Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/64: Рейтинг темы: голосов - 64, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 116
1

Не изменяется переменная в transform.rotation

11.09.2016, 12:03. Показов 12547. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, такая штука, хочу реализовать поворот камеры на 90 градусов при нажатии кнопки pageup, т.е. чтобы человек нажал, и пока он держит, камера крутится. Когда поворот доходит до 90 градусов, камера должна перестать крутиться. Камера у меня крутится, условие я написал, но почему-то не хочет подхватывать это условие скрипт. Помогите разобраться, пожалуйста.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public float rspeed;
 
    // Update is called once per frame
    void Update () {
    
    if (Input.GetKey(KeyCode.PageUp))
        {
            
            transform.Rotate (0, 0, rspeed);
            if (transform.rotation.z > 90f)
            {
                rspeed = 0;
            }
                
 
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2016, 12:03
Ответы с готовыми решениями:

Transform.rotation
Для стратегии камера должна не только передвигаться, но и менять угол просмотра. Для этого, при...

Transform.rotation. Углы
У меня есть камера, rotation(90,0,0). Необходимо повернуть её по Z при нажатии стрелки влево, но...

При hover-е начинают прыгать уголки изображения, когда изменяется transform
Есть картинка внутри такой разметки <sidebar> <ul class="gallery"> <li...

Переменная не изменяется
код должен проверить, сколько пользователей с данным ником зарегистрировалось, получая длину...

11
10 / 10 / 5
Регистрация: 06.09.2016
Сообщений: 26
11.09.2016, 12:18 2
Первым делом в апдейт закинь, что бы видеть выхлоп в консоль, что бы увидеть когда оно срабатывает, и как оно работает.

Debug.Log("transform.rotation.x = " + transform.rotation.x.ToString());
Debug.Log("transform.rotation.y = " + transform.rotation.y.ToString());
Debug.Log("transform.rotation.z = " + transform.rotation.z.ToString());

Добавлено через 3 минуты
Но, чтобтебя не мурыжить долго, ты пытаешься сравнить привычный для тебя угол с Quaternion.
Тк transform.rotation возвращает не тот ротейшн котрый у тебя в инспекторе.

тебе надо сравнивать с transform.eulerAngles

Добавлено через 1 минуту
https://docs.unity3d.com/Scrip... ation.html
public Quaternion rotation;

https://docs.unity3d.com/Scrip... ngles.html
public Vector3 eulerAngles; <--

Добавлено через 2 минуты
if (transform.eulerAngles.z > 90f)
{
rspeed = 0;
}

Что - то типо такого
1
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 116
11.09.2016, 12:59  [ТС] 3
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if (Input.GetKey(KeyCode.PageUp))
        {
            transform.Rotate(0, 0, rspeed);
            if (transform.eulerAngles.y <= 270)
            {
                rspeed = 0;
 
            }
            rdistance1 = transform.eulerAngles.y;
            
        }
        if (Input.GetKeyUp(KeyCode.PageUp))
        {
            for (int i = 0; i>= rdistance1; i++)
            {
                transform.Rotate(0, 0, -i);
            }
        }
Изменил таким образом код (методом проб и ошибок увидел в логе, что при изменении z меняется почему-то y). Т.е. в теории я хочу, чтобы переменная rdistance1 запоминала значение, на которое повернулась камера, а потом медленно возвращалась к исходному положению. Событие просто не обрабатывается. Почему?
0
10 / 10 / 5
Регистрация: 06.09.2016
Сообщений: 26
11.09.2016, 13:29 4
есть еще
Transform.localRotation
Transform.localEulerAngles

relative to the parent transform's rotation.

Добавлено через 6 минут
плавный возврат к значению лучше делать так

transform.euler.rotation = Vector3.Lerp(transform.euler.rotation , Vector.Zero, Time.DeltaTime * speed);

вместо Vector.Zero твоё исходное положение камеры (тк я не знаю кактам у тебя что)

Добавлено через 53 секунды
с моего когда тупо копипастить - рабоать не будет, пишу примерно по памяти, придется гуглить как оно пишется правильно

Добавлено через 42 секунды
https://docs.unity3d.com/Scrip... .Lerp.html Vector3.Lerp

Добавлено через 3 минуты
Что бы не было каши лучше выносить в отдельные функции мне кажется.
И писать в if'ах Debug.log , тогла поймешь что у тебя срабатывает и что не может

if (Input.GetKey(KeyCode.PageUp))
{
CamMoveDown();
}

if (Input.GetKeyUp(KeyCode.PageUp))
{
CamReset();
}


И учесть 1 раз срабатывает функция или пка жмешь кнопку.GetKeyUp вроди 1 раз отработает и всё, дкбаг покажет оно много раз отрабатывает или нет.

В случае если только 1 раз, то надо вешать на короутину, или делать булиан bool= isCamReseted и ждать пок не поменяется значение.

Я чесн тут не могу помочь, мало исходных данных. Я Указал возможные ошибки и варианты лечения
1
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 116
12.09.2016, 18:03  [ТС] 5
В общем, реализовал, однако, относительно плавности возвращения - не могу понять, как делать. Как и то, что нужно сделать, чтобы соблюдалось условие по углу поворота не больше 90 градусов.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
public class CamControl : MonoBehaviour
{
 
    public float camspeed;
    public float rotating;
    public float rotate;
    public float distance1;
    public float distance2;
    public bool isReset;
    void Start()
    {
        distance1 = transform.eulerAngles.y;
        isReset = false;
    }
 
    // Update is called once per frame
    void Update()
    {
        if ((transform.position.z < 6) && (Input.GetKey(KeyCode.UpArrow)))
        {
            VertCam(camspeed);
        }
 
        if ((transform.position.z > -6) && (Input.GetKey(KeyCode.DownArrow)))
        {
            VertCam(-camspeed);
        }
 
        if ((transform.position.x < 6) && (Input.GetKey(KeyCode.RightArrow)))
        {
            HorCam(camspeed);
        }
 
        if ((transform.position.x > -6) && (Input.GetKey(KeyCode.LeftArrow)))
        {
            HorCam(-camspeed);
        }
 
        if (Input.GetKey(KeyCode.PageUp))
        {
            RotCamLeft(rotate);
 
        }
 
        if ((Input.GetKeyUp(KeyCode.PageUp)) && (isReset == false))
        {
            CamBack(rotate);
        }
 
        if (Input.GetKey(KeyCode.PageDown))
        {
            RotCamRight(rotate);
 
        }
 
        if ((Input.GetKeyUp(KeyCode.PageDown)) && (isReset == false))
        {
            CamBack(rotate);
        }
 
    }
 
    void VertCam(float camspeeded)
    {
        if (camspeeded > 0)
        {
            transform.position = transform.position + new Vector3(0, 0, camspeeded);
 
        }
        if (camspeeded < 0)
        {
            transform.position = transform.position + new Vector3(0, 0, camspeeded);
 
        }
 
    }
 
    void HorCam(float camspeeded)
    {
        if (camspeeded > 0)
        {
            transform.position = transform.position + new Vector3(camspeeded, 0, 0);
 
        }
        if (camspeeded < 0)
        {
            transform.position = transform.position + new Vector3(camspeeded, 0, 0);
 
        }
 
 
 
    }
 
    void RotCamLeft(float rotating)
    {
        transform.Rotate(0, 0, rotating);
        distance2 = 360 - transform.eulerAngles.y;
        isReset = false;
 
    }
 
    void RotCamRight(float rotating)
    {
        transform.Rotate(0, 0, -rotating);
        distance2 = transform.eulerAngles.y;
        isReset = false;
 
    }
 
 
 
    void CamBack(float rotating)
    {
 
        while ((transform.eulerAngles.y != 0) && (transform.eulerAngles.y >= distance2) && (distance2 != 0))
        {
 
            transform.Rotate(0, 0, -rotating);
        }
        distance2 = 0;
        isReset = true;
    }
}
0
10 / 10 / 5
Регистрация: 06.09.2016
Сообщений: 26
12.09.2016, 22:42 6
у меня с углами проблема, решаю всегда заново и забываю.
там после 180 градусов перескакивает на 0 или минус 360 вроди (точно не помню)

надо юзать что-то типо такого:

if(angle < 180)
{
angle = Mathf.Clamp(angle, 0, 10);
}
if(angle > 180)
{
angle = Mathf.Clamp(angle, 350, 360);
}


Добавлено через 7 минут
выводи в дебаг в каждом кадре вращение, разгребай, что в консоли, а потом условием.
.....................................
по возврату к исходному положению.

Самый легкий вариант.
Создать (пустой) GameObject в сцене, на месте камеры. Скопируй Трансформ ротейшн из камеры в твойю пустышку.

в скрипте объяви

public Transform CameraDefaultTransform.

Потом перетяни пустышку в инспектор, на место объявленной переменной.
Теперь у тебя есть как должна стоять камера.

в скрипте когда надо делаешь
mycamera.transform.Rotation = Quaternion.Lerp(mycamera.transform.Rotation, CameraDefaultTransform.rotation, Time.DeltaTime * speed);

или тоже самое, только лерпишь еулер поворот.
..

Лерпить с гейм обжектами в сцене удобно, лично мне. Тк можно легко настроить положения камер не трогая код. Пустышки в виде кубиков, видно где позиции камер. Потом отключил у них рендер и всё.

Добавлено через 8 минут
твой код прочитать не осилил тк сейчас под веществами и работу работаю свою
0
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 116
14.09.2016, 17:50  [ТС] 7
В общем, вот таким образом написал, но эффекта плавности все равно нет - все мгновенно происходит...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    void RotCamLeft(float rotating)
    {
        transform.Rotate(0, 0, rotating);
        distance2 = 360 - transform.eulerAngles.y;
        isReset = false;
 
    }
 
    void RotCamRight(float rotating)
    {
        transform.Rotate(0, 0, -rotating);
        distance2 = transform.eulerAngles.y;
        isReset = false;
 
    }
 
 
 
    void CamBack(float rotating)
    {
        
        while ((transform.eulerAngles.y != 0) && (transform.eulerAngles.y >= distance2) && (distance2 != 0))
        {
 
            transform.rotation = Quaternion.Lerp(CameraDefaultTransform.rotation, transform.rotation, Time.deltaTime * rotating);
        }
        distance2 = 0;
        isReset = true;
    }
}
0
10 / 10 / 5
Регистрация: 06.09.2016
Сообщений: 26
14.09.2016, 18:00 8
CamBack()
где у тебя вызывается?

зачем в кам беке входной параметр rotating ? Оно вобще знать ничего не должно.
запустилось на взврат, отлерпилось в исходное и всё

Добавлено через 1 минуту
а, нашел.
тут оно вызывается

if ((Input.GetKeyUp(KeyCode.PageUp)) && (isReset == false))
{
CamBack(rotate);
}
1
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 116
14.09.2016, 18:05  [ТС] 9
Это как раз сделано, чтобы можно было контролировать скорость возврата (чтобы она была соразмерна скорости поворота). Ну так что может быть неправильно? Так-то, повторюсь, работает, но не так, как надо)
0
10 / 10 / 5
Регистрация: 06.09.2016
Сообщений: 26
14.09.2016, 18:39 10
Лучший ответ Сообщение было отмечено endicator как решение

Решение

Вот, Набросал поворот камеры а ограничения и другие движения сам пропишешь.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
using UnityEngine;
using System.Collections;
 
public enum CamStates { NONE, LEFT, RIGHT, BLOCKED, RESETED}
 
public class CamCtrl2 : MonoBehaviour {
 
    private Camera myCam;
    private CamStates CurrentCamState = CamStates.NONE;
 
    public float CamRotSpeed = 1F;
 
 
 
    private void RotateRight()
    {
        Debug.Log("CamCtrl2 : RotateRight");
        CurrentCamState = CamStates.RIGHT;
    }
 
    private void RotateLeft()
    {
        Debug.Log("CamCtrl2 : RotateLeft");
        CurrentCamState = CamStates.LEFT;
    }
 
    private void CamReset()
    {
        Debug.Log("CamCtrl2 : CamReset");
        CurrentCamState = CamStates.RESETED;
    }
 
 
    private void UpdateKeys()
    {
       
 
        if (Input.GetKeyDown(KeyCode.PageUp))
        {
            RotateLeft();
        }
 
        if (Input.GetKeyDown(KeyCode.PageDown))
        {
            RotateRight();
        }
 
        if (Input.GetKeyUp(KeyCode.PageUp) || Input.GetKeyUp(KeyCode.PageDown))
        {
            CamReset();
        }
 
    }
 
    private void UpdateCamRotation()
    {
        switch (CurrentCamState)
        {
            case CamStates.LEFT:
                myCam.transform.Rotate(Vector3.forward * CamRotSpeed);
                break;
            case CamStates.RIGHT:
                myCam.transform.Rotate(Vector3.back * CamRotSpeed);
                break;
 
            case CamStates.RESETED:
                myCam.transform.rotation = Quaternion.Lerp(myCam.transform.rotation, startCamRot, Time.deltaTime * CamRotSpeed);
                break;
 
            default:
                //Console.WriteLine("Default case");
                break;
        }
    }
 
    Quaternion startCamRot;
    private void FindCam()
    {
        myCam = transform.GetComponent<Camera>();
        if (myCam)
        {
            Debug.Log("Camera finded OK");
            startCamRot = myCam.transform.rotation;
        }
        else Debug.LogError("Camera find ERROR!");
    }
 
 
    void Start () {
        FindCam();
    }
    
 
 
    void Update () {
        UpdateKeys();
        UpdateCamRotation();
    }
}
Добавлено через 1 минуту
Это готовый скрипт, создай новый и скопипасть в новый скрипт.
Повесь на камеру, настрой скорость.
1
0 / 0 / 0
Регистрация: 26.05.2013
Сообщений: 116
14.09.2016, 18:56  [ТС] 11
спасибо, буду разбираться, почему я такой нубас, а у тебя получилось =)
0
10 / 10 / 5
Регистрация: 06.09.2016
Сообщений: 26
14.09.2016, 19:10 12
endicator, Для спасибо есть кнопочка.

Ничего страшного. Рад был помочь. С опытом научишься. Не забывай когда станешь умным помогать нубам)
1
14.09.2016, 19:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.09.2016, 19:10
Помогаю со студенческими работами здесь

Не изменяется переменная
Здравствуйте! Не меняется переменная в методе paint(). Если буду выводить значения n в методе...

Переменная не изменяется
Доброго времени суток ! Нужна ваша помощь. Вроде бы вопрос легкий, но не могу понять как...

Не изменяется static переменная
...довольно странная проблема. в 2-х файлах инклудится один заголовочный файл, в нем объявлена...

Не изменяется глобальная переменная в методе
В методе &quot;loadpt2&quot; заполняю массив потоков. Он по моему глобальный, тогда почему при выходе с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru