うにてぃブログ

UnityやUnreal Engineの記事を書いていきます

【Unity】Component を Module 化するライブラリ

Particle System のように要素を選択して、機能を追加できるライブラリを公開しました

f:id:hacchi_man:20200506235438p:plain:w400

github.com

使い方

ModuleControlAbstract を継承したクラスを作成する こちらが MonoBehaviour を継承しているクラス

using System;
 
public class SampleModuleControl : ModuleControlAbstract
{
    private void Awake()
    {
        // SetUpを呼び出すことで各Module のSetUpを呼ぶ
        SetUp();
    }
 
    // Module として使うベースクラスを指定する
    public override Type PartsType()
        {
            return typeof(SampleModuleAbstract);
        }
}

Module を作成する

Module のベースクラスとなる ModuleAbstract を継承したクラスを作成する

public abstract class SampleModuleAbstract : ModuleAbstract
{
    protected SampleModuleControl Owner => GetController<SampleModuleControl>();
}

先程作成したクラスを継承して機能を実装する

using UnityEngine;
 
public class SampleModuleMoveX : SampleModuleAbstract
{
    [SerializeField]
    private int _value;
    
    private float _defaultX;
    private bool _isPong;

    protected override void OnSetUp()
    {
        _defaultX = Owner.transform.localPosition.x;
    }

    protected override void OnUpdate()
    {
        var pos = Owner.transform.localPosition;
        if (_isPong)
        {
            pos.x -= Time.deltaTime;
            if (pos.x < _defaultX - _value)
                _isPong = !_isPong;
        }
        else
        {
            pos.x += Time.deltaTime;
            if (pos.x > _defaultX + _value)
                _isPong = !_isPong;
        }

        Owner.transform.localPosition = pos;
    }
}
using UnityEngine;
 
public class SampleModuleMoveY : SampleModuleAbstract
{
    [SerializeField]
    private int _value;
    
    private float _defaultY;
    private bool _isPong;

    protected override void OnSetUp()
    {
        _defaultY = Owner.transform.localPosition.y;
    }

    protected override void OnUpdate()
    {
        var pos = Owner.transform.localPosition;
        if (_isPong)
        {
            pos.y -= Time.deltaTime;
            if (pos.y < _defaultY - _value)
                _isPong = !_isPong;
        }
        else
        {
            pos.y += Time.deltaTime;
            if (pos.y > _defaultY + _value)
                _isPong = !_isPong;
        }

        Owner.transform.localPosition = pos;
    }
}

これで SampleModuleAbstract を継承しているクラスが Inspector上に表示される

f:id:hacchi_man:20200507001917p:plain:w400

チェックボックスをクリックすることでその機能が有効になる

今回ではX移動のみにチェックが入っているのでX座標のみ移動を行うオブジェクトになる

f:id:hacchi_man:20200507001838p:plain:w400

実際にはコンポーネントがついているが、HideFlagによってInspector上では非表示にすることで
擬似的にモジュールとして機能させている