분류 전체보기 134

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

퍼즐의 정답을 전달하는 메서드를 인터페이스화 하여 확장성을 늘려주었습니다.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..

면접 관련 - Update문, float와 int 의 표현 가능한 범위가 다른 이유

Update문의 종류와 특징프레임당 1회 실행되는 Update문, 일정한 시간마다 1회 실행되는 FixedUpdate문, Update 문이 종료된 후 실행되는 LateUpdate 문이 있습니다. Update문의 경우, 생명주기가 1회 반복되는 프레임마다 호출되기 때문에 기기성능에 따라 시간당 실행되는 횟수가 달라지며, 실시간으로 값이 변화하거나, 감지해야하는 기능을 구현할경우 사용하기 좋습니다. FixedUpdate 문의 경우, 일정한 시간마다 호출되어 기기성능에 영향을 받지 않습니다.이러한 특성으로 물리 연산이나 레이캐스팅을 사용하는 충돌처리, 기기의 성능에따라 달라지면 안되는 내용의 기능을 구현할때 사용하게됩니다. LateUpdate문은 Update문이 호출된 후, Update문이 종료되었을때 1회 ..

팀 프로젝트 - 맵 에디터 기반 제작

맵 제작을 위한 맵 에디터의 기반을 만들어주었습니다. 파란색이 교수측 플레이어 캐릭터의 생성위치, 노란색이 학생측 플레이어의 생성위치를 표기하며, 붉은색은 유령의 생성위치를 표기합니다. Generate players spawn 버튼으로 2명의 플레이어 스폰 위치를 생성 할 수 있으며, Generate ghost spawn 으로 유령이 스폰될 위치를 정해줄 수 있습니다. 플레이어는 2명으로 고정되어있으며, 현재로써는 스폰 위치가 고정될 예정이기때문에 각각 하나씩의 스폰위치가 생성되면 이후로는 생성되지 않습니다. 유령의 경우 다수의 스폰 위치를 사용할 수 있으며, 이후 모든 위치에서 스폰이 될지, 일부 위치에서만 스폰시킬지 결정하게될듯 합니다. Set spawn positions as Inspactor 와 ..

팀 프로젝트 - 클라이언트 캐릭터 위치문제

멀티플레이 구현중, 씬이 로드된 후 캐릭터를 스폰하는 방식을 사용중, 특정 위치를 지정하고 생성하였으나 이후 0, 0, 0 으로 위치가 변경되는 오류가 발생하였습니다. Instantiate 로 오브젝트를 생성한 후, SpawnAsPlayerObject 로 네트워크 오브젝트를 스폰 시킨 후 Position 값은 모두 지정해준 위치였으나, 그 이후에 어떤 이유에서인지 0, 0, 0 으로 오브젝트의 위치가 변하였습니다. 해당 문제의 경우 CharacterController 를 사용하여 멀티플레이를 구현할 때 발생하는 오류인것으로 확인하였습니다.CharacterController 를 사용할 때, 클라이언트가 소유권을 넘겨받으면서 위치정보에 대한 오류가 발생하여 0, 0, 0 으로 이동되는 문제가 있다고합니다. ..