void Awake () { enabled = false; }的理解

本文介绍了Unity中脚本的生命周期,包括Awake、OnEnable、Start等方法的执行顺序及应用场景。Awake作为生命周期的开始,用于初始化;OnEnable在脚本启用时调用;Start仅在脚本第一次启用且未被禁用过时执行。

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

最先执行的方法是Awake,这是生命周期的开始,用于进行激活时的初始化代码,一般可以在这个地方将当前脚本禁用:this.enable=false,如果这样做了,则会直接跳转到OnDisable方法执行一次,然后其它的任何方法,都将不再被执行。

  如果当前脚本处于可用状态,则正常的执行顺序是继续向下执行OnEnable,当然我们可以在另外一个脚本中实现这个脚本组件的启动:this.enab=true;

  再向下执行,会进行一个判断,如果Start方法还没有被执行,则会被执行一次,如果已经被执行了,则不会再被执行。这是个什么意思呢?我们可以在某个脚本中将组件禁用this.enable=false,再启用时会转到OnEnable处执行,这时继续向下走,发现Start执行过了,将不再被执行。

参考地址:http://www.unitymanual.com/thread-27292-1-1.html

using UnityEngine; using UnityEngine.UI; public class 自机血量与复活 : MonoBehaviour { public static 自机血量与复活 Instance { get; private set; } public GameObject 自机预制体; private GameObject 自机实例; private bool 正在移动 = false; private readonly float 移动速度 = 3f; private readonly float 目标Y = -4f; private readonly float 容差 = 0.01f; private float 无敌时间 = 3f; private float temp; void Awake() { Instance = this; } void Start() { temp = 资源管理.Instance.当前残机数; // 直接减少残机数 } void Update() { if (自机实例 == null) { 自机实例 = GameObject.FindGameObjectWithTag("自机"); } // 需要创建新自机 if (自机实例 == null && !正在移动) { 自机实例 = Instantiate(自机预制体, transform.position, Quaternion.identity); 正在移动 = true; 资源管理.Instance.当前残机数 -= 1; // 直接减少残机数 } // 处理自机移动 if (正在移动 && 自机实例 != null) { float 新Y = Mathf.MoveTowards(自机实例.transform.position.y, 目标Y, 移动速度 * Time.deltaTime); 自机实例.transform.position = new Vector3(transform.position.x, 新Y, transform.position.z); if (Mathf.Abs(自机实例.transform.position.y - 目标Y) < 容差) { 正在移动 = false; } } if (temp < 资源管理.Instance.当前残机数) { if(无敌时间 > 0) { 无敌时间 -= Time.deltaTime; 自机实例.tag = "无敌"; } temp--; 自机实例 .tag = "自机"; 无敌时间 = 3f; } } } using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class 死亡检查 : MonoBehaviour { public Image 满身疮痍; private 自机血量与复活 自机血量与复活脚本; // Start is called before the first frame update void Start() { 自机血量与复活脚本 = GameObject.Find("自机血量与复活").GetComponent<自机血量与复活>(); } // Update is called once per frame void Update() { if (资源管理.Instance.当前残机数 < 0) { 满身疮痍.enabled = true; 自机血量与复活脚本.enabled = false; } else { 满身疮痍.enabled = false; 自机血量与复活脚本.enabled = true; } } } NullReferenceException: Object reference not set to an instance of an object 死亡检查.Update () (at Assets/UI/资源&UI/死亡检查.cs:27)
最新发布
08-09
using System.Collections; using System.Collections.Generic; using UnityEngine; /*主要任务: *1.管理敌人的当前生命值和最大生命值。 *2.处理敌人受伤的逻辑,包括伤害冷却时间和受伤停顿。 *3.控制敌人动画(例如受伤和死亡动画)。 *4.处理敌人死亡后将其返回到对象池。 *5.与其他组件(如 healthBar、MonsterPatrol 和 enemyPool)交互。 */ public class enemylife : MonoBehaviour { public Animator anim; public int MaxHealth = 10; public int currentHealth; public healthBar healthbar; public bool isHurt = false; public bool isDie = false; public EnemyBehaviorLogic enemyBehaviorLogic; private PlayerATK playerATK; [Header("对象池")] public enemyPool enemyPool; private float lastDamageTime = 0f; // 记录上次受伤害的时间 public float damageCooldown = 0.5f; // 伤害冷却时间 [Header("受伤停顿")] public static bool isStunned = false; private Coroutine currentStunCoroutine; private void Awake() { enemyPool = FindObjectOfType<enemyPool>(); playerATK = FindObjectOfType<PlayerATK>(); } void Start() { currentHealth = MaxHealth; } void FixedUpdate() { enemyIsActive(); if (currentHealth <= 0 && !isDie) { anim.SetTrigger("die"); Debug.Log("敌人死亡"); isDie = true; StartCoroutine(DieAfterDelay()); } } // 延迟处理敌人死亡逻辑 private IEnumerator DieAfterDelay() { yield return new WaitForSeconds(0.5f); gameObject.SetActive(false); EnemyDefeated(gameObject); } //是否受到攻击----逻辑的开始 private void OnTriggerStay2D(Collider2D other) { if (other.CompareTag("attack")) { float currentTime = Time.time; if (currentTime - lastDamageTime >= damageCooldown) { lastDamageTime = currentTime; PlayerDamage(playerATK.PlayerDamage); OnEnemyHurt(); } } } private void PlayerDamage(int damage) { // 确保每次伤害都能触发动画和血条更新 currentHealth -= damage; healthba
03-17
using UnityEngine; public class 自机血量与复活 : MonoBehaviour { public static 自机血量与复活 Instance { get; private set; } public GameObject 自机预制体; private GameObject 自机实例; private bool 正在移动 = false; private readonly float 移动速度 = 3f; private readonly float 目标Y = -4f; private readonly float 容差 = 0.01f; void Awake() { Instance = this; } void Update() { if (自机实例 == null) { 自机实例 = GameObject.FindGameObjectWithTag("自机"); } // 需要创建新自机 if (自机实例 == null && !正在移动) { 自机实例 = Instantiate(自机预制体, transform.position, Quaternion.identity); 正在移动 = true; 资源管理.Instance.当前残机数 -= 1; // 直接减少残机数 } // 处理自机移动 if (正在移动 && 自机实例 != null) { float 新Y = Mathf.MoveTowards(自机实例.transform.position.y, 目标Y, 移动速度 * Time.deltaTime); 自机实例.transform.position = new Vector3(transform.position.x, 新Y, transform.position.z); if (Mathf.Abs(自机实例.transform.position.y - 目标Y) < 容差) { 正在移动 = false; } } } } using UnityEngine; public class 资源管理 : MonoBehaviour { public static 资源管理 Instance { get; private set; } public float 当前残机数 = 2; public float 当前符卡数 = 2; public float 当前火力 = 1; void Awake() { // 单例初始化 if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); // 跨场景保留 } else { Destroy(gameObject); } } } 帮我找到当残机等于0时的操作部分
08-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值