내일배움캠프 103

면접 관련 - 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가지 특징이 있으며캡슐화는 접근 제어자를 통해 특정 정보를 은닉하면서 작성한 코드를 재활용하는 특징추상화는 공통된 기능이나 속성을 묶어서 제공하는 특징상속은 부모 클래스의 기능을 그대로 물려받으면서, 추가 기능을 구현할 수 있는 특징다형성은 변수명, 함수명이 같아도 다른 기능을 할 수 있게되는 특징입니다. 생명주기유니티의 생명주기는 별도로 호출되지..

팀 프로젝트 - 리팩토링 대상 정리

NetworkConnectController - Awake 에 NetworkGameObject 생성 기능NetworkSpawnController 클래스를 만들면서, 네트워크 오브젝트의 생성, 삭제를 이 클래스에서 관리하는 방향으로 잡았음, 임시로 넣어준 기능의 위치 변경 필요LobbyManager - 인증 메서드 Authenticate()인증 시스템 자체를 별도의 클래스로 빼는것이 좋아보임LobbyManager - 로비 정보 새로고침 메서드 - RefreshLobbyInfo()메서드 내에 준비 상태 확인 로직, 게임 시작시 로직이 들어가있는 상태이 로직들을 별개의 메서드로 빼고, 메서드를 호출시키는것이 직관적일수 있다고 생각중VivoxController - 로그인 관련 메서드 SetupVivox()UGS..

팀 프로젝트 진행 - 멀티플레이 구현

팀원이 제작한 플레이어 오브젝트를 네트워크 오브젝트화 하여 멀티플레이를 구현하였습니다. 캐릭터 생성 로직네트워크 오브젝트를 스폰하기 위한 클래스를 생성해주었습니다.이후 모든 오브젝트의 생성을 이 클래스가 당담할 예정입니다.public class NetworkSpawnController : MonoSingleton{ public Transform profassorSpawnPoint; public Transform studentSpawnPoint; public NetworkObject playerPrefab; protected override void Awake() { Create(); if (Instance != this) { ..

팀프로젝트 진행 - 재시작 문제 해결

호스트와의 연결이 끊길경우, 호스트가 서버를 종료했을경우 클라이언트 플레이어가 로비로 돌아오도록 수정해주었습니다.public class NetworkConnectController : MonoBehaviour{ public NetworkObject networkGameManager; private void Awake() { if (NetworkManager.Singleton.IsHost) { NetworkObject netGameManager = Instantiate(networkGameManager); netGameManager.Spawn(true); } } //게스트 플레이어의 경우, 서버와 연결이..

Netcode - NetworkObject, NetworkBehaviour

NetworkObject 서버를 통해 작동해야하는 오브젝트에 붙여주는 컴포넌트호스트측에서 Instantiate 를 한 뒤, Spawn을 해서 클라이언트측에서 해당 오브젝트가 생성됨클라이언트측에서는 오브젝트를 생성, Spawn 할 권리가 없음Spawn(false) 를 할 경우, DontDestroyOnLoad 가 붙은 오브젝트로 생성됨(기본값이 true, 씬을 넘어가면 파괴됨)호스트측에서 오브젝트를 생성하고, SpawnWithOwnerShip() 을 사용하여 입력한 클라이언트 ID 의 소유로 생성해 줄 수 있다Spawn시 유니티 생명주기중 Awake 이후에 스폰된다, 따라서 Awake를 사용할 수 없다NetworkBehaviourNetworkManager 와 별도로 IsHost, IsClient 등의 플래..

팀 프로젝트 - Vivox 조작 UI 제작

좌측 하단에 다른 참가자가 입력을 할 경우 이를 시작적으로 표시해 줄 수 있는 HUD UI와, 보이스채팅 음량을 조절할 수 있는 UI를 제작하였습니다. 보이스채팅 채널에 입장할 때, HUD UI를 생성해주는 코드입니다.public class VoiceChatSetter : MonoSingleton{ public List chatList = new List(); public RosterItem hudUiPrefab; public Transform hudParentPosition; protected override void Awake() { Create(); if (Instance != this) { Destroy(gameO..