Godot-StartUP

创建于:2018-07-28

创建人: Justus

44 信息 154 成员
讨论基于Godot以及Unity引擎的游戏开发经验,理论和最佳实践。共享一些通用思路以启发另一种生产工具中的实践。独立开发群QQ: 122017359

[Godot] 如何实现简易的状态机

廿木 2018-08-18

Godot简易状态机


Godot做角色移动的时候,为了不让代码在一个脚本里扎堆强奸我们的眼睛和大脑,就需要做一些小优化,比如,用状态机。


本文将介绍如何在godot里控制角色移动动画根据移动方向而切换,并进行移动。


  • 项目构成:

  1. 以kinematicBody2d为根节点的玩家节点

Image title

        2.角色运动图集(玩家节点中的Sprite)

 Image title

        3. 控制角色运动动画的animationPlayer(玩家节点中的AnimationPlayer)

   我根据图集创建了3个动画,分别是“待机(idle)”、“向左跑(runLeft)”和“向右跑(runright)”

Image title

        4. 绑定在角色节点kinematicBody2d上的脚本dog_mov.gd(详情在下面)

        5. 简易的状态机脚本Bh_dog_test.gd(详情在下面)


  • 脚本介绍

        1.dog_mov.gd:

   这个脚本并不控制动画切换,只是提供了动画切换的函数,方便调用:

Image title

其中aniPlayer是玩家节点中的AnimationPlayer

Image title

在脚本里我定义了角色移动方向和速度

Image title

定义了移动函数:

Image title

并在_physics_process(delta):里控制移动:

Image title

这个函数里的bhv就是状态机实例,下面会继续介绍,而上面这个脚本就介绍结束了,并没有什么太复杂的内容。


        2. Bh_dog_test.gd

首先是定义变量和设置构造函数_init()

Image title

如果对funcref(obj,funcName)不熟悉的可以看这里:

[GodotAPI][FuncRef]

[GodotAPI][@GDScript.funcref]

当然你也可以用 signal 来做,目的是只调用一个函数,而函数内容根据条件变化

obj就是dog_mov.gd实例,现在在dog_move.gd中就可以新建一个Bh_dog_test.dg实例了:

Image title

回到Bh_dog_test.gd,编码状态机:


状态机的状态转换示意图:Image title

待机状态(idle):

 Image title

奔跑状态(running)

 Image title

再细分左右奔跑(runleft,runright)

 Image title

以上就是角色动画切换的状态机,其实角色移动控制也可以写在这里面的,看个人喜好吧。


至于为什么只截图,不发代码,由于过于简单,大家还是自己动手打打吧(手动笑哭)。


最终效果


Image title



(转发自:原日志地址

近期喜欢的会员

 
nemo 2018-08-22

我之前也试着实现过状态机,用的是 class 的继承。

不过当时编辑器的类型推导功能很弱,所以自动补全不工作,写起来很烦...

大概在 godot 3.1 中用 type hint 会好些吧

 
gakki_sama 2018-10-19

这个方法,感觉比在input里输入play_animation复杂啊,大佬

 
廿木 2018-10-20

gakki_sama 当然如果只是让角色动起来在input里直接控制也就很直观了,但是状态机的作用不限于角色运动,也可以用于游戏循环,回合控制等情况。这里只是给出状态机的一种实现,godot实现状态机还是挺灵活的。

 
gakki_sama 2018-10-21

Niilii 我更希望大佬可以讲解一下回合控制,整好我没什么思路........thx

 

加入 indienova

  • 建立个人/工作室档案
  • 建立开发中的游戏档案
  • 关注个人/工作室动态
  • 寻找合作伙伴共同开发
  • 寻求线上发行
  • 更多服务……
登录/注册