【バイオハザード風のゲームを作ってみよう。その1】
最近バイオハザード1 リマスター版をプレイして、自分でも作りたくなったのでやってみたいと思います。
下のセバスチャン先生の動画を参考に作ってみたいと思います。
youtu.be
まず、キャラクターはmixamoから下記ダウンロードしました。
・キャラクター:swat
・アニメーション:pistol idle
次にキャラクターをunity上に配置し、キーボードの上下(W,S,)で前進/後進、キーボードの左右(A,D)で回転するように下記スクリプトをアタッチしました。
参考サイト:
jyumotendo.jeez.jp
Unity Ver:2020.3.20f1(URP)を使用。
次に、前進/後進のアニメーションをmixamoからダウンロードしました。
・前進:Pistol Walk
・後進:Pistol Walk BackWard
Unityへのインポートが完了したら、下記のアニメーションの設定をします。
・設定したいアニメーションのInspectorウインドウの[Rig]>[Animation Type]から、プルダウンメニューで[Humanoid]を選択して、[Apply]で確定。
・設定したいアニメーションのInspectorウインドウの[Animation]>[Loop Time]にチェックを入れる。[Apply]で確定。
・アニメーションにアニメーションクリップが2つある場合、Inspectorウインドウの[Animation]の[Source Take](下図①)にアニメーションを再生(下図②)して動作する方に設定し、[Apply]で確定。
(私の場合、アニメーションにpistol walkとmixamoの2つのクリップがあり、初期はアニメーションにpistol walkが設定されていましたが、上手く動作しない(アニメーションを再生(下図②)しても上手く動作しなかった)ため、mixamoに変更した所、思い通りの動作になりました。)
次に、ブレンドツリーを下記のように設定しました。
左右回転時のアニメーションも前進/後進のアニメーションを使用しています。
そして、キーボードの動作でアニメーションが動作するようにスクリプトに追加しました。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player_Controller : MonoBehaviour { // 上下のキーで前後ろ移動、左右のキーでPlayerを左右に回転させたい。 // 上下の移動はPlayerの向いている方角に対して前後させたい。 public float speed = 1f; //歩行スピード public float rotateSpeed = 1f; //体の向きのスピード Vector3 direction; Animator animator; float snappedHorizontal; float snappedVertical; float span = 1f; private float currentTime = 0f; bool moveOn = true; public void Awake() { animator = GetComponent<Animator>(); } void FixedUpdate() { //Input.GetAxisRawは押したキーに応じて1か-1を返します。また、キーが押されていないときは0を返します。 //Input.GetAxisは押したキーに応じて1ら-1までの範囲の値をとります。初期値は0です、これはジョイスティック入力やキーボード入力からの場合です。 /// //float h = Input.GetAxisRaw("Horizontal"); //float v = Input.GetAxisRaw("Vertical"); float h = Input.GetAxis("Horizontal"); float v = Input.GetAxis("Vertical"); Move(v); Turning(h); } // 上下キーが押されたら void Move(float v) { if (v != 0) { direction = transform.TransformDirection(new Vector3(0.0f, 0.0f, v)); //ローカル空間からワールド空間へ x、y、z を変換します。 direction *= speed; direction *= Time.deltaTime; direction /= 2f; //歩行スピード調整 transform.position += direction; HandleAnimatorValues(0f, v); } else { HandleAnimatorValues(0f, 0f); } } //左右キーが押されたら void Turning(float h) { if (h != 0) { //左右に回転させるにはRotateメソッドを使用。 //y軸の引数に左右キーが押下された時に得られる1or - 1の値にspeedとdeleteTimeをかけて引数として使用しました。 transform.Rotate(0, 100 * Time.deltaTime * rotateSpeed * h, 0); HandleAnimatorValues(h, 0f); } } //移動アニメーション void HandleAnimatorValues(float horizontalMovememt, float verticalMovement) { if(horizontalMovememt > 0) { snappedHorizontal = 1; } else if (horizontalMovememt < 0) { snappedHorizontal = -1; } else { snappedHorizontal = 0; } if (verticalMovement > 0) { snappedVertical = 1; } else if (verticalMovement < 0) { snappedVertical = -1; } else { snappedVertical = 0; } // animator.SetFloat("Horizontal", snappedHorizontal, 0.1f, Time.deltaTime); // animator.SetFloat("Vertical", snappedVertical, 0.1f, Time.deltaTime); animator.SetFloat("Horizontal", snappedHorizontal); animator.SetFloat("Vertical", snappedVertical); } }
unityでプレイしてみた結果がこちら。
youtu.be