Нужда привела к тому что надо бы сделать обёртку над 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");
}
//**********************************************************************************************
}