전체 글 1187

Dynamo DB - 2) 사용자 인증 처리

- 개요회원가입한 플레이어가 인증한 후에 사용자 정보를 Dynamo DB에 추가하는 람다 함수를 생성한다 - 절차1) 람다 함수 생성 및 정책 설정 AWS 콘솔의 람다 탭에서 CongitoPostConfirmation 람다 함수를 생성한다 생성한 람다 함수에 적용할 정책을 설정한다우선, Players 테이블을 대상으로 정책을 사용하도록 Players 테이블의 리소스 ARN을 복사 + 붙여넣기한다 정책은 DynamoDB의 PutItem 리소스를 사용할 수 있도록 구성하였다 생성한 정책의 이름을 위와 같이 설정한다 최종적으로 생성한 CognitoPostConfirmation 람다 함수에 정책을 적용한다 람다 함수에서 사용할 REGION 환경 변수를 정의한다 2) 람다 함수 정의import { Dyn..

Dynamo DB - 1) 플레이어 데이터 테이블

- 개요AWS에서 제공하는 서버리스 기반의 초고속, 완전관리형 NoSQL 데이터베이스인 Dynamo DB를 사용하여플레이어에 관한 데이터를 관리 + 수정 + 저장한다GameLift가 Game Session을 배포 + 확장 + 호스팅하는 역할을 수행한다면DynamoDB는 Game Session 안과 밖에서 발생하는 막대한 데이터를 관리하는 용도로 사용한다 - 구성1) 데이터 테이블의 생성 생성할 Dynamo DB의 테이블 이름과 파티션 키를 위와 같이 설정한다세부 정보에서 적용할 수 있는 설정은 다음과 같다테이블 이름 : 테이블의 고유 이름파티션 키 : 생성할 테이블의 데이터를 여러 물리적 서버(파티션)로 나누어 저장할 때 기준이 되는 키 정렬 키 : 동일한 물리적 서버(파티션) 안에서 데이터를 정렬하는 ..

PlayerSession 처리 - 최종) UI를 통한 게임에 접속한 플레이어 표시

- 개요로비에 UI를 추가하여 한 게임의 GameSession에 접속하는 플레이어들을 표시한다 - 스크립트 작업1) LobbyState 클래스 GetPlayers 함수를 추가하여 PlayerInfoArray로부터 Players 변수를 반환한다 2) PlayerLabel 클래스 게임에 접속하는 플레이어에 대한 한 개의 행을 의미하는 PlayerLabel 클래스를 생성한다멤버변수의 구성은 위와 같다TexyBlock_UserName 멤버변수 : 플레이어의 이름을 보여주는 TextBlock UI TextBlock UI에 대한 2개의 함수를 정의한다 SetUserName 함수를 호출하여 TextBlock UI의 텍스트를 설정하고GetUserName 함수를 호출하여 TextBlock UI의 텍스트를 가져온다 3..

로컬 좌표를 사용한 구 바운딩 볼륨 생성

- 개요 절두체 컬링에 사용하는 구 바운딩 볼륨은 로컬 좌표를 기준으로 생성되는 데이터다그러나 절두체 컬링은 뷰 공간에서 수행된다따라서 이전에 수동으로 로컬 좌표로 저장된 구 바운딩 볼륨을 뷰 공간으로 변환하여 절두체 컬링을 진행하였다하지만 매번 로컬 공간에 저장된 바운딩 볼륨을 뷰 공간으로 변환하는 작업은 다소 불편하다따라서 이를 개선하여 로컬 공간의 데이터로 바로 절두체 컬링을 진행하도록 수정한다 - 개선 : 로컬 공간의 데이터를 활용한 바운딩 볼륨의 생성 뷰 공간에서의 영역 판정을 위해 원근 투영 행렬을 사용하여 평면의 방정식을 생성할 수 있었다이때 사용한 원근 투영 행렬을 P로, 클립 공간의 좌표를 V(clip)으로, 뷰 공간의 좌표를 V(view)로 표시하면위와 같이 수식을 정리할 수 있다 이..

구 바운딩 볼륨을 이용한 절두체 컬링

- 개요 구 바운딩 볼륨을 사용하여 절두체 영역과 구 영역을 비교하는 CheckBound 함수를 사용하여 절두체 컬링을 진행한다절두체 영역과 겹치는 구 영역의 게임 오브젝트는 붉은색으로 표시하고,절두체 영역 내부에 포함된 구 영역의 게임 오브젝트는 일반적으로 표시한다 - 예제 렌더링을 진행하는 Render3D 함수의 로직을 위와 같이 구성한다intersectedObjects 로컬 변수를 사용하여 절두체 영역과 구 영역이 겹치는 경우를 파악한다finalColor 로컬 변수를 사용하여 게임 오브젝트의 색상을 지정한다이후 메시의 구 바운딩 볼륨을 가져와 sphereBound 로컬 변수에 저장하고sphereBound의 반지름을 트랜스폼의 세 가지 값 중에서 가장 큰 값으로 반영한다또, sphereBound의 중..

바운딩 볼륨

- 개요 이전에 원근 투영 행렬을 활용한 절두체 컬링에서 카메라를 이동시키면화면 가장자리의 게임 오브젝트가 갑자기 튀어오르거나 사라지는 현상이 발생하였다위와 같은 현상이 발생하는 이유는 게임 오브젝트의 메시가 차지하는 공간 영역이 있음에도 불구하고게임 오브젝트의 기존 위치만 가지고 절두체 컬링을 수행하기 때문이다위의 이미지와 같은 상황에서 해당 게임 오브젝트는 그려져야 하지만기존의 절두체 컬링 로직을 사용한다면 절두체의 외부에 있다고 판단하여 그리기를 생략한다 1) 바운딩 볼륨의 도입 문제를 해결하기 위해 절두체 컬링은 게임 오브젝트의 위치가 아닌, 메시가 차지하는 영역을 대상으로 진행해야 한다게임 엔진은 메시가 차지하는 영역을 효과적으로 관리하기 위해 구나 박스와 같은 원시 도형을 사용하는데,이러한 원..

유닛 설치 - 2) 유닛 생성

- 개요유닛을 설치할 수 있는 타일을 선택한 후에 버튼을 눌러 유닛을 생성하도록 설계한다유닛을 생성한 후에는 자원을 소모하도록 구성한다 - 스크립트 작업1) UI_Canvas 클래스 유닛 생성 버튼을 묶어서 관리하는 UI_BuildBtns에 대한 프로퍼티를 추가하고Awake 함수에서 추가한 프로퍼티의 값을 설정한다 2) UI_Pause 클래스 + UI_InGame 클래스 일시정지 UI와 인게임 UI를 교환하는 로직을 F10 키로 동작하도록 코드를 수정한다 3) UI_BuildBtns 클래스 ShowBuildButtons 함수의 로직을 수정하여 외부에서 인자를 받아 유닛 생성 버튼들을 활성화 / 비활성화한다 4) UI_BuildBtn 클래스 유닛을 생성하는 생성 버튼에 사용할 UI_BuildBtn 클래스..

유니티 엔진의 구성 - 49) Netcode for GameObjects (1)

- 개요NetCode for GameObjects는 유니티에서 멀티플레이어 게임 개발을 지원하는 공식 네트워킹 프레임워크이다언리얼 엔진의 Replication처럼 게임을 구성하는 여러 정보들을 동기화하는 목적으로 사용한다 - 사용 절차1) 기본 세팅 패키지 매니저를 통해 NetCode for GameObjects 패키지를 설치한다 빈 게임 오브젝트를 생성하고 NetworkManager 컴포넌트를 추가한다해당 컴포넌트를 사용하여 멀티 플레이와 관련된 대부분을 처리한다주의해야 하는 점은 해당 컴포넌트는 1개만 존재해야 한다는 점이다 NetworkManager 컴포넌트의 주의사항에서 확인할 수 있듯이 의존 관계의 Multiplayer Tools 패키지도 설치한다 Network Transport 설정은 클..

유닛 설치 - 1) 선택한 타일 시각화

- 개요유닛을 설치할 수 있는 타일을 플레이어가 선택하면 시각화하도록 설계한다 - 스크립트 작업1) TileAnimator 클래스 타일을 시각화하기 위한 TileAnimator 컴포넌트 클래스를 추가한다멤버변수를 위와 같이 구성한다yMovementDuration 멤버변수 : 타일을 시각화하는 시간buildTileSlotOffset 멤버변수 : 타일을 시각화하기 위해 적용할 높이Instance 멤버변수 : TileAnimator의 싱글턴 인스턴스activeMoveTileCoroutines 멤버변수 : 타일 시각화를 수행하는 코루틴을 저장하여 중복 실행을 방지하는 딕셔너리targetTile 멤버변수 : 테스트용 멤버변수 Awake 함수를 추가하여 싱글톤 인스턴스를 저장한다 Get 함수들을 추가하여 시각화..

PlayerSession 처리 - 3) AInfo 클래스와 AGameState 클래스

- 개요게임에 참여하지 않은 로비에 있는 플레이어들을 관리하기 위한 2개의 클래스를 추가한다AInfo 클래스는 월드에 존재하되, 물리적 형태나 시각 표현이 필요없는 Actor들의 최상위 클래스이다따라서 보통 게임의 규칙이나 데이터를 관리하는 용도로 사용한다AGameState 클래스는 서버와 클라이언트 모두가 접근할 수 있으며 현재 게임의 상태를 기록하는 용도로 사용한다 - 스크립트 작업1) LobbyState 클래스 OnPlayerInfoChanged 델리게이트를 추가하여로비의 플레이어 정보를 저장하는 LobbyPlayerInfo가 변경될 때마다 브로드캐스트한다 LobbyPlayerInfoDelta 구조체를 추가하여 로비에 입장한 플레이어와 퇴장한 플레이어를 저장한다 AInfo 클래스를 상속받은 Lo..