UDN
Search public documentation:

MobileInputSystemKR
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 홈 > 모바일 홈 > 모바일 인풋 시스템

모바일 인풋 시스템


문서 변경내역: 홍성진 번역.

개요


디바이스의 터치나 모션 입력을 관리하는 방법은 세 가지 있습니다. 가장 간단한 방법은, 미리-디자인된 인풋 서브시스템으로 생각해 볼 수 있는 MobileInputZones 를 통한 것입니다. InputZone 에서 충분히 제어가 안되면, MobilePlayerInput 클래스에 있는 여러 deligate 를 사용하여 언리얼스크립트 코드로 전체 인풋 시스템을 관리하면 됩니다. 마지막으로는 키즈멧 이벤트와 액션 세트를 통해 빠른 프로토타이핑이 가능합니다.

MobilePlayerInput


MobilePlayerInput 클래스는 모바일 디바이스에서 모든 플레이어 입력에 대한 허브입니다. 디바이스 화면에서 터치 입력은 물론 디바이스에서 사용가능한 여러가지 모션 센서의 모션 입력도 받아들입니다. 이렇게 받아들인 입력 정보는 프로퍼티나 액세서 함수( 또는 가끔 델리게이트)를 통해 접근합니다.

MobilePlayerInputwithin(GamePlayerController) 로 정의되는데, 즉 GamePlayerController 클래스에서 직/간접적으로 그 계층구조를 통해 상속되는 클래스에서만 사용할 수 있다는 뜻입니다. MobilePlayerInput 클래스를 강제로 사용하려면, (물론 GamePlayerController 에서 확장된) 커스텀 PlayerController 클래스의 defaultproperties 블록에 있는 InputClass 프로퍼티에 클래스를 할당해 주면 됩니다.

SimplePC.uc
defaultproperties
{
  InputClass=class'GameFramework.MobilePlayerInput'
}

MobilePlayerInput 프로퍼티

Menus 메뉴

  • InteractiveObject 인터랙티브 오브젝트 - 사용자가 현재 상호작용하고 있는 MobileMenuObject 입니다. 예를 들어 사용자가 버튼을 누르면, 손가락을 떼어 UnTouch 이벤트가 발생되기 전까지는 InteractiveObject 가 됩니다.오브젝트가 됩니다.
  • MobileMenuStack 모바일 메뉴 스택 - 렌더하고 입력을 전달해 줄 모바일 메뉴 씬 스택을 담는 배열입니다. 모바일 메뉴 씬 관련 상세 정보는 Mobile Menu Technical Guide KR 페이지를 참고하시기 바랍니다.

Motion 모션

ALERT! 주: 여기 대부분의 변수는 2012년 2월 UDK 에 더이상 사용되거나 존재하지 않습니다.
  • MobilePitch 모바일 피치 - 디바이스에 자이로스코프가 있는 경우 그 현재 틸트(기울기) 값입니다.
  • MobilePitchCenter 모바일 피치 센터 - 디바이스 피치 중심값입니다.
  • MobilePitchMultiplier 모바일 피치 멀티플라이어 - 디바이스의 피치에 대한 스케일 팩터로, 피치 모션 감도를 조절합니다.
  • MobileYaw 모바일 요 - 디바이스에 자이로스코프가 있는 경우 그 현재 요(좌우) 값입니다.
  • MobileYawCenter 모바일 요 센터 - 디바이스 요 중심값입니다.
  • MobileYawMultiplier 모바일 요 멀티플라이어 - 디바이스의 요에 대한 스케일 팩터로, 요 모션 감도를 조절합니다.
  • MobilePitchDeadzoneSize 모바일 피치 데드존 크기 - MobilePitch 값이 입력으로 간주되는 MobilePitchCenter 로부터의 거리입니다. 모션 인풋이 게임 콘트롤에 쓰이고 있는 경우 사용됩니다.
  • MobileYawDeadzoneSize - 모바일 요 데드존 크기 - MobileYaw 값이 입력으로 간주되는 MobileYawCenter 로부터의 거리입니다. 모션 인풋이 게임 콘트롤에 쓰이는 경우 사용됩니다.
  • DeviceMotionAttitude 디바이스 모션 자세 - 디바이스의 자세나 방향을 나타내는 벡터입니다.
    • X - 화면에서 똑바로 뻗어나오는 축 중 중심 회전을 나타냅니다.
    • Y - 디바이스에 자이로스코프가 있을 때만 켜집니다.
    • Z 디바이스의 가로 축 중심 회전을 나타냅니다.
  • DeviceMotionRotationRate 디바이스 모션 회전율 - 디바이스의 자세 변화율이 담긴 벡터입니다. 자이로스코프가 있는 디바이스에서는 훨씬 정확합니다.
  • DeviceMotionGravity 디바이스 모션 중력 - 디바이스의 중력 벡터를 담는 벡터입니다. 디바이스에 자이로스코프가 있는 있는 경우에만 사용할 수 있습니다.
  • DeviceMotionAcceleration 디바이스 모션 가속도 - 디바이스의 현재 선 가속도를 담는 벡터입니다. 디바이스에 자이로스코프가 있을 때만 사용 가능합니다.
  • bDeviceHasGyroscope 디바이스에 자이로스코프 있음 - 디바이스에 자이로스코프가 있으면 참입니다.
  • DeviceGyroRawData 디바이스 자이로 로 데이터 - 자이로스코프 모션 날 데이터를 담는 벡터입니다. 값 범위는 [0.0, 1.0] 입니다.
  • bDeviceHasAccelerometer 디바이스에 가속도계 있음 - 디바이스에 가속도계가 있으면 참입니다.
  • DeviceAccelerometerRawData 디바이스 가속도계 로 데이터 - 날 가속도계 데이터를 담는 벡터입니다. 값 범위는 [0.0, 1.0] 입니다.
    • X - 롤. 화면에서 바로 나오는 축을 중심으로 한 회전을 나타냅니다.
    • Y - 세로 피치. 세로 모드에서 가로 축 중심 회전을 나타냅니다.
    • Z - 가로 피치. 가로 모드에서 가로 축 중심 회전을 나타냅니다.
  • MobileSeqEventHandlers 모바일 시퀸 이벤트 핸들러 - Motion 이벤트를 리슨하려는 SeqEvent_MobileBase 이벤트 배열입니다.
    • ALERT! 주: 아직 2012년 2월 UDK 에도 사용되는 옵션입니다.
  • aTilt 틸트 - 모바일 디바이스의 현재 방향을 나타내는 벡터입니다. (2012년 2월 UDK 에 사용)
  • aRotationRate 회전속도 - 틸트 변화 속도를 나타내는 벡터입니다. (2012년 2월 UDK 에 사용)
  • aGravity 중력 - 모바일 디바이스가 감지한 중력을 나타내는 벡터입니다. (2012년 2월 UDK 에 사용)
  • aAcceleration 가속도 - 디바이스가 감지한 선형 가속도를 나타내는 벡터입니다. (2012년 2월 UDK 에 사용)

Touch 터치

  • NumTouchDataEntries 터치 데이터 항목 수 - 상수. 동시에 추적할 터치 수를 설정합니다. 5 로 설정되어 있습니다.
  • Touches 터치 - 추적중인 터치를 나타내는 TouchData 구조체입니다.
  • MobileDoubleTapTime 모바일 더블탭 시간 - 두 번의 '탭' 사이 간격이 이 정도 이하여야 '더블 탭'으로 인식합니다.
  • MobileMinHoldForTap 모바일 탭 최소 유지 - 터치를 최소 이 정도 유지해야 '탭' 으로 인식합니다.
  • MobileTapRepeatTime 모바일 탭 반복 시간 - 눌리고 있는 터치에 대한 터치 이벤트를 재전송할 간격입니다.
  • bAllowTouchesInCinematic 시네마틱에 터치 허용 - 참이면 시네마틱 시퀸스 도중 터치 입력과 등록이 허용됩니다.
  • bDisableTouchInput 터치 인풋 끄기 - 참이면 터치를 입력으로 등록하지 않습니다.
  • bFakeMobileTouches 가짜 모바일 터치 - -simmobile 이나 -simmobileinput 명령줄 인수를 붙여 게임이 실행되면 참입니다.
  • MobileInactiveTime 모바일 비활성 시간 - 터치 인풋이 등록되지 않은 기간으로, 초 단위입니다.
  • MobileRawInputSeqEventHandlers 모바일 로 인풋 시퀸 이벤트 핸들러 - 처리되지 않은 터치 이벤트를 대기중인 SeqEvent_MobileRawInput 이벤트 배열입니다.

Zones 존

  • MobileInputGroups 모바일 인풋 그룹 - 사용가능한 인풋 MobileInputGroups 배열입니다.
  • CurrentInputGroup 현재 인풋 그룹 - 현재 활성 MobileInputGroup 을 가리킵니다.
    • ALERT! 주: 2012년 2월 UDK 부로 이름이 CurrentMobileGroup 으로 바뀌었습니다.
  • MobileInputZones 모바일 인풋 존 - 기존 MobileInputZones 배열입니다.
  • MobileInputZoneClasses 모바일 인풋 존 클래스 - MobileInputZones 이름에 매핑된 클래스 이름 배열입니다.
  • ZoneTimeout 존 타임아웃 - 이 기간동안 존에 입력이 없으면 타임아웃이 됩니다.

MobilePlayerInput 델리게이트

  • OnInputTouch() [Handle] [Type] [TouchLocation] [DeviceTimestamp] - 터치 이벤트가 발생하면 엔진에 의해 호출됩니다.
    • Handle - 터치의 고유 식별자입니다. 틸트한 것은 TouchData 부분을 참고해 주십시오.
    • Type - 터치 이벤트의 ETouchType 입니다. 틸트한 것은 Touch Events 부분을 참고해 주십시오.
    • TouchLocation - 터치 이벤트의 화면 좌표상 (픽셀 단위) Vector2D 위치입니다.
    • DeviceTimestamp - 터치 이벤트가 발생한 시간입니다.
  • OnMobileMotion() [PlayerInput] [CurrentAttitude] [CurrentRotationRate] [CurrentGravity] [CurrentAcceleration] - 디바이스에 모션이 발생할 때 엔진에 의해 호출됩니다. 주: 디바이스 하드웨어에 따라 중력이나 가속도는 지원되지 않을 수 있습니다. ALERT! 주: 더이상 2012년 2월 UDK 버전에 존재하지 않습니다.
    • PlayerInput - 델리게이트를 소유하는 PlayerInput 으로의 참조입니다.
    • CurrentAttitude - 디바이스의 현재 자세 (Pitch, Yaw, Roll) 정보를 담는 벡터입니다. 주: Yaw 는 디바이스에 자이로가 있을 때만 사용가능합니다. 또한 이 값은 가로모드인지 세로모드인지와는 무관합니다.
    • CurrentRotationRate - 디바이스의 자세 변화율을 담는 벡터입니다. 이 값은 자이로스코프가 있는 디바이스에서 훨씬 정확합니다.
    • CurrentGravity - 디바이스의 중력 벡터를 담는 벡터입니다. 디바이스에 자이로스코프가 있을 때만 사용가능합니다.
    • CurrentAcceleration - 디바이스의 현재 선 가속도를 담는 벡터입니다. 디바이스에 자이로스코프가 있을 때만 사용가능합니다.
  • OnTouchNotHandledInMenu() - 모바일 메뉴가 Touch_Began 을 처리하지 않았을 때 invoke 됩니다.
  • OnPreviewTouch() [X] [Y] [TouchpadIndex] - Returns true/false for touches handled/not handled.
    • X - Screen space X coordinate
    • Y - Screen space Y coordinate
    • TouchpadIndex - Which touch pad was touched

MobilePlayerInput 함수

Initialization 초기화

  • InitInputSystem() - 인풋 시스템이 생성된 이후 PlayerController 에 의해 호출됩니다. 현재 강제로 터치 인풋 시스템을 초기화시킵니다. 추가로 초기화시킬 것이 있으면 서브클래스에서 이를 덮어써야 합니다.
  • ClientInitInputSystem() - 인풋 시스템이 생성된 이후 클라이언트 측에서 호출됩니다. 현재 강제로 터치 인풋 시스템을 초기화시킵니다. 추가로 초기화시킬 것이 있으면 서브클래스에서 이를 덮어써야 합니다.
  • InitTouchSystem() - 모바일 시뮬레이션을 켠 상태거나 게임이 모바일 디바이스에서 실행중이면 터치 인풋 시스템을 셋업합니다.
  • NativeInitializeInputSystem - 네이티브. 인풋 서브시스템의 InitTouchSystem() 네이티브 초기화에 의해 호출됩니다.
  • InitializeInputZones() - 게임타입에 필요한 인풋 존을 물어본(query) 다음 초기화시킵니다.
  • NativeInitializeInputZones() - 네이티브. 인풋 존을 반복처리하여 초기화하고, 현재 디바이스 해상도에 따라 범위를 계산하고자 InitializeInputZones() 에 의해 호출됩니다.

Input Events 인풋 이벤트

  • SendInputKey [Key] [Event] [AmountDepressed] - 키보드의 키가 눌렸을 때와 같은 키 인풋 이벤트를 전송합니다. 모바일 입력을 수동으로 표준 키보드 입력으로 전환하는 기능입니다.
    • Key - 발생한 이벤트에 대한 키 이름입니다. (KEY_Up, KEY_Down, etc.)
    • Event - 인풋 이벤트의 EInputEvent 타입입니다. (IE_Pressed, IE_Released, IE_Repeat_, IE_DoubleClick, IE_Axis)
    • AmountDepressed - 아날로그 키에 대해 키가 눌린 양입니다.
  • SendInputAxis() [Key] [Delta] [DeltaTime] - 조이스틱, 썸스틱, 마우스 이동 등의 input axis 이벤트를 전송합니다. 이를 통해 모바일 인풋을 표준 콘트롤 인풋으로 옮길 수 있습니다.
    • Key - 이동한 축 이름입니다. (KEY_MouseX, KEY_XboxTypeS_LeftX, 등)
    • Delta - 축이 이동한 양입니다.
    • DeltaTime - 축의 지난 업데이트 이후 경과한 초 단위 시간입니다.

Input Zones 인풋 존

  • FindZone() [ZoneName] - MobileInputZones 배열에서 이름으로 인풋 존을 검색하여 반환합니다.
    • ZoneName - 검색할 인풋 존 문자열을 지정하는 문자열입니다.
  • FindorAddZone() [ZoneName] - MobileInputZones 배열에서 이름으로 인풋 존을 검색하여 반환합니다. 인풋 존을 찾지 못하면 새로운 존을 만들어 MobileInputZones 배열에 더하고, 새로운 존으로의 참조가 반환됩니다.
    • ZoneName - 검색 및/또는 추가할 존 이름을 지정하는 문자열입니다.
  • HasZones() - MobilePlayerInput 에 현재 인풋 존이 있는지 반환합니다.
  • GetCurrentZones() - MobileInputZones 배열로써 현재 인풋 그룹에 엮인 인풋 존 모두를 반환합니다.
  • ActivateInputGroup() [GroupName] - 실행. 새 인풋 그룹을 활성인 것으로 설정하여, 입력을 받을 수 있도록 합니다.
    • GroupName - 활성 설정을 해 줄 인풋 그룹을 지정하는 문자열입니다.
  • SetMobileInputConfig() [GroupName] - 실행. 새 인풋 그룹을 활성인 것으로 설정하여, 입력을 받을 수 있도록 합니다.
    • GroupName - 활성 설정을 해 줄 인풋 그룹을 지정하는 문자열입니다.

Kismet 키즈멧

  • RefreshKismetLinks() - 레벨의 키즈멧 시퀸스에 있는 모든 SeqEvent_MobileBaseSeqEvent_MobileRawInput 이벤트를 핸들러로써 할당하여 등록합니다.
  • AddKismetEventHandler() [NewHandler] - SeqEvent_MobileBase 키즈멧 이벤트를 새로운 모바일 모션 이벤트 핸들러로 추가하여, 모션이 발생하면 인풋 이벤트를 받도록 합니다.
  • AddKismetRawInputEventHandler() [NewHandler] - SeqEvent_MobileRawInput 키즈멧 이벤트를 새로운 모바일 터치 이벤트 핸들러로 추가하여, 터치가 발생하면 인풋 이벤트를 받도록 합니다.

Menu Scenes 메뉴 씬

  • OpenMenuScene() [SceneClass] [Mode] - 주어진 클래스의 메뉴 씬을 새로 엽니다. 열린 씬에 대한 참조를 반환합니다.
    • SceneClass - 열 메뉴 씬 클래스를 지정합니다. MobileMenuScene 의 서브클래스여야 합니다.
    • Mode - 옵션. 씬의 Opened() 함수에 전할 문자열을 지정합니다.
  • CloseMenuScene() [SceneToClose] - 지정된 메뉴 씬을 닫습니다.
    • SceneToClose - 닫을 씬을 가리킵니다.
  • CloseAllMenus() - 씬 스택의 모든 메뉴 씬을 닫습니다.
  • RenderMenus() [Canvas Canvas] [RenderDelta] - 씬 스택의 모든 메뉴를 렌더하기 위해 매 프레임마다 엔진에 의해 호출됩니다.
    • Canvas - 씬을 그리는 데 사용할 Canvas 를 가리킵니다.
    • RenderDelta - 지난 렌더 사이클 이후로 경과한 시간입니다.
  • MobileMenuCommand() [MenuCommand] - 실행. 아무나 명령을 처리(하면 참 반환)할 때까지 스택의 모든 씬에 명령을 전합니다.
    • MenuCommand - 씬에 전할 명령을 지정하는 문자열입니다.
  • OpenMobileMenu() [MenuClassName] - 실행. 문자열 형태로 클래스에 주어진 메뉴 씬을 엽니다.
    • MenuClassName - 문자열 형태로 열어줄 메뉴 씬의 클래스 이름을 지정합니다.
  • OpenMobileMenuMode() [MenuClassName] [Mode] - 실행. 문자열 형태로 주어진 클래스의 메뉴 씬을 옵션 모드로 엽니다.
    • MenuClassName - 열어줄 메뉴 씬 클래스 이름을 문자열 형태로 지정합니다.
    • Mode - 옵션. 씬의 Opened() 함수에 전해줄 문자열을 지정합니다.

TouchDataEvent

TouchDataEvent 는 특정 터치를 처리하도록 큐에 등록된 개별 터치 이벤트용 데이터를 담는 구조체입니다. 한 터치에 대한 터치 이벤트가 감지될 때마다 새로운 TouchDataEvent 를 구성하여 해당 이벤트에 대한 데이터를 담습니다. 그렇게 되면 인풋 시스템이 가급적 빠르게 이를 순서대로 처리할 수 있습니다.

  • EventType - 터치 이벤트의 ETouchType 유형입니다.
  • TouchpadIndex - 어느 터치 패드의 데이터인지 입니다.
  • Location - 터치 이벤트의 화면 좌표상 (픽셀) 위치를 나타내는 Vector2D 입니다.
  • DeviceTime - 이벤트 발생 당시의 타임스탬프 입니다.

TouchData

TouchData 는 특정 터치의 수명 전반, 즉 사용자가 화면을 처음 터치한 시점부터 화면에서 손가락을 뗀 시점에 걸친 정보가 모두 담긴 구조체입니다. 디바이스의 현재 활성 터치는 Touches 배열에 저장되므로, 디바이스의 터치 인풋 현 상태에 접근할 수 있습니다.

  • Handle - 이 별개의 터치에 대한 고유 ID 를 지정하는 Int 입니다.
  • TouchpadIndex - 어느 터치 패드의 데이터인지 입니다.
  • Location - 가장 최근의 터치 이벤트에 따라 터치의 화면 공간 현 위치를 담는 Vector2D 입니다.
  • TotalMoveDistance - 터치 이벤트가 처음 발생한 이후 이동한 총 픽셀 거리입니다.
  • InitialDeviceTime - 처음 터치 이벤트가 발생했을 때의 타임스탬프입니다.
  • TouchDuration - 터치가 활성화된 초 단위 기간입니다.
  • MoveEventDeviceTime - 이 터치에 대해 가장 최근 발생한 터치 이벤트의 타임스탬프입니다.
  • MoveDeltaTime - 지난 번 터치 이동 후 이동 이벤트 사이에 경과된 초 단위 시간입니다.
  • bInUse - 참이면 터치 입력이 현재 사용중입니다. 거짓이면 더이상 활성 상태가 아니라 터치를 새로 받을 수 있습니다.
  • Zone - 현재 터치를 처리중인 MobileInputZone 입니다.
  • State - 이 터치에 대해 가장 최근 발생한 터치 이벤트의 EZoneTouchEvent 유형입니다. 틸트한 정보는 Touch Events 부분을 참고해 주십시오.
  • Events - 이 터치의 수명 동안 모든 터치 이벤트를 담는 TouchDataEvents 배열입니다.
  • LastActiveTime - 지난 번 터치가 활성 상태였던 시간입니다. 존의 타임아웃 여부를 결정하는 데 사용됩니다.

인풋 존


인풋 존은 본질적으로 터치스크린 디바이스에서 입력을 받아 유의미한 데이터로 변환할 수 있는 터치 콘트롤을 말합니다. 같은 방식으로 키바인드를 통해 키 입력을 받은 다음 그 데이터를 게임에서 플레이어 이동이나 기타 게임내 이벤트에 사용되는 데이터로 변환할 수도 있는데, 인풋 존 역시 터치 입력을 받아 이와 똑같은 기능을 할 수 있습니다. 사실 곧 보시게 되겠지만, 인풋 존은 실제로 어떤 행위에 입력을 바인딩하는 바로 그 키바인딩 시스템을 사용합니다.

인풋 그룹

인풋 그룹이란 관련된 인풋 존 모음입니다. 에픽 시타델의 좌우측 콘트롤 스틱을 예로 들어 보자면, 이는 하나의 인풋 그룹에 속하는 것입니다. 각 게임은 할당된 인풋 그룹을 몇 개든 가질 수 있으며, 게임 도중 언제든 이들 중 하나를 활성화시킬 수 있습니다. 하나의 인풋 존을 둘 이상의 인풋 그룹에 넣을 수도 있으니, 여러 게임에서 재사용할 수도, 한 게임에서 여러 번 사용할 수도 있습니다.

MobileInputGroup 은 인풋 그룹을 나타내는 데 쓰이는 구조체입니다. 그룹을 이루는 인풋 존 배열과 고유한 이름을 매핑하여 그룹을 식별하는 역할을 합니다.

  • GroupName - 인풋 그룹의 고유한 이름을 지정하는 문자열입니다.
  • AssociatedZones - 인풋 그룹에 속하는 MobileInputZones 배열입니다.

인풋 그룹은 DefaultGame.ini 파일의 개별 게임타입에 대한 RequiredMobileInputConfigs 배열에 엔트리를 추가하는 식으로 정의합니다. 틸트한 정보는 인풋 그룹 정의하기 부분을 참고하십시오.

MobileInputZone

MobileInputZone 클래스는 사용자의 터치 입력을 받아서 표준 UE3 input/axis 이벤트로 변환하는 화면 영역을 정의하기 위한 베이스 클래스입니다.

MobileInputZone 프로퍼티

General 일반
  • Type 타입 - 인풋 존의 종류(버튼, 조이스틱, 트랙볼, 슬라이더)를 지정하는 EZoneType 입니다. 틸트한 것은 인풋 존 타입 부분을 참고하십시오.
  • State 상태 - 인풋 존의 현 상태를 나타내는 EZoneState 입니다. 틸트한 것은 인풋 존 상태 부분을 참고하십시오.
  • SlideType 슬라이더 타입 - 존이 슬라이더일 ( Type=ZoneType_Slider )경우 존의 슬라이딩 방향을 나타내는 EZoneSlideType 입니다.
  • InputOwner 인풋 오너 - 인풋 존 관리를 담당하는 MobilePlayerInput 입니다.
  • MobileSeqEventHandlers 모바일 시퀸 이벤트 핸들러 - 인풋 존에 연관된 SeqEvent_MobileZoneBase 키즈멧 이벤트 배열입니다.

Input 인풋
  • InputKey 인풋 키 - 이 인풋 존에서 인풋 이벤트 발생시 인풋 서브시스템에 전송할 인풋 키 이름입니다. 아날로그 인풋 타입에 대해서는 세로 축 인풋 이벤트입니다.
  • HorizontalInputKey 가로 인풋 키 -이 인풋 존에서 가로 축 인풋 이벤트 발생시 인풋 서브시스템에 전송할 인풋 키 이름입니다. 아날로그 인풋 타입에 대해서만 사용됩니다.
  • TapInputKey 탭 인풋 키 - 이 인풋 존에서 탭 인풋 발생시 인풋 서브시스템에 전송할 인풋 키 이름입니다.
  • DoubleTapInputKey 더블탭 인풋 키 - 이 인풋 존에서 더블탭 인풋 발생시 인풋 서브시스템에 전송할 인풋 키 이름입니다.
  • VertMultiplier 세로 곱수 - 세로 축 아날로그 인풋에 곱해줄 스케일 팩터입니다. 인풋 존의 세로 축 감도를 결정합니다.
  • HorizMultiple 가로 곱수 - 가로 축 아날로그 인풋에 곱해줄 스케일 팩터입니다. 인풋 존의 가로 축 감도를 결정합니다.
  • Acceleration 가속도 - 트랙볼 인풋 존 이동에 적용할 가속도(, 실제로 정의되기로는 초당 이동) 양입니다.
  • Smoothing 스무딩 - 트랙볼 인풋 존 이동에 적용할 인풋 스무딩(부드럽게 할) 양입니다.
  • EscapeVelocity 탈출 속도 - 터치가 끝난 후에 적용해 줄 가로 세로 인풋 이동을 담는 Vector2D 입니다. iOS 디바이스의 스크롤 목록에서 터치가 끝난 후에도 계속해서 스크롤되는 현상처럼, 관성 운동같은 것입니다.
  • EscapeVelocityStrength 탈출 속도 세기 - 매 업데이트시 사용할 탈출 속도 양을 지정합니다. 이 값의 범위는 [0.0, 1.0] 입니다. 값이 클 수록 감쇠량도 커집니다.
  • bScalePawnMovement 폰 이동 스케일 - 참이면 존의 인풋 값에 로컬 PlayerController 의 Pawn 의 MovementSpeedModifier 값을 곱해줍니다.
  • bQuickDoubleTap 퀵 더블탭 - 참이면 더블탭은 터치 이벤트시 DoubleTapInputKey 의 IE_Pressed 와 IE_Release 를 부릅니다. 거짓이면 더블탭은 터치 이벤트시 DoubleTapInputKey 의 IE_Pressed 를, 업데이트 이벤트마다 DoubleTapInputKey 의 IE_Repeat 를, 언터치 또는 취소됨 이벤트시 IE_Release 를 부릅니다.
  • TapDistanceConstraint 탭 거리 제약 - 터치 이벤트와 언터치 이벤트 사이의 거리가 이 이내여야 탭으로 간주합니다.
  • bAllowFirstDeltaForTrackballZone 트랙볼 존에 첫 델타 허용 - 참이면 트랙볼 존에 대한 첫 이동 델타가 사용됩니다. 거짓이면 트랙볼 존에 대한 첫 이동 델타는 무시됩니다. 초기 터치 델타에 대해 '데드 존'이 일정하지 않은 디바이스에 좋으나, 트랙볼 드랙 반응성이 살짝 떨어집니다.
  • InitialLocation 초기 위치 - 존 안에서 터치 이벤트가 새로 발생했을 때 터치 이벤트의 초기 위치입니다.
  • CurrentLocation 현재 위치 - 존 안에 터치의 현재 위치입니다. 조이스틱과 트랙볼 존에만 적용됩니다.
  • InitialCenter 초기 센터 - 범위를 지정한 경우 존의 실제 중심입니다. bCenterOnTouch=true 를 사용하여 (보통은 조이스틱) 존을 리셋하는 데 사용합니다.
  • CurrentCenter 현재 센터 - 인풋 이벤트에 대해 센터로 사용되는 현재 위치입니다. 터치가 새로 발생할 때 bCenterOnTouch=true 를 사용하여 (보통은 조이스틱) 존의 초기 터치 위치로 업데이트됩니다.
  • PreviousLocations 예전 위치 - 프레임에 걸친 인풋 스무딩에 사용되는, 존의 최근 (6 개) 터치 이벤트 위치입니다. 조이스틱과 트랙볼 존에만 적용됩니다.
  • PreviousMoveDeltaTimes 예전 이동 경과시간 - 프레임에 걸친 인풋 스무딩에 사용되는, 존의 최근 (6 개) 터치 이벤트 경과시간 입니다. 조이스틱과 트랙볼 존에만 적용됩니다.
  • PreviousLocationCount 예전 위치 갯수 - 프레임에 걸친 인풋 스무딩 용으로 현재 저장되어 사용되고 있는 예전 터치 위치 및 경과시간 갯수입니다.
  • LastTouchTime 지난 터치 시간 - 존의 지난 터치 이벤트 시간입니다. 탭이 더블탭인지 결정하는 데 사용됩니다.
  • TimeSinceLastTapRepeat 지난 탭 반복 이후 시간 - 버튼 존에 대한 InputKey 의 IE_Repeat 가 반복된 이후 경과된 시간입니다.
  • bIsDoubleTapAndHold 더블탭 후 지속인지 - '퀵 더블탭'으로 간주되지 않는 더블탭이 발생했다면 참입니다. DoubleTapInputKey 의 IE_Repeat, IE_Release 가 전송되도록 하기 위해 필요합니다.
  • LastAxisValue 지난 축 값 - 지난 업데이트에서 캐시된 입력 값을 담는 Vector2D 입니다. 조이스틱과 트랙볼 존에만 적용됩니다.
  • TotalActiveTime 총 활성화 시간 - 존이 총 활성화되어 있는 기간입니다.
  • LastWentActiveTime 존이 지난 번 비활성 상태에서 활성 상태로 변경된 시간입니다.

Position and Size 위치와 크기
  • [X/Y] - 인풋 존 좌상단 코너의 화면 좌표상 가로 세로 위치입니다. (픽셀 또는 bRelative[X/Y] 에 따라 상대적)
  • Size[X/Y] 크기 - 인풋 존의 폭과 높이입니다. (픽셀 또는 bRelativeSize[X/Y] 에 따라 상대적)
  • ActiveSize[X/Y] 활성 크기 - '활성 존'의 폭과 높이입니다. 틸트한 정보는 크기 및 위치 조정 부분을 확인하십시오.
  • bRelative[X/Y] 상대적 - 참이면 존 좌상단 코너의 가로 세로 위치는 [0.0, 1.0] 범위의 상대 값으로 추정합니다.
  • bRelativeSize[X/Y] 상대적 크기 - 참이면 존의 폭과 높이는 [0.0, 1.0] 범위의 상대 값으로 추정합니다.
  • bActiveSizeYFromX ActiveSizeY 는 X 에서 - 참이면 ActiveSizeY 값은 ActiveSizeX 에 상대적인 값으로 추정합니다.
  • bSizeYFromSizeX SizeY 는 X 에서 - 참이면 SizeY 값은 SizeX 에 상대적인 값으로 추정합니다.
  • bApplyGlobalScaleToActiveSizes 활성 크기에 글로벌 스케일 적용 - 참이면 ActiveSize[X/Y] 값에 가로 세로 글로벌 스케일 팩터가 적용됩니다. 해상도나 화면 크기가 다른 디바이스에서 정확한 콘트롤 크기를 유지하기에 좋습니다.
  • bCenter[X/Y] 센터 - 참이면 컨픽에 지정된 [X/Y] 값에 존의 좌상단 코너가 아닌 중앙을 맞춥니다. 그 후 [X/Y] 에는 존의 실제 좌상단 코너가 반영됩니다.
  • bCenterOnEvent 이벤트시 센터 - 참이면 새로운 터치 이벤트 발생시마다 존의 CurrentCenter 가 그 위치로 조정됩니다. 에픽 시타델의 조이스틱처럼 (특정 지역 내) 사용자 터치 위치로 자동 위치조정되는 콘트롤을 만들 때 좋습니다.
  • ResetCenterAfterInactivityTime 비활성 시간 경과후 센터 리셋 - bCenterOnEvent=TRUE 고 이 값도 0 이 아니면, 존이 비활성화된 뒤 이만큼 시간이 경과된 후 CurrentCenter 위치를 InitialCenter 로 리셋시킵니다.
  • Border 테두리 - 터치가 존 범위 내인지 아닌지를 결정할 때 존 외부를 포함시킬 범위입니다.
  • bFloatingTiltZone 떠다니는 틸트 존 - 참이면 틸트존은 Size[X/Y] 안에서 떠다닙니다. 사용되지 않는 것 같습니다.

Rendering 렌더링
  • OverrideTexture[1/2] 오버라이드 텍스처 [1/2] - 존 텍스처를 덮어쓰는 데 사용할 Texture2D 를 지정합니다. * 버튼 존의 경우 OverrideTexture1 은 버튼 비활성화시, OverrideTexture2 는 버튼 활성화시 그릴 텍스처입니다. * 트랙볼과 조이스틱 존의 경우, OverrideTexture1 은 배경으로, OverrideTexture2 는 손가락을 따라오는 "hat", 뚜껑으로 그려집니다. * 슬라이더 존의 경우, OverrideTexture1 은 슬라이더 그래픽으로, OverrideTexture2 는 사용되지 않습니다.
  • OverrideTexture[1/2]Name 오버라이드 텍스처 [1/2] 이름 - "Package.Group.Name" 식으로 텍스처 전체 경로를 지정하는 문자열입니다.
  • OverrideUVs[1/2] 오버라이드 UV [1/2] - OverrideTexture[1/2] 의 하위 구역을 그리는 데 사용할 텍스처 UV 를 텍셀(, 즉 텍스처 픽셀 값으)로 지정합니다.
  • Caption 캡션 - 존에 표시할 텍스트입니다. 현재 존 안에 중심을 맞춰 그려진 버튼에만 사용됩니다.
  • Caption[X/Y]Adjustment 캡션 [X/Y] 조절 - 존의 Caption 위치에 대한 가로 세로 오프셋으로, 올바른 폰트 정렬을 위해 텍스트를 미세 조절합니다.
  • bIsInvisible 안보이는지 - 참이면 존이 렌더됩니다.
  • bUseGentleTransitions 부드러운 전환 사용 - 참이면 존이 비활성 상태에서 활성 상태로, 또는 그 반대로 전환될 때 시각적으로 부드럽게 전환됩니다. 거짓이면, 즉시 변환됩니다. 주: 순전히 시각적인 부분만입니다. 실제 존의 상태 변환은 터치가 시작되거나 끝남과 동시에 이루어 집니다.
  • ActivateTime 활성화 시간 - 존이 비활성 상태에서 활성 상태로 시각적 전환되는 데 걸리는 기간입니다.
  • DeactivateTime 비활성화 시간 - 존이 활성 상태에서 비활성 상태로 시각적 전환되는 데 걸리는 기간입니다.
  • bRenderGuides 가이드 렌더 - 참이면 존에 대한 디버그 라인이 렌더됩니다. 현재 조이스틱 존인 것에만, 존의 CurrentCenter 에서 조이스틱 뚜껑까지 선을 그리는 데 사용됩니다.
  • RenderColor 렌더 컬러 - 존을 그리는 데 사용할 색입니다. 존의 시각적인 표상물을 이루는 이미지나 텍스트에 영향을 끼칩니다. Canvas 를 그리는 색도 MobileHUD 내 적절한 존 드로잉 함수 호출 전 이 색으로 설정됩니다.
  • InactiveAlpha 비활성 알파 - 존 비활성화 상태시의 불투명도 입니다.
  • AnimatingFadeOpacity 페이드 불투명도 애니메이팅 - 일정 비활성화 기간 이후 존에 센터를 다시 잡을 때 사용되는 페이딩 이펙트의 현재 불투명도 입니다.
  • TransitionTime 전환 시간 - 현재 존이 비활성에서 활성으로, 또는 그 반대로 전환하는 데 걸린 기간입니다.

MobileInputZone 델리게이트

  • OnProcessInputDelegate() [Zone] [DeltaTime] [Handle] [EventType] [TouchLocation] - 존 안에 인풋 이벤트가 발생했을 때, 그 처리를 다른 클래스에 완전 맡기는 커스텀 처리를 가능하게 하고자 호출됩니다. 인풋이 처리되었음은 참을 반환하여 알립니다. 거짓을 반환하면 인풋을 전달하여, ProcessTouch() 함수에서 존의 타입에 따라 처리되도록 합니다.
    • Zone - 델리게이트가 속하는 존을 가리킵니다.
    • DeltaTime - 존에 인풋 이벤트가 발생한 이후 경과 시간입니다.
    • Handle - 인풋 이벤트를 담당하는 터치의 고유 식별자입니다.
    • EventType - 인풋 이벤트의 EZoneTouchEvent 종류입니다.
    • TouchLocation - 터치 이벤트의 가로 세로 위치를 픽셀 화면 좌표로 지정하는 Vector2D 입니다.
  • OnTapDelegate() [Zone] [EventType] [TouchLocation] - 존 안에 탭이 발생했을 때, 그 처리를 다른 클래스에 완전 맡기는 커스텀 처리를 가능하게 하고자 호출됩니다. 탭이 처리되었음은 참을 반환하여 알립니다. 거짓을 반환하면 탭을 전달하여, ProcessTouch() 함수가 처리하도록 합니다.
    • Zone - 델리게이트가 속하는 존을 가리킵니다.
    • EventType - 인풋 이벤트의 EZoneTouchEvent 종류입니다.
    • TouchLocation - 터치 이벤트의 가로 세로 위치를 픽셀 화면 좌표로 지정하는 Vector2D 입니다.
  • OnDoubleTapDelegate() [Zone] [EventType] [TouchLocation] - 존 안에 더블탭이 발생했을 때, 그 처리를 다른 클래스에 완전 맡기는 커스텀 처리를 가능하게 하고자 호출됩니다. 더블탭이 처리되었음은 참을 반환하여 알립니다. 거짓을 반환하면 더블탭을 전달하여, ProcessTouch() 함수가 처리하도록 합니다.
    • Zone - 델리게이트가 속하는 존을 가리킵니다.
    • EventType - 인풋 이벤트의 EZoneTouchEvent 종류입니다.
    • TouchLocation - 터치 이벤트의 가로 세로 위치를 픽셀 화면 좌표로 지정하는 Vector2D 입니다.
  • OnProcessSlide() [Zone] [EventType] [SlideValue] [ViewportSize] - 슬라이더 존 안에 인풋 이벤트가 발생했을 때, 슬라이더 값 접근을 허용하기 위해 호출됩니다. 반환값은 현재 사용되지 않습니다.
    • Zone - 델리게이트가 속하는 존을 가리킵니다.
    • EventType - 인풋 이벤트의 EZoneTouchEvent 종류입니다.
    • SlideValue - 원래 놓인 위치에서 [+/-] 픽셀 오프셋으로 슬라이드시킬 위치입니다.
    • ViewportSize - 현재 뷰포트, 즉 디바이스 화면의 치수입니다.
  • OnPreDrawZone() [Zone] [Canvas] - 존이 렌더되기 직전에 다른 커스텀 존이나 액터 로 덮어써서 존을 그릴 수 있도록 하고자, MobileHUD 에 의해 호출됩니다. 참을 반환하여 존의 표준 렌더링을 중단시킵니다.
    • Zone - 델리게이트가 속하는 존을 가리킵니다.
    • Canvas - 그리는 데 사용할 Canvas 를 가리킵니다.
  • OnPostDrawZone() [Zone] [Canvas] - 존이 렌더된 이후 커스텀 존이나 다른 액터 로 존 그리기를 보충할 수 있도록 하기 위해 MobileHUD 에 의해 호출됩니다.
    • Zone - 델리게이트가 속하는 존을 가리킵니다.
    • Canvas - 그리는 데 사용할 Canvas 를 가리킵니다.

MobileInputZone 함수

  • ActivateZone() - 인풋 존을 bUseGentleTransitions 값에 따라 ZoneState_ActivatingZoneState_Active 상태 중 하나로 설정합니다.
  • DeactivateZone() - 인풋 존을 bUseGentleTransitions 값에 따라 ZoneState_DeactivatingZoneState_Inactive 상태 중 하나로 설정합니다.
  • AddKismetEventHandler() [NewHandler] - 새 모바일 인풋 키즈멧 이벤트에 인풋 존을 연결시켜, 그 존에 터치 인풋이 발생하면 이벤트를 받을 수 있도록 합니다.
    • NewHandler - 새로운 핸들러로 추가할 SeqEvent_MobileZoneBase 를 가리킵니다.

인풋 존 타입

  • Button 버튼 - ZoneType_Button 존 타입은 Pressed 와 Unpressed, 두 가지 상태가 있는 존입니다. 눌린 상태에서 안눌린 상태로 바뀌면 InputKey 를 전송합니다.
  • Joystick 조이스틱 - ZoneType_Joystick 존 타입은 디바이스에서 조이패드/스틱을 빠르게 흉내내볼 수 있는 가상 스틱입니다. InputKey 는 세로 액세스에 따른 이동이 발생할 때 전송될 바인드를 정의합니다. HorizontalInputKey 는 가로 액세스 이동이 발생할 때 전송됩니다.
  • Trackball 트랙볼 - ZoneType_Trackball 존 타입은 일반 터치와 스와이프를 처리하는 존을 만듭니다. 트랙볼 존을 추가하고, 그 안에서 손가락을 움직이면 트랙볼을 굴리는 것과 똑같은 효과를 냅니다. 위의 ZoneType_Joystick 과 마찬가지로, InputKey 는 세로 이동, HorizontalInputKey 는 가로 이동 용입니다.
  • Slider 슬라이더 - ZoneType_Slider 존 타입은 고정축을 따라 서브-존을 미끄러뜨리는 데 사용됩니다. SliderZone 은 스크립트 델리게이트와 함께 그 값 관리용으로 사용되도록 고안되었습니다. 예제로는 Citadel 을 살펴보십시오.

인풋 존 상태

  • Inactive 비활성 - 이 인풋 존은 현재 비활성 상태입니다.
  • Activating 활성중 - 이 인풋 존은 활성화되고 있는 중입니다.
  • Active 활성 - 이 인풋 존은 활성 상태입니다.
  • Deactivating 비활성중 - 이 인풋 존은 비활성화되고 있는 중입니다.

렌더링과 외형

인풋 존에 대한 오버레이 렌더링은 MobileHud 클래스가 처리합니다. 그 외형을 바꾸려면 여러가지 DrawMobileZone_xxxx 함수를 덮어써야 할 것입니다.

존에 있는 다음 프로퍼티를 사용하여 기본적인 외형 덮어쓰기도 약간 가능합니다. (프로퍼티에 대한 설명은 MobileInputZone Rendering 프로퍼티 부분을 참고하십시오.)

  • OverrideTexture[1/2]
  • OverrideTexture[1/2]Name
  • OverrideUVs[1/2]

크기 및 위치 조정

존의 위치와 크기는 X, Y, SizeX, SizeY 멤버 변수에 의해 처리됩니다. 크기 및 위치 조정에 관해서 알아둬야 할 중요한 점이 몇 가지 있습니다. 먼저, 음수 사용에 관계된 것입니다. 음수는 뷰포트의 오른쪽/아래 가장자리에서부터 뭔가의 위치나 크기를 정할 때 사용할 수 있습니다. 예를 들어 SizeX = 32 이고 X = -32 인 존은, 화면의 오른쪽 가장자리에서 이어지게 됩니다. 추가로, 엔진이 뷰포트의 백분율로 이 값을 사용하도록 할 수 있는 플랙도 몇 가지 있습니다. 즉 bRelativeX = true 인 존은 X 값을 뷰포트 SizeX 의 백분율로 취하게 됩니다. 마지막으로, (아이패드 대 아이팟 처럼) 가변적인 해상도에서도 적절한 종횡비를 내기 위해서도 bSizeYFromSizeX 를 사용할 수 있습니다.

X, Y, SizeX, SizeY 에 추가로 ActiveSizeXActiveSizeY 도 있습니다. "존 안에 존 있다" 상황을 연출할 수 있습니다.

activezone.jpg

인풋 존 추가하기

각각의 존은 DefaultGame.ini 환경설정 파일에 정의되어 있습니다. MobileInputZone 시스템은 여러가지 존을 관리하고 로드하는 데 오브젝트별 환경설정을 사용합니다. 즉 각 인풋 존은 환경설정 파일 내 각 부분에 정의된다는 뜻입니다. config 지정자로 선언된 프로퍼티는 무엇이든 환경설정 파일 내 인풋 존을 정의하는 부분에서 설정할 수 있습니다.

모바일 인풋 존 정의에 대한 예제는 다음과 같습니다:

[UberStickMoveZone MobileInputZone]
InputKey=MOBILE_AForward
HorizontalInputKey=MOBILE_AStrafe
Type=ZoneType_Joystick
bRelativeX=true
bRelativeY=true
bRelativeSizeX=true
bRelativeSizeY=true
X=0.05
Y=-0.4
SizeX=0.1965
SizeY=1.0
bSizeYFromSizeX=true
VertMultiplier=-1.0
HorizMultiplier=1.0
bScalePawnMovement=true
RenderColor=(R=255,G=255,B=255,A=255)
InactiveAlpha=0.25
bUseGentleTransitions=true
ResetCenterAfterInactivityTime=3.0
ActivateTime=0.6
DeactivateTime=0.2
TapDistanceConstraint=5

인풋 그룹 정의하기

FrameworkGame 에서 확장한 게임타입은 필수 모바일 인풋 컨픽, 또는 인풋 그룹 목록을 정의할 수 있습니다. 각 컨픽은 그를 정의하는 이름과 포함해야 하는 존 목록으로 구성되어 있습니다. 인풋 그룹에 인풋 존이 지정되는 순서는 매우 중요합니다. 인풋을 인풋 존에 전달하는 순서를 정의하며, 인풋이 인풋 존에 전달되고 그 존의 범위 내에 있으면, 바로 처리하여 뒤따르는 존에 전달하지 않습니다. 인풋 그룹에 서로 겹치는 존이 다수 있을 경우 문제가 생길 수 있습니다. 예를 들어 한 인풋 존이 전체화면이고, 다른 모든 인풋 존 앞에 추가되었다 칩시다. 뒤따르는 존은 전혀 인풋을 받지 못할 것입니다.

에픽 시타델에 사용된 CastleGame 게임타입에 대한 모바일 인풋 컨픽 부분은 이렇습니다:

[MobileGame.CastleGame]
+RequiredMobileInputConfigs=(GroupName="UberGroup",RequireZoneNames=("MenuSlider","UberStickMoveZone","UberStickLookZone","UberLookZone"))
+RequiredMobileInputConfigs=(bIsAttractModeGroup=true,GroupName="AttractGroup",RequireZoneNames=("MenuSlider","ExitAttractModeZone"))
+RequiredMobileInputconfigs=(GroupName="InitialFlybyGroup")
+RequiredMobileInputConfigs=(GroupName="TapTutorialGroup",RequireZoneNames=("MenuSlider","TapTutorialZone"))
+RequiredMobileInputConfigs=(GroupName="SwipeTutorialGroup",RequireZoneNames=("MenuSlider","SwipeTutorialZone"))
bAllowAttractMode=true

인풋 시스템이 초기화(initialize)되면, 어느 MobileInputZones 를 로드해야 하는지 게임에 물어(query) 알아냅니다. 현재 게임타입에 대해 각 인풋 존이 인스턴싱되어 MobilePlayerInput 클래스의 로컬 인스턴스에 저장됩니다. 여기서 중요한 부분은 RequireZoneNames 배열은 .ini 파일에 오브젝트별 컨픽 생성에 사용된 이름을 담아야 한다는 점입니다. 코드는 MobilePlayerInput 클래스의 InitializeInputZones() 를 확인해 보시기 바랍니다. MobilePlayerInput 에서 ActiveInputGroup() 을 호출하면 활성 인풋 그룹을 변경할 수 있습니다.

디버깅

가급적 쉽게 만들려고 노력은 했습니다만, 존에서의 입력 디버깅은 까다로울 수 있습니다. 우선, PC에서 모든 기능을 사용할 수 있는 이뮬레이션 모드가 있습니다. 다음과 같은 명령줄 파라미터로 게임을 실행시키면:
-simmobile
또는
-simmobileinput

게임은 하나의 터치 환경을 흉내내기 위해 마우스를 사용합니다. 부가적으로 "-wxwindows" 명령줄 파라미터를 사용한 다음에는, 다음과 같은 콘솔 명령을 사용할 수 있습니다:

editobject class=mobileplayerinput

이렇게 하면 실시간으로 다양한 모바일 입력 속성을 보고/편집할 수 있습니다. 게다가 HUD에 디버그 정보가 표시되게 하는 컨픽 옵션도 여럿 있습니다:

[GameFramework.MobileHUD]
bDebugTouches=true
bDebugZones=true
bDebugZonePresses=true
bShowMotionDebug=true

이는 SET 명령어로도 가능합니다. (예: set mobilehud bDebugTouches). 시타델에서 해 보시기 바랍니다.

UDKRemote 를 사용하여 디바이스에서의 입력을 PC에서 실행중인 엔진으로 전송할 수도 있습니다. UDKRemote 관련 상세 정보는 UDK Remote KR 페이지를 참고해 보시기 바랍니다.

언리얼스크립트에서의 모바일 인풋


모바일 디바이스 상의 인풋은 MobilePlayerInput 클래스에서 찾을 수 있는 여러가지 델리게이트를 통해 언리얼스크립트로 관리할 수 있습니다. 신경써야할 로우-레벨 함수는 딱 하나 있습니다. 이 델리게이트에 함수를 할당하여, 모바일 디바이스로부터의 터치와 모션 인풋을 완전히 커스텀하게 처리하는 방식을, 언리얼스크립트를 통해 직접 셋업할 수 있는 것입니다. 이러한 방식은 MobilePlayerInput 의 서브클래스에서도, 게임의 커스텀 PlayerController 클래스에서도, 아니면 디바이스의 인풋을 처리할 필요가 있으면 어느 곳에서도 가능합니다.

터치 인풋

사용자가 화면을 건드릴 때마다 '터치'로 간주됩니다. 인풋 시스템은 한 번에 여러 터치를 기록할 수 있습니다. 각각의 터치는 사용자가 화면을 건드린 시점부터 화면에서 손을 뗄 때까지 유지됩니다.

터치 이벤트

터치 수명 동안에 다양한 종류로 세분화된 이벤트를 생성합니다. 이 종류를 통해 일정 시점에서 터치에 반응하는 방식을 결정할 수 있습니다. 이러한 유형은 Interaction.uc 에 정의되어 있는 ETouchType 라는 열거형에 들어 있습니다.

  • Touch_Began - 터치 이벤트는 사용자가 디바이스에 접촉했을 때 전송됩니다. 새로운 개별 터치를 나타냅니다.
  • Touch_Moved - 업데이트 이벤트는 터치의 첫 발생 이후 끝나는 사이 매 프레임마다 전송됩니다. 이 이벤트로 터치의 수명 동안 기록을 유지할 수 있습니다.
  • Touch_Ended - 언터치 이벤트는 터치가 끝났을 때나 사용자가 디바이스 터치를 중단했을 때 전송됩니다. 개별 터치의 끝을 나타냅니다.
  • Touch_Cancelled - 캔슬드 이벤트는 시스템 메시지 출력과 같은 외부적 요소에 의해 기존 터치가 취소되었을 때 전송됩니다. 이것 역시 기존 터치의 끝을 나타냅니다.
  • ZoneEvent_Stationary - 이 이벤트는 현재 생성되지 않고 있습니다.

터치 처리하기

터치 인풋 시스템의 시작은 MobilePlayerInput 클래스에 존재하는 델리게이트를 통해서입니다. 이 델리게이트로 디바이스에서 오는 날 로우 레벨 터치 데이터에 접근할 수 있습니다. 이는 프레임 마다 여러 번 호출 가능하고, 또 실제로 그리 하여 다양한 터치 정보를 반환합니다. 여기서 오는 데이터의 유지 관리는 프로그래머 몫입니다.

  • OnInputTouch [Handle] [Type] [TouchLocation] [DeviceTimestamp] -
    • Handle - 이 터치 식별을 위한 Touches 배열로의 인덱스입니다. 터치의 수명 내도록 고유하나, 터치와 터치 사이에는 고유하지 않습니다.
    • Type - 터치 이벤트의 ETouchType 입니다. 생성가능 이벤트 종류에 대한 설명은 터치 이벤트 부분을 참고하십시오.
    • TouchLocation - 디바이스 화면상 터치의 픽셀 단위 가로 세로 위치를 담는 Vector2D 입니다.
    • DeviceTimestamp - 터치의 실제 로우-레벨 타임스탬프입니다.
    • TouchpadIndex - 이 델리케이트를 invoke 한 터치 패드입니다.

이와 동일한 정보가 위의 MobileInputZone 을 돌리는 데 사용됩니다. 이 델리게이트는 존 보다 먼저 터치에 접근하나, 그와 공존해야 합니다.

집기(Picking) 예제

각기 다른 여러 유형의 게임에서 월드 내 임의의 아이템과 상호작용할 수 있는 기능, 또는 어느 아이템이 터치되고 있는가 감지하는 기능이 필요합니다. 이러한 것들은 인터페이스는 물론 MobilePlayerInput 클래스에서의 OnInputTouch() 델리게이트를 사용하여 매우 유연한 방식으로 가능합니다. 인터페이스의 사용을 통해 '터치가능'하게 하고 싶은 클래스는 무엇이든 소원을 들어 주면서도, 코드는 거기에만 꼭 맞도록 군살을 쏙 빼줄 수 있습니다.

ITouchable 인터페이스
ITouchable 인터페이스는 매우 단순합니다. 하나의 함수 OnTouch() 를 선언하는데, 이 인터페이스를 구현하는 액터가 터치될 때마다 (아래 설명한) 커스텀 PlayerController 클래스에서 호출되는 함수입니다.

ITouchable.uc
Interface ITouchable;

function OnTouch(ETouchType Type, float X, float Y);

테스트를 위해서는 이 인터페이스를 구현하는 클래스가 필요할 것입니다. MobilePlaceablePawn 에서 확장된 클래스로 충분할 것입니다.

UDNMobilePawn.uc
class UDNMobilePawn extends MobilePlaceablePawn implements(ITouchable);

function OnTouch(ETouchType Type, float X, float Y)
{
   WorldInfo.Game.Broadcast(self, "Touched:"@self);
}

implements(ITouchable) 는 이 클래스가 ITouchable 인터페이스에 속하는 모든 함수를 정의해야 함을 나타냅니다. 이 경우는 OnTouch() 함수죠. 이를 통해 터치가능한 아이템과는 무엇이든 안정적으로 통신할 수 있는 방법을 제공합니다. 함수의 본문은 단지 아이템이 터치되었다고 화면에 메시지를 뿌리기만 합니다.

PlayerController 클래스
오브젝트 집기 함수성은 PlayerController 클래스에서 구현되는데, 모바일 터치 인풋을 사용하려면 GamePlayerController 클래스가 필수이기에 이 클래스의 서브클래스가 될 것입니다.

UDNMobilePC.uc
class UDNMobilePC extends GamePlayerController;

집기 함수성의 편의를 위해 여러가지 변수가 필요합니다.

UDNMobilePC.uc
/** 디바이스 화면 치수 저장 */
var vector2D ViewportSize;

/** 참이면 터치가 새로 감지된 것 (반드시 유일 활성 터치) */
var bool bPendingTouch;

/** 가장 최근 터치의 처리 저장 */
var int PendingTouchHandle;

/** 선택된 액터 저장 */
var Actor SelectedActor;

/** 액터 집기 가능 최대 거리 */
var float PickDistance;

/** '클릭'으로 간주하기 위해 터치에서 언터치까지 마우스 최대 이동 가능 거리 */
var float ClickTolerance;

/** MobilePlayerInput 으로의 참조 캐시 */
var MobilePlayerInput MPI;

터치의 화면 좌표 위치를 한 쌍의 벡터로 변환하여 Trace() 함수와 함께 사용, 뭐가 터치되었는가를 결정해 내기 위한 함수를 새로 정의합니다.

UDNMobilePC.uc
/** 터치 위치 아래 액터 찾기
*
*   @PickLocation - 터치의 화면 좌표
*/
function Actor PickActor(Vector2D PickLocation)
{
   local Vector TouchOrigin, TouchDir;
   local Vector HitLocation, HitNormal;
   local Actor PickedActor;

   // 절대 화면 좌표를 상대 좌표로 변환
   PickLocation.X = PickLocation.X / ViewportSize.X;
   PickLocation.Y = PickLocation.Y / ViewportSize.Y;

   // 집기 광선을 구하기 위해 월드 좌표로 변환
   LocalPlayer(Player).Deproject(PickLocation, TouchOrigin, TouchDir);

   // 터치된 액터를 찾기 위해 트레이스 수행
   PickedActor = Trace(HitLocation, HitNormal, TouchOrigin + (TouchDir * PickDistance), TouchOrigin, true);

   // ITouchable 로 형 변환하여 터치된 액터가 정말 터치 가능한지 확인
   if(Itouchable(PickedActor) != none)
   {
      //터치된 액터에서 OnTouch() 함수 호출
      Itouchable(PickedActor).OnTouch(ZoneEvent_Touch, PickLocation.X, PickLocation.Y);
   }

   //덤으로 터치된 액터 반환
   return PickedActor;
}

이제 터치의 위치를 PickActor() 함수에 전달할 수 있도록 결정해 줘야 합니다. 여기에는 위에 나타낸 대로 MobilePlayerInput 클래스에서의 OnInputTouch() 델리게이트를 사용해야 합니다. 먼저 델리게이트에 할당될 함수를 정의합니다.

UDNMobilePC.uc
function HandleInputTouch(int Handle, ETouchType Type, Vector2D TouchLocation, float DeviceTimestamp)
{
  local Actor PickedActor;
  local int i;

  // 새 터치 이벤트
  if(Type == Touch_Began)
  {
    //Specify a new touch has occurred
    PendingTouchHandle = Handle;
    bPendingTouch = true;
  }
  // 터치 진행중
  else if(Type == Touch_Moved)
  {
    for(i=0; i<MPI.NumTouchDataEntries; i++)
    {
      // 터치 이동 거리를 검사하여 너무 멀리 갔으면 취소, 아니면 터치 위치 업데이트
      if(MPI.Touches[i].Handle == PendingTouchHandle && MPI.Touches[i].TotalMoveDistance > ClickTolerance)
      {
        bPendingTouch = false;
      }
    }
  }
  // 터치 끝
  else if(Type == Touch_Ended)
  {
    //Check if a touch is active
    if(Handle == PendingTouchHandle && bPendingTouch)
    {
      //터치 아래 액터 구하기
      PickedActor = PickActor(TouchLocation);

      //액터가 터치 가능한지 검사하여 참이면 선택 설정하고, 거짓이면 무선택 상태로
      if(ITouchable(PickedActor) != none)
      {
        SelectedActor = PickedActor;
      }
      else
      {
        SelectedActor = none;
      }

      //cancel active touch
      bPendingTouch = false;
    }

    WorldInfo.Game.Broadcast(self, "SelectedActor:"@SelectedActor);
  }
}

인풋 발생시 HandleInputTouch() 함수가 호출되게 하려면 OnInputTouch() 델리게이트에 할당해 줘야 합니다.

UDNMobilePC.uc
event InitInputSystem()
{
  Super.InitInputSystem();

  //로컬 MobilePlayerInput 로의 리퍼런스 구하기
  MPI = MobilePlayerInput(PlayerInput);

  //델리게이트로의 인풋 핸들러 함수 접근하기
  MPI.OnInputTouch = HandleInputTouch;

  //화면 치수 구하기 (DeProject 에 쓸 상대 화면 좌표로 변환하는 데 사용)
  LocalPlayer(Player).ViewportClient.GetViewportSize(ViewportSize);
}

인풋 시스템을 초기화시키기 위해 InitInputSystem() 이벤트가 호출됩니다. Super.InitInputSystem(); 호출 이전에 시스템이 초기화되고 로컬 MobilePlayerInput 이 접근 가능해야 HandleInputTouch 함수를 OnInputTouch 에 할당되도록 할 수 있습니다.

마지막으로 필수 프로퍼티에 약간의 디폴트 설정을 해 줍니다.

UDNMobilePC.uc
defaultproperties
{
   PickDistance=10000
   ClickTolerance=5

   InputClass=class'GameFramework.MobilePlayerInput'
}

게임타입
분명 사용될 오브젝트를 집는 데 있어 이러한 함수성이 새로 포함된 PlayerController 클래스를 사용하는 것이 필수일 것입니다. 새로운 PlayerController 를 강제 사용하도록 하는 간단한 게임타입 예제는 이와 같습니다.

UDNMobileGame.uc
class UDNMobileGame extends FrameworkGame;

defaultproperties
{
   PlayerControllerClass=class'UDNMobileGame.UDNMobilePC'
   DefaultPawnClass=class'MobileGame.MobilePawn'
   HUDType=class'GameFramework.MobileHUD'
   bRestartLevel=false
   bWaitingToStartMatch=true
   bDelayedStart=false
}

디폴트로 새로운 게임타입을 사용하도록 하기 위해 DefaultEngine.ini 에도 지정해 줍니다.

[Engine.GameInfo]
DefaultGame=UDNMobileGame.UDNMobileGame
DefaultServerGame=UDNMobileGame.UDNMobileGame
DefaultGameType="UDNMobileGame.UDNMobileGame"

테스팅
PlayerStart 와 재즈 잭래빗 스켈레탈 메시를 사용하여 PlayerStart 앞에 놓은 UDNMobilePawn 로 구성된 매우 간단한 테스트 맵입니다.

pickactor_map.jpg

먼저 재즈 이외에 터치하니 터치된 아이템이 없음을 알리는 결과 화면입니다.

pickactor_fail.jpg

그리고 재즈 바로 위에 터치하니 바라던 대로 재즈가 터치되었음을 알리는 결과 화면입니다.

pickactor_success.jpg

모션 인풋

모션 인풋은 입력 수단으로 디바이스 자체의 방향과 이동을 사용하는 것을 가리킵니다. 각양 각색의 디바이스에 모션 데이터도 각양 각색으로(, 또는 전혀 없을 수도) 있습니다. 가속도계가 있는 디바이스는 기본 오리엔테이션과 로테이션 데이터를 내는 반면, 자이로스코프처럼 좀 더 정교한 기구를 가진 경우 직선 운동과 같은 부가 데이터는 물론 좀 더 정확한 오리엔테이션과 로테이션 인풋 데이터를 내 주기도 합니다. 모션 인풋 데이터는 PlayerInput 의 프로퍼티를 통해 직접 접근 가능합니다.

Tilt 틸트

디바이스의 틸트(Tilt, 기울기)는 오리엔테이션(방향)을 가리킵니다. 디바이스를 여러 축으로 회전시켜 오리엔테이션이 달라지면, 틸트는 (주로 Vector 형태의) Pitch, Yaw, Roll 단위로 보고됩니다. 그리고 게임내 액션이나 게임플레이 엘리먼트를 돌리는 데 이 값을 사용할 수 있습니다. 가속도계가 있는 디바이스기만 하면야 틸트 모션 데이터는 언제든 사용할 수 있습니다.

이 데이터는 PlayerInput.aTilt 안에 보관됩니다. 이 값의 단위는 Unreal rotator unit 입니다.

Rotation Rate 회전율

회전율이란 디바이스의 틸트가 바뀌는 속도를 말합니다. 디바이스의 오리엔테이션이 바뀌어 감에 따라, 축을 중심으로 하는 회전율이 디바이스가 보고하는 회전율 값을 결정합니다. 이 데이터는 피치, 요, 롤 변화율을 나타내는 벡터 형태로 나타납니다. 회전율 데이터는 가속도계가 있는 디바이스에서 사용할 수 있으나, 자이로스코프가 있는 디바이스에서 훨씬 더 정확합니다.

이 값은 PlayerInput.aRotationRate 안에 보관됩니다.

Acceleration 가속도

가속도는 디바이스의 직선 운동을 말합니다. 디바이스가 축을 따라 공간을 이동할 때, 디바이스는 벡터 형태의 가속도 데이터로 이 직선 운동을 보고합니다. 이러한 모션 인풋 유형은 자이로스코프가 있는 디바이스에서만 사용할 수 있습니다.

이 값은 PlayerInput.aAcceleration 안에 보관됩니다.

Gravity 중력

일부 디바이스는 중력 감지도 가능합니다.

이 값은 PlayerInput.aGravity 안에 보관됩니다.

키즈멧의 모바일 인풋


키즈멧에는 인풋 셋업과 관리를 위한 액션과 이벤트가 여럿 있습니다. 게임 .ini 파일을 편집하지 않고도 일회성 레벨을 만든다거나, 레벨-전용 인풋을 원한다거나 할 때 좋습니다.

모바일 인풋-관련 키즈멧 오브젝트에 대한 세부사항은 Mobile Kismet Reference KR 페이지를 참고하시기 바랍니다.

키즈멧에서 인풋 존 관리하기

키즈멧 안에서 인풋 존을 관리하는 방법은 여러가지 있습니다. 모바일 액션으로 개별 인풋 존을 추가/제거하거나 모든 인풋 존을 비울 수도 있습니다.

인풋 존 추가/제거하기

인풋 존의 추가나 삭제는 모바일 인풋 액션 Clear Input Zones, Add Input Zones, Remove Input Zones 등을 사용하여 키즈멧을 통해 직접 손쉽게 할 수 있습니다. 빠른 프로토타이핑이나 특화된 레벨-전용 인풋에 특히나 좋습니다. 키즈멧을 통해 에디터를 종료하고, .ini 파일을 수정하고, 에디터를 다시 열고, 레벨을 다시 열고 하는 작업 없이도 인풋 존 프로토타이핑과 테스팅을 할 수 있다는 것은, 시간 절약 측면에서만 봐도 인풋 존 관리에 있어 엄청난 이득입니다. Add Input Zone 액션으로 인풋 존의 위치나 크기 뿐만 아니라 다른 중요한 프로퍼티도 완벽히 조절할 수 있습니다. 사용감을 향상시키기 위해 게임 도중에도 이러한 액션을 사용하여 인풋 존을 제한하거나 재설정할 수도 있습니다. 예를 들어 어떤 레벨에서는 게임의 일반적인 플레이어 인풋은 제한하면서 매우 특수한 플레이어 인풋 메서드가 필요할 수 있습니다. 그런 경우에 이 액션이 딱입니다.

아래는 디폴트 MobileGame 에서 표준 인풋 존을 받고서 플레이 도중 플레이어의 인풋 선택을 제한시킨 다음 다시 디폴트 인풋으로 복원시키도록 변경시키는 기능에 대한 단순한 예제입니다.

키즈멧 시퀸스:

(원래 크기로 보시려면 클릭)

kismet_inputzones_example_thumb.jpg

시퀸스 로직은 꽤나 단순합니다:

  • RemoveInput 이벤트 시퀸스는 둘러보는 데 사용되는 UberLookZone 트랙볼 인풋 존만 남겨둔 채 UberStickMoveZoneUberStickLookZone 조이스틱 인풋 존을 제거합니다.
  • AddInput 이벤트 시퀸스가 UberStickMoveZoneUberStickLookZone 조이스틱 인풋 존을 되돌려놓아 플레이어의 정상 콘트롤을 복원시킵니다.
  • Console Events 는 단지 콘솔에 CE ADDCE REMOVE 를 입력하여 원격 이벤트 시퀸스를 간단히 트리거시켜주는 방법을 제공합니다.

Add Input Zones 액션에 대한 프로퍼티는:

(Click to see all properties)

kismet_inputzones_props_stickmove_thumb.jpg kismet_inputzones_props_sticklook_thumb.jpg

시퀸스를 미리 작동시켜본 모습:

kismet_inputzones_preview.jpg

버튼 인풋 존 처리

버튼 인풋 존의 인풋은 Mobile Button Access 이벤트를 통해 처리 가능합니다. 이를 통해 사용자가 버튼을 탭한 것에 따라 레벨 내에서 액션을 수행할 수 있습니다. 모니터링할 버튼 인풋 존은 현재 게임타입에 대한 DefaultGame.ini 에 정의하거나, Add Input Zone 액션을 사용해 완전 커스텀 버튼으로 추가해도 됩니다.

다음은 콘솔 이벤트에 반응하여 버튼이 언제 눌리는지 대기하는 버튼 인풋 존을 추가하기 위한, 간단 키즈멧 시퀸스 예제입니다. 버튼이 눌리면 게임을 닫으라는 콘솔 명령이 전송됩니다.

키즈멧 시퀸스:

(원래 크기로 보시려면 클릭)

kismet_inputzones_example_thumb.jpg

Add Input Zone 액션과 Mobile Button Access 이벤트에 대한 프로퍼티:

(Click to see all properties)

kismet_mobilebutton_props_addbutton_thumb.jpg kismet_mobilebutton_props_buttonaccess.jpg

시퀸스를 미리 작동시켜본 모습:

(원래 크기로 보시려면 클릭)

kismet_mobilebutton_preview_thumb.jpg

조이스틱 인풋 존 처리

조이스틱 인풋 존의 입력은 Mobile Input AccessMobile Look 이벤트를 통해 키즈멧에서 바로 처리할 수 있습니다. Mobile Input Access 는 축이나 중심값처럼 조이스틱의 날 입력 데이터에 접근할 수 있는, 꽤나 일반적인 이벤트입니다. Mobile LookYaw, Strength, Rotation 처럼 좀 더 특수하긴 해도 매우 유용한 데이터를 출력하는 특수 이벤트입니다. 프로토타이핑할 때나 특정 레벨 전용 플레이어 콘트롤 등의 용도로, 조이스틱에서 인풋을 받아 게임내 캐릭터를 제어하기 위해 적용시키는 데 사용할 수 있습니다.

이 예제는 (보통 단순 방향 이동에 사용되는) 왼쪽 스틱을 플레이어의 이동 방향 뿐만 아니라 플레이어의 로테이션도 항상 이동 방향을 향하도록 하는 단일 조이스틱 이동 구현 예제입니다. 이 예제에서 또 한가지 주목할 점은, 배치가능 폰과 아울러 키즈멧을 사용하여 맵 안에 만든 커스텀 카메라 셋업도 함께 사용한다는 점입니다.

키즈멧 시퀸스:

(원래 크기로 보시려면 클릭)

kismet_joystick_example_thumb.jpg

시퀸스 로직은:

  • Level Loaded 이벤트는 플레이어 인풋을 끄고 내려보기 카메라를 설정합니다.
  • Input Active 출력은 StrengthRotation 변수를 사용하여 플레이어의 Velocity (속도 = 방향 + 속력) 계산을 합니다.
  • Input Active 출력은 Yaw 변수를 사용하여 플레이어의 Rotation 을 계산합니다.
  • Input Inactive 입력은 플레이어의 Velocity (속도)를 낚아채 플레이어 감속 효과를 내는 시퀸스를 돌립니다.

Mobile Look 이벤트에 대한 프로퍼티:

kismet_joystick_props_mobilelook.jpg

작동중인 시퀸스 미리보기:

(Click to view - Right-click > Save As to download)

kismet_joystick_preview.jpg

키즈멧 터치 인풋 이벤트 처리

날 터치 입력은 물론 단순한 스와이프도 키즈멧에서 Mobile Raw Input AccessMobile Simple Swipes 이벤트를 사용하여 감지해낼 수 있습니다. Mobile raw Input Access 이벤트로 키즈멧 내부의 바로 그 범용 인풋 데이터에 접근할 수 있습니다. 이는 커스텀 인풋 스키마를 디버깅하고 프로토타이핑하는 데 유용할 수 있습니다. Mobile Simple Swipes 이벤트는 키즈멧 안에서 기본적인 스와이프 감지 기능을 하여, 스와이프 터치에 따른 커스텀 플레이어 인풋이 가능합니다.

아래 예제는 배치가능 폰 캐릭터의 이동과 회전을 제어하기 위해 단순 스와이프 감지를 사용하는 예제입니다. 씬의 다른 모든 입력은 꺼져 있습니다. 이 예제가 배치가능 플레이어를 사용하기는 하지만, 플레이어가 움직여야 하는 퍼즐 조각이나 돌덩이 등의 오브젝트를 제어하는 데도 비슷하게 사용할 수 있습니다.

키즈멧 시퀸스:

(원래 크기로 보시려면 클릭)

kismet_swipe_example_thumb.jpg

시퀸스 로직:

  • Mobile Simple Swipes 이벤트의 각 출력은 방향과 회전 변수를 조금 설정합니다.
  • 방향과 회전 변수는 속도와 회전 벡터 변수를 만드는 데 사용됩니다.
  • 회전 벡터는 배치가능 폰 캐릭터의 Rotation 을 설정하는 데 사용됩니다.
  • 방향 벡터와 속력(velocity magnitude) 변수는 폰 배치가능 폰 캐릭터의 Velocity 를 설정하는 데 사용됩니다.
  • 플레이어가 감속되는 모양을 내기 위해 Velocity 를 낚아챕니다.

Mobile Simple Swipes 이벤트에 대한 프로퍼티:

kismet_swipe_props_mobileswipe.jpg

작동중인 시퀸스 미리보기:

(Click to view - Right-click > Save As to download)

kismet_swipe_preview.jpg

키즈멧 모션 인풋 이벤트 처리

모션 인풋 데이터는 키즈멧의 Mobile Motion Access 이벤트를 사용하여 접근 가능합니다. 이는 회전 값과 델타(경과치) 형태로 모션 데이터를 출력합니다. 상황에 따라 이 데이터는 디버깅과 프로토타이핑에 쓰일 수도, 레벨 안에 고유하고 특수한 인풋을 만드는 데도 사용할 수 있습니다. 그래도 유념할 점은, 데이터가 꽤나 날것이라 키즈멧에서 복잡한 콘트롤 방법으로 활용하려면 약간의 처리가 필요할 수도 있습니다. 이 이벤트를 사용하는 커스텀 콘트롤을 만들기 위해서는 커스텀 키즈멧 오브젝트와 여러가지 계산이 추가로 필요할 수도 있습니다.

다음 예제는 키즈멧 안에서 모션 인풋을 사용하여 배치가능 폰 캐릭터의 "단순" 운동을 제어하는 데모입니다. ("단순"에 따옴표가 붙은 이유는, 실제보다 나빠 보이긴 해도 시퀸스가 단순 그 자체이기 때문입니다.

키즈멧 시퀸스:

(원래 크기로 보시려면 클릭)

kismet_motion_example_thumb.jpg

시퀸스 로직:

  • Roll 값은 정규화를 거쳐 [0.0, 1.0] 범위로 제한시킨 다음, 데드 존을 계산합니다.
  • Pitch 값은 정규화를 거쳐 [0.0, 1.0] 범위로 제한시킨 다음, 데드 존을 계산합니다.
  • 최종 RollPitch 값이 캐릭터의 속도(방향+속력)를 설정하는 데 사용됩니다.

작동중인 시퀸스 미리보기:

(Click to view - Right-click > Save As to download)

kismet_motion_preview.jpg