我正在尝试为玩家的动作制作一个脚本,以使玩家向各个方向行走并绕着自己旋转,问题是当我将鼠标指针放在玩家的头部或顶部时,玩家会向下弯曲如下图所示:
脚本如下:
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);
}
有什么建议吗?
如果您的相机不是完全自上而下使用
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)):