Как правильно ограничить поворот gameObject в Unity

268
24 ноября 2021, 02:20

У меня есть задача, ограничить движение по вертикали пушки от -20 до 20 градусов, если это значение превышается, то поворачивает платформа на которой она стоит, а также необходимо сделать вертикальное поднятие пушки от 0 до 80 градусов.

Я написал код, по отдельности все работает хорошо, но вместе начинается ад.

Мой код:

void FixedUpdate()
{
    float fMoveHorizontal = Input.GetAxis("Horizontal") * Time.deltaTime * fMovementSpeed;
    float fMoveVertical = Input.GetAxis("Vertical") * Time.deltaTime * fMovementSpeed;
    transform.Translate(Vector3.forward * fMoveVertical);
    transform.Translate(Vector3.right * fMoveHorizontal);
    float fRotateHorizontal = Input.GetAxis("Mouse X") * Time.deltaTime * fRotateSpeed;
    float fRotateVertical = Input.GetAxis("Mouse Y") * Time.deltaTime * fUpSpeed;
    if (objectCannon.transform.localEulerAngles.z - fRotateHorizontal <= 110.0f &&
        objectCannon.transform.localEulerAngles.z - fRotateHorizontal >= 70.0f)
    {
        objectCannon.transform.Rotate(Vector3.forward, -fRotateHorizontal);
        Debug.Log("objCannon local: " + objectCannon.transform.localEulerAngles);
        Debug.Log("objCannon global: " + objectCannon.transform.eulerAngles);
    }
    else
    transform.Rotate(Vector3.up, fRotateHorizontal);

   if(objectCannon.transform.localEulerAngles.x + fRotateVertical + 1  <= 89.0f &&
      objectCannon.transform.localEulerAngles.x + fRotateVertical + 1 >= 9.0f)
    {
        objectCannon.transform.Rotate(Vector3.up, -fRotateVertical);
    }
}
Answer 1
float fRotateHorizontal = Input.GetAxis("Mouse X") * Time.deltaTime * fRotateSpeed;
    float fRotateVertical = Input.GetAxis("Mouse Y") * Time.deltaTime * fUpSpeed;
    ///Horizontal
    if (fRotateX + fRotateHorizontal <= 110.0f &&
        fRotateX + fRotateHorizontal >= 70.0f)
    {
        fRotateX += fRotateHorizontal;
    }
    else 
    {
        if (fRotateX > 110.0f) fRotateX = 110.0f;
        if (fRotateX <  70.0f) fRotateX =  70.0f;
        transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(transform.rotation.eulerAngles.x,
                                                                                  transform.rotation.eulerAngles.y + fRotateHorizontal,
                                                                                  transform.rotation.eulerAngles.z), Time.deltaTime * fRotateSpeed);
    }
    //Vertical
    if (fRotateY + fRotateVertical <= 85.0f &&
        fRotateY + fRotateVertical >= 5.0f)
    {
        fRotateY += fRotateVertical;
    }
    objectCannon.transform.localRotation = Quaternion.Euler(fRotateY, 0, fRotateX);
READ ALSO
Как управлять мышью ,а не курсором

Как управлять мышью ,а не курсором

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

212
async / await передача Task

async / await передача Task

Есть функция

71
С# WPF(MVVM) Как взаимодействовать с DependencyProperty из ViewModel

С# WPF(MVVM) Как взаимодействовать с DependencyProperty из ViewModel

Только недавно начал постигать паттерн MVVM, и столкнулся со следующим вопросомКак правильно получить доступ к DependencyProperty из ViewModel

88
автообновление программы ClickOnce

автообновление программы ClickOnce

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

174