Обёртка над 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


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

//************************************************//
//********** Author:  Dimusikus@mail.ru **********//
//********** Author:  http://midadev.ru **********//
//************************************************//
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,  так:

 

sing 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");
  }
  //**********************************************************************************************
}

 

Теги: ,

Трекбэк с Вашего сайта.

Дмитирй

This information box about the author.

Оставить комментарий

Вы должны войти чтобы оставить комментарий.

Offcanvas

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.