Unity 2D中如何通过UI Button切换跟随目标?
问题分析与解决方案
首先你的核心问题出在代码结构错误和未做空值校验,导致切换逻辑根本没机会正常运行:
1. 代码的核心问题
- 代码没有包裹在C#类中,成员变量
targets、targetedEnemy、currentTarget直接声明在类外部,这会直接导致编译失败,程序根本跑不起来。 currentTarget没有初始赋值,第一次执行Update时,GameObject.FindGameObjectsWithTag(currentTarget)相当于传入空字符串,返回空数组,后续访问targets[Random.Range(...)]会触发索引越界错误。- 每次调用
Follow()都重复查找对应标签的对象,效率低下,且未判断数组是否为空,若场景中没有对应标签的对象,依然会报错。
2. 修正后的代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FollowTarget : MonoBehaviour { private GameObject[] targets; private Transform targetedEnemy; // 给初始值,避免第一次调用时为空 public string currentTarget = "Player"; public float followSpeed = 2f; void Update() { Follow(); } public void Follow() { // 先判断目标标签是否有效 if(string.IsNullOrEmpty(currentTarget)) return; targets = GameObject.FindGameObjectsWithTag(currentTarget); if(targets.Length == 0) { Debug.LogWarning($"未找到标签为{currentTarget}的对象"); return; } // 随机选取一个目标 targetedEnemy = targets[Random.Range(0, targets.Length)].transform; transform.position = Vector3.MoveTowards(transform.position, targetedEnemy.position, followSpeed * Time.deltaTime); } public void SwitchToPlayer() { currentTarget = "Player"; // 可选:切换时立即执行跟随逻辑,无需等下一帧Update // Follow(); } public void SwitchToBoss() { currentTarget = "Boss"; // Follow(); } }
3. 按钮绑定的正确操作
你的第一种思路(给每个按钮绑定单独切换函数)完全可行,之前失败是因为代码编译错误:
- 将修正后的脚本挂载到需要跟随的GameObject上
- 在UI Button的
OnClick事件中,拖拽挂载了脚本的GameObject到事件列表 - 选择
FollowTarget -> SwitchToPlayer()(或SwitchToBoss())作为点击触发的函数
4. 关于你的疑问
- 你之前的
FollowEnemy()和FollowPlayer()修改的currentTarget不是局部变量,它是类的成员变量(类范围内全局有效),问题是代码结构错误导致这些函数根本没被正确执行。 - 完全可以通过修改这个全局的
currentTarget值来切换跟随目标,这是最简洁的方案,不需要写多个跟随脚本或复杂的启用/禁用逻辑。
内容的提问来源于stack exchange,提问作者Aru Alonless
相关产品推荐
相关产品推荐

