猿问

Unity C#:使用自动定位和鼠标外观的相机控制

我通常不在这里发帖,但现在我花了几个小时试图弄清楚这一点,我已经在网上搜索过但找不到答案。我希望有人能在这里帮助我。我是新手,这是我第一次尝试在Unity C# 中结合跟随玩家运动的两种类型的第三人称相机控制

  1. 当玩家移动时,相机会捕捉到预定义的位置和旋转(无鼠标观察)

  2. Mouse Look 在按住鼠标按钮时激活,因此无论玩家的位置是否改变,相机都会根据鼠标移动旋转

它几乎可以工作,只是我似乎无法将鼠标外观重置为其第一个预定义设置。播放器释放鼠标按钮后,#1 的代码开始执行,因此相机似乎返回到其默认视图。但是做进一步的鼠标查看,我注意到相机总是返回到它被停用的最后一个位置和旋转。我需要它甚至在玩家激活他的第一个鼠标外观之前返回到原始的预定义位置和旋转,这样它就不会让玩家迷失方向。

我尝试了几个代码,但无法让它工作,所以我删除了非工作行并发布了那些我认为适用的行。请参考我下面的代码。如果有人可以帮助我,我将不胜感激。提前致谢!

编辑:更新了代码以具有两种控制相机的方法,并添加了建议的代码以重置当前的 X 和 Y 值。注释/取消注释每个要测试的方法调用。但是我仍然存在无法平滑鼠标外观的缩放的问题。

最终编辑:我再次更新了下面的代码,对其进行了清理,并包含了建议的更改。代码现在应该可以正常工作并且没有抖动。感谢您的帮助!:-)


慕斯王
浏览 302回答 1
1回答

跃然一笑

更新:试试这个void LateUpdate(){&nbsp; &nbsp; if (lookAround)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; currentX += Input.GetAxisRaw("Mouse X");&nbsp; &nbsp; &nbsp; &nbsp; currentY += Input.GetAxisRaw("Mouse Y");&nbsp; &nbsp; &nbsp; &nbsp; currentY = Mathf.Clamp(currentY, angleMinY, angleMaxY);&nbsp; &nbsp; &nbsp; &nbsp; Vector3 dir = new Vector3(0, 0, -distance);&nbsp; &nbsp; &nbsp; &nbsp; Quaternion rotation = Quaternion.Euler(currentY, currentX, 0);&nbsp; &nbsp; &nbsp; &nbsp; Vector3 wantedPosition = target.position + rotation * dir;&nbsp; &nbsp; &nbsp; &nbsp; transform.position = Vector3.Lerp(transform.position, wantedPosition, Time.deltaTime * damping);&nbsp; &nbsp; &nbsp; &nbsp; camTransform.LookAt(target.position);&nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; ...和void Update(){&nbsp; &nbsp; // Here&nbsp; &nbsp; if (Input.GetMouseButtonDown(1))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; currentX = transform.eulerAngles.y;&nbsp; &nbsp; &nbsp; &nbsp; currentY = transform.eulerAngles.x;&nbsp; &nbsp; }&nbsp; &nbsp; if (Input.GetMouseButton(1))&nbsp; &nbsp; {&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; ...我所做的是在 Update() 中按下鼠标时将 currentX 和 currentY 重置为它们当前的欧拉角值。我在 LateUpdate() 中向想要的环视位置添加了一个位置 Lerp编辑:虽然我仍然没有修复最初按住鼠标右键时鼠标外观的平滑缩放试试这个改变void CameraOrbit(){&nbsp; &nbsp; currentX += Input.GetAxisRaw("Mouse X");&nbsp; &nbsp; currentY += Input.GetAxisRaw("Mouse Y");&nbsp; &nbsp; currentY = Mathf.Clamp(currentY, angleMinY, angleMaxY);&nbsp; &nbsp; Vector3 dir = new Vector3(0, 0, -distance);&nbsp; &nbsp; Quaternion rotation = Quaternion.Euler(currentY, currentX, 0);&nbsp; &nbsp; // -->&nbsp; &nbsp; Vector3 wantedPosition = target.position + rotation * dir;&nbsp; &nbsp; transform.position = Vector3.Lerp(transform.position, wantedPosition, Time.deltaTime * damping);&nbsp; &nbsp; // <--&nbsp; &nbsp; camTransform.LookAt(target.position);}
随时随地看视频慕课网APP
我要回答