GDScript重要函数

2021-06-06 约 867 字 预计阅读 2 分钟

基础函数

ready process physics_process的区别

我们可以做一个测试

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
func _ready():
    print("ready!!!!")


func _process(delta):
    print("process")

func _physics_process(delta):
    print("physics process")

发现打印结果如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
ready!!!!
physics process
physics process
physics process
physics process
physics process
physics process
physics process
physics process
process
physics process
physics process
physics process
physics process
physics process
physics process
physics process
physics process
process
physics process
process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process
process
physics process

ready很好解释,就是在场景加载准备就绪以后调用一次

processphysics_process都是在一定间隔时间循环调用,至于两者的区别,我的理解是:physics_process是物理性的,就是和真实世界同步的,比如说你需要执行的方式和真实世界的时钟一致(好比1秒钟1次),所以delta是常量就是帧率(1/每秒多少帧),而process则是很帧几乎同步, 而帧在运行的过程中不可能完全和物理同步,因为内存和渲染数量以及其他种种原因,都有可能让帧是不稳定,delta不是常,而是处理每一帧的所需时间,所以如果想让物体运行和真实世界一致,用physics_process

获取输入

控制器

按键

1
Input.is_action_pressed("ui_right")

按键强度, 最大为1

1
Input.get_action_strength("ui_right")

根据按键强度得到某个轴的强度,最大为1

1
2
input_vector.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
input_vector.y = Input.get_action_strength("ui_up") - Input.get_action_strength("ui_down")

移动

move_and_collide

移动并自动处理碰撞

1
move_and_collide(velocity)

move_and_slide

移动并自动处理边缘滑动, 在做动作游戏的时候可以在不同的地形,比如水里, 草里,等等用不同的摩擦系数,注意这个函数的速度是 像素/秒, 所以使用此函数的时候不用再乘以delta了

Vecltor的nomalize函数

简单的解释是:为了保证在非单个轴的移动的情况下的速度限定在1范围以内,否则,对角线的长度是会大于单个轴的长度的.

移动速度和真实世界一致

为了排除帧率给移动带来的实际影响,结合physics_process的delta,可以将速度保持和真实世界一致

delta在60帧相当于1/60

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
func _physics_process(delta):
    
#    Input.is_action_pressed("ui_right")
    var input_vector = Vector2.ZERO
    input_vector.x = Input.get_action_strength("ui_right") - Input.get_action_strength("ui_left")
    input_vector.y = Input.get_action_strength("ui_down") - Input.get_action_strength("ui_up")
    input_vector = input_vector.normalized()
    
    if input_vector != Vector2.ZERO:
        velocity = input_vector
    else:
        velocity = Vector2.ZERO
    
    move_and_collide(velocity * delta * 100)
TAG: godot game
文章作者 : Cocding