团结:让玩家面对鼠标的方向。为什么此代码有效?

时间:2019-03-18 19:14:51

标签: unity3d

我在this tutorial之后的一个简单项目中,我需要做的第一件事就是让玩家指向鼠标的位置。

为此,我按照以下教程编写了这段代码:

ddev ssh
http://bar.ddev.local
curl: (6) Could not resolve host: http://bar.ddev.local

这是问题所在:它可以工作,但是我不太理解为什么。我阅读了private void Update() { Vector3 input = Input.mousePosition; Vector3 mousePosition = camera.ScreenToWorldPoint(new Vector3(input.x, input.y, camera.transform.position.y)); transform.LookAt(mousePosition + Vector3.up * transform.position.y); } 上的文档,仍然不确定。

我的问题是双重的:

  1. 为什么要对要传递给ScreenToWorldPoint的向量的camera.transform.position.y分量使用z

  2. 为什么添加ScreenToWorldPoint有用?没有它,如果鼠标离播放器太近,它将旋转身体并使其移动。有了它,播放器就只能在xz平面内旋转。

编辑:这是轮播的demonstration,以显示其有效。

2 个答案:

答案 0 :(得分:4)

  

为什么要对我要传递给ScreenToWorldPoint的向量的z分量使用camera.transform.position.y?

传入的矢量的第三个分量是相机以世界单位表示的z位置。您可以在此处的文档中阅读:https://docs.unity3d.com/ScriptReference/Camera.ScreenToWorldPoint.html

之所以是摄影机y,是因为我们正在寻找将地面指向世界的点,即距离我们的眼位置的摄影机y单位。如果摄像机的高度是摄像机的两倍,那么距眼睛位置仍为camera.y个单位。

  

为什么添加Vector3.up * transform.position.y起作用?没有它,如果鼠标离播放器太近,它将旋转身体并使其移动。有了它,播放器就只能在xz平面内旋转。

我假设对象的高度不为零。因此,如果世界位置在y高度为零,它将旋转身体。因此,观察点将更改为与对象的高度匹配。将向量乘以浮点数时,结果是一个向量,其中每个元素都乘以浮点数。

答案 1 :(得分:2)

注意:我对1的回答仅适用于3D透视相机的使用,与OP的情况不同

  1. z距离设置为相机的z位置,因为在这种情况下深度并不重要。如果要设置近平面,则可以将其用作z距离,因为这就是您要看的前方。本质上是从相机到点的距离。

  2. Vector3.up =(0,1,0),因此添加变换时将省略其他两个轴。我很确定这与进行new Vector3(0, transform.position.y, 0)