Godot FunctionTree 功能树 简单使用教程

Posted 张学徒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Godot FunctionTree 功能树 简单使用教程相关的知识,希望对你有一定的参考价值。

Godot 功能树

项目地址:Apprentice/FunctionTree (gitee.com)

使用 FunctionTree 快速开发角色功能

示例教程

在 test 文件夹中有个 test01 示例,可进入参考查看

添加基本节点

在一个 KinematicBody2D 节点下点击添加节点,搜索 FunctionRoot 点击添加。添加后选中 FunctionRoot ,右侧将会出现一列可添加的节点列表,双击天机 BlackboardStandardCustom 节点

场景根节点更名为 Player,创建一个 player 文件夹,保存场景到里面。

添加移动功能

选中 Standard 节点,添加 Actions 节点,然后选中 Actions 节点,双击添加右侧节点列表中的 Move 节点


选中 Custom 节点,添加 Controllers 节点,然后选中 Controllers 节点,双击添加 CustomFunction 节点


双击场景树中的 CustomFunction 节点,重命名为 CMove,意为 Control Move(控制移动),然后在编辑器最右侧检查器面板中给这个脚本扩展一下



在代码编辑视图中按下 Ctrl + Alt + Shift + S ,或者点击代码编辑上的代码菜单(这个是我自己的一个脚本插件添加上的,默认没有这个),如下图,然后弹出重写函数弹窗,勾选 _process_input 方法,点击 OK 按钮


生成如下代码:

extends "res://addons/function_tree/src/custom/CustomFunction.gd"


#(override)
func _process_input(arg0):
	._process_input(arg0)
	pass

重写 _process_input ,获取用户输入,根据玩家按下的键盘控制节点移动

extends "res://addons/function_tree/src/custom/CustomFunction.gd"


#(override)
func _process_input(arg0):
    # 获取用户输入(下面四个是小键盘上的按键,按下进行控制)
	var dir = Input.get_vector("ui_left","ui_right","ui_up","ui_down")
    # 获取 Move 功能节点,操控其移动
	get_function("Move").control(dir)

我们将文件系统中 icon.png ,Godot 小图标拖拽到场景中

还差一点,给场景根节点 Player 添加一个脚本,并写入如下代码

extends KinematicBody2D


export var move_speed : int = 300


onready var root = $FunctionRoot


func _ready():
	# 设置移动速度
	root.get_property().move_speed = move_speed

让我们按下 F6 ,进行运行当前场景,按下小键盘进行移动

添加旋转功能

选中场景树中的 Actions 节点,双击添加 TurnTo 节点,选中 Controllers 节点,双击右侧 CustomFunction 添加节点,并重命名为 CTurnTo,选中这个 CTurnTo 节点,在编辑器最右侧检查器面板中进行扩展脚本


在代码编辑视图中按下 Ctrl + Alt + Shift + S ,或者点击代码编辑上的代码菜单,弹出窗口中勾选 _process_input ,点击 OK,写入控制旋转代码,让节点随着鼠标位置进行旋转,脚本代码如下

extends "res://addons/function_tree/src/custom/CustomFunction.gd"


#(override)
func _process_input(arg0):
	# 获取鼠标的全局位置
	var mouse_pos = (host as Node2D).get_global_mouse_position()
	# 旋转到鼠标位置
	get_function("TurnTo").control(mouse_pos)

按下 F6 运行当前场景,按小键盘让角色移动到场景中,鼠标移动一下查看是否进行了旋转

添加技能

选中 Standard 节点,添加 Skills 节点,然后选中 Skills 节点,双击添加右侧节点列表中的 Sprint 节点,选中 Sprint 节点,修改 duration 属性持续时间设为 0.5


添加键位映射,添加鼠标的映射,添加 click


设置为鼠标左键点击

Godot 的 Input 类获取 click 事件,就代表要获取鼠标点击的事件,点击 关闭 按钮


选中场景树中的 Controllers 节点,双击右侧 CustomFunction 添加节点,并重命名为 CSprint,选中这个 CSprint 节点,在编辑器最右侧检查器面板中进行扩展脚本,重写 _process_input 方法,控制 Sprint 技能的使用 ,脚本代码如下

extends "res://addons/function_tree/src/custom/CustomFunction.gd"


#(override)
func _process_input(arg0):
	if Input.is_action_pressed("click"):
		# 获取鼠标的全局位置
		var mouse_pos = (host as Node2D).get_global_mouse_position()
		# 操作 Sprint 方法,冲刺到鼠标位置
		get_function("Sprint").control(mouse_pos)

按下 F6 运行当前场景,点击鼠标,看看节点是否进行了冲刺


经过这个简单的教程之后,不知你对这个插件是否有了兴趣?现在我将介绍一下这个插件的一个制作思路。分为 Standard 类的节点和 Custom 类的节点。将通用功能放在 Standard 类下的节点,将各种各样的逻辑和操作写在 Custom 类的节点下,在 Custom 下的节点中调用 Standard 下的节点的功能。如此进行分类。

根节点
标准节点
自定义节点
标准节点层1
标准节点层...
自定义节点层...
Function1
Function2
自定义子节点...
自定义子节点...

Standard 与 Custom 下的节点的区别

Standard 类下方的子节点尽量都不要重写(如果你了解这个节点的执行逻辑的话,也可以扩展脚本,但不建议这样做)

Custom 类下方的子节点都要进行重写才能使用其功能,否则其只有逻辑,没有功能没有效果

Standard 下的节点提供功能,节点只进行属性的设置,增加功能节点;在 Custom 下的节点中进行扩展脚本调用 Standard 下的节点的功能。

以上是关于Godot FunctionTree 功能树 简单使用教程的主要内容,如果未能解决你的问题,请参考以下文章

Godot行为树

Godot行为树插件

Godot 4.0一个简单的匿名方法的使用lambda

Godot 4.0一个简单的匿名方法的使用lambda

Godot数据响应的方式执行功能

Godot数据响应的方式执行功能