📌
Unityにおけるコンポーネント指向(余談)
Qiitaより転載
2017/4/23 初投稿
ちなみに、前回の記事ではサンプルケースに合わせる為にPlayerとEnemyクラスを残したが、本来は残さなくていいと思う。
というのも、PlayerとEnemyは別にクラスである必要が無いからだ。
Movableを拡張した以下のクラスが適するだろう。
Movable.cs
using UnityEngine;
public abstract class Movable : MonoBehaviour
{
// 移動スピード
[SerializeField] private float speed;
// SpaceshipのRigidbody
[SerializeField] private Rigidbody2D _rigidbody;
// 機体の移動
protected virtual void Move (Vector2 direction)
{
_rigidbody.velocity = direction * speed;
}
}
StraightDownMovable.cs
public class StraightDownMovable : Movable
{
void Start()
{
Move(transform.up * -1);
}
}
KeyboardInputMovable.cs
public class KeyboardInputMovable : Movable
{
void Update ()
{
// 右・左
float x = Input.GetAxisRaw ("Horizontal");
// 上・下
float y = Input.GetAxisRaw ("Vertical");
// 移動する向きを求める
Vector2 direction = new Vector2 (x, y).normalized;
// 移動
movable.Move (direction);
}
}
こうすれば、エディタ上で「Player」というゲームオブジェクトを作り、それにKeyboardInputMovableをアタッチすることでキーボードで移動する宇宙船を作成することができる。敵も同様で、全部エディタ上で完結させられる。むしろMovableは移動以外するべきでない。
たぶん、コンポーネント指向的には、すべてのコンポーネントは自身のふるまいまで管理できるが、外部から干渉できるものである、って感じだと思う。
Discussion