Unity2D 見下ろし型画面でキャラクターを動かす
前回の記事でいきなりアニメーション実装を書いてしまったので順番が前後した感しかありませんが、
今回はトップダウン方式のキャラクター移動をやっていきます。
というか、前回はアニメーションの話をしたかったのに、
微妙に移動の話も入れてしまったので流れがややこしくなってしまった気がする。
今回からコードはGistを使って埋め込みしたいと思いますが、うまく表示されない……
どうすりゃいいんだ。
やってることは非常に簡単です。
GameObjectを動かすとなると、transformのpositionを変える方法や、Rigidbodyのvelocityを直接変更する方法がありますが、
今回はRigidbodyのAddForceを使った物理演算で動いてもらいます。
Area Effectorなど他の物理的な力を使ったギミックを作るためです。
何より、簡単だし……
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
[RequireComponent(typeof(Rigidbody2D))] | |
public class PlayerController : MonoBehaviour { | |
[SerializeField] | |
private float moveSpeed; | |
private Rigidbody2D rb; | |
private Vector2 movement; | |
void Start () | |
{ | |
rb = GetComponent<Rigidbody2D>(); | |
} | |
void Update() | |
{ | |
movement = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); | |
} | |
private void FixedUpdate() | |
{ | |
MovePlayer(); | |
} | |
private void MovePlayer() | |
{ | |
rb.AddForce(movement.normalized * moveSpeed); | |
} |
Embedが動かないので貼り付け。これどうなるんだろ。
まず、今回は2Dゲームなので使用するRigidbodyも2Dにします。
ここをミスってると動かないので注意。
Rigidbody2Dを使うと決まっているので、RequireComponent属性を付けて勝手にコンポーネントが追加されるようにしておくといいと思います。
クラスの変数として、移動速度を決定するmoveSpeed、rb、movementを宣言しておきます。
いずれもクラス外からアクセスすることは(少なくとも今は)なさそうなので、privateにしておきます。
ただ、moveSpeedはInspectorから調節したいので、SeriarizeField属性を付けておきます。
StartでGetComponentメソッドを使ってrbにRigidbody2Dを格納。
Updateでmovementにプレイヤーの入力を格納。
入力は必ずUpdate内でやってね、とのUnity公式からのお達しなのでそうしましょう
(いや、言ってない気もするけど、これをFixedUpdateでやると不具合の温床になるっぽい)。
FixedUpdateで規則的な間隔でMovePlayerを呼び出し、AddForceで動かしています。
Rigidbodyを使った物理演算は必ずFixedUpdate内でやってね、とのUnity公式からのお達しなのでそうしましょう。
Vector2やVector3のnormalizedは単位ベクトルと言って、要するに方向だけ取得できる書き方です。
こうしないと、上下左右の移動時は-1から1に収まるので問題ないのですが、斜め入力時のベクトルが1.4になるので斜めに歩くと速いという出来の悪いレトロゲーの裏技的な挙動みたいになってしまいます。
強さが1なので、これだけだと限りなく遅くなりますが、moveSpeedを掛けることで速度を増幅させています。
設定はこんな感じにしています(今回使ってない変数は気にしないでください)
Linear Dragを大きくすることで滑る動きを抑制、摩擦が強くなるのでその分Move Speedを増やして対抗してる、って感じです。
ついでにInput Settingsで軸入力のGravityをべらぼうに増やしておくといいと思います。
こうすることで、ボタンを離したときの反応が良くなります。
うまく動きました。