UDN
Search public documentation:

DevelopmentKitGemsRacerStarterKitKR
English Translation
日本語訳
中国翻译

Interested in the Unreal Engine?
Visit the Unreal Technology site.

Looking for jobs and company info?
Check out the Epic games site.

Questions about support via UDN?
Contact the UDN Staff

UE3 홈 > UDK 젬 > 레이서 스타터 키트
UE3 홈 > 시작하기: 프로그래밍 > 레이서 스타터 키트

레이서 스타터 키트


문서 변경내역: James Tan 작성. 홍성진 번역.
UDK 2011년 7월 버전으로 최종 테스팅

개요


이 스타터 키트에는 카 레이싱 게임 개발 시작점으로 삼아볼 수 있는 예제 코드가 들어 있습니다.

SRG_0_BeautyShot.jpg

ALERT! 이 스타터 키트는 함수로의 터치 인풋 과 같은 모바일 상호작용을 사용하므로, PIE 에서 게임을 시작하기 전 Mobile Emulation (모바일 이뮬레이션)을 켜 주시기 바랍니다. 모바일 이뮬레이션을 켜려면 스크린 샷에 보이는 것처럼 언리얼 에디터의 툴바에 있는 버튼을 눌러주기만 하면 됩니다.

EmulateMobile.jpg

내용물


  • 단순 바퀴 비히클 (SRG_Vehicle + SRG_VehicleCameraProperties) (비히클 + 비히클 카메라 프로퍼티) - 이 비히클은 프로퍼티로 아키타입을 만들 수 있는 단순한 비히클입니다. VehicleCameraProperties (비히클 카메라 프로퍼티) 아키타입 안에 저장된 프로퍼티를 사용하여 카메라를 덮어쓸 수도 있습니다.
  • 커스텀 키즈멧 (SRG_SeqAct_ConcatenateStrings + SRG_SeqAct_VehicleTeleport) (문자열 합치기 + 비히클 텔레포트) - 커스텀 키즈멧 시퀸스 액션 노드가 둘 있는데, 하나는 키즈멧에서 두 문자열을 합치는 기능을 하고, 또 하나는 비히클을 다른 액터 위치로 텔레포트시키는 기능을 합니다.
  • 아키타입 비히클을 사용하는 게임 인포 (SRG_GameInfo) - 게임인포는 플레이어용 아키타입 비히클을 만들고 플레이어에게 아키타입 웨폰을 줍니다. 여기서 아키타입을 사용한 이유는 컴파일 없이 파라미터를 빠르게 조정할 수 있도록 하기 위해서입니다.
  • 샘플 맵 - 레이싱 게임 시뮬레이션을 돌리는 데 필요한 모든 키즈멧 게임 로직이 들어있는 에픽 시타델 수정 버전이 포함되어 있습니다.

코드 / 키즈멧 구조


카메라 작동 방식

언리얼 엔진 3 의 카메라 기본 구현법은 플레이어의 현재 폰이나 비히클이 카메라 위치와 로테이션을 덮어쓸 수 있도록 하는 것입니다. 이 작업은 CalcCamera (카메라 계산) 안에서 이루어지며, SRG_Vehicle (비히클) 안에서 그 구현법을 확인할 수 있습니다. SRG_Vehicle (비히클)은 디폴트로 3인칭 카메라를 구현합니다. SRG_VehicleCameraProperties (비히클 카메라 프로퍼티)를 사용하면 내려보기든 등뒤에서 보기든 어떤 종류의 3인칭 카메라가 될 수도 있습니다.

먼저 카메라가 올 수 있는 위치를 계산한 다음 그 위치와 비히클의 위치 사이에 트레이스를 하는 식으로, 카메라가 월드 안에 파묻히지 않도록 할 수 있습니다. 그 이유는 (bWorldGeometry 플랙을 검사하여) 트레이스에 월드의 일부인 것으로 간주되는 액터가 걸리면, 카메라가 올 수 있는 위치를 걸린 위치(에서 히트 노멀 방향으로 약간 이격시킨 위치)로 조절하기 때문입니다. 트레이스에 아무것도 걸리지 않으면, 카메라가 원래 올 수 있던 위치가 사용됩니다.

카메라의 로테이션은 비히클 위치와 카메라 위치 사이의 방향을 확인하여 결정합니다. 그런 다음 카메라 로테이션에 대한 로테이터로 변환합니다. 그러면 카메라 위치와 폰 위치에 무관하게 항상 비히클을 바라보는 카메라가 됩니다.

마지막으로 FOV (Field Of View, 시야)는 SRG_VehicleCameraProperties (비히클 카메라 프로퍼티) 아키타입에 저장된 최소 최대값을 비히클의 상대 속력(speed)에 따라 선형 보간하여 처리합니다. 상대 속력은 비히클의 속도(velocity) 벡터에서 세기(magnitude)를 구해 그 값을 비히클의 최대 속력으로 나눠서 구합니다. 그러면 다른 카 레이싱 게임에서 보듯이 뭔가 끌어당기는 효과가 나, 운전중의 속도감을 낼 수 있는 것입니다.

맵 시작시 플레이어를 비히클에 태우는 법

언리얼 엔진 3 는 디폴트로 제어할 폰을 스폰합니다. GameInfo (게임 인포) 서브클래스의 RestartPlayer (플레이어 재시작)이라는 함수를 덮어쓰면 이 행위를 바꿀 수 있습니다. RestartPlayer (플레이어 재시작)이 호출되면 먼저 적합한 PlayerStart (플레이어 시작점)을 찾습니다. 찾지 못한 경우 플레이어는 "재시작되지" 않습니다. 처음엔 플레이어에게 단순한 폰이 주어지는데, 언리얼 엔진 3 는 일반적으로 플레이어가 비히클을 운전하기 전 폰을 제어할 것으로 기대하기 때문입니다. 폰에 플레이어가 빙의된 이후, SpawnDefaultVehicleFor (...용 디폴트 비히클 스폰) 함수를 사용하여 비히클을 스폰합니다. 비히클 스폰 이전 반드시 폰에 콜리전이 없애서, 비히클이 콜리전 겹침(encroaching) 문제로 스폰되지 못하는 일이 없도록 합니다. 비히클이 스폰되면 플레이어의 폰은 새로이 스폰된 비히클 운전을 시도합니다.

SpawnDefaultVehicleFor (...용 디폴트 비히클 스폰)은 GameInfo (게임 인포)의 SpawnDefaultPawnFor (...용 디폴트 폰 스폰)과 비슷한 메서드를 사용하며, 그 용도의 아키타입 비히클을 추가로 사용한다는 점이 다릅니다. 여기서 아키타입을 사용하는 이유는, 소스 코드를 리컴파일하지 않고 비히클을 수정할 수 있도록 하기 위해서입니다. 즉 언리얼 에디터 안에서 비히클을 수정한 다음 바로 테스트를 시작할 수 있다는 뜻입니다.

문자열 합치기 키즈멧 노드 작동 방식

이 키즈멧 노드가 돌아가면 단순히 ValueA 와 ValueB 를 차례로 읽어 들이며, ConcatenateWithSpace (공백 포함 합치기) 여부에 따라 공백을 넣든 말든 해서 합칩니다. 그 결과는 StringResult (문자열 결과)로 출력됩니다. 이 변수는 언리얼 엔진 3 와 VariableLinks (변수 링크)를 적절히 설정하여 자동 설정됩니다. 그 작업은 PropertyName (프로퍼티 이름)을 키즈멧 변수가 자동으로 채웠으면 하는 변수 이름으로 설정하여 이뤄냅니다. 키즈멧 변수가 언리얼스크립트 변수에 따라 자동으로 업데이트하는 bWriteable 플랙을 사용하는 식으로 돌아갈 수도 있습니다.

텔레포트 비히클 키즈멧 노드 작동 방식

이 Teleport Vehicle 키즈멧 노드가 활성화되면 먼저 Vehicle 과 Destination 을 SVehicle 과 Actor 로 각각 캐스트해 넣어 봅니다. 이 필드는 키즈멧이 자동으로 채우기는 하지만 오브젝트로 채워지기 때문입니다. 캐스트가 성공하면 비히클을 검사하여 메시가 있는지, 피직스가 PHYS_RigidBody_ 로 설정되었는지 확인합니다. 왜냐하면 SetRBPosition, SetRBRotation, SetRBLinearVelocity, SetRBAngularVelocity 에 비히클의 위치, 로테이션, 선속도, 각속도를 설정해야 하기 때문입니다. 이 모두가 PhysX 시뮬레이션 액터에는 SetLocation 과 SetRotation 이 작동하지 않기 때문입니다.

전체적인 게임 작동 방식

실제 게임 로직 대부분을 제어함에 있어 키즈멧을 사용하여 게임이 작동합니다.

게임이 처음 시작될 때, 카메라가 날아다니는 마티네 재생을 시작합니다. 이 도중 전체 화면은 터치에 반응하여 게임을 시작시킵니다. 플레이어의 비히클은 이미 스폰되어 있으나 보통 뷰에는 숨어 있습니다. 플레이어가 화면을 터치하여 게임을 시작할 때, 플레이어의 비히클이 초기 체크 포인트로 텔레포트됩니다.

SRG_Flyby.jpg

맵에는 트리거가 여기저기 흩어져 있습니다. 트리거는 두 종류입니다. 하나는 플레이어를 안내하는 역할을 하는 시청각 정보를 발동시키며, 다른 하나는 체크 포인트와 점수를 처리하는 트리거입니다. 트리거는 빨강 외곽선으로 그려지며, 하나는 사과, 다른 하나는 스위치같아 보입니다.

SRG_TriggerSprinkle.jpg

플레이어가 시청각 트리거를 건드리면 도로 표지판이 나오며 조수석에서 "좌회전" "우회전" 따위의 안내를 합니다.

SRG_DisplayLeftTurn.jpg

플레이어가 체크 포인트 트리거를 건드리면, 먼저 체크 포인트가 설정됩니다. 거기서 리모트 이벤트가 실행됩니다. 다 이쁜 키즈멧을 위한 작업이죠.

SRG_CheckPoint.jpg

이 리모트 이벤트는 플레이어의 점수를 계산합니다. WorldInfo 에서 현재 시간을 구한 다음, 예전 체크 포인트 시간에서 빼 주고, 일정한 상수로 나눠서 체크 포인트 점수를 계산해 내고, 그것을 현재 점수에 더하는 것입니다. 이 과정에서 예전 체크 포인트 시간을 현재 시간으로 설정해 줍니다.

SRG_CalculateScore_Thumbnail.jpg

이렇게 하여 단순한 레이싱 게임의 기본적인 구조를 키즈멧으로 만들었습니다.

화면 위에 텍스처를 렌더하는 방식

이 작업은 키즈멧의 HUD 렌더링 함수성을 사용하여 이루어집니다. 글로벌 불리언 키즈멧 변수를 사용해서 단순히 껐다 켰다 하는 것으로 사인 렌더링 시점을 결정합니다. audio visual 키즈멧 시퀸스에서 이 내용을 확인할 수 있습니다.

SRG_DrawSigns_Thumbnail.jpg

게임 재시작 처리 방식

게임을 재시작하면 Remote Event 에 네 갈래로 붙은 대로, 네 가지 작업을 합니다.

  1. 첫 갈래는 맨 위에서, 플레이어의 비히클 리셋을 처리합니다. 먼저 키즈멧은 플레이어에게 피드백을 주기 위해 비히클 시작 소리를 재생합니다. 다음으로 현재 체크 포인트가 레벨의 플레이어 스타트에 할당됩니다. 마지막으로 비히클을 현재 체크 포인트로 텔레포트시키고 카메라 타겟을 플레이어의 비히클로 다시 설정합니다.
  2. 둘째 갈래는 모바일 인풋 존 셋업을 처리합니다. 게임이 끝날 때, 비히클을 제어하는 인풋 존 모두를 제거합니다.
  3. 셋째 갈래는 플레이어가 게임을 재시작했을 때 예전 체크 포인트 시간 설정을 처리합니다.
  4. 넷째 갈래는 점수 리셋과 점수 텍스트 비우기를 담당합니다.

위의 네 갈래가 모두 실행되면, 게임은 플레이어가 처음 플레이 시작했던 곳과 비슷한 스타트로 리셋됩니다. 마티네가 있거나 다른 변경된 것이 있다면, 바로 여기가 그 시작 위치로 리셋시키기 좋은 곳입니다.

SRG_RestartLevel_Thumbnail.jpg

게임 끝 처리 방식

게임 끝은 플레이어의 비히클이 레이스 끝에 있는 트리거를 건드릴 때 발생합니다. 키즈멧은 다음 명령을 따릅니다:
  • 카메라 타겟을 레벨에 있는 카메라 액터로 설정하여 경주 종료시의 시네마틱 뷰를 길게 잡을 수 있으며, 원한다면 마티네를 재생하도록 확장할 수도 있습니다.
  • 플레이어가 비히클을 더이상 조종할 수 없도록 현재 인풋 존을 모두 비웁니다.
  • 플레이어 피드백을 위해 경주 종료 사운드를 재생합니다.
  • 플레이어에게 전할 메시지와 점수를 합친 엔드 게임 텍스트를 작성합니다.
  • 엔드 게임 텍스트 렌더링 시퀸스를 켭니다.
  • 게임내 스코어 텍스트 렌더링 시퀸스를 끕니다.
  • 게임 재시작 버튼을 추가합니다.

이 시퀸스 안에는, 게임 재시작 버튼이 눌렸을 때 트리거되는 이벤트가 있습니다. 단순히 "Restart Game" 리모트 이벤트를 호출하여 게임을 재시작시킵니다.

SRG_EndGame_Thumbnail.jpg

이 스타터 키트 사용법


  1. UDK 를 다운로드 합니다.
  2. UDK 를 설치합니다.
  3. zip 파일을 다운로드 합니다.
  4. UDK 베이스 디렉토리에 압축을 풉니다. (예로 C:\Projects\UDK-2011-08\) 기존 파일아니 폴더를 덮어쓴다는 창이 뜰지도 모릅니다. 모두 예 를 선택하십시오.
    PRG_01_ExtractFiles.jpg
  5. UDKGame\Config 디렉토리의 DefaultEngine.ini 파일을 메모장(Notepad)으로 엽니다. (예로 C:\Projects\UDK-2011-08\UDKGame\Config\DefaultEngine.ini)
    PRG_02_FindDefaultEngine.jpg
  6. EditPackages 를 검색합니다.
    PRG_03_DefaultEngineEditPackages.jpg
  7. +EditPackages=StarterRacerGame 를 추가합니다.
    PRG_04_AddEditPackages.jpg
  8. Binaries 디렉토리에 있는 Unreal Frontend Application 을 실행합니다. (예로 C:\Projects\UDK-2011-08\Binaries\UnrealFrontend.exe)
    PRG_05_FindUnrealFrontEnd.jpg
  9. Script 를 누르고 Full Recompile 을 선택합니다.
    PRG_06_FullCompile.jpg
  10. 마지막에 StarterRacerGame 패키지가 컴파일되는 것이 보일 것입니다.
    PRG_07_FinishedCompiling.jpg
  11. UnrealEd 를 눌러 언리얼 에디터를 엽니다.
    PRG_08_LaunchUnrealEd.jpg
  12. Open 버튼을 눌러 StarterRacerMap.udk 를 엽니다.
    PRG_09_OpenMap.jpg
    PRG_10_OpenMapNow.jpg
  13. Play In Editor 버튼을 눌러 레이서 스타터 키트를 플레이합니다.
    PRG_11_PIEAndMobileToggle.jpg

스타터 키트 셋업을 마쳤으니, 만들려는 게임쪽으로 수정을 시작해도 됩니다. 언리얼스크립트 코드는 Development\Src\StarterRacerGame\Classes\.uc* 안에 있으며, 모든 콘텐츠는 UDKGame\Content\StarterRacerGameContent.upk 에 들어 있습니다.

내려받기


SRG_Screenshot.jpg