如何让3D游戏角色在相机环绕时始终朝向鼠标光标?
解决3D游戏中角色随鼠标光标朝向的问题
你的代码只在相机正对角色时有效,核心问题是基于屏幕坐标差值计算角度的方式,没有考虑相机的空间旋转。当相机绕角色移动后,屏幕坐标的x/y对应的世界空间方向已经改变,自然会导致角色朝向错误。
下面是两种通用解决方案,适配不同场景:
场景1:角色在地面(固定Y平面)移动
通过射线检测获取鼠标对应的地面世界坐标,让角色朝向该点的水平方向:
public Camera cam; // 角色所在地面的Y轴高度,根据你的场景调整 public float groundY = 0f; void Update() { // 生成从相机到鼠标位置的射线 Ray mouseRay = cam.ScreenPointToRay(Input.mousePosition); // 创建平行于地面的检测平面 Plane groundPlane = new Plane(Vector3.up, new Vector3(0, groundY, 0)); float rayDistance; // 检测射线与地面的交点 if (groundPlane.Raycast(mouseRay, out rayDistance)) { // 获取交点的世界坐标 Vector3 targetWorldPos = mouseRay.GetPoint(rayDistance); // 计算角色到目标点的水平方向(忽略Y轴,避免角色抬头低头) Vector3 horizontalDirection = targetWorldPos - transform.position; horizontalDirection.y = 0; // 仅当目标点与角色有足够距离时旋转,避免抖动 if (horizontalDirection.magnitude > 0.1f) { transform.rotation = Quaternion.LookRotation(horizontalDirection); } } }
场景2:空中/无固定平面的角色
直接用射线方向的水平分量作为朝向参考:
public Camera cam; void Update() { Ray mouseRay = cam.ScreenPointToRay(Input.mousePosition); // 提取射线的水平方向(忽略Y轴) Vector3 horizontalLookDir = mouseRay.direction; horizontalLookDir.y = 0; if (horizontalLookDir.magnitude > 0.1f) { transform.rotation = Quaternion.LookRotation(horizontalLookDir); } }
这两种方案都基于世界空间计算,不管相机如何环绕角色旋转,角色都会正确朝向鼠标对应的空间位置,彻底解决视角变化后的朝向错误问题。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

