published on in Godot

Godot开发・3D动作

今天我们来学习使用Godot 3D模式下的物体运动操作,我们主要会使用到RigidBody3D「刚体」, StaticBody3D「静态」, Camera3D「相机」, DirectionalLight3D「定向光源」这四个节点。当然,除了这几个主要的节点,我们还会使用到处理碰撞检测的CollisionShape3D节点,Godot预置的3D模型,立方体CSGBox3D节点与圆柱体CSGCylinder3D节点。

创建场景并安放节点

我们新建一个项目,并把会用到的节点按着如下结构放置在场景中:

  • Node[重命名为Root]
    • StaticBody3D
      • CollisionShape3D
      • CSGBox3D
    • RigidBody3D
      • CollisionShape3D
      • CSGCylinder3D
    • Camera3D
    • DirectionalLight3D

设置节点

我们为StaticBody3D的子节点CollisionShape3D设置属性Shape,这里我们给定一个BoxShape属性并且把Size x改为10m,z改为10m:

我们将StaticBody3D的子节点CSGBox3D中的Size也做同样的修改,使物理实体对齐碰撞检测的Shape:

我们选中RigidBody3D节点,然后设置它的位置Position,将y改为3.5m:

我们将Camera3D节点的位置Position和旋转角度Rotation也做修改:

我们最后再对DirectionalLight3D节点的位置Position和旋转角度Rotation做修改:

现在我们可以按键盘快捷键F6,运行该场景进行预览:

插入控制脚本

我们右键节点RigidBody3D,点击Attach Script选项,为其添加脚本,并把如下内容写入脚本:

extends RigidBody3D


# Called when the node enters the scene tree for the first time.
func _ready():
	pass # Replace with function body.


# Called every frame. 'delta' is the elapsed time since the previous frame.
func _physics_process(delta):
	if Input.is_action_pressed("ui_left"):
		linear_velocity.x = -3
	if Input.is_action_pressed("ui_right"):
		linear_velocity.x = 3
	if Input.is_action_pressed("ui_up"):
		linear_velocity.z = -3
	if Input.is_action_pressed("ui_down"):
		linear_velocity.z = 3

一般来说我们在函数_physics_process中控制物体的物理运动。

我们可以使用方法Input.is_action_pressed来获取键盘方向键输入,ui_left, ui_right, ui_up, ui_down分别对应键盘方向键左,右,上,下。

linear_velocity用于设置刚体的运动速度,我们这里只处理x和z方向。

例如,当键盘方向键左被按住时触发:

if Input.is_action_pressed("ui_left"):
	linear_velocity.x = -3

我们将x方向的速度设置为-3。

保存后,再次运行场景,我们就可以使用键盘方向键来操作我们的物体进行运动了: