超初心者のゲーム開発記~Unity~

超初心者がUnityでゲーム(目標はAndroidアプリ )を開発していくブログです!

【Unity公式チュートリアル】 サバイバルシューター part.3 プレイヤーを動かす設定をする!

こんにちは!ヤギです!

Unity公式チュートリアルのサバイバルシューターをやってみるpart.3になります。

記事概要

今回の記事では、プレイヤーを動かす設定についてご説明していきます。
※part.3に対応する公式チュートリアルは、
Player Character - Unityとなります。
※前回の記事はこちら
www.yagigame.com

Playerのコンポーネントの設定

1. Player > Inspector > Add Componentをクリックし、Rigidbodyを選択します。
※このコンポーネントで、重力を適用します。
f:id:yagigame:20181114144105p:plain
2. Rigidbodyを以下の内容に修正します。
・Drag > Infinity
・Angular Dragg > Infinity
・Freeze Position > Yにチェック
・Freeze Rotation > X,Zにチェック
f:id:yagigame:20181114144447p:plain
3. Player > Inspector > Add Componentをクリックし、Capsule Colliderを選択します。
※このコンポーネントで、衝突検知を可能にします。
4. Capsule Colliderを以下の内容に修正します。
・Center > x > 0.2
・Center > y > 0.6
・Height > 1.2
f:id:yagigame:20181114144948p:plain
5. Player > Inspector > Add Componentをクリックし、Audio Sourceを選択します。
※プレイヤーが攻撃を受けた時の効果音を設定します。
6. Audio Sourceを以下の内容に修正します。
・Audio Clip > Player Hurt
・Play On Awake > チェックを外す
f:id:yagigame:20181114145409p:plain

プレイヤを動かすスクリプトの作成

1. Project > Assets > Scripts > Player > PlayerMovementをPlayerにドラッグします。
f:id:yagigame:20181114145748p:plain
2. PlayerMovementスクリプトを作成していきます。
※ソースの中に解説を書いています!ご確認ください!

using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    public float speed = 6f;            //プレイヤの移動速度

    Vector3 movement;                   //プレイヤーの移動方向
    Animator anim;                      //アニメーションコンポーネント
    Rigidbody playerRigidbody;          //Rigidbodyコンポーネント
    int floorMask;                      //Floorとrayermaskを使う
    float camRayLength = 100f;          //カメラからのray

    void Awake()
    {
        //Floorのrayermaskを作成
        floorMask = LayerMask.GetMask("Floor");

        //コンポーネントを取得
        anim = GetComponent<Animator>();
        playerRigidbody = GetComponent<Rigidbody>();
    }

    //オブジェクトが動くたびに呼ばれる
    void FixedUpdate()
    {
        //インプットから左右上下の移動量を-1もしくは1で受け取る
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");

        //プレイヤーを動かすMove()を呼ぶ
        Move(h, v);

        //プレイヤーの方向を動かすTurning()を呼ぶ
        Turning();

        //プレイヤーのアニメーションを設定するAnimating()を呼ぶ
        Animating(h, v);
    }

    //プレイヤーを動かす処理
    void Move(float h, float v)
    {
        //移動量を設定
        movement.Set(h, 0f, v);

        //移動するベクトルを1にし、移動する距離を設定する
        movement = movement.normalized * speed * Time.deltaTime;

        //プレイターのポジションを動かす
        playerRigidbody.MovePosition(transform.position + movement);
    }


    void Turning()
    {
        //カメラから、マウスで指している方向のrayを取得する
        Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);

        //rayが衝突した情報を取得する
        RaycastHit floorHit;

        //rayを飛ばして、床に衝突した場合の処理
        if (Physics.Raycast(camRay, out floorHit, camRayLength, floorMask))
        {
            //マウスで指している場所と、プレイヤーの場所の差分を取得
            Vector3 playerToMouse = floorHit.point - transform.position;

            //プレイヤはy座標には動かさない
            playerToMouse.y = 0f;

            //プレイヤーの場所から、マウスで指している場所への角度を取得
            Quaternion newRotation = Quaternion.LookRotation(playerToMouse);

            //プレイヤーの角度(プレイヤーの向き)を、新しく設定
            playerRigidbody.MoveRotation(newRotation);
        }
    }

    //アニメーションの処理
    void Animating(float h, float v)
    {
        //プレイヤーの移動量が0以外の場合、walkingをtrueにする
        bool walking = h != 0f || v != 0f;

        //アニメーションのパラメーターOsWalkingをwalkingの値で設定する
        anim.SetBool("IsWalking", walking);
    }
}

トラブルシューティング

実行すると、以下のエラーが出るかもしれません。
NullReferenceException: Object reference not set to an instance of an object
PlayerMovement.Turning () (at Assets/Scripts/Player/PlayerMovement.cs:58)
PlayerMovement.FixedUpdate () (at Assets/Scripts/Player/PlayerMovement.cs:35)

これは、Main CameraのTagが設定されていないことで発生している可能性があります!
Main CameraのTagをMain Cameraと設定しましょう。
f:id:yagigame:20181114161649p:plain

ゲームを実行する

実際にゲームを動かしてみましょう。
キーボードの矢印でプレイヤーの位置が動き、マウスを追ってプレイヤーが向きを変えれば大成功です!
f:id:yagigame:20181114162153p:plain

次回予告

次回は、カメラの設定を行なっていきます!
次回に対応する公式チュートリアルは、「Camera setup」です!

読んでいただきありがとうございました!