C \ # 디자인 모드 (1) 구독 - 게시 모드

원래 Besige 를 지속 적 으로 개발 하 는 것 이 었 으 나 조만간 디자인 모델 이라는 것 이 계속 확 대 될 것 이라는 점 을 고려 하여 제목 을 새로 열 었 으 니 시작 이 라 고 할 수 있다.
모델 이라는 것 은 원래 언어 외 에 독립 적 으로 말 할 수 있 지만 서로 다른 언어의 실현 에 차이 가 있 기 때문에 저 는 글 을 검색 할 때 다른 언어의 참고 자 료 를 찾 는 것 을 좋아 하지 않 습 니 다. 쓰레기 정 보 를 적 게 만 들 기 위해 덕 을 쌓 기 위해 제목 앞 에 C \ # 를 추 가 했 습 니 다.
구독 - 게시 모델 은 관찰자 모델 이 라 고도 부 르 는데 많은 자 료 는 대체적인 사상 만 소 개 했 을 뿐 구독 자 와 게시 자 를 결합 시 키 는 참고 코드 를 찾기 어렵다.
나 는 내 가 비교적 좋아 하 는 디자인 에 약간의 수정 버 전 을 붙 였 다.
using UnityEngine;
using System;
using System.Collections.Generic;

public class SubPubSystem 
{
    public Dictionary records = new Dictionary();

    public void Subscribe(string name, Action method) { _Subscribe(name, method); }
    public void Subscribe(string name, Action method) { _Subscribe(name, method); }
    public void Subscribe(string name, Action method) { _Subscribe(name, method); }
    public void Subscribe(string name, Action method) { _Subscribe(name, method); }
    public void Subscribe(string name, Action method) { _Subscribe(name, method); }

    public void UnSubscribe(string name, Action method) { _UnSubscribe(name, method); }
    public void UnSubscribe(string name, Action method) { _UnSubscribe(name, method); }
    public void UnSubscribe(string name, Action method) { _UnSubscribe(name, method); }
    public void UnSubscribe(string name, Action method) { _UnSubscribe(name, method); }
    public void UnSubscribe(string name, Action method) { _UnSubscribe(name, method); }

    public void _Subscribe(string name, Delegate method)
    {
        Delegate d;
        if (records.TryGetValue(name, out d))
        {
            d = Delegate.Combine(d, method);
            records[name] = d;
        }
        else
        {
            records.Add(name, method);
        }
    }

    public void _UnSubscribe(string name, Delegate method)
    {
        Delegate d;
        if (records.TryGetValue(name, out d))
        {
            d = Delegate.Remove(d, method);
            records[name] = d; 
        }
    }

    public void Publish(string name, params object[] args)
    {
        try
        {
            Delegate d;
            if (records.TryGetValue(name, out d))
            {
                if (d != null)
                {
                    d.DynamicInvoke(args);
                }             
            }
            else
            {
                records.Remove(name);
            }
        }
        catch(Exception ex)
        {
            Debug.LogError(ex.Message); 
        }
    }
}

사용 도 간단 합 니 다. 어떤 큰 시스템 모듈 에서 new 인 스 턴 스 를 사용 하고 필요 한 곳 에서 Subscribe, Publish 방법 을 호출 하면 됩 니 다. 만약 에 게임 규모 가 작 으 면 정적 클래스 로 직접 바 꿀 수 있 습 니 다.
주의해 야 할 점:
1. 구독 자 방법 을 의외로 잃 어 버 리 면 유 니 티 에서 어떤 물체 에 묶 여 있 는 스 크 립 트 가 물체 의 소각 에 따라 없어 지면 메시지 호출 시 이상 이 발생 할 수 있 습 니 다.호출 방법 이 아직 존재 하 는 지 더 잘 알 아 보 는 방법 에 대해 몇 군 이 물 었 지만 좋 은 대답 을 얻 지 못 했 으 니 온 디 스트로 리 에서 손 으로 구독 을 취소 하 는 것 이 좋 겠 다.더 좋 은 방안 을 아 는 사람 이 있 으 면 가르쳐 주 십시오.
2. 간단하게 보기 위해 서 는 최대 네 개의 인자 만 지원 합 니 다. 더 많은 인자 가 필요 하 다 면 몇 줄 을 복사 해서 붙 여 넣 으 면 됩 니 다.
나 는 개인 적 으로 이 시스템 의 간단 하고 유연 한 것 을 매우 좋아한다.. net framwork 가 제시 한 EventHandler 규범 처럼 EventArgs 를 계승 하여 많은 메 시 지 를 쓰 는 것 도 귀 찮 습 니 다.
잠시 Besige 에서 이 시스템 으로 메시지 사건 을 처리 한 후에 문제 가 발생 하면 다시 완선 합 니 다.
마지막 으로 다음 단계 의 계획 을 말씀 드 리 겠 습 니 다.
위의 글 에서 Besige 는 아직도 많은 기능 모듈 을 남 겨 두 고 해 야 한다 고 말 했 지만, 나 는 지금 급히 검 이 오랫동안 탐 내 던 다른 지역 인 스 크 립 트 시스템 을 가리 키 고 싶다.
일단 익숙 한 길 은 시간 이 필요 한 일 들 을 내 버 려 두 고 상대 적 으로 낯 설 고 도 전적인 분야 로 먼저 들어간다.
회사 프로젝트 에 사용 되 는 스 크 립 트 시스템 은 사용자 정의 DSL 이 고 가상 컴퓨터 도 스스로 쓴 것 입 니 다. 전혀 필요 하지 않 고 스 크 립 트 는 변수 도 사용 할 수 없 을 정도 로 약 합 니 다.통용 되 는 스 크 립 트 언어 와 제3자 라 이브 러 리 를 빌려 사용 하면 더욱 실속 있 고 기능 도 강하 다.
이렇게 구체 적 으로 말 하면 Lua 나 Python 일 뿐 입 니 다. Unity 에 서 는 Lua 를 상대 적 으로 많이 사용 하기 때문에 목 표 는 ulua 에 고정 되 어 있 습 니 다.tolua 에 올 랐 습 니 다. tolua 의 개발 자 는 Lua Framework 를 동시에 제공 합 니 다.NGUI / UGUI 의 프레임 워 크 는 그 구 조 를 배 우 는 데 도 좋다.
저 는 그 생각 을 소화 한 후에 루 아 가상 머 신 을 분리 시 켜 자신의 프로젝트 에 최소 화하 고 이 를 바탕 으로 스 크 립 트 프로 그래 밍 을 하 는 실천 을 하고 싶 습 니 다. 적어도 스 크 립 트 로 UI 를 정의 한 다음 에 상황 에 따라 다른 것 을 할 수 있 는 지, 예 를 들 어 AI 와 같은 것 을 할 수 있 는 지, 심지어 전체 순찰 집 은 루 아 를 가지 고 이 루어 져 야 합 니 다.
마지막 으로 이 걸 해 결 했 습 니 다. 많은 작은 회사 의 면접 자 들 이 특히 즐겨 묻 는 핫 업 데 이 트 는 자 연 스 럽 게 해 결 됩 니 다.
요즘 일 도 바 빠 서 주기 가 길 어 질 수 있 으 니 두 달 정도 로 하 세 요.

좋은 웹페이지 즐겨찾기