You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity+C#:如何解决鼠标指向玩家时角色弯腰的问题

解决玩家因鼠标位置导致弯腰的问题

我正在编写玩家移动脚本,以实现玩家全方向行走及自转功能,但当鼠标指针指向玩家头部或上方时,玩家会向下弯腰,效果如下:

玩家弯腰效果

当前使用的C#脚本如下:

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);
}

问题原因

问题出在transform.LookAt()的目标点计算错误,导致玩家不仅绕Y轴水平旋转,还会产生X轴的上下旋转(弯腰动作)。原代码中给鼠标位置叠加了Vector3.up * transform.position.y,使得目标点的Y轴位置异常,迫使玩家头部朝向该点,出现弯腰。

解决方案

需要确保玩家仅在水平面上(绕Y轴)旋转,忽略鼠标的垂直位置影响,有两种实现方式:

方式一:修正目标点Y轴高度

将鼠标转换后的世界坐标Y轴强制与玩家自身Y轴保持一致,让LookAt()只触发水平旋转:

void Update()
{
    // 将鼠标位置转换到世界空间,保持Y轴与玩家一致
    Vector3 mouseWorldPos = viewCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, viewCamera.transform.position.y));
    mouseWorldPos.y = transform.position.y; // 强制目标点与玩家同高度
    
    transform.LookAt(mouseWorldPos);
    
    velocity = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")).normalized * moveSpeed;
}

方式二:手动计算水平旋转方向

通过计算玩家与鼠标点的水平方向向量,直接设置旋转角度,完全避免上下旋转:

void Update()
{
    Vector3 mouseWorldPos = viewCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, viewCamera.transform.position.y));
    // 提取水平方向向量,忽略Y轴差异
    Vector3 lookDirection = new Vector3(mouseWorldPos.x - transform.position.x, 0, mouseWorldPos.z - transform.position.z).normalized;
    
    if (lookDirection != Vector3.zero)
    {
        // 仅绕Y轴设置旋转
        transform.rotation = Quaternion.LookRotation(lookDirection);
    }
    
    velocity = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")).normalized * moveSpeed;
}

两种方式都能解决玩家弯腰的问题,确保玩家只根据鼠标的水平位置进行自转,不产生上下方向的躯体旋转。

内容的提问来源于stack exchange,提问作者user15365798

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 09:05:33