今天在学习unity的Eventhandle的图中写了一个状态管理器如下
namespace stateManager
{ public enum Damage
{
Other,
Foot,
Hand,
Head,
}
}
public class StateManager : MonoBehaviour
{
private float _health;
public event EventHandler<StateChangeDelegate> StateChangeEventHandle;
public float Health { get { return _health; } set { _health = value; } }
private void Awake()
{
}
void Start()
{
StateChangeEventHandle+= OnHealthChange;
}
void Update()
{
if (StateChangeEventHandle!=null)
{
Debug.Log("我有事件监听");
}
}
void OnHealthChange(object sender, StateChangeDelegate e)
{
Debug.Log(e.DamageType+"我被打到了");
this.Health -=e.Damage;
}
public void TriggerStateChangeEvent(StateChangeDelegate stateChangeDelegate)
{
StateChangeEventHandle?.Invoke(this, stateChangeDelegate);
}
}
public class StateChangeDelegate:EventArgs
{
public float Damage;
public stateManager.Damage DamageType;
public StateChangeDelegate(float damage, stateManager.Damage damageType)
{
Damage = damage;
DamageType = damageType;
}
}
随后写了一个触发器来执行:
public class fuckyou:MonoBehaviour
{
public StateManager StateManager;
public void Start()
{
StateManager.TriggerStateChangeEvent(new StateChangeDelegate(10,stateManager.Damage.Foot));
}
}
随后放两个测试盒子去运行,但是比较遗憾,并不能成功执行,可能是因为这两个start重合了,那没问题我将handle的增加函数事件放到了awake中,但是依然没有作用。
随后我改了一下第二个加了个线程:
public void Start()
{
StartCoroutine(Attack());
}
public IEnumerator Attack()
{
yield return null;
StateManager.TriggerStateChangeEvent(new StateChangeDelegate(10,stateManager.Damage.Foot));
}
然后看到了最后的结果成功执行

再次通过debug发现attack是先执行,stateManager是后执行,二者的start和update是交替执行并没有问题 先是attack的start执行了然后跑到了协程的yield return null 但是依然在第一次update之后没有执行击打函数,说明yield是严格按流程及时提前跑到了也是放到缓存中等update之后运行,因此在debug时才出现update运行两次之后才进行下面的操作,而在中间没有跑到yield的情况,这下就明朗了。
在start中使用协程之后会直接执行协程中内容直到yield return null , 此时这个会被放进缓存中等待update,随后进行了第一次update处理了yield return null ,随后进行了第二次update 之后处理了协程中return后面的内容。
评论(0)
暂无评论