unity中OnEnable()和OnDisable()

博客进行了OnEnable()和OnDisable()的测试,在场景的cube上挂载脚本TestOne.cs,在另一物体上挂载脚本TestTwo.cs。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里做一个关于OnEnable()和OnDisable()个测试。在场景中cube上挂一个脚本TestOne.cs,然后在另一物体上挂脚本TestTwo.cs;

TestOne如下:

public class TestOne : MonoBehaviour {

    private void OnEnable() 
    {
        print("激活");
    }
    private void OnDisable() 
    {
        print("禁止");
    }
}```

TestTwo.cs如下:

void Update ()
    {
        //MouseRotate2();
        MouseRotate();
        testActive();
    }
    private void OnEnable() //只在程序启动时执行一次,因为TestTwo脚本并没有挂在cube上
    {
        print("启用");
    }
    private void OnDisable() //只在程序停止时执行一次,因为TestTwo脚本并没有挂在cube上
    {
        print("禁调");
    }
    void testActive()
    {
        if(Input.GetKeyDown(KeyCode.A))
        {
            // cube.gameObject.SetActive(false);//游戏对象.setActive(false)会激发游戏对象上挂的脚本中的OnDisable()方法(前提是该游戏对象的状态由true到false发生转变);
            // cube.GetComponent<MeshRenderer>().enabled = false; //这种情况下onEnable和onDisable不会被调用的(enable()方法只是控制对象在屏幕上是否渲染出现,碰撞还是可以检测到的哦);
            Destroy(cube.gameObject); //destroy游戏对象会激发游戏对象上挂的脚本中的OnDisable()方法;
        }
        if(Input.GetKeyDown(KeyCode.B))
        {
            //cube.gameObject.SetActive(true);//游戏对象.setActive(true)会激发游戏对象上挂的脚本中的OnEnable()方法(前提是该游戏对象的状态由false到true发生转变);
            // cube.GetComponent<MeshRenderer>().enabled = true;
            Object cc =Resources.Load("Cube");//重新创造该游戏对象也会激发对象上挂脚本中的OnEnable()方法;
            GameObject vv = (GameObject) Instantiate(cc, Vector3.zero, Quaternion.identity);
        }
    }
<think>好的,我现在需要回答用户关于UnityOnEnable方法的使用说明示例代码的问题。首先,我得回忆一下自己对Unity的了解,特别是OnEnable方法的用途调用时机。根据用户提供的引用内容,特别是引用[1]中提到,当调用SetActive(true)时,OnEnable方法会被自动调用。这说明OnEnable与对象的激活状态有关。我需要确认这一点是否正确,以及是否有其他触发OnEnable的情况,比如脚本组件被启用时。 接下来,用户需要具体的使用说明示例代码。我应该分点说明OnEnable的触发条件、常见用途,并给出一个简单的代码示例。同时,要注意用户可能想知道OnEnable与其他生命周期方法如StartAwake的区别,是否需要提及? 另外,用户可能还想了解何时使用OnEnable而不是Start,或者两者之间的执行顺序。例如,Start在脚本实例的生命周期中只调用一次,而OnEnable可能在每次激活时都调用。这点需要明确说明。还要注意代码的格式,按照用户的要求,代码块需要用Python的三引号包裹,但这里示例代码是C#,可能需要调整格式。用户示例中的Python代码是否正确?可能需要检查,但用户现在的问题是关于C#的Unity代码,所以应该用正确的语法。另外,用户提到引用[2]中关于委托事件的内容,但当前问题与OnEnable相关,可能暂时不需要涉及事件处理,除非OnEnable中常用到事件注册。如果有必要,可以简要提及,比如在OnEnable中注册事件,在OnDisable中注销,以避免内存泄漏。最后,生成的相关问题需要与OnEnable相关,比如与其他生命周期方法的对比、使用注意事项或常见错误等。需要确保问题有针对性,帮助用户深入理解。 总结步骤: 1.解释OnEnable的功能触发条件。 2.说明常见使用场景,如初始化、事件注册。3.提供示例代码,展示基本用法。4.对比OnEnable与其他方法如Start、Awake的区别。 5.注意事项,比如多次调用的问题。 6.生成相关问题,比如使用时机、性能影响等。需要确保回答结构清晰,分点说明,符合用户要求的格式,并且正确引用提供的资料。同时检查LaTeX是否符合要求,但当前问题可能不涉及数学公式,所以可能不需要使用。但如果有代码块,需正确标记。</think>### Unity OnEnable方法使用说明 #### 一、功能与触发条件 1. **自动调用时机** - 当游戏对象**首次被激活**时(如`SetActive(true)`)[^1] - 当脚本组件**启用**时(如`enabled = true`) - 对象**从非激活状态变为激活状态**时(包括场景加载时默认激活的对象) 2. **生命周期位置** `OnEnable`属于Unity生命周期中较早阶段的方法,执行顺序为: `Awake` → `OnEnable` → `Start` #### 二、常见使用场景 1. **初始化动态数据** 例如:重置状态、加载资源 ```csharp private void OnEnable() { health = maxHealth; // 每次激活时重置血量 } ``` 2. **事件注册** 通常在`OnEnable`中注册事件,并在`OnDisable`中注销以避免内存泄漏[^2]: ```csharp private void OnEnable() { GameManager.OnPlayerDeath += HandleDeath; } private void OnDisable() { GameManager.OnPlayerDeath -= HandleDeath; } ``` 3. **UI组件初始化** 适用于需要动态更新的UI元素: ```csharp public Text scoreText; private void OnEnable() { scoreText.text = "当前分数:" + GameManager.score; } ``` #### 三、注意事项 1. **多次调用问题** 若对象反复激活/禁用,`OnEnable`会被多次调用,需确保代码具有幂等性。 2. **与Start的区别** | 方法 | 调用次数 | 执行顺序 | 适用场景 | |-----------|----------|-------------------|------------------------| | `Start` | 仅一次 | 在首次`OnEnable`后 | 持久化初始化(如组件获取) | | `OnEnable`| 多次 | 每次激活时 | 状态重置、事件绑定 | #### 四、完整示例 ```csharp using UnityEngine; using UnityEngine.UI; public class PlayerHUD : MonoBehaviour { [SerializeField] private Slider healthBar; private void OnEnable() { PlayerStats.OnHealthChanged += UpdateHealthUI; healthBar.value = PlayerStats.CurrentHealth; // 激活时同步最新状态 } private void OnDisable() { PlayerStats.OnHealthChanged -= UpdateHealthUI; } private void UpdateHealthUI(float newHealth) { healthBar.value = newHealth; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值