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

Unity如何实现NPC触发的浮动文本持续跟随移动对象

问题根因

现有浮动文本逻辑仅在生成瞬间计算一次传入的世界坐标对应的屏幕位置,后续每帧更新没有同步NPC的实时位置,所以NPC移动时文本会停留在初始生成点。

修复方案

所有修改均兼容原有浮动文本逻辑(比如伤害飘字、拾取提示等不需要跟随的文本不需要调整调用方式),具体修改步骤如下:

  • 扩展FloatingText数据类,新增跟随相关字段
  • 修改浮动文本每帧更新逻辑,存在跟随目标时实时同步位置
  • 扩展文本展示方法的参数,支持传入跟随目标和偏移量
  • 修改NPC触发文本的调用,传入自身作为跟随目标

1. 扩展FloatingText类

在你的FloatingText类定义中新增两个字段,用于存储跟随目标和头顶偏移:

public class FloatingText
{
    public bool active;
    public GameObject go;
    public Text txt;
    public Vector3 motion;
    public float duration;
    // 新增字段
    public Transform followTarget;
    public Vector3 followOffset;

    public void Show()
    {
        active = true;
        go.SetActive(true);
    }

    // 原有其他逻辑保留
}

2. 修改FloatingText的每帧更新逻辑

调整UpdateFloatingText方法,增加跟随目标的位置同步逻辑,文本回收时清空跟随目标避免复用异常:

public void UpdateFloatingText()
{
    if (!active) return;

    // 存在跟随目标时,每帧同步目标的实时位置
    if (followTarget != null)
    {
        go.transform.position = Camera.main.WorldToScreenPoint(followTarget.position + followOffset) + motion * Time.deltaTime;
    }
    else
    {
        // 无跟随目标时保留原有位移逻辑,兼容伤害飘字等效果
        go.transform.position += motion * Time.deltaTime;
    }

    // 原有计时、隐去、回收逻辑保持不变
    duration -= Time.deltaTime;
    if (duration <= 0)
    {
        active = false;
        go.SetActive(false);
        followTarget = null; // 回收时清空引用
    }
}

3. 扩展FloatingTextManager的Show方法

修改Show方法签名,增加可选的跟随参数,初始化文本时赋值跟随相关字段:

public void Show(string msg, int fontSize, Color color, Vector3 position, Vector3 motion, float duration, Transform followTarget = null, Vector3 followOffset = default)
{
    FloatingText floatingText = GetFloatingText();

    floatingText.txt.text = msg;
    floatingText.txt.fontSize = fontSize;
    floatingText.txt.color = color;
    
    // 赋值跟随参数
    floatingText.followTarget = followTarget;
    floatingText.followOffset = followOffset;
    
    // 计算初始位置:有跟随目标优先取目标位置,否则用传入的固定位置
    Vector3 initWorldPos = followTarget != null ? followTarget.position + followOffset : position;
    floatingText.go.transform.position = Camera.main.WorldToScreenPoint(initWorldPos);
    floatingText.motion = motion;
    floatingText.duration = duration;

    floatingText.Show();
}

4. 同步修改GameManager的ShowText方法

更新转发方法的签名,透传新增的可选参数:

public void ShowText(string msg, int fontSize, Color color, Vector3 position, Vector3 motion, float duration, Transform followTarget = null, Vector3 followOffset = default)
{
    floatingTextManager.Show(msg, fontSize, color, position, motion, duration, followTarget, followOffset);
}

5. 修改NPCTextPerson的调用逻辑

触发文本时传入NPC自身的Transform作为跟随目标,保留原有的头顶偏移量即可:

protected override void OnCollide(Collider2D coll)
{
   if (Time.time - lastShout > cooldown)
   {
        lastShout = Time.time;
        GameManager.instance.ShowText(
            message, 
            25, 
            Color.white, 
            default, // 有跟随目标时该参数无效,传default即可
            Vector3.zero, 
            cooldown, 
            transform, // 传入自身作为跟随目标
            new Vector3(0,0.16f,0) // 原有的头顶偏移
        );
   }
}
实现原理
  • 给需要跟随NPC的文本绑定对应NPC的Transform引用,文本激活显示期间,每帧都会读取NPC的最新世界坐标,转换为UI画布使用的屏幕坐标更新位置,实现持续跟随效果
  • 新增的参数均为可选默认值,原有不需要跟随的浮动文本(比如伤害数字、获得道具提示)调用逻辑完全不需要修改,不会破坏现有功能
  • 文本对象回收到对象池时会清空跟随目标引用,避免复用时出现位置错乱、空引用等问题
  • 原有的motion位移逻辑保留,后续如果需要做NPC对话文本缓慢上浮、渐隐等效果,直接修改motion参数即可,不需要调整核心跟随逻辑

内容的提问来源于stack exchange,提问作者Dalen M. Fitzgerald

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:00:57