2024/12 22

팀 프로젝트 - 조작 관련 UI 추가, 로비 배경 추가

로비 화면에서 조작법을 볼 수 있는 UI를 제작해주었습니다.조작 키 변경의 경우, 구현 우선순위가 낮다고 판단하여 차후 시간이 남을경우에 구현하게 될 듯 합니다. 이 외에도 로비 배경으로 사용할 오브젝트들을 배치해 두었으며, 맵의 추가 유령 스폰, 아이템 스폰 시스템을 제작중에 있습니다.※바닥 재질의 텍스쳐를 구해야할 것 같습니다... 생각중인 내용UI 제작중, 현재로써는 해외 출시등을 전혀 고려하지 않고 제작중인 상태입니다.현업에서는 해외 진출등을 고려하는 경우가 많기 때문에, 현재처럼 TMP 에 직접적으로 텍스트를 입력하기보단, 외부에 어떤 텍스트를 사용할지, 어떤 폰트를 사용할지를 저장한 뒤, 사용할 언어를 선택하여 표기할것으로 생각됩니다. 폰트의 경우 사용되는 폰트가 제한적이기 때문에 SO를 사용..

팀 프로젝트 - 로비 UI 디자인 변경

로비 UI의 디자인을 변경하고, UI 활성화시 연출이 발생하도록 수정해주었습니다. 먼저 UI의 책을 넘기는 효과는 무료 에셋을 사용하여 구현해주었습니다.https://assetstore.unity.com/packages/tools/animation/book-page-curl-55588 Book - Page Curl | 애니메이션 도구 | Unity Asset StoreUse the Book - Page Curl tool from Abdullah Aldandarawy on your next project. Find this & more animation tools on the Unity Asset Store.assetstore.unity.com 해당 에셋의 Book.cs 에 추가적으로 FlipEvent 메..

팀 프로젝트 - 로비 개선

게임 종료 후, 이전 로비로 돌아오도록 로비를 개선해주었습니다.해당 개선으로 인해, 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..