Godot 中关于命名方式

方法命名方式

使用蛇形命名法:单词之间通过下划线 _ 连接,比如 out_of_range

  • 下划线风格命名,全部小写+下划线。

  • 以开头不加 _ 下划线开头的变量和方法作为外部可调用控制的标识。

  • 以单个下划线作为内部的方法和可以被重写覆盖的方法。

Godot 方法命名风格

开头加一个下滑线的方法在 Godot 中随处可见 _ready_enter_tree_input,而且他们都是可以被重写的方法。例如:

Object 类中的

Node 类中的

开头带下划线的都是可以直接重写的方法,而且他们都没有任何功能,就是专门用于让你重写的。

例如 Object 类中的 _notificationnotification 方法一样,前者加了下划线的标志着是没有功能的方法,这种方法都是对象自身内部有他自己的运行机制的,在不同条件下会自动调用这个方法,就是让你根据自身需要来选择是否重写的方法;而后者开头没有加下划线,则是自身就是有功能的,让你根据需要去调用它的。

当然有些不加下划线的方法也可以,但是那样会覆盖掉他的功能,虽然也可以加上 .方法名([参数]) 的方式进行扩展方法,但如非方便或必要则不建议做。

示例:

那我们如果想做一个基础的类的脚本,想让他扩展更多的子类,那么就需要做一些类似的可扩展的方法,则这些可扩展重写的方法就像上面一样都加上下划线,而方法代码块中没有其他语句。

如果我要写一个状态机的基础状态类,那么他会至少有 进入状态退出状态 的方法需要用户根据需要去重写方法逻辑。那么我会至少有如下方法:

class_name BaseState
extends Node

signal entered
signal exited


## 进入状态
func enter_state():
    _enter_state()
    emit_signal("entered")

## 退出状态
func exit_state():
    _exit_state()
    emit_signal("exited")


func _enter_state():
    # 用于重写重写这个方法,在进入这个状态时生效
    pass

func _exit_state():
    # 重写这个方法,在退出这个状态时生效
    pass

func _state_process(delta):
    # 重写这个方法,当前状态的线程
    pass

#(省略其他代码)

那么在状态机根节点中的切换状态的逻辑中会是以下的调用逻辑

class_name StateMachineRoot
extends Node


# 当前运行的状态
var _run_state: BaseState


func _physics_process(delta):
    if _run_state:
        # 也并非绝对,如果你比较了解他的运行逻辑也可以直接这样调用,就像这个
        _run_state._state_process(delta)


##  切换状态
func trans_to_state(state):
    # 退出上个状态
    if _run_state != null:
        _run_state.exit_state() # 外部调用退出状态方法

    # 进入执行这个状态
    var state = get_child(state)
    state.enter_state() # 外部调用进入状态方法
    _run_state = state

#(省略其他代码)

这样在用户自己扩展各种状态类的时候,仅仅进行重写 _enter_state_exit_state_state_process 方法即可,而不能重写其他方法,否则可能会导致逻辑混乱错误。

变量名命名

  • 开头不加下划线,作为可以外部调用使用的变量

  • 开头加下划线,只作为内部的变量或者扩展的脚本使用,而不作为 对象._变量 这种方式使用。

当然外部调用这个方法变量也可以,不建议这样做,代码量多了之后,可能会导致有点混乱,你也不清楚到底外面用还是里面用的,对代码后续修改可能会有点影响,其他人看的话就加大了理解难度。

类名命名

使用大驼峰法(Upper Camel Case) 也称为 帕斯卡(Pascal)命名法

各个单词的开头字母大写连接,如:FirstName、LastName、CamelCase


规范是为了统一,如果一直只是一个人其实也妨碍不大。但是多人就需要有规范,大家都了解之后,看了代码都心照不宣知道他的使用范围,理解更快,使用也减少出错,减少沟通成本等。

发表评论