今回はUntiyの標準アセットに含まれる ThirdPersonCharacter を改造。通常移動が走るモーション、左:Shiftキー+移動キーで歩行となっているところを入れ替え、通常移動を歩行に変更してみました。
Unity の標準アセットから Charactor をインポート。[Project]ウィンドウ > Standard Assets > Characters > ThirdPersonCharacter > ThirdPersonController を選択。[Inspector]ウィンドウでアタッチされているでコンポーネントを確認してみます。
キャラクターのアニメーションを制御するコンポーネント。[Cull Update Transforms]が設定されていてカメラで描画されていない場合はアニメーションがスキップされます。
キャラクターの移動制御
キャラクターの衝突判定処理のコライダー。物理マテリアルに ZeroFriction が割り当てられています。
プレイヤーの入力処理を行うスクリプト。
キャラクターの移動やアニメーションの制御のスクリプト。旋回速度、ジャンプ力、重力の強さ、移動速度、アニメーションの再生速度などが設定できますね。
まずは ThirdPersonCharacter の操作制御スクリプト ThirdPersonUserControl を複製します。
[Project]ウィンドウ > Standard Assets > Characters > ThirdPersonCharacter > Scripts> ThirdPersonUserControlを選択。
メニュー:Edit > Duplicateを選択してファイルを複製。ファイル名をMod_ThirdPersonUserContrに変更。
複製したスクリプトファイルは今回の作業用フォルダに移動しました。
スクリプト Mod_ThirdPersonUserControl の改造内容は下記の3点になります。
編集したスクリプトコード。一部理解できていない部分がありますがコメントを付けました。
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 としました。
標準の Ethan と色付きの Ethan を並べて[Game]ビューで確認するのこのような感じ。
複製したプレハブ ThirdPersonController Color のコンポーネントを変更します。ThirdPersonUserContr を削除して Mod_ThirdPersonUserContr をアタッチします。
以前の記事で使用した室内のオブジェクトを用意してシーンを作成。
壁や床のテクスチャはUnityのアセットストアの無料テクスチャYughues Free Architectural Materials を使用しています。
プレハブ ThirdPersonController Color をシーンに配置。標準アセットの Utility に含まれている SimpleMouseRotator を使用して回転用オブジェクトを作成。子階層にMain Camera を設定しました。
今回の内容をWebGLでビルドしてみました。画像クリックでファイルがダウンロード、再生されます。(ダウンロードサイズ:約30MB)
View Comments
1をかけるのって意味あるんですか?