전체 글 132

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

맵에 퍼즐을 배치하고, 퍼즐의 내용과 힌트를 멀티플레이로 연결해주었습니다. 퍼즐의 경우 협업한 팀원이 제작한 내용이며, 퍼즐 결과를 만든 뒤, 정답 내용을 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 으로 이동되는 문제가 있다고합니다. ..

팀 프로젝트 - 오브젝트 스폰 시점 수정, 로딩 씬 추가

변경점UGS 인증을 별도의 클래스로 만들어주었습니다. 또한 UGS에 로그인을 한 뒤 Vivox에 로그인 하도록 변경하였습니다.public class NetworkAuthenticate : MonoSingleton{ public TMP_InputField nameInput; //로그인 성공시 호출 public event Action OnAuthenticateSuccessEvent; private readonly string loginText = "Connecting"; protected async override void Awake() { Create(); if (Instance != this) { Destroy(ga..

면접관련 - 객체지향 프로그래밍과 유니티 생명주기

객체지향절차지향이 코드간의 순서를 중요시한다면 객체지향은 코드를 담고있는 객체간의 관계를 중요시하는 패러다임 입니다. 객체지향에서는 클래스와 인스턴스가 존재하며, 클래스는 객체에 필요한 속성과 기능에 대한 정보를 가지고 관리하며,인스턴스는 클래스를 기반으로 실제 메모리에 할당된 내용을 뜻합니다. 그리고 객체지향 프로그래밍에는 캡슐화, 추상화, 상속, 다형성의 4가지 특징이 있으며캡슐화는 접근 제어자를 통해 특정 정보를 은닉하면서 작성한 코드를 재활용하는 특징추상화는 공통된 기능이나 속성을 묶어서 제공하는 특징상속은 부모 클래스의 기능을 그대로 물려받으면서, 추가 기능을 구현할 수 있는 특징다형성은 변수명, 함수명이 같아도 다른 기능을 할 수 있게되는 특징입니다. 생명주기유니티의 생명주기는 별도로 호출되지..