📌

Unityにおけるコンポーネント指向(余談)

2022/10/18に公開

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