抽象クラスを使ったUnityでの移動方法の学習

unityでの移動(瞬間移動)には、2種類があります。今回は、抽象クラスも使ってこれを切り替えて実行するプログラムに挑戦してみましょう

Unityエディター画面

  • Cubeオブジェクトを追加
  • 各スクリプトの作成
  • CubeオベジェクトへPlayerスクリプトのアタッチ

列挙型(enum)は、Unityでは、インスペクターからプルダウンメニューで初期値の選択ができます

実行

スペースキーを押すたびに、Cubeはx軸方向に1ずつ進みます。

UMLクラス図

Playerから直接PositionMoveクラスやTranslateMoveクラスを呼び出すのではなく、Movable抽象クラスへの参照からアクセスできるようにしています。これによって、依存性を低くする効果があります。

  • PlayerはMovableへ依存しています
  • PositionMoveはMovableへ依存しています
  • TranslateMoveは、Movableへ依存しています

今後、他の手段の移動に関するクラスを実装する場合でも、プログラム更新の影響が低く抑えることができます。

using UnityEngine;

public class Player : MonoBehaviour
{
    enum Pattern
    {
        PositionMove,
        TranslateMove,
    }

    [SerializeField]
    Pattern pattern;

    Movable movePattern;

    void Start()
    {
        switch (pattern)
        {
            case Pattern.PositionMove:
                movePattern = new PositionMove(gameObject);
                break;
            case Pattern.TranslateMove:
                movePattern = new TranslateMove(gameObject);
                break;
            default:
                break;
        }
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            movePattern.Move(new Vector3(1, 0, 0));
        }
    }
}
using UnityEngine;

public abstract class Movable : MonoBehaviour
{
    protected GameObject obj;

    public Movable(GameObject gameObject)
    {
        obj = gameObject;
    }

    public abstract void Move(Vector3 vector);
}
using UnityEngine;

public class PositionMove : Movable
{
    public PositionMove(GameObject obj) : base(obj) { }

    public override void Move(Vector3 vector)
    {
        obj.transform.position += vector;
        Debug.Log("PositonMove");
    }
}
using UnityEngine;

internal class TranslateMove : Movable
{
    public TranslateMove(GameObject gameObject) : base(gameObject) { }

    public override void Move(Vector3 vector)
    {
        gameObject.transform.Translate(vector);
        Debug.Log("TranslateMove");
    }
}

C#,Unity

Posted by hidepon