Godot Engine 入門 パート3

[パート2](https://qiita.com/tomon9086/items/b893cc1b54cbc07ee583) からの続きです
# 玉転がし
## プレイヤー作成
ついにプレイヤーを作ります
下図赤枠の「+」をクリックして新規シーンを作成
<img width="1000" alt="スクリーンショット 2019-10-22 22.54.36のコピー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/21b30ff7-0d64-0595-a73b-fd6db61a6ddd.png">

### 玉
今回はルートノードをAreaにします
「カスタムノード」をクリックしてRigidBodyを選択してください
<img width="1000" alt="スクリーンショット 2019-10-22 22.55.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/fbb61c37-f72f-b81a-0895-c54abac76c80.png">
下のようにツリーを構成して、「CollisionShape」ノードのShapeにはSphereShapeを選択します
<img width="1000" alt="スクリーンショット 2019-10-22 22.56.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/1207e50c-811c-ec07-4eab-d97ba64dde9d.png">
「CSGSphere」ノードのRingsを12にします
これは必要ではありませんが、デフォルトより丸く見えます
<img width="1000" alt="スクリーンショット 2019-10-22 22.57.40のコピー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/eb9c1303-7fe2-c81f-c5b3-3c655fb2e080.png">
「RigidBody」ノードで右クリックして「スクリプトをアタッチ」を選択します
<img width="1000" alt="スクリーンショット 2019-10-22 23.08.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/a1bc9621-51d4-d664-405e-8d7b6dd38650.png">
デフォルトの設定のまま作成します
<img width="1000" alt="スクリーンショット 2019-10-22 23.11.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/e943c66b-e167-1496-78de-13c62d70550b.png">
以下のようにスクリプトを書きます
<img width="1000" alt="スクリーンショット 2019-10-22 23.13.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/2eedf837-055f-3a63-a630-05658430597e.png">

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

```py
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()

```

### カメラ
ルートノードの子ノードとしてカメラを追加します
<img width="1000" alt="スクリーンショット 2019-10-22 23.17.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/73126c76-d4a8-559a-1b0a-6060336ebc5f.png">
カメラのTransformを、球が真ん中に映るように変更します
<img width="1000" alt="スクリーンショット 2019-10-22 23.18.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/ea9da9f8-58d8-b46f-ac4e-04d1d9f6820b.png">
同様にカメラにもスクリプトをアタッチします
<img width="1000" alt="スクリーンショット 2019-10-22 23.20.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/7f8faab9-26f3-2087-a3ac-18a7c384f4fb.png">
カメラを球の子として配置するだけでは、球の回転といっしょにカメラも回転してしまうので、
それを抑えるために以下のようなスクリプトを書きます
<img width="1000" alt="スクリーンショット 2019-10-22 23.21.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/b706fe8e-9f89-936f-f8c7-e89d43231f9c.png">

ごめんなさい[コピペしました](https://www.reddit.com/r/godot/comments/b43gnk/make_a_camera_following_a_rotating_rigidbody/)

```py
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」に変更します
<img width="1000" alt="スクリーンショット 2019-10-22 23.19.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/9e6e73fe-385f-6572-5397-8bdf2eb46514.png">
Mainシーンと同様に「Player.tscn」としてシーンを保存します
<img width="1000" alt="スクリーンショット 2019-10-22 23.13.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/43ea8393-4093-9182-f052-4a75ac53a3f3.png">

### メインシーンへの追加
「Main.tscn」をダブルクリックし、「Spacial」ノードに「Player.tscn」をドラッグアンドドロップします
<img width="1000" alt="スクリーンショット 2019-10-22 23.19.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/5a8f6ef7-c971-5095-fd92-6b5f538fb913.png">
PlayerのTranslateを調整します
<img width="1000" alt="スクリーンショット 2019-10-22 23.19.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/0b017306-6159-4f90-7816-041bf236d0c1.png">

## 床と壁を固定する
忘れていました
メインシーンのFloorの「Mode」を「Static」にします
<img width="1000" alt="スクリーンショット 2019-10-22 23.23.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/ca7e016d-5f56-2c3c-8e67-ca00cc3aa787.png">
各Wallも同様です
<img width="1000" alt="スクリーンショット 2019-10-22 23.23.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/41065014-65a9-b5a7-1cb2-2d604590b1f8.png">

### 動かしてみる
下図赤枠の実行ボタンをクリックして実行します
<img width="1000" alt="スクリーンショット 2019-10-22 23.19.44のコピー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/3537f2e9-4e06-766e-94df-13d64becca8a.png">

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

[パート4](https://qiita.com/tomon9086/items/f8b9d8dce0788a475000)に続きます…