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

角色无法正确朝向鼠标光标:动画异常问题求助

角色朝向鼠标光标功能异常问题排查

尝试实现角色朝向鼠标光标的功能,但该功能运行异常且效果不稳定。以下是相关代码:

if (CanDirectionChange)
{
    Direction.x = Input.GetAxisRaw("Horizontal");
    Direction.y = Input.GetAxisRaw("Vertical");

    Anim.SetFloat("X", MousePos.x);
    Anim.SetFloat("Y", MousePos.y);
    Anim.SetFloat("Speed", Direction.sqrMagnitude);

    if (MousePos.x >= 1 || MousePos.x >= -1 || MousePos.y <= 1 || MousePos.y <= -1)
    {
        Anim.SetFloat("LastX", MousePos.x);
        Anim.SetFloat("LastY", MousePos.y);
    }
}

角色的朝向由LastX和LastY参数控制,Animator状态机设置如图:

Animator状态机设置

问题分析与修复方案

核心问题

代码中的条件判断逻辑完全错误:MousePos.x >= 1 || MousePos.x >= -1 这个表达式对任何数值都成立(因为任何数要么大于等于1,要么大于等于-1),再加上MousePos.y <=1 || MousePos.y <=-1同样全成立,导致LastX和LastY每一帧都被强制更新,这会让角色朝向频繁跳动,出现不稳定的情况。

修复步骤

  1. 修正条件判断
    改为判断鼠标方向向量的绝对值是否超过合理阈值(比如0.1,避免微小误触导致频繁更新),只有当鼠标有明显方向输入时才更新朝向记录:

    // 判断鼠标方向是否有有效输入
    if (Mathf.Abs(MousePos.x) >= 0.1f || Mathf.Abs(MousePos.y) >= 0.1f)
    {
        Anim.SetFloat("LastX", MousePos.x);
        Anim.SetFloat("LastY", MousePos.y);
    }
    
  2. 确保MousePos是正确的方向向量
    确认MousePos是角色到鼠标的归一化方向向量,而非原始屏幕坐标。如果当前是直接使用屏幕坐标,需要先转换:

    // 示例:将鼠标屏幕坐标转换为世界坐标,计算相对于角色的方向
    Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
    mouseWorldPos.z = transform.position.z; // 保持和角色同一平面
    Vector2 mouseDir = (mouseWorldPos - transform.position).normalized;
    // 使用mouseDir作为MousePos的值
    Anim.SetFloat("X", mouseDir.x);
    Anim.SetFloat("Y", mouseDir.y);
    
  3. 优化朝向逻辑(可选)
    如果需要角色持续朝向鼠标,不需要仅在满足条件时更新LastX/LastY,可以直接每一帧用当前鼠标方向更新这两个参数;若要在角色停止移动时保持最后朝向,则保留条件判断即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:35:38