images/blog-posts

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。

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

SUBSCRIBE


🔒 No spam. Unsubscribe any time.

About kk

kk

Vincenzo Antedoro is an engineer who helps those who want to invest in renewables. For the rest he enjoys teaching with the method of learning by doing..

» More about kk