Unity C#脚本问题:点击对象切换激活状态失效排查
Unity 3D点击切换模型显示/隐藏问题修复
你的脚本存在三个核心问题:
- 变量未初始化:
SittingGuyc和StandingGuyc是私有变量,没有赋值就调用SetActive,会直接触发空引用异常。 - 点击触发条件缺失:
OnMouseUpAsButton需要目标对象带有碰撞体组件(如BoxCollider/SphereCollider),且碰撞体的Is Trigger不能勾选,否则无法触发鼠标点击事件。 - 逻辑不完整:当前只实现了从坐姿切换到站姿的单向逻辑,没有处理反向切换的情况。
修正后的脚本代码
using UnityEngine; public class ModelToggle : MonoBehaviour { // 用[SerializeField]让变量在Inspector面板可见,方便手动赋值 [SerializeField] private GameObject sittingGuy; [SerializeField] private GameObject standingGuy; private void Start() { // 初始化默认显示状态(确保两个模型状态互斥) if (sittingGuy != null && standingGuy != null) { sittingGuy.SetActive(true); standingGuy.SetActive(false); } } private void OnMouseUpAsButton() { // 先检查变量是否赋值,避免空引用报错 if (sittingGuy == null || standingGuy == null) { Debug.LogError("请在Inspector面板中为sittingGuy和standingGuy绑定对应模型!"); return; } // 双向切换模型激活状态 sittingGuy.SetActive(!sittingGuy.activeSelf); standingGuy.SetActive(!standingGuy.activeSelf); } }
操作步骤:
- 将脚本挂载到任意一个模型对象上,或单独创建空对象作为管理器挂载。
- 在Unity Inspector面板中,把坐姿模型拖入
sittingGuy字段,站姿模型拖入standingGuy字段。 - 给两个模型都添加碰撞体组件(如
BoxCollider),调整碰撞体大小使其覆盖模型,确保Is Trigger未勾选。 - 运行场景,点击当前显示的模型,即可切换到另一个模型。
额外排查点:
- 若点击无反应,检查模型是否在相机视野内,碰撞体是否被其他物体遮挡。
- 可在
OnMouseUpAsButton开头添加Debug.Log("点击触发"),验证点击事件是否正常响应。
内容的提问来源于stack exchange,提问作者Tnecniw
相关产品推荐
相关产品推荐

