Godot Engine 入門 パート3


パート2 からの続きです

玉転がし

プレイヤー作成

ついにプレイヤーを作ります
下図赤枠の「+」をクリックして新規シーンを作成

今回はルートノードをAreaにします
「カスタムノード」をクリックしてRigidBodyを選択してください

下のようにツリーを構成して、「CollisionShape」ノードのShapeにはSphereShapeを選択します

「CSGSphere」ノードのRingsを12にします
これは必要ではありませんが、デフォルトより丸く見えます

「RigidBody」ノードで右クリックして「スクリプトをアタッチ」を選択します

デフォルトの設定のまま作成します

以下のようにスクリプトを書きます

矢印キーの入力に応じて球に X, Z 方向の力を加えるスクリプトです

extends RigidBody

const speed = 5
var velocity = Vector3()

func player_move():
    var direction = Vector3()

    if Input.is_action_pressed("ui_right"):
        direction.x += 1
    if Input.is_action_pressed("ui_left"):
        direction.x -= 1
    if Input.is_action_pressed("ui_down"):
        direction.z += 1
    if Input.is_action_pressed("ui_up"):
        direction.z -= 1

    if direction.length() > 0:
        var force = direction.normalized() * speed
        add_force(force, Vector3(0, 0, 0))


func _ready():
    pass


func _process(delta):
    player_move()

カメラ

ルートノードの子ノードとしてカメラを追加します

カメラのTransformを、球が真ん中に映るように変更します

同様にカメラにもスクリプトをアタッチします

カメラを球の子として配置するだけでは、球の回転といっしょにカメラも回転してしまうので、
それを抑えるために以下のようなスクリプトを書きます

ごめんなさいコピペしました

extends Camera

onready var player = get_parent()
var offset : Vector3

func _init():
    set_as_toplevel(true)


func _ready():
    offset = get_global_transform().origin


func _physics_process(delta):
    var target = get_parent().get_global_transform().origin
    var pos = offset + target
    var up = Vector3(0, 1, 0)
    look_at_from_position(pos, target, up)


func _process(delta):
    pass

保存

ルートノードの名前を「Player」に変更します

Mainシーンと同様に「Player.tscn」としてシーンを保存します

メインシーンへの追加

「Main.tscn」をダブルクリックし、「Spacial」ノードに「Player.tscn」をドラッグアンドドロップします

PlayerのTranslateを調整します

床と壁を固定する

忘れていました
メインシーンのFloorの「Mode」を「Static」にします

各Wallも同様です

動かしてみる

下図赤枠の実行ボタンをクリックして実行します

矢印キーで玉が転がることを確認しましょう

パート4に続きます…