전체 글 151

유니티 - 터레인(Terrain)

유니티에서 3D 게임의 광범위한 지형을 만들 때, 터레인을 사용하여 구현하게 됩니다. 터레인의 경우, 하이라키창에서 우클릭 후, 3D Object - Terrain 을 선택하여 생성 할 수 있습니다.이때, 생성과 동시에 Assets 폴더에 생성한 터레인의 데이터를 저장하는 Terrain Data 가 생성됩니다.생성된 터레인은 인스펙터에서 Terrain 컴포넌트와, 콜라이더 컴포넌트를 가지게 됩니다.Terrain 컴포넌트의 5개의 버튼을 통해 터레인 오브젝트를 조작 할 수 있습니다. 첫번째 버튼은 이웃 터레인을 생성하는 버튼입니다.선택시 현재 존재하는 터레인의 4방향에 녹색 기즈모가 나타나며, 기즈모로 표기된 범위를 클릭하면 해당 위치에 터레인을 추가 생성합니다.Mirror 모드를 사용하여 생성할경우, 생..

제네릭 SO

데이터 관리시 스크립터블 오브젝트에 리스트를 사용해서 관리하는 경우가 자주 있었는데, 관리해야하는 데이터들이 여러개일때 관련 내용을 하나의 스크립터블 오브젝트 클래스로 관리할 수 없을까 해서 내용을 찾아봤습니다. 스크립터블 오브젝트의 기본이 되는 클래스를 제네릭으로 선언한 뒤, 해당 클래스를 상속시키면서 관리할 데이터타입의 제네릭을 지정해주는 방식입니다.public class SOList : ScriptableObject{ public List list;}[CreateAssetMenu(fileName = "DataSOList", menuName = "DataSO/Map List")]public class MapListSO : SOList{} 현재는 이런 방식이면 상속 시키는 의미가 없어보일 수 있으..

팀 프로젝트 - 조작 관련 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..