SUGI_ 2023. 8. 16. 20:34

방 목록 구성

방 이름 Prefabs - RoomItem

Content

만드는 시점에서 데이터를 넣어 줄 것임 = ChatItem 비슷한 흐름

using UnityEngine.UI;

public class RoomItem : MonoBehaviour
{
    [SerializeField] Text roomInfo;

    //정보를 받아서 표현만 해주겠다.
    public void SetInfo(string roomName, int currPlayer, int maxPlayer)
    {
        //나의 게임오브젝트 이름을 방이름으로 하자.
        name = roomName;

        //방 정보를 Text 에 설정
        //방 이름  (5 /10)
        roomInfo.text = roomName + "(" + currPlayer + "/" + maxPlayer + ")";
    }
}

LobbyManager - 생성

오류 - 스케일이 이상하게 생성됨

Instantiate 후 Content 로 들어가게 되면 크기가 작아지게 됨.

-> 해결 :  GameObject goRoomInfo = Instantiate(roomItemFactory, rtContent); 생성하자마자 바로 넣기.

    public override void OnRoomListUpdate(List<RoomInfo> roomList)
    {
        base.OnRoomListUpdate(roomList);

        for (int i = 0; i < roomList.Count; i++)
        {
            print(i + "번째 방" + roomList[i].Name);

            //roomItem prefab을 이용해서 roomItem을 만든다.
            GameObject goRoomInfo = Instantiate(roomItemFactory, rtContent);
            //만들어진 roomItem의 부모를 scrollView -> Content 의 transfrom으로 한다.
            //goRoomInfo.transform.parent = rtContent; ->  오류 발생이 일어남 . 부모의 기준을 맞춰 스케일 값이 변하기 때문에

            //만들어진 roomItem 에서 RoomItem 컴포넌트 가져온다.
            RoomItem roomItem = goRoomInfo.GetComponent<RoomItem>();
            //가져온 컴포넌트가 가지고 있는 SetInfo 함수 실행. -> roomList 정보들을 셋팅
            roomItem.SetInfo(roomList[i].Name, roomList[i].PlayerCount, roomList[i].MaxPlayers);
        }
    }

 

Key = int

List : 값들만 들어감

[10,12,5]

딕셔너리 : (제너릭 문법 Key, Value) 

["1번방",10]

방 정보 가지고 있는 Dictionary

IEnumerable이라서 foreach 사용 가능

 

[C#] foreach 문 적용이 가능한 객체 만들기 : IEnumerable

foreach foreach 문은 for 문처럼 인덱스 변수가 필요 없다. 배열이나 리스트같은 컬렉션에서만 사용이 가능하다. foreach 문이 객체 내의 요소를 순회하기 위해서는 foreach 문과의 약속을 지켜야만 한다

daekyoulibrary.tistory.com

 

비공개방 (비밀번호)

 

for 문 continue / break

https://itbeginner2020.tistory.com/29

 

break 와 continue의 차이

결론부터 말하자면, break문은 break; 를 적어준 곳에서 해당 조건문 블록과 그 밖의 반복문 자체를 탈출한다. continue문은 해당 조건문 블록을 탈출하여 아래 명령문은 실행하지 않고, 다음 반복문

itbeginner2020.tistory.com

 void UpdateRoomList(List<RoomInfo> roomList)
    {
        #region 방법1
        foreach (RoomInfo info in roomList)
        {
            //roomCache에 info의 방이름으로 되어있는 Key 값 존재하니?
            if (roomCache.ContainsKey(info.Name))
            {
                //삭제 = true면 삭제되야하는 것.
                if (info.RemovedFromList)
                {
                    roomCache.Remove(info.Name);
                }
                //수정
                else
                {
                    roomCache[info.Name] = info;
                }
            }
            else
            {
                //추가
                roomCache[info.Name] = info;
            }
        }
        #endregion

        #region 방법2 추가 삭제를 한줄로 가능 (continue)
        foreach (RoomInfo info in roomList)
        {
            //roomCache에 info의 방이름으로 되어있는 Key 값 존재하니?
            if (roomCache.ContainsKey(info.Name))
            {
                //삭제 = true면 삭제되야하는 것.
                if (info.RemovedFromList)
                {
                    roomCache.Remove(info.Name);
                    continue;
                }
            }
            //추가 / 삭제
            roomCache[info.Name] = info;
        }
        #endregion
    }

동적 생성

클릭 되었을때 누구인지 찾아야 하지만

    public void OnClick()
    {
        //1.InputRoomName 게임 오브젝트 찾자.
        GameObject go = GameObject.Find("InputRoomName");
        //2. 찾은 게임오브젝트에서 InputField 컴포넌트 가져오자.
        InputField inputField = go.GetComponent<InputField>();
        //3. 가져온 컴포넌트를 이용해서 Text 값 변경하자.
        inputField.text = name;
    }

-> Delegate or Action 를 사용하면 더 편하게 사용가능 (누가되든 상관없이 함수 실행)

 

비번 넣기

Integer Number

public Action<string> onChangeRoomName;

-> Action 사용 방법 : using System  /   public System.Action<string> onChangeRoomName;

 

딕셔너리 키 벨류의 자료형 타입이 정해져 있음

Hashtable hash 는 자유로움

728x90