내일배움캠프 103

팀 프로젝트 - 로비 개선

게임 종료 후, 이전 로비로 돌아오도록 로비를 개선해주었습니다.해당 개선으로 인해, LobbyManager가 씬을 넘어갈 때 파괴되지 않도록 변경되었습니다. 로비 매니저 추가 내용입니다.게임 종료후, p2p 연결을 끊으면서 BackToLobby 메서드를 호출, 로비의 키 값을 대기중으로 변경해줍니다.//게임 종료후, 로비 재참여public async void BackToLobby(){ if (!IsLobbyhost()) return; try { Lobby lobby = await Lobbies.Instance.UpdateLobbyAsync(nowLobby.Id, new UpdateLobbyOptions { //로비의 GameStartKey 대기..

팀 프로젝트 - 게임 종료후 씬 이동 문제 해결

씬 문제가 발생하던 이유NetworkSceneManager 를 사용하지 않고 씬을 넘길경우, 이전씬에서 생성한 NetworkObject 들이 디스폰되지 않아서 이후 같은 씬을 불러오면 디스폰되지 않은 오브젝트들이 남아있음씬을 넘기고 즉시 서버 연결을 종료할경우, 클라이언트측에서 씬 로드가 끝나기 전에 연결이 끊기면서 문제가 발생할 가능성이 높음Addictive 형태로 로드하였기 때문에 씬의 언로드와 로드가 순차적으로 이루어져야하는데, 양측 모두가 로드, 언로드가 끝났음을 알기 힘듬하나의 메서드에서 처리를 시도하면 먼저 시작한 처리만 작동함//이 두 메서드를 이런식으로 호출하면 LoadScene만 처리됨NetworkManager.Singleton.SceneManager.LoadScene(sceneName,..

팀 프로젝트 - 게임 오버 메커니즘

게임 플레이가 종료되어 멀티플레이를 끝내는 메커니즘을 제작중에 있습니다. GameManager에서 게임오버 메서드가 호출되면 게임을 종료할 수 있도록 제작중에 있으며 게임 결과를 보여주는 UI를 활성화 시켜줄 계획입니다.public bool IsGameover { get; private set; } = false;public void Gameover(ResultType resultType){ Debug.Log("게임 종료 요청"); IsGameover = true; NetworkConnectController.Instance.ExitVivoxChennel(); NetworkSceneChanger.Instance.ChangeScene("LobbyScene"); resultUi =..

팀 프로젝트 - 퍼즐 정보 관련 인터페이스화

퍼즐의 정답을 전달하는 메서드를 인터페이스화 하여 확장성을 늘려주었습니다.public interface INetworkPuzzle{ public void SetPuzzleByNetwork(int[] hintNumbers);}public class NetworkPuzzleRepeater : NetworkBehaviour{ //...생략 [ClientRpc] public void SynchronizePuzzle1ClientRpc(int[] numbers, int puzzleIndex) { //TODO : 게임 매니저 싱글톤에 Puzzle 올려서 퍼즐에 이 내용 넣어주고 작동시키기 INetworkPuzzle puzzle = (INetworkPuzzle)Puz..

면접준비 - 힙과 스택 메모리, Find함수 사용을 자제해야하는 이유

힙 메모리 와 스택 메모리의 차이스택 메모리는 정적 메모리의 저장공간으로 빠른 접근이 가능하지만 메모리의 크기가 작으며, 주로 값 형식의 데이터가 저장됩니다.힙 메모리는 동적 메모리의 저장공간으로 참조형식의 데이터를 저장하며, 동적으로 메모리를 할당할 수 있어 메모리의 크기에 자유롭지만 상대적으로 접근 속도가 느립니다. 스택 메모리의 경우 사용이 종료되면 즉시 메모리의 할당이 해제되며, 힙 메모리의 경우 메모리의 할당과 해제를 직접 해주어야합니다.C# 의 경우 힙 메모리의 할당 해제를 가비지 컬렉터가 관리하여 별도로 해제를 해 줄 필요는 없지만 가비지컬렉터가 작동할 때 성능 저하가 발생하기 때문에 불필요한 객체생성을 줄여서 힙 메모리의 낭비를 줄이는것이 좋습니다. Find 함수 사용을 자제해야하는 이유F..

팀 프로젝트 - 퍼즐 관련 멀티플레이 연결

맵에 퍼즐을 배치하고, 퍼즐의 내용과 힌트를 멀티플레이로 연결해주었습니다. 퍼즐의 경우 협업한 팀원이 제작한 내용이며, 퍼즐 결과를 만든 뒤, 정답 내용을 ServerRpc 로 송신하도록 만들어주었습니다.Rpc의 특성상, 정답을 int값 배열로 변환하여 전달하도록 만들어주었습니다.//다시 시작하거나 라운드를 통과하였을 때 리스트를 다시 배정하는 코드private void SetRound(){ if (curRound >maxRound || Activatables.Count == curRound) return; //퍼즐이 모두 끝났거나 현재 라운드의 활성화될 오브젝트 수가 같다면 반환 List numbers = new List(); for (int i = 0; i  전달받는 플레이어는 int..

멀티플레이 테스트용 - ParrelSync

ParrelSync는 멀티플레이 구현시 테스트를 위해 다수의 인원이 필요할 때, 에디터를 복제하여 멀티플레이 구현을 테스트 할 수 있게 해주는 패키지입니다.패키지 매니저에서 받을 수 있지만, 공식 패키지가 아니기 때문에 git URL을 통해 받아주어야합니다.패키지 매니저 좌측 상단에 + 를 클릭하면 이러한 선택지가 나오는데, 이중 Add package from git URL... 을 선택하면 됩니다. 그러면 URL 입력창이 나오게 되는데, 아래 주소를 복사, 붙여넣기 하고 Add 버튼을 누르면 패키지가 설치됩니다.https://github.com/VeriorPies/ParrelSync.git?path=/ParrelSyncIn Project 패키지에 ParrelSync 가 추가되면 설치가 완료된것입니다. ..

팀 프로젝트 - 유령 배치, Navmesh 동적 생성

학생측의 역할이 된 플레이어의 게임 씬에 유령의 역할을 할 오브젝트를 스폰시키도록 제작해주었습니다.현재, 교수측은 직접적으로 유령과 조우하지 않기 때문에 학생측에게만 유령을 생성하도록 만들어주었으며, 교수측에게 필요한 정보는 별도로 Rpc를 사용하여 전달하게 될 듯 합니다.생성 코드입니다.public class NetworkGameManager : NetworkBehaviour{ //...생략 private void DoNextStep() { //...생략 else { NetworkSpawnController.Instance.SpawnPlayer(ProfessorId, StudentId); SpawnGhostCl..

팀 프로젝트 - 맵 데이터, 맵 생성

테스트용 구조물 배치 후, 맵의 정보를 저장하는 스크립트를 만들어주었습니다.일단 임시로 맵 프리팹에 스크립트를 붙여 맵 정보를 저장해둔 상태입니다.이후 맵 에디터를 본격적으로 만들때 Json 형태로 저장하는 방식을 사용할 가능성이 있습니다. 호스트측에서 맵을 결정한 후, 클라이언트에 맵을 생성해줄 방법이 필요했습니다.따라서 MapListSO 라는 이름으로 맵들을 저장하는 스크립터블 오브젝트를 만든 뒤, 리소스파일에 배치해주었습니다.맵이 정해진 후, ClientRpc 를 사용하여 int값으로 인덱스를 보내주고, 클라이언트는 해당 리스트에 접근한 뒤, 받은 인덱스 값에 위치한 맵을 생성하게됩니다. 맵 데이터와 리스트 SO, 유령의 순찰 경로를 지정해주는 클래스 입니다.[System.Serializable]p..

팀 프로젝트 - 아이템 기반

게임내에서 사용될 아이템의 기반을 만들어주었습니다.기본 틀은 모든 아이템이 가질 정보를 저장하는 ItemBase를 최상단 추상 클래스로 구현한 뒤,필드에 드랍되어 있거나 플레이어가 손에 들고있을 아이템의 오브젝트를 ItemObject로, 아이템 사용으로 인해 생성되는 투사체용으로 ItemProjectile 을 만들어주었습니다. 또한 ItemObject의 경우 추상클래스로 사용되며, 인터페이스인 IUseable을 통해 아이템 사용시 효과를 구현하게됩니다.이때, 사용시 발생하는 효과 메서드는 추상클래스로 구현하여 아이템의 고유 사용효과를 구현하도록 만들어주었습니다.더보기기반 ItemBasepublic enum ItemState{ None, Dropped, Holding}public abstr..