Unity3D中点击UI Toolkit制作的UI按钮如何触发角色播放指定动画
问题原因梳理
- 语法错误:
UIController中把DeporteButton_clicked方法嵌套写在了OnEnable生命周期函数内,C#不支持方法嵌套,运行会直接报编译错误 - 组件获取错误:
UIController挂载在UIDocument对象上,你在角色身上的PlayerController中调用GetComponent<UIController>(),只能获取角色对象自身挂载的组件,自然找不到UIDocument上的UIController,所以返回null输出Button not pressed - 缺失必要引用:
UIController中没有提前获取UIDocument的rootVisualElement,也没有定义animator变量,直接调用会触发空引用报错 - 事件重复绑定:你已经在
UIController的OnEnable中绑定了按钮点击事件,不需要在PlayerController中重复绑定
解决步骤
- 修正
UIController代码,调整结构补全缺失内容:
using UnityEngine; using UnityEngine.UIElements; public class UIController : MonoBehaviour { // 按钮变量 public Button deporteButton; public Button lecturaButton; public Button trabajoButton; public Button vacunacionButton; public Button gatoButton; public Button perroButton; public Button ratonButton; // 提前声明Animator,后续手动赋值角色的Animator组件 public Animator roleAnimator; // UIDocument的根元素 private VisualElement rootVisualElement; private void OnEnable() { // 先获取当前对象上的UIDocument,拿到根元素 rootVisualElement = GetComponent<UIDocument>().rootVisualElement; // 查找所有按钮 deporteButton = rootVisualElement.Q<Button>("deporte-button"); lecturaButton = rootVisualElement.Q<Button>("lectura-button"); trabajoButton = rootVisualElement.Q<Button>("trabajo-button"); vacunacionButton = rootVisualElement.Q<Button>("vacunacion-button"); gatoButton = rootVisualElement.Q<Button>("gato-button"); perroButton = rootVisualElement.Q<Button>("perro-button"); ratonButton = rootVisualElement.Q<Button>("raton-button"); // 绑定点击事件 deporteButton.clicked += DeporteButton_clicked; // 其他按钮的绑定逻辑可以按这个格式补充 } // 把方法从OnEnable里移出来 private void DeporteButton_clicked() { // 切换动画前先把其他布尔参数设为false,避免动画状态混乱 ResetAllAnimParams(); roleAnimator.SetBool("deporteAn", true); Debug.Log("Deporte clicked"); } // 补充重置所有动画参数的方法,切换动画时调用 private void ResetAllAnimParams() { roleAnimator.SetBool("deporteAn", false); // 其他动画参数的重置也按这个格式补充 } }
- 组件挂载与赋值
- 保持
UIController挂载在UIDocument对象上 - 选中UIDocument对象,在Inspector面板把场景中的角色对象拖到
UIController组件的roleAnimator字段上,自动绑定角色的Animator组件
- 保持
- 删掉冗余的
PlayerController脚本逻辑即可,不需要额外通过角色脚本绑定UI事件
内容的提问来源于stack exchange,提问作者Aleja Salcedo
相关产品推荐
相关产品推荐

