、发现状态机、了解状态机
实现人物受伤后会被击退
isHurt用于标记人物是否受到伤害:
详详细解释:
但是在实际测试中我们发现了这个isHurt一旦被设置成了true,在角色被击退后就无法再回到false状态,从而导致角色一直被击退直到碰到墙体或掉出地图
isHurt解除true状态的办法
首先找到animator,找到我们受伤的动画的状态:
在右侧的Inspector中选择Add Behaviour,自定义类名HurtAnimation
然后他会自动生成一个代码,打开此代码:
在动画退出时刻,将isHurt设置为false就可以解决此问题(注意,打开代码后,里面的东西都是被注释掉的,想用的话取消注释即可)
状态机:
单次播放动画设置
如果你连接到了any state中的话想进行单词播放动画的设置就这么操作,没有连接到any state的不用这么操作
取消勾选就行
通过代码订阅事件的方式
想为一个事件添加一个监听器使用+=符号,移除监听器使用-=
inputControl.GamePlay.Attack.started += PlayerAttack;
inputControl.GamePlay.Attack.started -= PlayerAttack;
问:你再详细讲讲通过代码订阅了事件,还是拿上面给的进行说明,就是我那这个GetHurt函数订阅了OnTakeDamage,那OnTakeDamage发生的时候就会调用我的GetHurt吗?那订阅是在哪里进行订阅呢?在哪里取消?
在Unity中,通过代码订阅事件是一种常见的做法,它允许你在运行时动态绑定事件处理器。这给了你更多的灵活性,因为你可以根据需要添加或移除事件监听器。以下是如何在代码中进行订阅和取消订阅的详细步骤:
订阅事件
通常,你会在组件的生命周期方法中订阅事件,如 Awake
, Start
, 或者 OnEnable
。这些方法是在组件初始化的时候被调用的,因此它们是绑定事件监听器的好地方。
void OnEnable() { // 假设你已经获取了Character组件的引用 character.OnTakeDamage.AddListener(GetHurt); }
在上述代码中,OnTakeDamage
是一个 UnityEvent
类型的事件。使用 AddListener
方法,你可以将 GetHurt
方法添加为这个事件的监听器。当 OnTakeDamage
事件被触发时,GetHurt
方法会被调用。
一个事件是可以被多个函数订阅的
要注意的是,当事件被触发时,订阅的方法将按照它们被添加到事件的顺序依次被调用。如果其中一个方法在执行时抛出了异常,它将阻止后续的方法被调用,所以建议在事件处理方法中进行适当的异常处理。
协程Coroutine
协程(Coroutine)是一种特殊的方法,它允许执行能够暂停和继续的代码,而不会阻塞游戏的主线程。协程对于实现延迟操作、时间控制行为或执行需要跨多个帧的任务非常有用。
协程的工作原理是通过 IEnumerator
接口,这允许函数在某一点“暂停”,并在下一个帧或指定的时间后“继续”执行。在 Unity 中,协程通常与 yield
语句一起使用,它指示何时暂停协程的执行。
定义协程:协程是一个返回 IEnumerator
类型的方法。
在 Unity 中,Update
方法和协程是并行执行的,它们各自独立于 Unity 的游戏循环中。
Update
方法:它是 Unity 生命周期的一部分,每一帧都会调用一次。它主要用于处理帧依赖的逻辑,如玩家输入和快速更新。
协程不是多线程。它们在 Unity 的主线程上“异步”运行。