Unity의 메시지 메커니즘

5193 단어 Unity
게임 개발에서 우리는 항상 소식을 전달해야 한다.
소식을 전달하는 데는 일반적으로 세 가지 방법이 있다.객체의 참조를 저장합니다.2. Unity에서 제공하는 메시지 메커니즘3. C#의 위임 및 이벤트

객체의 참조 저장


예를 들어 수류탄이 폭발할 때에는 수류탄, 지면, 부근 물체 등 게임 요소의 대상을 획득한 후 폭발 효과를 틀어야 한다.이런 방법은 간단하고 거칠지만 프로젝트의 규모가 커지면 증감 개정은 매우 번거로워질 것이다.사실 이것은 결합도가 비교적 높은 방안이다.

Unity에서 제공하는 메시지 메커니즘


Unity 자체는 Messages 메시지 메커니즘을 제공합니다.
  • BroadcastMessage():
  • Calls the method named methodName on every MonoBehaviour in this game object or any of its children.
  • 한 물체와 그 모든 하위 물체에 대해 메시지를 방송한다. 그 중 하위 물체에 스크립트가 붙어 있고 스크립트에 해당 메시지를 처리하는 함수가 있으면 Invoke가 호출한다.
  • BroadcastMessage는 물체와 모든 하위 물체에 메시지를 보냅니다.

  • SendMessage():
  • Calls the method named methodName on every MonoBehaviour in this game object.
  • 게임 물체 각각MonoBehaviour에서methodName이라는 방법을 호출합니다.
  • SendMessage는 이 단계의 물체의 여러 스크립트에 메시지를 보냅니다. 즉 현재 대상에 마운트된 모든 스크립트에 메시지를 보냅니다.(methodName을 포함하는 방법임에도 불구하고MonoBehavior 중 모든MonoBehavior는 이 메시지를 받지 못함)
  • SendMessageUpwards():
  • Calls the method named methodName on every MonoBehaviour in this game object and on every ancestor of the behaviour.
  • 게임 물체 하나하나의MonoBehaviour와 각behaviour의 조상들에게methodName이라는 방법을 사용한다.
  • SendMessageUpwards는 물체와 상급 부물체에 정보를 보낸다.


  • C#의 이벤트


    C#의 의뢰와 사건은 메시지 전달에 매우 유용하고 디자인 모델의 측면에서 보면 전형적인 관찰자 모델이다.
    예를 들어 우리는 로커터치 Begin, 로커터치 Move, 로커터치 End 세 가지 이벤트를 디자인할 수 있다.
    이 사건에 관심이 있는 대상은 해당하는handler를 통해 이 사건을 감청하여 일대다 게임Object 간의 통신을 할 수 있다.
    구체적으로는 아래에서 제시한 실현을 참고할 수 있다.
    public class Rocker : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler {
    
        public delegate void RockerTouchBegin(Vector2 vec);
        public delegate void RockerTouchMove(Vector2 vec);
        public delegate void RockerTouchEnd();
    
        public event RockerTouchBegin OnTouchBegin;
        public event RockerTouchMove OnTouchMove;
        public event RockerTouchEnd OnTouchEnd;
    
        private bool isTouched = false;
    
        public void OnPointerDown(PointerEventData eventData) {
            isTouched = true;
            if (null != OnTouchBegin)
                OnTouchBegin(eventData.position);
        }
    
        public void OnPointerUp(PointerEventData eventData) {
            isTouched = false;
            if (null != OnTouchEnd)
                OnTouchEnd();
        }
    
        public void OnDrag(PointerEventData eventData) {
            if (null != OnTouchMove)
                OnTouchMove(eventData.position);
        }
    }
    
    
    private Rocker rocker;
    
    void Start() {
        rocker = FindObjectOfType<Rocker>();
        rocker.OnTouchBegin += OnTouchBegin;
        rocker.OnTouchMove += OnTouchMove;
        rocker.OnTouchEnd += OnTouchEnd;
    }
    
    void OnTouchBegin(Vector2 vec) {
        Debug.Log("OnTouchBegin");
    }
    
    void OnTouchMove(Vector2 vec) {
        Debug.Log("OnTouchMove");
    }
    
    void OnTouchEnd() {
        Debug.Log("OnTouchEnd");
    }
    

    잘못이 있으면 지적해 주십시오.
    email:dxmdxm1992#gmail.com
    blog: http://blog.csdn.net/david_dai_1108

    좋은 웹페이지 즐겨찾기