Unity中如何让实例化的UI文本跟随Zombie预制体移动?
解决文本跟随僵尸移动的问题
嘿,我来帮你搞定这个文本不跟着僵尸走的问题!核心原因很简单:你现在只是在生成文本时把它放到了僵尸的初始位置,但僵尸移动后,文本没有收到任何“跟着走”的指令。这里有两种靠谱的解决方案,你可以按需选:
方案一:把文本变成僵尸的“小跟班”(首推)
这种方法最省心,让文本直接成为僵尸预制体的一部分,僵尸动它就自动跟着动,完全不用写额外的更新逻辑。
操作步骤:
- 打开你的Zombie预制体,在里面加个空物体(比如叫
TextAnchor),把它拖到僵尸头顶或者你想显示文本的位置,作为文本的固定锚点。 - 修改你的
WordSpawner脚本,把生成的文本挂到这个锚点下面,而不是Canvas:
public GameObject wordpb; // 你的文本预制体 public EnemyOne enemy; public DisplayWord Spawn() { // 找到僵尸身上的文本锚点 Transform textAnchor = enemy.transform.Find("TextAnchor"); if(textAnchor == null) { Debug.LogError("Zombie预制体里找不到TextAnchor这个物体哦!"); return null; } // 把文本实例化到锚点下,自动继承锚点的位置和旋转 GameObject wordobj = Instantiate(wordpb, textAnchor.position, Quaternion.identity, textAnchor); DisplayWord displayWord = wordobj.GetComponent<DisplayWord>(); return displayWord; }
- 别忘了调整文本预制体的RectTransform:如果是UI文本,把锚点设成居中,调整好大小,确保在World Space模式下能正常显示。
这个方案的好处就是一劳永逸,性能还好,完全不用操心更新位置的事儿。
方案二:让文本每一帧“追”着僵尸跑(适合不能改僵尸预制体的情况)
要是你不想动Zombie预制体,那就给DisplayWord加个Update方法,让它每一帧都同步僵尸的位置:
首先,在DisplayWord里存好要跟随的僵尸引用:
public Text text; public EnemyOne targetEnemy; // 要跟着的那个僵尸 void Update() { if(targetEnemy != null) { // 同步位置,这里可以加个y轴偏移让文本在头顶,别和僵尸叠一起 transform.position = new Vector2(targetEnemy.transform.position.x, targetEnemy.transform.position.y + 1f); } } public void SetWord(string word) { text.text = word; } // 其他方法保持不变...
然后改一下WordSpawner的Spawn方法,把僵尸的引用传给文本:
public DisplayWord Spawn() { // 初始位置加个偏移,避免一开始就叠在僵尸身上 Vector2 targetPos = new Vector2(enemy.transform.position.x, enemy.transform.position.y + 1f); GameObject wordobj = Instantiate(wordpb, targetPos, Quaternion.identity, canvas); DisplayWord displayWord = wordobj.GetComponent<DisplayWord>(); // 把要跟随的僵尸传给文本 displayWord.targetEnemy = enemy; return displayWord; }
这种方法虽然能解决问题,但每一帧都要更新位置,不如子物体方案优雅,不过胜在不用改僵尸预制体。
小提醒
- 确保你的Canvas模式是Screen Space - Camera或者World Space,而且World Camera已经正确赋值了!如果是Screen Space - Overlay模式,直接用世界坐标会出问题的。
- 调整文本位置时记得加个偏移量,比如y轴+1,这样文本会飘在僵尸头顶,看着更舒服~
内容的提问来源于stack exchange,提问作者drunkdazed




