namespace SRF { using System.Diagnostics; using UnityEngine; /// <summary> /// Base MonoBehaviour which provides useful common functionality /// </summary> public abstract class SRMonoBehaviour : MonoBehaviour { /// <summary> /// Get the Transform component, using a cached reference if possible. /// </summary> public Transform CachedTransform { [DebuggerStepThrough] [DebuggerNonUserCode] get { if (_transform == null) { _transform = base.transform; } return _transform; } } /// <summary> /// Get the Collider component, using a cached reference if possible. /// </summary> public Collider CachedCollider { [DebuggerStepThrough] [DebuggerNonUserCode] get { if (_collider == null) { _collider = GetComponent<Collider>(); } return _collider; } } /// <summary> /// Get the Collider component, using a cached reference if possible. /// </summary> public Collider2D CachedCollider2D { [DebuggerStepThrough] [DebuggerNonUserCode] get { if (_collider2D == null) { _collider2D = GetComponent<Collider2D>(); } return _collider2D; } } /// <summary> /// Get the Rigidbody component, using a cached reference if possible. /// </summary> public Rigidbody CachedRigidBody { [DebuggerStepThrough] [DebuggerNonUserCode] get { if (_rigidBody == null) { _rigidBody = GetComponent<Rigidbody>(); } return _rigidBody; } } /// <summary> /// Get the Rigidbody2D component, using a cached reference if possible. /// </summary> public Rigidbody2D CachedRigidBody2D { [DebuggerStepThrough] [DebuggerNonUserCode] get { if (_rigidbody2D == null) { _rigidbody2D = GetComponent<Rigidbody2D>(); } return _rigidbody2D; } } /// <summary> /// Get the GameObject this behaviour is attached to, using a cached reference if possible. /// </summary> public GameObject CachedGameObject { [DebuggerStepThrough] [DebuggerNonUserCode] get { if (_gameObject == null) { _gameObject = base.gameObject; } return _gameObject; } } // Override existing getters for legacy usage // ReSharper disable InconsistentNaming public new Transform transform { get { return CachedTransform; } } #if !UNITY_5 && !UNITY_2017_1_OR_NEWER public new Collider collider { get { return CachedCollider; } } public new Collider2D collider2D { get { return CachedCollider2D; } } public new Rigidbody rigidbody { get { return CachedRigidBody; } } public new Rigidbody2D rigidbody2D { get { return CachedRigidBody2D; } } public new GameObject gameObject { get { return CachedGameObject; } } #endif // ReSharper restore InconsistentNaming private Collider _collider; private Transform _transform; private Rigidbody _rigidBody; private GameObject _gameObject; private Rigidbody2D _rigidbody2D; private Collider2D _collider2D; /// <summary> /// Assert that the value is not null, disable the object and print a debug error message if it is. /// </summary> /// <param name="value">Object to check</param> /// <param name="fieldName">Debug name to pass in</param> [DebuggerNonUserCode] [DebuggerStepThrough] protected void AssertNotNull(object value, string fieldName = null) { SRDebugUtil.AssertNotNull(value, fieldName, this); } [DebuggerNonUserCode] [DebuggerStepThrough] protected void Assert(bool condition, string message = null) { SRDebugUtil.Assert(condition, message, this); } /// <summary> /// Assert that the value is not null, disable the object and print a debug error message if it is. /// </summary> /// <param name="value">Object to check</param> /// <param name="fieldName">Debug name to pass in</param> /// <returns>True if object is not null</returns> [Conditional("UNITY_EDITOR")] [DebuggerNonUserCode] [DebuggerStepThrough] protected void EditorAssertNotNull(object value, string fieldName = null) { AssertNotNull(value, fieldName); } [Conditional("UNITY_EDITOR")] [DebuggerNonUserCode] [DebuggerStepThrough] protected void EditorAssert(bool condition, string message = null) { Assert(condition, message); } } }