U3D自学(一) Enable、Disable及OnEnable()、OnDisable()、OnDestroy()。

本文介绍如何在Unity中使用C#脚本控制游戏对象的激活状态与Mesh渲染器的启用禁用,通过按键操作实现游戏对象的显示与隐藏。

Enable/Disable:属性是否可用

public class t : MonoBehaviour {
    public MeshRenderer CB;
	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            CB.enabled = !CB.enabled;
        }
	}
}

Active/Inactive:对象是否被激活

gameObject.Setactive(false);


在小程序或某些前端框架(如微信小程序、Taro、支付宝小程序等)中,组件的 `onEnable` 和 `onDisable` 方法并不是所有平台都原生支持的标准生命周期方法。但在些特定的开发框架或自定义组件系统中(例如 Unity 的 UI Toolkit、Cocos Creator、或者某些自研引擎),`onEnable` 和 `onDisable` 是常见的组件生命周期钩子。 我们以 **通用组件生命周期设计** 为背景来解释这两个方法的调用时机,并结合微信小程序自定义组件和 Unity 中的行为进行类比说明。 --- ### ✅ 正确理解:`onEnable` 和 `onDisable` 的调用时机 > **`onEnable` 和 `onDisable` 是每个组件实例独立调用的,不是只调次,而是每个组件实例在其状态变化时都会触发。** #### 调用时机: - `onEnable()`: - 当组件从“不可用”变为“可用”状态时调用。 - 通常发生在: - 组件被创建并挂载到节点上; - 组件所在的节点从隐藏变为显示(如 `active = true`); - 组件被添加到场景/父节点中且启用状态生效。 - `onDisable()`: - 当组件从“可用”变为“不可用”时调用。 - 通常发生在: - 组件所在节点被设为非激活(`active = false`); - 组件被移出场景但未销毁; - 节点被隐藏或暂停。 > ⚠️ 注意:这两个方法**不是全局只执行次**,而是**每个组件实例各执行自己的 `onEnable/onDisable`**,只要该实例的状态发生变化就会调用。 --- ### 示例代码(基于 Cocos Creator 或类似引擎) ```typescript import { _decorator, Component } from 'cc'; const { ccclass } = _decorator; @ccclass('MyComponent') export class MyComponent extends Component { onEnable() { console.log(`${this.node.name} 的组件已启用`); // 可在这里恢复监听、动画、定时器等 } onDisable() { console.log(`${this.node.name} 的组件已禁用`); // 可在这里取消事件监听、停止动画等 } start() { console.log(`${this.node.name} 组件启动`); } } ``` #### 场景演示: 假设有两个节点 NodeA 和 NodeB,都挂载了 `MyComponent`: 1. NodeA 启动 → 打印 `"NodeA 的组件已启用"` 2. NodeB 启动 → 打印 `"NodeB 的组件已启用"` 3. 设置 NodeA.active = false → 打印 `"NodeA 的组件已禁用"` 4. 再次设置 NodeA.active = true → 打印 `"NodeA 的组件已启用"` ✅ 每个实例独立响应自身的启用/禁用状态。 --- ### 对比微信小程序自定义组件(类比) 虽然微信小程序没有 `onEnable/onDisable`,但有类似的生命周期: | 状态 | 微信小程序对应机制 | |--------------|-------------------------------| | 首次显示 | `attached()` + `ready()` | | 隐藏/卸载 | `detached()` | | 显示/隐藏控制 | 需手动通过 `hidden` 控制,无自动 `onEnable/disable` | 如果你希望实现类似行为,可以这样模拟: ```js // 自定义组件模拟 onEnable/onDisable Component({ attached() { this.onEnable(); }, detached() { this.onDisable(); }, pageLifetimes: { show() { this.data.enabled && this.onEnable(); }, hide() { this.onDisable(); } }, methods: { onEnable() { console.log('组件启用'); // 启动定时器、监听事件等 }, onDisable() { console.log('组件禁用'); // 清理资源 }, setEnabled(enabled) { this.setData({ enabled }); if (enabled) this.onEnable(); else this.onDisable(); } } }) ``` --- ### 总结回答: > `onEnable` 和 `onDisable` 是**每个小组件实例在其启用或禁用时分别调用的**,不是仅第个创建时调用次。 > 每当个组件实例变为启用状态(如被激活、加入场景)时,就会调用其 `onEnable`; > 当它变为禁用状态(如隐藏、失活)时,调用 `onDisable`。 这与 `start()` 或 `awake()` 不同,后者通常只在初始化时调用次。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值