Godot Engine 入門 パート4

[パート3](https://qiita.com/tomon9086/items/d31127662cde8f9bab20) からの続きです

# 玉転がし
## スター作成
最終章です
プレイヤーシーンを作ったときと同様に新規シーンを作成し、CollisionShapeの、ShapeにBoxShapeを子ノードにCSGBoxを追加します
※画像ではルートノードがRigidBodyになっていますが、Areaにしておいてください

> もし間違えた場合は、右クリックで「Change Type」をクリックしてノード型を変更できます

<img width="1000" alt="スクリーンショット 2019-10-22 23.31.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/921df395-a661-6ff0-5254-81d8c5358055.png">
ColisionShapeのTransformを変更します
※画像ではScaleが0.1になっていますが、やってみたら小さすぎたので全て0.2にしておいてください
<img width="1000" alt="スクリーンショット 2019-10-22 23.33.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/9e1e251b-8684-fc52-cd7f-8d43022419ef.png">
次はマテリアルです
MaterialフォルダにSpacialMaterialを「Star.tres」として新規作成します
<img width="1000" alt="スクリーンショット 2019-10-22 23.33.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/6a87980e-97ae-4f98-fa4b-917358de7722.png">
星なので黄色にします
<img width="1000" alt="スクリーンショット 2019-10-22 23.34.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/5fb6db27-8c7f-49e0-17b8-cc4d12b2690f.png">
以前と同様にドラッグアンドドロップで適用します
<img width="1000" alt="スクリーンショット 2019-10-22 23.34.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/00fc7f53-4e41-312d-92ee-14d1a511dbfc.png">
ルートノードの名前を「Star」に変更します
<img width="1000" alt="スクリーンショット 2019-10-22 23.34.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/34c42237-5ac5-a67a-1dae-c016abfe4c25.png">
プレイヤーシーンと同様にシーンを保存してください
名前は「Star.tscn」にしました

### メインシーンに配置
星は8つ配置する予定です
壁と同様に星はひとまとめにしたいので「Stars」と名付けたPosition3Dの子ノードとして追加します
<img width="1000" alt="スクリーンショット 2019-10-22 23.38.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/a89538af-a658-ead7-6cd1-ed5aa9ca137b.png">
Translateを変更します
<img width="1000" alt="スクリーンショット 2019-10-22 23.38.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/94526253-b0b8-d4b4-48a2-a99990bc80db.png">
複製してそれぞれ配置します

> 半径 5 の円周上に均等に配置、 45° の位置は 5 ÷ √2 ≒ 3.54 を参考にしながら、よしなに

<img width="1000" alt="スクリーンショット 2019-10-22 23.40.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/95b2c320-a1fd-5c10-c21d-e14bf6458637.png">

### 試運転
ここで一旦実行してみましょう
玉を動かして星と重なったとき、ぶつからず、すり抜けることを確認します
<img width="700" alt="スクリーンショット 2019-10-22 23.46.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/ba613754-373b-d6ae-8b8b-3be326a156a7.png">

*画像のアップロード制限になってもうた*

プレイヤーシーンと同様にStarにもスクリプトをアタッチします
<img width="1000" alt="スクリーンショット 2019-10-22 23.47.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/83510e73-3fa9-5781-4658-a3e429bda517.png">
スクリプトは以下
<img width="1000" alt="スクリーンショット 2019-10-22 23.47.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/59e3b558-e836-c533-4ff8-ff5d092b7d7f.png">


星を自転させて、プレイヤーと接触したら消えるようにするスクリプトです

```py
extends Area

func star_rotate(speed):
	rotate(Vector3(0, 1, 0), speed)


func gotten(body):
	if body.name == "Player":
		queue_free()


func _ready():
	pass


func _process(delta):
	star_rotate(delta)


func _on_Star_body_entered(body):
	gotten(body)

```

```_on_Star_body_entered``` は「シグナル」と呼ばれる機能によって発火するイベントです
インスペクタの上にある「ノード」タブをクリックしてbody_enteredシグナルをStar (ルートノード) と接続します
<img width="1000" alt="スクリーンショット 2019-10-22 23.48.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/4b389715-edad-ce4f-ad20-e186112dac4e.png">
<img width="1000" alt="スクリーンショット 2019-10-22 23.48.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/fd179114-57cb-5d90-854c-cacb76611ecd.png">

# 完成！
実行してみましょう
玉を動かして星にぶつけると星が消えるようになっているはずです
<img width="700" alt="スクリーンショット 2019-10-22 23.50.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147904/e608d776-e3b4-a125-9003-e635f5b509d0.png">


すべて星を取ったら終了画面を出してみたり、Labelでスコアを表示するようにしてみたり、BGMをつけてみたり…
と、もっとゲームらしくしてみるのもおもしろいかもしれません

これをきっかけにGodotでなにか作ってみたくなっていただければうれしいです
大量のスクショを撮った甲斐があります