ユニティちゃんのインストール
今回のキャラクターはユニティちゃんを利用させていただきます。
Unity上のAssetStoreの検索欄に『unity-chan』と打ち込み、"Unity-chan!"Modelをダウンロード、インポートします。
正常にダウンロードとインポートが終わると、以下のようにAssetsフォルダ内にUnityChanフォルダが作成されます。
キャラクター設定
まずはインターネット上で動くキャラを作成する前に、オフライン上で動くキャラを作成します。
手順は以下のようになります。
- "Asset"フォルダ→"UnityChan"フォルダ→"Prefabs”フォルダ→unitychan.prefabというファイルがあるのでそれをHierarchyビューにドラッグ&ドロップ
- unitychanのプレハブについている"Idle Changer"スクリプトと”FaceUpdate”スクリプトを削除
- CharacterControlScriptを作成(↓にソースあり)
- CharacterControllerコンポーネントとCharacterControlScriptを追加
- AnimatorのControllerを"UnityChanLocomotions"に変更
- CharacterControlScriptに必要な情報を入力
それでは以上の手順を行ったときの最終的なユニティちゃんのinspectorビューを見てみましょう。
今回キャラクターを動かすことに必要な新しい要素は以下の3つです。
- InputManager
- CharacterControllerコンポーネント
- CharacterControlScript
InputManager
ゲームでのプレイヤーの入力を管理するためにUnityが標準装備しているツールがInputManagerです。
簡単に言えば、キーコンフィグの設定ツールです。
Photonを使ったオンラインゲームではキーコンフィグの設定もクライアント側に任せることもできます。
詳しくは別の記事で解説します。
CharacterControllerコンポーネント
今回はCharacterControllerコンポーネントを用いて、プレイヤーキャラクターを操作します。
キャラクターコントローラーには以下の大きく2つの役割があります。
- キャラクターを動かす
- キャラクターのコライダー(Collider)となる
具体的に述べると「CharacterControlScript内でユーザの入力を受け付けて計算を行い、CharacterControllerコンポーネントに動かす方向を渡して、ユニティちゃんを動かす」という感じです。
CharacterControlScript.csのソースコード
今回ユニティちゃんを動かすには少し長いスクリプトを書く必要がありますが、一つ一つはそんなに難しいことはしていないので出来れば理解しながら以下のCharacterControlScriptを完成させてください。
コピーペーストでも良いですが、内容を理解した方が応用が効くようになります。
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 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class CharacterControlScript : MonoBehaviour { //移動処理に必要なコンポーネントを設定 public Animator animator; //モーションをコントロールするためAnimatorを取得 public CharacterController controller; //キャラクター移動を管理するためCharacterControllerを取得 //移動速度等のパラメータ用変数(inspectorビューで設定) public float speed; //キャラクターの移動速度 public float jumpSpeed; //キャラクターのジャンプ力 public float rotateSpeed; //キャラクターの方向転換速度 public float gravity; //キャラにかかる重力の大きさ Vector3 targetDirection; //移動する方向のベクトル Vector3 moveDirection = Vector3.zero; // Start関数は変数を初期化するための関数 void Start () { } // Update関数は1フレームに1回実行される void Update () { moveControl(); //移動用関数 RotationControl(); //旋回用関数 //最終的な移動処理 //(これが無いとCharacterControllerに情報が送られないため、動けない) controller.Move(moveDirection * Time.deltaTime); } void moveControl() { //★進行方向計算 //キーボード入力を取得 float v = Input.GetAxisRaw("Vertical"); //InputManagerの↑↓の入力 float h = Input.GetAxisRaw("Horizontal"); //InputManagerの←→の入力 //カメラの正面方向ベクトルからY成分を除き、正規化してキャラが走る方向を取得 Vector3 forward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized; Vector3 right = Camera.main.transform.right; //カメラの右方向を取得 //カメラの方向を考慮したキャラの進行方向を計算 targetDirection = h * right + v * forward; //★地上にいる場合の処理 if (controller.isGrounded) { //移動のベクトルを計算 moveDirection = targetDirection*speed; //Jumpボタンでジャンプ処理 if (Input.GetButton("Jump")) { moveDirection.y = jumpSpeed; } } else //空中操作の処理(重力加速度等) { float tempy = moveDirection.y; //(↓の2文の処理があると空中でも入力方向に動けるようになる) //moveDirection = Vector3.Scale(targetDirection, new Vector3(1, 0, 1)).normalized; //moveDirection *= speed; moveDirection.y = tempy - gravity * Time.deltaTime; } //★走行アニメーション管理 if (v > .1 || v < -.1 || h > .1 || h < -.1) //(移動入力があると) { animator.SetFloat("Speed", 1f); //キャラ走行のアニメーションON } else //(移動入力が無いと) { animator.SetFloat("Speed", 0f); //キャラ走行のアニメーションOFF } } void RotationControl() //キャラクターが移動方向を変えるときの処理 { Vector3 rotateDirection = moveDirection; rotateDirection.y = 0; //それなりに移動方向が変化する場合のみ移動方向を変える if (rotateDirection.sqrMagnitude > 0.01) { //緩やかに移動方向を変える float step = rotateSpeed * Time.deltaTime; Vector3 newDir = Vector3.Slerp(transform.forward, rotateDirection, step); transform.rotation = Quaternion.LookRotation(newDir); } } } |
スクリプトが完成したら、unitychanのinspectorビューに行き、以下の画像のようにAnimatorコンポーネントとCharacterControllerコンポーネントをCharacterControlScriptのAnimatorとControllerにそれぞれドラッグ&ドロップします。
以上でCharacterControlScriptの設定は終わりです。
実際にキャラクターを動かしてみよう
操作方法
キーボードの矢印キーでも動きますが[W][A][S][D]キーでも動きます。
スペースでジャンプします。
次回予告
無事にユニティちゃんが動いてくれましたね!
しかしこのままではユニティちゃんを舐めまわすように視点を動かすことができません...
次回は固定されているカメラを動かしてみましょう!!