единство - движение камеры - PullRequest
0 голосов
/ 11 января 2020

Я рассматриваю этот фрагмент кода о движении камеры:

 using UnityEngine;
 using System.Collections;

 public class CamMove : MonoBehaviour {
    Vector2 mouseLook;
    Vector2 smoothV;
    public float sensitivity=5.0f;
    public float smoothing = 2.0f;

    GameObject character;
    void Start()
    {
        //moving left and right
        character = this.transform.parent.gameObject;
    }

    void Update()
    {
        var md = new Vector2 (Input.GetAxisRaw ("Mouse X"), Input.GetAxisRaw ("Mouse Y")); //mouse movement
        md = Vector2.Scale (md, new Vector2 (sensitivity * smoothing, sensitivity * smoothing));
        smoothV.x = Mathf.Lerp (smoothV.x, md.x, 1f / smoothing);



        smoothV.y = Mathf.Lerp (smoothV.y, md.y, 1f / smoothing);

        mouseLook += smoothV;
        if(mouseLook.y>-40 && mouseLook.y<60)
                    transform.localRotation = Quaternion.AngleAxis (-mouseLook.y, Vector3.right);

        character.GetComponent<CharacterController>().transform.localRotation = Quaternion.AngleAxis (mouseLook.x, character.transform.up);
    }


 }

как он получает каждое новое местоположение? С интерполяцией Math.Lerp? Также я не могу понять часть md = Vector2.Scale (md, new Vector2 (sensitivity * smoothing, sensitivity * smoothing)); Также часть:

if(mouseLook.y>-40 && mouseLook.y<60)
                    transform.localRotation = Quaternion.AngleAxis (-mouseLook.y, Vector3.right);

1 Ответ

1 голос
/ 11 января 2020

Ну

var md = new Vector2 (Input.GetAxisRaw ("Mouse X"), Input.GetAxisRaw ("Mouse Y")); //mouse movement

даже комментируется mouse movement. Как обычно, лучшее имя переменной уже объясняет это. Было бы лучше назвать mouseDelta. Таким образом, код использует не фиксированную позицию мыши, а перемещенную точку с последнего кадра. (См. Input.GetRawAxis )


Тогда

md = Vector2.Scale (md, new Vector2 (sensitivity * smoothing, sensitivity * smoothing));

Vector2.Scale увеличивает или уменьшает этот вектор. Вы также можете написать это как

md = new Vector2 (md.x * sensitivity * smoothing, md.y * sensitivity * smoothing);

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

md *= sensitivity * smoothing;

Тогда Mathf.Lerp - это линейная интерполяция между двумя заданными позициями с использованием определенного factor между 0 и 1, где 0 будет полностью первым параметром, 1 полностью вторым, в противном случае что-либо между ними. Например, коэффициент 0.5 приведет к центру между обоими значениями, поэтому это зависит от заданного вами значения для smoothing

    smoothV.x = Mathf.Lerp (smoothV.x, md.x, 1f / smoothing);
    smoothV.y = Mathf.Lerp (smoothV.y, md.y, 1f / smoothing);

Опять же, это пишется совершенно излишне, потому что лучше писать напрямую, используя Vector2.Lerp

 smoothV = Vector2.Lerp(smoothV, md, 1f/smoothing);

Но на самом деле я не совсем уверен, что это даже то, что вы ожидаете, поскольку это не абсолютное значение, а то, что вы позже добавляете каждый кадр так что использование Lerp для меня в любом случае не имеет особого смысла ... Я бы, вероятно, напрямую использовал Lerp для перемещения текущего mouseLoock к новому целевому значению.


Наконец вы делаете

mouseLook += smoothV;
if(mouseLook.y>-40 && mouseLook.y<60)
    transform.localRotation = Quaternion.AngleAxis (-mouseLook.y, Vector3.right);

character.GetComponent<CharacterController>().transform.localRotation = Quaternion.AngleAxis (mouseLook.x, character.transform.up);

, который обновляет два вращения . В вашем коде нет ничего, присваивающего какую-либо новую позицию вообще ...


Кроме того, что использование по кадрам GetComponent крайне неэффективно, вам лучше хранить эту ссылку один раз (например, в Start) и использовать его позже.

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