プレイヤーキャラクターを左右に移動させる。向きの反転、接地判定も行う。 解説記事 http://negi-lab.blog.jp/PlayerWalkAndJump2D
using UnityEngine;
// プレイヤーキャラクターを左右に移動させる。向きの反転、接地判定も行う。
// 解説記事 http://negi-lab.blog.jp/PlayerWalkAndJump2D
public class PlayerWalk2D : MonoBehaviour
{
// 値はインスペクターから変更可能
[SerializeField] float moveSpeed = 1000f;
public bool isGrounded;
private Rigidbody2D rb;
private Vector3 defalutScale;
private void Start ()
{
// ゲームプレイ中、頻繁に呼び出されるコンポーネントは Start 内でキャッシュしておく
// 毎回 GetComponent すると負荷が高くなるため
rb = GetComponent<Rigidbody2D> ();
// 開始時のローカルスケールの値を記憶しておく
defalutScale = transform.localScale;
}
private void Update ()
{
// 左右方向の入力を受け取る
var input_h = Input.GetAxis ( "Horizontal" );
Walk ( input_h );
Turn ( input_h );
}
// 水平方向の移動
private void Walk ( float inputValue )
{
if ( inputValue != 0 )
{
// 接地していないときは水平方向に移動する力を弱める
var mult = isGrounded ? 1f : 0.3f;
// Rigidbody2D に力を加えることでプレイヤーキャラクターを移動させる
rb.AddForce ( Vector2.right * inputValue * moveSpeed * mult * Time.deltaTime );
}
}
// 向きを変える
private void Turn ( float inputValue )
{
if ( inputValue > 0 )
{
transform.localScale = defalutScale;
}
else if ( inputValue < 0 )
{
// ローカルスケールのXの値を反転させることで、スプライトを反転させる
transform.localScale = new Vector3 ( -defalutScale.x, defalutScale.y, defalutScale.z );
}
}
// 接地判定
private void OnCollisionEnter2D ( Collision2D collision )
{
isGrounded = true;
}
private void OnCollisionExit2D ( Collision2D collision )
{
isGrounded = false;
}
}