キャラクターの移動制限に悩む。
色々画像を作っていてUnityの勉強がだいぶ久しぶりになってしまった。
また勉強とゲーム作りを再開したので勉強メモ。
・今回はInputSystemでキャラクター移動をしたい。
・斜め移動を禁止するには?
・アニメーションと連携させるには・・・?
上記の点で悩んだので現状のまとめ。
InputSystemの設定については割愛。
パッケージマネージャーからインストールして作成、ActionMaps>Actionsに入力を設定>Action TypeはValue(値)、Control TypeはVector2にした。
シンプルなWASD移動にしたかったのでW:上、A:左、S:下、D:右。
毎回セーブを忘れずに。
設定したらインスペクターのGenerate C# Classにチェックして適用するとスクリプトが自動で作成される。
アニメーションは当初ブレンドツリーを利用して実装するつもりだったが、全然動かなくて困った。
後は動かすだけ…と思ったけどやっぱりアニメーションの切り替えがうまくいかなくて困った。
検索したら終了時間(Exit Time)のチェックはずせば大丈夫という情報が多かったがそういう問題でもなかった。
キーを離したときは止まるのはもちろんだが、キーを押してる最中に他のキーを押してもBoolがfalseにならないといけなかったので、さらにゴリ押しで全部SetBoolで外した。
これはどうやったらもっとスマートにできるんだろうか…。
とりあえずこれで斜め移動禁止、上下左右移動のみのアニメーションつき移動にはなった。
問題でてきたらまた地道に修正する。
public class InputScript : MonoBehaviour
{
private PlayerInput playerInput;
public Animator animator;
private void Start()
{
playerInput = new PlayerInput();
playerInput.Enable();
}
void Update()
{
Move();
}
private void Move()
{
const float speed = 2.8f;
Vector2 direction = playerInput.Move.Movement.ReadValue<Vector2>(); //全方向
Vector3 movement = new Vector3(direction.x, direction.y, 0.0f); //方向の指定
float horizontalInput = direction.x; // 水平方向の入力
float verticalInput = direction.y; // 垂直方向の入力
bool isMoving = movement.magnitude > 0; //キーが押されてるかどうか
if (isMoving) //キーがなにかしら押されていたら
{
// 斜め入力の場合、片方の方向を無視
if (Mathf.Abs(horizontalInput) >Mathf.Abs(verticalInput))
{
// 水平方向の入力が優先
verticalInput = 0f;
// Aキーが押されたときに左に移動
if (movement.x <= 0)
{
transform.Translate(Vector3.left * speed * Time.deltaTime);
animator.SetBool("RightRun", false); //他のアニメを切る
animator.SetBool("UpRun", false); //他のアニメを切る
animator.SetBool("DownRun", false); //他のアニメを切る
animator.SetBool("LeftRun", true); //On
}
// Dキーが押されたときに右に移動
if (movement.x >= 0)
{
transform.Translate(Vector3.right * speed * Time.deltaTime);
animator.SetBool("LeftRun", false); //他のアニメを切る
animator.SetBool("UpRun", false); //他のアニメを切る
animator.SetBool("DownRun", false); //他のアニメを切る
animator.SetBool("RightRun", true);
}
}
else if (Mathf.Abs(verticalInput) > Mathf.Abs(horizontalInput))
{
// 垂直方向の入力が優先
horizontalInput = 0f;
// Wキーが押されたときに上に移動
if (movement.y >= 0)
{
transform.Translate(Vector3.up * speed * Time.deltaTime);
animator.SetBool("RightRun", false); //他のアニメを切る
animator.SetBool("LeftRun", false); //他のアニメを切る
animator.SetBool("DownRun", false); //他のアニメを切る
animator.SetBool("UpRun", true);
}
// Sキーが押されたときに下に移動
if (movement.y <= 0)
{
transform.Translate(Vector3.down * speed * Time.deltaTime);
animator.SetBool("RightRun", false); //他のアニメを切る
animator.SetBool("UpRun", false); //他のアニメを切る
animator.SetBool("LeftRun", false); //他のアニメを切る
animator.SetBool("DownRun", true);
}
}
} //isMovingここまで
else //キーが押されてなかったら
{
animator.SetBool("LeftRun", false);
animator.SetBool("RightRun", false);
animator.SetBool("UpRun", false);
animator.SetBool("DownRun", false);
}
}
}
この記事が気に入ったらサポートをしてみませんか?