전체 글 1260

적 추가 - 6) 최종보스의 구성 (1)

- 개요모든 웨이브를 클리어한 후에 등장하는 최종보스를 구현한다최종보스는 거미 형태의 적으로 거미와 같은 움직임을 Animation Rigging 패키지를 통한 IK를 사용하여 구현한다 - 스크립트 작업1) Enemy_Base 클래스 EnemyType 열거형에 최종 보스를 의미하는 Final_Boss 멤버를 추가한다 2) Enemy_Boss 클래스 보스에서 사용하는 Enemy 컴포넌트의 클래스를 생성한다 3) BossParts 클래스 보스의 기능을 수행하는 BossParts 클래스를 생성한다멤버변수를 위와 같이 구성한다legMoveSpeed 멤버변수 : 보스의 다리 움직임 속도legs 멤버변수 : 보스의 다리들 Start 함수를 위와 같이 구성하여 legs 멤버변수의 값을 구성하고Update 함수를 위와..

UI 구성 - 4) 강퇴와 닉네임 설정

- 개요리슨 서버의 역할을 맡은 플레이어가 다른 플레이어들을 로비에서 강퇴시킬 수 있는 기능을 추가한다또, 로비에 들어와 있는 플레이어들이 자신의 닉네임을 설정할 수 있는 기능을 추가한다 - 스크립트 작업1) SOO_PlayerState 클래스 로비 레벨과 인게임 레벨 모두에서 사용하는 PlayerState의 코드를 위와 같이 수정한다NickName 변수를 사용하여 플레이어가 원하는 닉네임을 사용할 수 있도록 설정한다 CopyProperties 함수에 로직을 추가하여 닉네임을 Travel 이후에도 유지한 채로 넘겨준다 GetLifetimeReplicatedProps 함수에 로직을 추가하여 닉네임을 레플리케이션할 수 있도록 설정한다 GetKickedByServer 함수는 서버에서 호출하여 클라이언트에..

UI 구성 - 3) 플레이 준비와 게임 입장

- 개요로비 레벨의 플레이어들이 게임에 접속할 수 있도록 준비하고모든 플레이어가 준비되면 게임 레벨로 이동하여 게임을 플레이할 수 있도록 설정한다 - 스크립트 작업1) SOO_PlayerState 클래스 프로젝트에서 사용하는 PlayerState에 위와 같이 함수와 변수를 추가한다bIsReady 멤버변수를 사용하여 플레이어의 게임 플레이 준비 여부를 설정한다 GetLifetimeReplicatedProps 함수를 오버라이드하여 bIsReady 변수가 레플리케이트되어 동기화할 수 있도록 설정한다 OnRep_IsReady 함수를 추가하여 bIsReady가 변경될 때마다 로비 UI를 갱신한다 2) SOO_LobbyPlayerController 클래스 로비 레벨에서 사용할 PlayerController 클래..

UI 구성 - 2) 로비 UI 갱신

- 개요생성된 게임의 로비에 입장한 플레이어에 맞춰 로비 UI를 갱신하는 작업을 추가한다 - 스크립트 작업1) SOO_LobbyHUD 클래스 로비에서 사용할 HUD 클래스에 위와 같이 RefreshUI 함수를 추가한다해당 함수는 BlueprintImplementableEvent 속성을 부여하여 블루프린트에서 오버라이드한다 2) SOO_PlayerState 클래스 로비 레벨과 인게임 레벨에서 공동으로 사용하는 PlayerState 클래스에 위와 같이 3개의 함수를 추가한다 RefreshLobbyUI 함수의 로직은 위와 같다월드를 통해 로컬 플레이어의 PlayerController를 가져오고 다시 HUD 클래스를 가져와 RefreshUI 함수를 호출한다 OnPlayerStateDestroyed 함수를 추..

UI 구성 - 1) 타이틀과 로비

- 개요인게임에 들어가기 전에 거치는 2가지 단계의 레벨을 추가한다각각 타이틀과 로비로서, 타이틀에서는 게임 생성과 게임 입장을 처리한다로비에서는 입장한 게임에 대한 정보를 표현한다플레이어는 타이틀에 입장하여 로비를 거쳐 최종적으로 인게임에서 플레이하게 된다 - 스크립트 작업1) SOO_PlayerState 클래스 인게임 레벨과 로비 레벨은 동일한 PlayerState 클래스를 사용한다이때 레벨에서 레벨로 넘어가는 Travel을 진행할 때 필요한 정보를 유지한 채로 넘겨주기 위해CopyProperties 함수를 오버라이드하여 새로 생성된 PlayerState에 정보를 넘겨준다 2) SOO_LobbyGameModeBase 클래스 로비 레벨에서 사용할 GameMode 클래스를 생성한다bUseSeamles..

사원수의 변환 (3) 사원수 - 회전 변환행렬 (2)

- 개요이전의 방식으로 회전 변환행렬에서 사원수를 계산하는 경우 예외 사항이 존재한다트레이스의 값이 -1보다 작거나 같다면 제곱근을 구하는 값이 0보다 작거나 같아져W를 구하는 데 필요한 r의 해가 존재하지 않게 된다 예를 들어 Y축으로 180° 회전하는 행렬은 X 기저와 Z 기저를 반대 방향으로 돌리므로 위와 같이 구성된다이 행렬을 사용하게 되면 트레이스 값이 -1이 되고 W 값은 0이 된다0의 역수는 존재하지 않기에 나머지 값들을 계산할 수 없다따라서 이런 경우 W가 아닌 다른 요소부터 계산한 후에 이로부터 다른 성분을 계산하도록 우회해야 한다 - 예외 처리 과정 주어진 Y축으로 180° 회전하는 행렬에서 첫 번째 대각 성분에서 두 번째, 세 번째 대각 성분을 뺀다 최종적으로 X 값을 위와 같이 ..

사원수의 변환 (2) 사원수 - 회전 변환행렬

- 개요사원수에서 회전 변환행렬로 변환하는 식을 계산한다회전 변환행렬은 로컬 축으로 구성되어 있기 때문에사원수를 사용하여 회전된 세 로컬 축의 값을 계산하면 쉽게 변환하는 것이 가능하다 - 사원수에서 회전 변환행렬로의 변환 사원수를 구성하는 네 가지 요소를 x, y, z, w라고 가정할 때,회전 사원수의 r 벡터의 값은 (x, y, z)가 되고 여기에 회전시킬 벡터 v 값을 대입하면외적 식으로 회전된 벡터의 값을 계산할 수 있다먼저 회전할 벡터는 x축 기저벡터 (1, 0, 0)이고 이를 계산한 결과는 사원수에 의해 회전된 x 로컬 축을 의미한다 동일한 사원수에 대해 y축과 z축의 기저벡터 (0, 1, 0)과 (0, 0, 1)을 대입하면 위와 같이 사원수에 회전된 y 로컬 축과 z 로컬 축을 계산할 수 ..

적 추가 - 5) 중간보스 적의 추가

- 개요스타크래프트의 캐리어와 같이 무리지어 오는 적을 대거 소환하는 중간보스를 추가한다무리지어 오는 적을 처치해도 보상을 주지는 않지만, 중간보스가 파괴되면 소환된 적들도 파괴된다 - 스크립트 작업1) Enemy_Base 클래스 기존의 멤버변수들을 protected로 변경하여 필요한 경우 자식 클래스에서 사용할 수 있도록 설정한다또, Rigidbody 멤버변수를 추가하여 적용된 컴포넌트를 캐싱한다 Awake 함수에서 추가한 Rigidbody 멤버변수의 값을 설정한다 Start 함수의 로직을 수정하여 NavMeshAgent 컴포넌트가 활성화되었는지 확인한다 Update 함수를 수정하여 NavMeshAgent 컴포넌트가 유효한지 + 이동할 경로가 설정되었는지 확인한다 플레이어가 설치한 유닛에 의해 ..

프로젝트 세팅 - 최종) 달리기 추가와 핸디캡

- 개요플레이어들이 빠르게 이동할 수 있는 달리기 기능을 추가한다하지만 달리게 되면 4개의 기둥을 찍는 우승 조건에 가까워지므로 기둥을 찍을 때마다 달리기 속도를 느리게 만드는 핸디캡을 부여하도록 설정한다 - 스크립트 작업1) SOO_Action_Sprint 클래스 Shift 키를 누르는 동안 호출되는 IA에 연계되어 동작하는 행동(Ability) 클래스를 정의한다OriginalMaxWalkSpeed 멤버변수를 사용하여 캐릭터의 기본 이동속도를 저장한다 TryActivate 함수를 위와 같이 정의하여 캐릭터로부터 달릴 때의 이동속도를 가져와캐릭터의 CharacterMovementComponent에 적용하고 ActionComponent를 통해 서버 RPC를 진행한다 Cancle 함수를 위와 같이 정의하..

프로젝트 세팅 - 11) 킬스코어의 추가

- 개요킬스코어를 추가하여 게임이 종료된 후에 최고 킬스코어를 표현하도록 설정한다 - 스크립트 작업1) SOO_PlayerState 클래스 killCount 멤버변수를 추가하여 플레이어가 처치한 다른 플레이어들(AI, 유저 모두)의 수를 저장한다 2) SOO_GameModeBase 클래스 기존에 사용하던 OnPlayerDeath 함수를 개선하여 OnCharacterDeath 함수로 이름을 변경하고쓰러진 AI 캐릭터와 플레이어 캐릭터 모두 호출하도록 설정한다또, GetTopKillScore 함수를 추가하여 최고 킬스코어를 달성한 플레이어의 PlayerState를 반환한다 OnCharacterDeath 함수의 로직을 위와 같이 구성한다인자로 받은 공격자 플레이어 캐릭터의 PlayerState를 가져와 ki..