Обёртка над MonoBehaviour

Нужда привела к тому что надо бы сделать обёртку над MonoBehaviour  дабы незабивать в скрипт постоянно один и тот же код(кеширование компонентов, подписка на события и т.д.)

 
using UnityEngine;
using System.Collections;

public class CustomMono : MonoBehaviour 
{
  private Rigidbody2D _body2d = null;
  private Transform   _transform = null;
  private Animator    _anim = null;

  //**********************************************************************************************
  public Rigidbody2D body2d 
  {
    get 
    {
      if (_body2d == null) 
      {
        _body2d = GetComponent<Rigidbody2D>();
        if(_body2d == null)	Debug.LogError("CustomMono: Rigidbody2D компонента нет на объекте="+gameObject.name);
      }
      return _body2d;
    }
  }
  //**********************************************************************************************
  public Transform myTransform 
  {
    get 
    {
      if (_transform == null) 
      {
        _transform = transform;
      }
      return _transform;
    }
    protected set {			_transform = value;		}
  }
  //**********************************************************************************************
  public Animator anim 
  {
    get 
    {
      if (_anim == null) 
      {
        _anim = GetComponent<Animator>();
        if(_anim == null)	Debug.LogError("CustomMono: Rigidbody2D компонента нет на объекте="+gameObject.name);
      }
      return _anim;
    }
  }
  //**********************************************************************************************


}

использовать собираюсь так:

using UnityEngine;
using System.Collections;

public class test : CustomMono 
{	
  //**********************************************************************************************
  public override void myAwake () 
  {	
    Debug.Log ("test: myAwake");

    Debug.Log ("test: body2d=" + body2d);
    Debug.Log ("test: myTransform=" + myTransform);
  }	
  //**********************************************************************************************

  
  //**********************************************************************************************
  void Update ()  
  {	
  }
  //**********************************************************************************************
  
  //**********************************************************************************************
  void OnEnable(){}
  void OnDisable(){}
  //**********************************************************************************************
}

Тут есть один нюанс это то что мы переопределяем Awake и поэтому в создваваемых скриптах метод будет называться немного иначе:  myAwake()

Update

Так же создадим глобальный статический класс, типа медиатора.

using UnityEngine;
using System.Collections;

public static class Center
{	
  private static GameObject 	_gameCenter;
  private static GameObject 	_poolManager;
  private static GameObject 	_soundManager;
  private static GameData 	_gameData;
  private static EventManager _eventManager;

  //**********************************************************************************************
  public static GameObject gameCenter
  { 
    get 
    {
      if(_gameCenter == null)
      {
         _gameCenter = GameObject.FindWithTag ("GameCenter");
        if(_gameCenter == null)	Debug.LogError("Center: GameCenter объекта не существует на сцене.");
      }
      return _gameCenter;
    }
  }
  //**********************************************************************************************
  //компонент с игровыми данными
  public static GameData gameData
  { 		
    get 
    {
      if(_gameData == null)
      {
        _gameData = gameCenter.GetComponent<GameData> ();
        if(_gameData == null)	Debug.LogError("Center: GameData компонента нету на объекте GameCenter");
      }
      return _gameData;
    }
  }
  //**********************************************************************************************
  // компонент Событий 
  public static EventManager eventManager
  { 
    get 
    {
      if(_eventManager == null)
      {
        _eventManager = gameCenter.GetComponent<EventManager> ();
        if(_eventManager == null)	Debug.LogError("Center: EventManager компонента нету на объекте GameCenter");
      }
      return _eventManager;
    }
  }
  //**********************************************************************************************
  // Pool менеджер объектов
  public static GameObject poolManager
  { 
    get 
    {
      if(_poolManager == null)
      {
        _poolManager = GameObject.FindWithTag ("PoolManager");
        if(_poolManager == null)	Debug.LogError("Center: PoolManager объекта не существует на сцене.");
      }
      return _poolManager;
    }
  }
  //**********************************************************************************************
  // Sound менеджер
  public static GameObject sounManager
  { 
    get 
    {
      if(_soundManager == null)
      {
        _soundManager = GameObject.FindWithTag ("SoundManager");
        if(_soundManager == null)	Debug.LogError("Center: SoundManager объекта не существует на сцене.");
      }
      return _soundManager;
    }
  }
  //**********************************************************************************************
}

 

Использоваться будет через глобальный метод Center,  так:

 

using UnityEngine;
using System.Collections;

public class test3 : MonoBehaviour
{		
  //**********************************************************************************************
  void Awake ()  
  {	

    Debug.Log ("test3: gameCenter.name=" + Center.gameCenter.name);
    Debug.Log ("test3: gameCenter=" + Center.gameCenter);
    Debug.Log ("test3: gameData=" + Center.gameData);
    Debug.Log ("test3: eventManager=" + Center.eventManager);

    Center.eventManager.StartListening(GameEvents.set_game_state,sgm);
    Center.eventManager.QueueTriggerEvent(GameEvents.set_game_state);

  }
  //**********************************************************************************************
  void sgm ()  
  {	
    Debug.Log ("test3: set_game_state");
    Debug.Log ("test3: -------------------------------------------------------------------");
    Application.LoadLevel("customMono3");
  }
  //**********************************************************************************************
}