내일배움캠프/TIL 53

멀티플레이 테스트용 - ParrelSync

ParrelSync는 멀티플레이 구현시 테스트를 위해 다수의 인원이 필요할 때, 에디터를 복제하여 멀티플레이 구현을 테스트 할 수 있게 해주는 패키지입니다.패키지 매니저에서 받을 수 있지만, 공식 패키지가 아니기 때문에 git URL을 통해 받아주어야합니다.패키지 매니저 좌측 상단에 + 를 클릭하면 이러한 선택지가 나오는데, 이중 Add package from git URL... 을 선택하면 됩니다. 그러면 URL 입력창이 나오게 되는데, 아래 주소를 복사, 붙여넣기 하고 Add 버튼을 누르면 패키지가 설치됩니다.https://github.com/VeriorPies/ParrelSync.git?path=/ParrelSyncIn Project 패키지에 ParrelSync 가 추가되면 설치가 완료된것입니다. ..

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

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

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

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

Netcode - NetworkObject, NetworkBehaviour

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

특강 - 그래픽스와 셰이더

CPU - 모든 연산을 처리RAM - 주 기억장치SSD(하드디스크) - 보조 기억장치 - 모니터의 해상도가 커지면서, 모니터의 모든 픽셀을 CPU가 연산하여 처리하기에는 비 효율적→ 낮은 연산능력의 코어를 여러개 가져서, 낮은 수준의 많은 연산을 동시 처리하는 GPU가 등장하게됨 다수의 픽셀 처리를 GPU가 당담하게 되어 CPU는 중요 연산만 처리하고, 화면은 GPU가 당담※ 여담, 이러한 병렬처리 능력 때문에 딥러닝에서 GPU를 주로 사용하게 된다.컨벌루젼 네트워크를 통해 학습을 진행하는데, 이것이 점마다 연산을 처리한 뒤, 결과물을 다시 연산하는것을 반복하기 때문이다. 랜더링 파이프라인3차원으로 만들어진 모델을, 2차원으로 투영하는 과정3차원 도형은 버텍스라는 이름의 점으로 이루어져있으며, 버텍스는 ..

최종 팀프로젝트 - 멀티플레이 기반 생각하기

최종 프로젝트로 한쪽이 갇혀 있는상태로 퍼즐에 대한 힌트를 주고, 다른 한쪽은 외부에서 돌아다니며 퍼즐을 풀어 갇힌 사람을 구해내는 형태의 공포 게임을 제작하기로 하였습니다. 이를 위해 멀티플레이 로비와 인게임 보이스 채팅을 구현해야하게 되었습니다. 일단 로비와 플레이의 경우, Photon2를 사용하여 구현해볼까 하다가, 한번 UGS를 활용하여 Lobby, Relay를 사용하여 구현해볼 생각입니다. 또한 현재는 2명의 플레이어의 협동 플레이 게임이므로, P2P 형태의 서버를 구축하여도 문제가 없다고 생각중 입니다. 또한, 인게임 보이스 채팅은 UGS에서 Vivox 를 통해 지원하며, 5000명 이하의 동시 사용에 대해 무료로 사용할 수 있음을 확인하였으며, Lobby, Relay와의 연동이 잘 되어있다고..

특강 - 게임을 완성시키기 위한 기획

게임 개발에서의 커뮤니케이션서로의 생각을 이해하고, 함께 가고자 하는 방향으로 합쳐나가는것함께 가고자 하는 방향을 어떻게 잡을것인가 → 기조를 어떻게 잡을것인가기획에 대한 생각을 납득하게 하는것이 중요하다.납득을 위해 논리를 사용하게 된다.기조는 보통 상급자 (기획자)가 결정하게 되지만, 아마추어 단계에서는 개발자 본인이 결정하게 될 수도 있다. 좋은기조가능한 모든 구성원이 동의할 수 있어야한다.쉽게 변경되지 않아야한다.기조간의 우선순위가 명확하게 체계화 되어야한다.좋은 기조를 위한 기반논의를 주도할 리더가 있어야한다수평적 의사결정은 오히려 독이 될 가능성이 있다프로젝트 초기에 기조를 정해두는것이 좋다기조는 의견합치가 중여한데, 추상적인 상태에서 합치는것이 쉽다중간에 기조를 바꿀경우 의견 충돌의 가능성이..

게임 제작을 나누는 단계

최종프로젝트 진행 전, 어떻게 프로젝트를 진행해야하는지에 대한 내용 정리입니다. 게임 사이클을 만들기게임 사이클은 게임을 시작하고, 게임이 끝날때 까지의 진행 과정입니다.솔로플레이, 챕터 진행 방식의 게임이라면, 챕터의 시작를 시작하고, 챕터가 완료될 때 까지 어떻게 진행될지를 만들어야 합니다.PVP형태의 게임이라면, 매칭이 끝나고 게임을 어떻게 시작할지, 게임의 진행은 어떻게 될지, 게임이 어떻게 종료될지(승리, 패배 판정) 을 만들어야합니다.단계를 나누기1단계구현이 종료되면 게임이 돌아가는 단계입니다.게임성, 화려한 이펙트, 추가기능등은 구현할 필요가 없습니다.게임이 진행되기만 하면 됩니다. 로그라이크형 게임일 경우, 스테이지가 시작된다 - 방에 입장하면 전투가 시작된다- 전투가 종료되고 보상을 준다..

타일맵 위치에 오브젝트 생성하기

팀 프로젝트로 타워디펜스를 제작하게 되었는데, 타일맵을 사용할 때, 타워의 설치 위치를 정해주어야 하는 상황이 생겼습니다. 일단 마우스가 Collider 에 올라가면 자신을 설치 위치로 잡아주는 오브젝트를 제작하였는데, 이것을 지정한 타일에 올려줄 방법이 필요아였습니다.public class ConstructPoint : MonoBehaviour{ public bool IsTowerConstructed { get; private set; } public Transform constructPosition; public Tower ConstructedTower { get; private set; } [SerializeField] private GameObject selectImage; ..

중첩 코루틴, 다수의 코루틴

유니티 공식문서의 코루틴 부분 마지막에는 이러한 문구가 있습니다. 일련의 작업을 최대한 적은 수의 개별 코루틴으로 압축하는 것이 가장 좋습니다. 중첩 코루틴은 코드 명료성과 유지관리에 용이하지만 코루틴이 오브젝트를 추적하기 때문에 더 많은 메모리가 소모됩니다.코루틴이 매 프레임마다 실행되고 오래 실행되는 작업에서 yield 되지 않는 경우 Update 또는 LateUpdate 콜백으로 대체하는 것이 더 효과적입니다. 이는 오래 실행되거나 무한 루프되는 코루틴의 경우에 유용합니다. 이때, 중첩 코루틴의 경우, 실행중인 코루틴 내부에서 다른 코루틴을 호출하는 경우로, 이러한 경우를 사용하지 않는것을 권고하고 있습니다. 또한, while문을 사용하여 실행중 무한히 반복되는 코루틴이나 오랜시간동안 실행되는 코루..