プレーヤーをゆっくり移動・回転させて、ボール発射。
カメラの視界を常にプレーヤーに追従させてみましょう。
今回は、以下3つの事例をミックスさせて、完成させています。
約1秒間かけて90°回転
約1秒かけてゆっくり移動する
プレーヤーの前から発射する
関連記事:
キャラクターコントローラーに発射機能
MainCameraがオブジェクトを追従
ゆっくりとした移動と回転
PlayerのオブジェクトをCubeで作成し、位置(X,Y,Z)をすべて0にします。
移動と回転は1つのスクリプトにまとめて書きましょう。
PlayerManager.csを作成し、Plyaerに追加します。
PlayerManager.csを書いていきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerManager : MonoBehaviour { //回転中かどうか bool turnBool = false; //移動中かどうか bool moveBool = false; void Update() { if(Input.GetKeyDown("right")) { //回転中ではない場合は実行 if (!turnBool) { turnBool = true; StartCoroutine("RightMove"); } } if(Input.GetKeyDown("left")) { //回転中ではない場合は実行 if (!turnBool) { turnBool = true; StartCoroutine("LeftMove"); } } if(Input.GetKeyDown("up")) { //移動中ではない場合は実行 if (!moveBool) { moveBool = true; StartCoroutine("MoveForward"); } } if(Input.GetKeyDown("down")) { //移動中ではない場合は実行 if (!moveBool) { moveBool = true; StartCoroutine("MoveBack"); } } } //右にゆっくり回転して90°でストップ IEnumerator RightMove() { for (int turn=0; turn<90; turn++) { transform.Rotate(0,1,0); yield return new WaitForSeconds(0.01f); } turnBool = false; } //左にゆっくり回転して90°でストップ IEnumerator LeftMove() { for (int turn=0; turn<90; turn++) { transform.Rotate(0,-1,0); yield return new WaitForSeconds(0.01f); } turnBool = false; } //約1秒かけて前に進む IEnumerator MoveForward() { for (int i=0; i<100; i++) { transform.Translate(0, 0, 0.02f); yield return new WaitForSeconds(0.01f); } moveBool = false; } //約1秒かけて後ろに進む IEnumerator MoveBack() { for (int i=0; i<100; i++) { transform.Translate(0, 0, -0.02f); yield return new WaitForSeconds(0.01f); } moveBool = false; } } |
プレイして動きを確認しましょう。
メインカメラの視界を合わせる
カメラが固定されているため、ゲームの操作性があまり良くありません。
カメラとPlayerの動きを一緒にして、操作性を上げてみましょう。
ゲームビューを見ながら、MainCameraの位置を調整しましょう。
ここでは、MainCameraの位置と回転をこのように設定しました。
MainCameraをPlyaerにドラッグ&ドロップしましょう。
MainCameraをPlyaerに親子関係ができます。
動きが確認しやすいように、平面オブジェクトを置きました。
プレイしてみましょう。
カメラの視界とプレーヤーが一緒に動きます。
これでゲームの操作性も良くなりました。
動きながら発射する
発射ついては、以下の記事をご覧ください。
【Unity C#】プレーヤーの前から発射する
https://futabazemi.net/unity/unity-front_shot/
動きながらの発射は、プレーヤーの前にボールを生成する必要があります。
空のオブジェクト(GameObject)をプレーヤーの前方に配置。
Playerにドラッグ&ドロップして、親子関係をとります。
BallShot.csを作成して、GameObjectに追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BallShot : MonoBehaviour{ public GameObject ballPrefab; public float speed; void Update () { if(Input.GetKeyDown("space")) { GameObject ball = (GameObject)Instantiate(ballPrefab, transform.position, Quaternion.identity); Rigidbody ballRigidbody = ball.GetComponent<Rigidbody>(); ballRigidbody.AddForce(transform.forward * speed); } } } |
ボールのPrefabデータを用意します。
リジッドボディを追加し、重力を使用(UseGravity)はチェックを外します。
GameObjectのインスペクターを確認します。
BallPrefabフィールドには、Prefabデータを入れます。
速度フィールドは自由に入力してください。
ゲームプレイしてみましょう。
動きながら、Spaceキーでボールを発射します。