Unity:滚动到“缩放”以指向

时间:2018-11-28 13:55:17

标签: c# unity3d scroll camera zoom

我的应用(使用Unity 2017.3.1f1)的设置如下:

  • 透视相机位于“玩家”对象(禁用碰撞)内部,并且也是其子对象(用于获得第一人称视角)
  • 摄像机具有一个“ MouseLook”脚本(我在Unity的默认脚本中做了一些更改),该脚本将光标锁定并隐藏在屏幕中间(Cursor.lockState = CursorLockMode.LockedCursor.visible = false
  • “玩家”具有常规的“输入”脚本和移动脚本:如果按下wasd,这些按键将移动玩家对象,这也会使相机移动

我要实现的目标:

  • 使用鼠标上的滚轮将其移向相机正看着或远离它的位置,这与是否存在物体无关。
  • 我不想更改FOV /比例
  • 没有必要使用Lerp,我只想在使用鼠标滚轮的每一帧中将播放器向目标位置移动一步

我尝试过的事情:

1a。在常规输入脚本中:

if(Input.GetAxis("Mouse ScrollWheel") != 0) {
    transform.Translate(0,0,Input.GetAxis("Mouse ScrollWheel") * 200);
}

1b:在常规输入脚本中:

if(Input.GetAxis("Mouse ScrollWheel") != 0) {
    transform.position += transform.forward * Input.GetAxis("Mouse ScrollWheel") * 200;
}

两者的工作原理相同,但即使向下/向上看,也只能将播放器/相机移动到相同的y水平。 transform.up始终输出“(0.0,1.0,0.0)”,因此没有必要将其合并。

2。相机上的新脚本(source):

public class ScrollToZoom : MonoBehaviour {
    public GameObject player;

    void Update () {
        if(Input.GetAxis("Mouse ScrollWheel") != 0) {
            RaycastHit hit;
            Ray ray = this.transform.GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
            Vector3 desiredPosition;

            if(Physics.Raycast(ray,out hit)) {
                desiredPosition = hit.point;
            } else {
                desiredPosition = transform.position;
            }
            float distance = Vector3.Distance(desiredPosition,transform.position);
            Vector3 direction = Vector3.Normalize(desiredPosition - transform.position) * (distance * Input.GetAxis("Mouse ScrollWheel"));

            transform.position += direction;
        }
    }
}

这根本不起作用,因为“方向”始终为(0,0,0),因为鼠标光标已锁定(我无法/不会更改)。

您如何在其中合并围绕x轴的旋转(我在“ MouseLook”脚本中将其固定为+/- 90°)?

1 个答案:

答案 0 :(得分:0)

if(Input.GetAxis("Mouse ScrollWheel") != 0) {
    transform.localPosition += Vector3.forward * Input.GetAxis("Mouse ScrollWheel") * 200;
}

应该工作。 transform.position将参考世界位置,而不管对象面对的位置。