在C#和Unity中如何让鼠标放在玩家身上时不弯腰?

问题描述 投票:0回答:1

我正在尝试为玩家的动作制作一个脚本,以使玩家向各个方向行走并绕着自己旋转,问题是当我将鼠标指针放在玩家的头部或顶部时,玩家会向下弯曲如下图所示:

脚本如下:

public float moveSpeed = 6;
 
     Rigidbody rigidbody;
     Camera viewCamera;
     Vector3 velocity;
 
     void Start()
     {
         rigidbody = GetComponent<Rigidbody>();
         viewCamera = Camera.main;
     }
 
     void Update()
     {
         Vector3 mousePos = viewCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, viewCamera.transform.position.y));
         transform.LookAt(mousePos + Vector3.up * transform.position.y);
         velocity = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")).normalized * moveSpeed;
     }
 
     void FixedUpdate()
     {
         rigidbody.MovePosition(rigidbody.position + velocity * Time.fixedDeltaTime);
     }

有什么建议吗?

c# unity3d unity-container
1个回答
2
投票

如果您的相机不是完全自上而下使用

viewCamera.transform.position.y

因为距离不可靠。

而不是做

transform.LookAt(mousePos + Vector3.up * transform.position.y);

你可以简单地做

mousePos.y = transform.position.y;
transform.LookAt(mousePos);

这会消除 Y 中的任何差异,仅在 XZ 中旋转

或者不使用

ScreenToWorldPoint
你也可以直接对玩家身高的
Plane
进行光线投射,例如

var ray = viewCamera.ScreenPointToRay(Input.mousePosition);
var plane = new Plane(Vector3.up, transform.position);
if(pane.Raycast(ray, out var distance))
{
    var hitPoint = ray.GetPoint(distance);
    transform.LookAt(hitPoint);
}

一般来说,在使用物理时,你不应该通过

transform
设置任何东西,而是通过 Rigidbody

rigidbody.MoveRotation(Quaternion.LookRotation(hitPoint)):
© www.soinside.com 2019 - 2024. All rights reserved.