一番はじめのボール転がしゲーム２（カメラ追従、当たり判定）

# はじめに
過去に投稿した一番はじめのボール転がしゲームに当たり判定とカメラ追従機能を追加して説明したいと思います！
過去投稿記事：[一番はじめのボール転がしゲーム](https://qiita.com/akino_13/items/df2861327f0b05a0344b "一番はじめのボール転がしゲーム")

今回は移動とジャンプを駆使してゴールを目指すことを目標にします！
実装順は下記の通りです。
・カメラ追従
・当たり判定 + ジャンプ処理の追加
・当たり判定 + ゴールの追加

# カメラ追従機能の追加
[一番はじめのボール転がしゲーム](https://qiita.com/akino_13/items/df2861327f0b05a0344b "一番はじめのボール転がしゲーム")では移動処理を実装しているので、ボール（プレイヤー）が移動したら追従して移動するカメラを作りましょう！

まずはカメラの移動処理をするCameraMoveControllerスクリプトを作成します
![09a89b1642a8a09e03abc4f6448e9a61.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/e4f23b3f-cb92-212a-8932-9a37481a066d.png)

上記のスクリプトに下記の処理を追加しました
内容としてはplayerと自身（カメラ）の位置から距離を取得して、Update関数内でplayerの位置と距離の値を自身（カメラ）に代入することで
プレイヤーが移動するとカメラが移動するようになってます

![a95d96c4c6026b3377b9da03d6e02bae.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/18fbbd37-e222-5047-d6c3-f5f8d60f614b.png)

スクリプトをMain Cameraオブジェクトに追加して、PlayerにBallオブジェクトを追加しましょう
ビルドして、ボールを移動させるとカメラもボールに追従して移動するはずです！
カメラの初期位置はお好みで調整しましょう！

![30a4ac63af1373c29fa31c90454f5ce6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/244fffcd-dd66-7d52-74ce-7eb7f8bff546.gif)

# 当たり判定 + ジャンプ処理の追加
まずはジャンプ処理を実装します。
移動処理が実装されているBallControllerスクリプトのUpdate関数にスペースキーを押した時に実行される処理を追加します。
ジャンプする量はお好みで調整してください！
![47c24e6f3559841c4adb1a649485c33a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/e9041b71-a991-74b9-bc96-dc9aa7c69742.png)

現在の処理だとスペースキーを押すたびにジャンプできてしまうため、地面に着いている時に1回だけジャンプできるように変更します。

"Ground"タグを追加して、GroundオブジェクトのタグをGroundに変更しましょう！
![59ed1a996cbc56caf750ac963d262101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/60657600-6b12-6b86-976e-fbd67cfe23f4.png)
![44d73ccfc959229d3246892e441e5547.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/e44db8e6-3402-ea5f-9c5d-1e40ddf736de.png)

そしてスクリプトに下記のように追加しましょう
スペースキーを押す処理にisGroundの判定を追加してます
これはボールが地面に接触したタイミングでOnCollisionEnterの関数が呼ばれ、ボールに接触しているオブジェクトのタグがGroundの場合、isGroundをtrueにしてます
そして、ジャンプして地面を離れたタイミングでOnCollisionExit関数が呼ばれ、同じくボールに接触していたオブジェクトのタグがGroundの場合、isGroundをfalseにしてます
これで地面に着いている時だけジャンプできるようになりました！
![331c58f02d44caffed538289e3142b31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/08fad4db-1ee1-4670-b12b-069bd1f399cf.png)
![c6ddcb1699114eb1f0e0e0a5aac4b040.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/4010022f-f317-1d8a-5157-4e2f58f4bb2a.gif)

# 当たり判定 + ゴールの追加
最後にゴールまで移動して、ゴールに辿り着いたらゴールの文字を表示しましょう！
ステージはこんな感じに作ってみました！
ステージはお好みで大丈夫です！
ゴール地点のCapsule型のGoalオブジェクトに触ったらゴールの文字を表示します！
![e81d2635c631564feafa25ca7de1c482.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/adc2f3b0-3d2a-735c-0ccb-69d6c8919541.png)

追加したステージのオブジェクトには同じようにGroundのタグを設定しましょう！
そしてGoalのテキストを表示するためにCanvasを追加してGoalTextオブジェクトを追加します
GoalTextはボールがゴールに到着したら表示したいので非アクティブにしておきます
![4f0fa50a76b2d352dfdbf93d94f03b9d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/fc481961-2938-b2ef-f5c3-e597fa93dcb2.png)

GoalのオブジェクトにはGoalのタグを新しく追加して設定します
今回はCapsuleColliderのIsTriggerにチェックをいれます
![1c263390f10d41ea14b70689169bf282.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/b38cc6b2-78ef-091d-df77-57026f2ad506.png)

追加の処理はOnTriggerEnter関数です。
OnCollisionEnterと同様に接触したオブジェクトのタグを見て、今回はGoalタグの場合、goalTextのオブジェクトをアクティブにして表示します！
![5ac84a4c5b61371c212b4cf141612f60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/119accc3-b9ee-61f3-6ade-1fb017110b3e.png)

これで必要な実装は追加しました！
実際にプレイしてゴールを目指してみます！!
![a7dfcbe9e231529714da3a00259e3f3b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/26659566-61cb-69fb-876c-afde23a6e7b8.gif)
![2b49edd148dd8df565b2fcb6c473adf8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/834bfab5-0b13-73e8-f184-e54cc3f4fc6c.gif)
![fce27a21a46073223daa868c408115dd.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/608328/12416ea1-9870-83df-68a2-99a9f2a339c8.gif)
無事ゴールまで辿り着いて、GOAL！！が表示されました！

# 当たり判定の条件
当たり判定を表でまとめました！
各オブジェクトにアタッチされているColliderのIsTriggerのチェックによってOnCollision関数かOnTrigger関数が呼ばれます！

|  ボール  | GroundまたはGoal | OnCollision/OnTrigger|
|---|---|---|
|Is Trigger ☑|Is Trigger ☑|OnTrigger|
|Is Trigger ☑|Is Trigger ☐|OnTrigger|
|Is Trigger ☐|Is Trigger ☑|OnTrigger|
|Is Trigger ☐|Is Trigger ☐|OnCollision|

OnCollisionのEnter/Stay/Exitは下記の条件で呼ばれます！
OnTriggerも同様です！
|  Enter  | Stay | Exit|
|---|---|---|
|オブジェクト同士が接触した時|オブジェクト同士が接触している間|オブジェクト同士が離れた時|

# 最後に
今回はカメラ追従と当たり判定をテーマにしてみました！
これらの機能を入れることで少しゲーム性が出てきたと思います！
他にもステージを拡張したり、ボールが落ちた際にリトライするなど機能を追加しても面白いと思います！
ぜひ試してみてください！