XREAL-SNU / xTown

XREAL의 메인프로젝트 XTown project
10 stars 11 forks source link

Video Chat user list update #204

Open AliceOfSNU opened 2 years ago

AliceOfSNU commented 2 years ago

현재 상황

작업 계획

일정

AliceOfSNU commented 2 years ago

event 기반 코딩 예제 Voice.cs ` // events public Action<int, bool> OnPlayerVoiceChangedHandler = null;

    public void OnPlayerVoiceChanged(int actorNr, bool state)
    {
        if (OnPlayerVoiceChangedHandler != null)
        {
            OnPlayerVoiceChangedHandler.Invoke(actorNr, state);
        }
    }

    public void RemoveListener(Action<int, bool> action)
    {
        if(OnPlayerVoiceChangedHandler != null)
        {
            OnPlayerVoiceChangedHandler -= action;
        }
    }

    public void AddListener(Action<int, bool> action)
    {
        OnPlayerVoiceChangedHandler -= action;
        OnPlayerVoiceChangedHandler += action;
    }`

Action, Action<T1, T2>, Action<T1, T2... Tn> 은 주로 On어쩌고저쩌고 Handler로 naming되며, 명시된 parameter type (T)를 인자로 받고 리턴값이 void인 함수들을 event의 listener로 추가할 수 있음 (AddListener, RemoveListener 참고)

해당 Handler는 .Invoke를 통해, 그 handler 에 assign 된 action들을 모두 invoke할 수 있음(OnPlayerVoiceChanged) 이때 invoke될 함수들의 parameter를 set 해줌. Invoke(T1 param1, T2 param2);

join, leave 두가지 상황에 대한 이벤트가 있다고 하면, 이들을 위해 OnUserJoinedHandler, OnUserLeftHandler를 정의하는대신 OnUserStatusChangedHandler만 정의하고, action parameter로 enum PlayerStatus {Joined, Left} 를 주는 방법이 있음

추가자료: 새로운 UI 시스템의 BindEvent 참조 UIBase.cs UIEvent의 종류별로(click. enter, exit, drag) 분기

`public static void BindEvent(GameObject go, Action action, UIEvents.UIEvent type = UIEvents.UIEvent.Click) { UIEventHandler evt = go.GetComponent(); if(evt is null) { Debug.Log(" Deprecation warning: XReal UI convention requires you to attach UIEventHandler script to " + "interactable UI elements. But we will attach it for you for now. "); evt = go.AddComponent(); }

        switch (type)
        {
            case UIEvents.UIEvent.Enter:
                evt.OnEnterHandler -= action;
                evt.OnEnterHandler += action;
                break;
            case UIEvents.UIEvent.Click:
                evt.OnClickHandler -= action;
                evt.OnClickHandler += action;
                break;
            case UIEvents.UIEvent.Exit:
                evt.OnExitHandler -= action;
                evt.OnExitHandler += action;
                break;
            case UIEvents.UIEvent.Drag:
                evt.OnDragHandler -= action;
                evt.OnDragHandler += action;
                break;
        }
    }`
tehokim commented 2 years ago
  1. 유저 입장
    • 6명 full이면 별다른 action 없음
    • 6명 미만이면 맨 마지막에 생성
  2. 유저 pin
    • pin 최대 2개
    • pin 하면 pin 한 순서대로 맨 앞 정렬
    • unpin하면 unpin되어 있는 유저 화면 중 가장 앞으로(pin된 것 중 마지막 뒤에)
  3. 유저 퇴장
    • 내 페이지 밖 유저 퇴장하면 action 없음
    • 페이지 안 유저 퇴장하면 그 사람 빼고 자동 정렬