Unity不使用Update方法进行每帧更新的做法参考

有些时候,比如做一个可能要被继承的类,可能不希望在这个类的Update方法里面添加内容,因为继承的子类一旦在Update里面填写内容,会覆盖父类的内容,这时候可以考虑使用递归协程的方法来模拟Update的效果,代码类似下面的写法:

using System.Collections;
using UnityEngine;

public class TT : MonoBehaviour
{
    void OnEnable()
    {
        StartCoroutine(UpdateLoop());
    }

    int num = 0;
    IEnumerator UpdateLoop()
    {
        yield return null;
        Debug.Log(num++);
        StartCoroutine(UpdateLoop());
    }
}

协程的启动写在了OnEnable方法里面了,这样每次GameObject激活的时候都会启动协程,如果写到Start方法里面,如果GameObject不激活就会停止执行,即使再次激活也不会启动协程了。

还有一个需要说明的是停止这种递归协程的写法,请参考下面的代码:

	Coroutine coroutineGetEquipmentInfoByID = null;
	voidGetEquipmentInfoByID(bool isShow)
	{
		if (isShow)
		{
			coroutineGetEquipmentInfoByID = StartCoroutine(LoopGetEquipmentInfoByID());
		}
		else
		{
			if (coroutineGetEquipmentInfoByID != null)
			{
				StopCoroutine(coroutineGetEquipmentInfoByID);
				coroutineGetEquipmentInfoByID = null;
			}
		}
	}

	UnityAction<int> onGetEquipmentInfoByID;
	publicvoidAddActGetEquipmentInfoByID(UnityAction<int> act) { onGetEquipmentInfoByID -= act; onGetEquipmentInfoByID += act; }
	publicvoidRemoveActGetEquipmentInfoByID(UnityAction<int> act) { onGetEquipmentInfoByID -= act; }
	IEnumerator LoopGetEquipmentInfoByID()
	{
		onGetEquipmentInfoByID?.Invoke(equipment.equipmentID);
		yieldreturnnewWaitForSeconds(interval);
		coroutineGetEquipmentInfoByID = StartCoroutine(LoopGetEquipmentInfoByID());
	}

注意里面的第6行和第25行有两行相同的代码,如下:

coroutineGetEquipmentInfoByID = StartCoroutine(LoopGetEquipmentInfoByID());

这样才能保证coroutineGetEquipmentInfoByID指向的是当前正在执行的协程,也就能保证停止的是当前正在执行的协程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值