Categories: Unity

Unity:標準アセットのThirdPersonCharacterを改造して通常の移動を歩行に変更

今回はUntiyの標準アセットに含まれる ThirdPersonCharacter を改造。通常移動が走るモーション、左:Shiftキー+移動キーで歩行となっているところを入れ替え、通常移動を歩行に変更してみました。

ThirdPersonController にアタッチされているコンポーネントを確認

Unity の標準アセットから Charactor をインポート。[Project]ウィンドウ > Standard Assets > Characters > ThirdPersonCharacter > ThirdPersonController を選択。[Inspector]ウィンドウでアタッチされているでコンポーネントを確認してみます。

Animator

キャラクターのアニメーションを制御するコンポーネント。[Cull Update Transforms]が設定されていてカメラで描画されていない場合はアニメーションがスキップされます。

Ridgidbody

キャラクターの移動制御

Capsule Collider

キャラクターの衝突判定処理のコライダー。物理マテリアルに ZeroFriction が割り当てられています。

ThirdPersonUserControl (Script)

プレイヤーの入力処理を行うスクリプト。

ThirdPersonCharacter (Script)

キャラクターの移動やアニメーションの制御のスクリプト。旋回速度、ジャンプ力、重力の強さ、移動速度、アニメーションの再生速度などが設定できますね。

スクリプト ThirdPersonUserControl の複製

まずは ThirdPersonCharacter の操作制御スクリプト ThirdPersonUserControl を複製します。
[Project]ウィンドウ > Standard Assets > Characters > ThirdPersonCharacter > Scripts> ThirdPersonUserControlを選択。

メニュー:Edit > Duplicateを選択してファイルを複製。ファイル名をMod_ThirdPersonUserContrに変更。

複製したスクリプトファイルは今回の作業用フォルダに移動しました。

スクリプト Mod_ThirdPersonUserControl の編集

スクリプト Mod_ThirdPersonUserControl の改造内容は下記の3点になります。

  • クラス名を Mod_ThirdPersonUserContr に変更
  • 関数 FixedUpdate() の処理内にキー入力条件を追加
  • 左:Shiftキー入力時の動作を[歩く] →[走る]に変更

編集したスクリプトコード。一部理解できていない部分がありますがコメントを付けました。

using System;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

// 名前空間 UnityStandardAssets.Characters.ThirdPerson の使用
namespace UnityStandardAssets.Characters.ThirdPerson
{
    // ThirdPersonCharacter コンポーネントを要求(自動的にアタッチされる)
    [RequireComponent(typeof(ThirdPersonCharacter))]

    public class Mod_ThirdPersonUserControl : MonoBehaviour
    {
        // スクリプト ThirdPersonCharacter を格納する変数
        private ThirdPersonCharacter m_Character;
        // メインカメラの Transform を格納する変数
        private Transform m_Cam;
        // カメラの進行方向を格納する変数
        private Vector3 m_CamForward;
        // カメラの進行方向とプレイヤー入力値から算出したキャラクターのワールド座標ベクトル値を格納する変数
        private Vector3 m_Move;
        // ジャンプの判定フラグ
        private bool m_Jump;

        // ゲーム開始時の処理
        private void Start()
        {
            // メインカメラがシーンに存在する場合
            if (Camera.main != null)
            {
                // メインカメラの Transform値を変数 m_Cam に格納
                m_Cam = Camera.main.transform;
            }
            // メインカメラがシーンに存在しない場合
            else
            {
                // メインカメラがシーンに存在しない場合の警告メッセージ
                // メインカメラの参照と制御については自動的に関連付けされる。ユーザーには必要ないと思われるが、念のための警告メッセージ表示処理。
                Debug.LogWarning(
                    "Warning: no main camera found. Third person character needs a Camera tagged \"MainCamera\", for camera-relative controls.", gameObject);
            }
            // ThirdPersonCharacter コンポーネントを取得して変数 m_Character に格納
            m_Character = GetComponent();
        }

        // ゲーム実行中の毎フレーム実行処理
        private void Update()
        {
            // ジャンプフラグ変数 m_Jump の値が false の場合
            if (!m_Jump)
            {
                // ジャンプ入力フラグ変数 m_Jump の値に渡す
                m_Jump = CrossPlatformInputManager.GetButtonDown("Jump");
            }
        }

        // ゲーム実行中の一定間隔実行処理
        private void FixedUpdate()
        {
            // 水平入力処理の値を変数 h に格納
            float h = CrossPlatformInputManager.GetAxis("Horizontal");
            // 垂直入力処理を変数 v に格納
            float v = CrossPlatformInputManager.GetAxis("Vertical");
            // しゃがみ入力の判定
            bool crouch = Input.GetKey(KeyCode.C);

            // メインカメラがある場合
            if (m_Cam != null)
            {
                // メインカメラの進行方向ベクトルを正規化(X,Z成分のみのベクトルを取得するため?)
                m_CamForward = Vector3.Scale(m_Cam.forward, new Vector3(1, 0, 1)).normalized;
                // メインカメラの進行方向ベクトルをキャラクターの移動ベクトル変数 m_Move に渡す
                m_Move = v * m_CamForward + h * m_Cam.right;
            }
            // メインカメラが無い場合
            else
            {
                // 入力値をそのままキャラクターの移動方向として処理する
                m_Move = v * Vector3.forward + h * Vector3.right;
            }
            // 左[Shift]キー入力が無い場合
            if (!Input.GetKey(KeyCode.LeftShift))
            {
                // 歩く速度で移動する
                // 変数 m_Move の値に 0.5f を乗算
                m_Move *= 0.5f;
            }

            // プラットフォーム依存コンパイル:モバイル入力でない場合はコンパイルから除去
#if !MOBILE_INPUT
            // 走る速度で移動する
            //  [左:Shift]キー入力があれば変数 m_Move の値に 1f を乗算
            if (Input.GetKey(KeyCode.LeftShift)) m_Move *= 1f;
            // プラットフォーム依存コンパイル:ここまで
#endif
            // キャラクターの移動処理
            // スクリプト ThirdPersonCharacter の関数 Move を実行
            m_Character.Move(m_Move, crouch, m_Jump);
            // ジャンプフラグを無効にする
            m_Jump = false;
        }
    }
}

キャラクターのセットアップ

Unity の標準アセットに含まれている ThirdPersonCharacter の3Dモデル Ethan はマテリアルカラーがグレーになっていますが、Asset Store で提供されている サンプルアセット Standard Assets for Unity 4.6 ではマテリアルカラーが設定された Ethan が用意されています。

このアセットはアセットストアでの取り扱いが終了しました。アセットを新規に購入あるいは無償取得することはできません。取り扱い終了前にアセットをダウンロード済みのユーザーは、ローカルに保存されている場合に限りインポートすることができます。

サンプルアセット Standard Assets for Unity 4.6 は名前の通り古いバージョンの Unity 用アセットなので、テクスチャファイル EthanAlbedoSpecular.png のみインポートして使用してみることにしました。

マテリアルは Standard Assets > Characters > ThirdPersonCharacter > Materials > EthanGrey を複製し名前を EthanColor に変更。

マテリアルの設定はこのようにしました。PNG形式のテクスチャファイルにはアルファチャンネルが含まれているので Smoothness 強度の Source としました。

[Project]ウィンドウ > Standard Assets > Characters > ThirdPersonCharacter > Prefabs > ThirdPersonController を複製。名前をThirdPersonController Color に変更。作成したマテリアル EthanColor を割り当てました。

標準の Ethan と色付きの Ethan を並べて[Game]ビューで確認するのこのような感じ。

コンポーネントの設定

複製したプレハブ ThirdPersonController Color のコンポーネントを変更します。ThirdPersonUserContr を削除して Mod_ThirdPersonUserContr をアタッチします。

シーンのセットアップ

以前の記事で使用した室内のオブジェクトを用意してシーンを作成。

壁や床のテクスチャはUnityのアセットストアの無料テクスチャYughues Free Architectural Materials を使用しています。

プレハブ ThirdPersonController Color をシーンに配置。標準アセットの Utility に含まれている SimpleMouseRotator を使用して回転用オブジェクトを作成。子階層にMain Camera を設定しました。

WebGLビルド

今回の内容をWebGLでビルドしてみました。画像クリックでファイルがダウンロード、再生されます。(ダウンロードサイズ:約30MB)

  • キャラクター移動:前 W、左 A、後 S、右 Dキー
  • 走る:左:Shiftキー + 移動キー
  • ジャンプ:Spaceキー
  • しゃがみ:Cキー
  • 視点移動:マウス移動
corevale

View Comments