【Unity】Metroidvania Controllerのソースを解析する
こちらのゲームのコードを解析していきます。
こちらのゲームは矢印で移動、C:ダッシュ、X:アタック、V:ショット、Z:ジャンプで動かすことができます。
プレイヤの動作とアニメーションはそれぞれで設定されています。
1.プレイヤ動作
1.1Z:ジャンプ、C:ダッシュ
Playerは「PlayerMovement.cs」で管理されており、MonoBehaviourを継承したPlayerMovementクラスのUpdate関数でフラグ管理することで動作します。
if (Input.GetKeyDown(KeyCode.Z))
{
jump = true;
}
if (Input.GetKeyDown(KeyCode.C))
{
dash = true;
}
また、設定されている一定秒数ごとによばれるFixedUpdateでフラグをOFF(false)にしています。(FixedUpdateは毎フレームごとに呼ばれます。)
void FixedUpdate ()
{
// Move our character
controller.Move(horizontalMove * Time.fixedDeltaTime, jump, dash);
jump = false;
dash = false;
}
1.2X:アタック、V:ショット
Attack.csで管理されます。
アタックの場合IsAttackingフラグが切り替わります。
if (Input.GetKeyDown(KeyCode.X) && canAttack)
{
canAttack = false;
animator.SetBool("IsAttacking", true);
StartCoroutine(AttackCooldown());
}
ショットの場合ThrowableWeapon.csが呼び出されます。
if (Input.GetKeyDown(KeyCode.V))
{
GameObject throwableWeapon = Instantiate(throwableObject, transform.position + new Vector3(transform.localScale.x * 0.5f,-0.2f), Quaternion.identity) as GameObject;
Vector2 direction = new Vector2(transform.localScale.x, 0);
throwableWeapon.GetComponent<ThrowableWeapon>().direction = direction;
throwableWeapon.name = "ThrowableWeapon";
}
2.アニメーション更新
アニメーションはアニメーション周期、フラグ管理を設定することで変化させます。まずアニメーション周期は移動速度(矢印を押下か否か)で次の二つの処理で管理されます。
horizontalMove = Input.GetAxisRaw("Horizontal") * runSpeed;
animator.SetFloat("Speed", Mathf.Abs(horizontalMove));
Input.GetAxisRawは矢印キーの左を押せば - 1、右を押せば1、何も押さなければ0を取得できます。
その値をhorizontalMoveに与えてアニメーションの周期に利用します。
また、アニメータはグローバル関数のOnFall関数とOnLanding関数に渡されて管理されます。
public void OnFall()
{
animator.SetBool("IsJumping", true);
}
public void OnLanding()
{
animator.SetBool("IsJumping", false);
}
また、
MonoBehaviourを継承したCharacterController2DクラスのFlip関数でプレイヤの向きが変更されます。
3.スマホでの入力に対応するためには
スワイプの上下右左を判定とタップの判定を分ける必要があります。