[Godot] 如何实现简易的状态机
Godot简易状态机
Godot做角色移动的时候,为了不让代码在一个脚本里扎堆强奸我们的眼睛和大脑,就需要做一些小优化,比如,用状态机。
本文将介绍如何在godot里控制角色移动动画根据移动方向而切换,并进行移动。
项目构成:
- 以kinematicBody2d为根节点的玩家节点
2.角色运动图集(玩家节点中的Sprite)
3. 控制角色运动动画的animationPlayer(玩家节点中的AnimationPlayer)
我根据图集创建了3个动画,分别是“待机(idle)”、“向左跑(runLeft)”和“向右跑(runright)”
4. 绑定在角色节点kinematicBody2d上的脚本dog_mov.gd(详情在下面)
5. 简易的状态机脚本Bh_dog_test.gd(详情在下面)
脚本介绍
1.dog_mov.gd:
这个脚本并不控制动画切换,只是提供了动画切换的函数,方便调用:
其中aniPlayer是玩家节点中的AnimationPlayer
在脚本里我定义了角色移动方向和速度
定义了移动函数:
并在_physics_process(delta):里控制移动:
这个函数里的bhv就是状态机实例,下面会继续介绍,而上面这个脚本就介绍结束了,并没有什么太复杂的内容。
2. Bh_dog_test.gd
首先是定义变量和设置构造函数_init()
如果对funcref(obj,funcName)不熟悉的可以看这里:
[GodotAPI][FuncRef]
[GodotAPI][@GDScript.funcref]
当然你也可以用 signal 来做,目的是只调用一个函数,而函数内容根据条件变化。
obj就是dog_mov.gd实例,现在在dog_move.gd中就可以新建一个Bh_dog_test.dg实例了:
回到Bh_dog_test.gd,编码状态机:
状态机的状态转换示意图:
待机状态(idle):
奔跑状态(running)
再细分左右奔跑(runleft,runright)
以上就是角色动画切换的状态机,其实角色移动控制也可以写在这里面的,看个人喜好吧。
至于为什么只截图,不发代码,由于过于简单,大家还是自己动手打打吧(手动笑哭)。
最终效果
这个方法,感觉比在input里输入play_animation复杂啊,大佬
gakki_sama 当然如果只是让角色动起来在input里直接控制也就很直观了,但是状态机的作用不限于角色运动,也可以用于游戏循环,回合控制等情况。这里只是给出状态机的一种实现,godot实现状态机还是挺灵活的。
Niilii 我更希望大佬可以讲解一下回合控制,整好我没什么思路........thx
我之前也试着实现过状态机,用的是 class 的继承。
不过当时编辑器的类型推导功能很弱,所以自动补全不工作,写起来很烦...
大概在 godot 3.1 中用 type hint 会好些吧