Wwise SDK 2024.1.1
|
Motion 플러그인을 사용하면 컨트롤 인터페이스의 햅틱 피드백을 제어할 수 있습니다. Wwise와 함께 동일한 도구 세트를 사용하여 애플리케이션의 동작(모션)과 오디오를 관리할 수 있습니다. 내부적으로, 모션 데이터는 오디오 데이터와 차이점이 없으며, 오디오에서 사용할 수 있는 모든 기능을 모션에서도 사용할 수 있습니다. 모션 기능을 통해 두 가지 유형의 햅틱 피드백을 사용할 수 있습니다. 하나는 프로젝트의 모든 오디오 신호를 모션으로 변환하는 유형이고, 다른 하나는 Motion 소스를 사용하여 전용 모션 신호를 생성할 수 있는 유형입니다. 지원되는 컨트롤러를 사용하여 Windows에서 Wwise Authoring을 통해 직접 동작을 테스트할 수 있습니다.
Motion은 애플리케이션에서 작동하기 위해 Wwise Sound Engine 플러그인 시스템을 사용하며, Motion 이라는 오디오 소스와 Wwise Motion 이라는 Audio Device의 두 모듈로 세분될 수 있습니다. Motion 오디오 소스는 선택 사항이기는 하지만 정밀하고도 유연한 모션 디자인을 만들 수 있는 강력한 도구입니다.
Wwise Motion 오디오 장치 플러그인은 사운드 엔진을 모션 지원 장치에 연결합니다. 모든 오디오 장치 플러그인과 마찬가지로 이 플러그인도 Listener(리스너)로부터 데이터를 수신해 이 데이터를 장치에 '제공'합니다. 이 플러그인은 별도의 라이브러리 내에 있으며 Wwise Authoring과 애플리케이션에 모두 포함되어야 합니다. 더 많은 정보는 Motion 설정하기 섹션을 참고하세요.
Motion 소스 플러그인을 사용하면 햅틱 피드백 효과의 동작을 설계할 수 있습니다. 다른 오디오 음원과 마찬가지로 자신의 Wwise 프로젝트에서 Sound SFX 노드에 Motion 소스 플러그인을 추가할 수 있습니다. Sound SFX 노드의 Output Bus는 반드시 모션 준비(motion-ready) 버스로 설정돼 있어야 합니다. 더 자세한 정보는 Motion을 참조하세요.
애플리케이션에서 모션을 사용하려면 각 구성 요소들을 올바르게 설정해야 합니다. 오디오 작업 과정에 적용되는 모든 개념은 모션에도 적용 가능하다는 점을 기억하세요. 모션은 동일한 버스와 리스너, 이미터를 사용합니다 ( 리스너 통합하기 참고).
사운드나 모션 데이터를 장치로 보내려면 라이선스가 있는 Wwise Motion Audio Device를 Wwise 프로젝트에서 Project Explorer의 Audio 탭에 있는 Audio Device 폴더에 추가해야 합니다. Wwise Motion Audio Device는 모션-레디 장치와 소통할 때 사운드 엔진이 사용하는 플러그인입니다. 이 플러그인은 Wwise Motion Audio Device를 상위 레벨 Audio Bus에 할당할 때에도 중요한 역할을 합니다. 모션 버스 라는 용어는 Wwise Motion Audio Device가 할당된 최상위 Audio Bus를 나타냅니다. 손쉽게 문제를 해결하고 모니터링하기 위해서는 프로젝트에서 단일 모션 버스 계층을 사용하는 것이 좋습니다. 그러면 모든 Sound SFX의 Output Bus를 모션 버스로 설정해 햅틱 피드백을 생성할 수 있습니다. 일반적으로 모션 버스를 사용하는 사운드 SFX 구성 요소는 Motion 소스도 사용합니다. 오디오와 모션을 동시에 가지려면, Sound SFX에 Output Bus나 Auxiliary Bus로서 최소한 한 개의 모션 버스와 Audio Bus가 있어야 합니다.
게임 단에서는 AkMotionSink
라는 별도의 라이브러리와 연결합니다. 이 라이브러리는 지원하는 플랫폼의 표준 컨트롤러를 제공합니다. 또한 SDK\include\AK\plugin
에 위치한 AkMotionSinkFactory.h 파일을 포함시켜야 합니다. 이 파일을 포함하면 플러그인이 자동으로 등록되기 때문에 매우 중요합니다.
참고: Unity와 Unreal에서는 플러그인 라이브러리가 자동으로 관리됩니다. 즉 AkMotionSink 를 직접 추가할 필요가 없습니다. |
지원하는 컨트롤러와 추가 요구사항에 관한 목록은 다음 표를 참고하세요.
Platform | Device | Device Channel Config and Layout | Additional Requirements |
Android | Android device with vibration support | Anonymous 1-channel | High-resolution vibration support for Android 8 and later |
iOS | iOS device with vibration support iOS-compatible Controllers (iOS 14.0 and later) | Anonymous 1-channel | CoreHaptics.framework GameController.framework iOS 13.0 or later |
tvOS | tvOS-compatible Controllers (tvOS 14.0 and later) | Anonymous 1-channel | CoreHaptics.framework GameController.framework |
Linux | Not supported. | ||
Mac | Mac-compatible Controllers (macOS 11.0 or later) | Anonymous 1-channel | CoreHaptics.framework GameController.framework macOS 10.15 or later |
OpenHarmony | OpenHarmony device with vibration support | Anonymous 1-channel | |
PlayStation 4 | DUALSHOCK 4 PlayStation 무브 | Anonymous 2-channel: 왼쪽 모터, 오른쪽 모터 | |
PlayStation 5 | DualSense VR 컨트롤러 | Stereo 2-channel: 왼쪽 진동, 오른쪽 진동 | |
Switch | 조이콘 | Anonymous 4-channel: 왼쪽 낮은 진동, 왼쪽 높은 진동, right low-freq vibration, right high-freq vibration | |
Windows | XInput-compatible Controllers | Anonymous 2-channel: Left motor, right motor | Xinput.lib |
Windows | GameInput-compatible Controllers | Anonymous 4-channel: Left motor, right motor, left Impulse Trigger, right Impulse Trigger | GameInput.dll installed in Windows. |
Windows | DualShock 4 and DualSense Controllers | Anonymous 2-channel and Stereo 2-channel | See the "Support for DualShock 4 and DualSense on Windows" section below (login with PS5 license required) |
Xbox One Xbox Series X | Xbox 컨트롤러 | Anonymous 4-channel: Left motor, right motor, left Impulse Trigger, right Impulse Trigger |
만약 애플리케이션이 모션을 하나 이상의 장치에 사용할 경우 각 장치에 대해 별도로 지정된 출력을 추가해줘야 합니다. 예를 들어, 4인 플레이어가 연결된 분할 화면 게임은 컨트롤러가 햅틱 피드백을 받기 위해 네 개의 서로 다른 출력이 필요합니다. 출력 장치를 추가하려면 Wwise API의 AK::SoundEngine::AddOutput
함수를 사용하고 AkOutputSettings
매개변수에 ShareSet 이름(Wwise 프로젝트에 정의된 이름)을 지정합니다. 추가로, 복수의 장치가 연결되기 때문에 장치 ID를 제공해줘야 합니다. 다음 표는 장치 ID에 대한 자세한 정보입니다.
플랫폼 | 장치 | 정보 |
Android | 진동을 지원하는 Android 장치 | 0을 사용합니다. |
iOS | 진동 지원 및 iOS 호환 컨트롤러가 있는 iOS 기기 | 기기를 진동시키려면 0을 사용합니다. 연결된 컨트롤러를 진동시키려면 먼저 GameController.framework API를 사용하여 원하는 GCController 인스턴스에 플레이어 인덱스를 할당합니다. 그런 다음 AK::SoundEngine::GetDeviceIDFromPlayerIndex 를 호출하여 해당 플레이어 인덱스의 DeviceID를 검색합니다. 상주 모드를 사용하려면 DeviceID에 AKMOTION_RESIDENT_MODE 를 추가하세요. 일반적으로 무음 모드에서 실행할 경우 수십 밀리초 동안 진동이 무시되지만, 상주 모드에서 실행하면 이러한 딜레이가 제거됩니다. 그러나 상주 모드로 실행하면 장치의 전력 소비가 다소 증가합니다. |
Linux | 지원되지 않음. | - |
Mac | Mac 호환 컨트롤러 | 먼저, GameController.framework API를 사용하여 원하는 GCController 인스턴스에 플레이어 인덱스를 할당합니다. 그런 다음 AK::SoundEngine::GetDeviceIDFromPlayerIndex 를 호출하여 해당 플레이어 인덱스의 DeviceID를 검색합니다. 상주 모드를 사용하려면 DeviceID에 AKMOTION_RESIDENT_MODE 를 추가하세요. 일반적으로 무음 모드에서 실행할 경우 수십 밀리초 동안 진동이 무시되지만, 상주 모드에서 실행하면 이러한 딜레이가 제거됩니다. 그러나 상주 모드로 실행하면 장치의 전력 소비가 다소 증가합니다. |
OpenHarmony | 진동을 지원하는 OpenHarmony 장치 | 0을 사용합니다. |
PlayStation 4 | DUALSHOCK 4와 PlayStation Move | scePadOpen나 scePadGetHandle에서 반환된 장치의 핸들을 사용합니다. |
PlayStation 5 | DualSense 및 VR 컨트롤러 | scePadOpen나 scePadGetHandle에 의해 반환되는 장치의 핸들을 사용합니다. PSVR2의 경우, 왼쪽과 오른쪽 VR 컨트롤러의 핸들 중 하나를 사용하여 단 하나의 출력 장치만 생성하면 두 VR 컨트롤러 모두에서 진동이 발생합니다. 장치 ID를 0으로 지정하면 시스템은 VR 컨트롤러가 아닌 무선 컨트롤러에 대해서만 초기화됩니다. 햅틱 피드백에 필요한 Advanced(고급) 진동 제어 모드는 PlayStation 5의 DualSense 및 VR Controller의 System Software에서 기본적으로 활성화되어 있습니다. 코드에서 scePadSetVibrationMode를 호출하는 경우, SCE_PAD_VIBRATION_MODE_COMPATIBLE의 진동 모드를 설정하는 등 Advanced 진동 제어 모드를 비활성화하는 동작을 사용하지 않도록 주의하세요. |
Switch | 조이콘 | 원하는 인덱스로 nn::hid::NpadId를 사용합니다. |
Windows | XInput-compatible Controllers | Use the player index between 0 to 3. |
Windows | GameInput-compatible Controllers | Retrieve the GameInputDeviceInfo for a gamepad, and call AK::GetAppLocalDeviceIdHash with the address of the GameInputDeviceInfo::deviceId as the parameter.Note that the Motion output is only initialized for devices with a non-zero value for GameInputDeviceInfo::supportedRumbleMotors. Devices that only use force feedback, such as some racing wheels and flight sticks, are not supported. |
Xbox One (XDK) | Xbox Controllers | Use the ID stored in a IGamepad object. |
Xbox One (GDK) Xbox Series X | Xbox 컨트롤러 | AK::SoundEngine::GetGameInputDeviceID 를 호출해 게임패드의 DeviceID를 구합니다. |
참고: Windows를 제외한 모든 플랫폼에서 장치 ID '0'은 모션을 지원하는 첫 번째 사용 가능한 장치를 대상으로 합니다. On Windows, a device ID of "0" is initialized as an XInput device. |
게임 컨트롤러는 물리적인 분리나 통신 문제로 연결이 끊어질 수 있다는 점에 유의하세요. 연결 해제는 불필요하게 리소스를 사용하는 것 외에는 사운드 엔진에 부정적인 영향을 미치지 않습니다. 장치가 오랫동안 연결이 끊어졌다고 생각되면 AK::SoundEngine::RemoveOutput
을 호출하고 해당 AddOutput()
함수 호출에서 반환된 AkOutputDeviceID
를 제공합니다.
모션 출력은 다른 Secondary Output(2차 출력)과 같으므로 동일한 제한 및 요구 사항이 적용됩니다. 게임을 로컬에서 제어하는 플레이어 한 명만 있는 1인 플레이어 게임을 만드는 경우, Listener(리스너)/Game Object(게임 오브젝트) 설정이 매우 간단합니다. 일반적인 경우, 새로운 모션 출력은 기본 오디오 출력과 동일한 기본 Listener를 재사용합니다. 즉, 1인 플레이어 설정에서는 Listener를 관리할 필요가 거의 없습니다.
멀티플레이어 게임의 경우 모션 출력마다 하나씩 Listener/Game Object를 생성해야 합니다. 이는 각 플레이어가 게임에서 처한 상황에 따라 원하는 햅틱 피드백을 얻을 수 있도록 하기 위해서입니다. 장치와 연관된 Listener는 반드시 AK::SoundEngine::AddOutput()
에 의해 해당 출력이 초기화되는 동시에 함께 초기화되어야 합니다. 지정된 Listener는 사운드나 모션을 전송하는 추가 레이어를 제공합니다. 해당 플레이어의 Listener와 고유하게 연결된 Game Object에 Event를 재생하면 특정 플레이어를 지정할 수 있습니다. 이러한 연결을 설정하려면 AK::SoundEngine::SetListeners
를 호출합니다. 하나의 게임 오브젝트에 여러 리스너를 연결할 수도 있는데, 이 경우 모든 리스너에 '전송(broadcast)' 효과가 생깁니다. Listener와 게임 오브젝트에 대한 더 많은 정보는 리스너 통합하기 를 확인하세요.
참고: Emitter에 Listener가 모션 출력으로 설정되어있다 하더라도 사운드는 모션 버스 계층 구조로 라우팅되어야 합니다. |
다음 예제에서는 모션을 사용하기 위해 애플리케이션을 설정하는 방법을 보여줍니다. SDK 예제에 포함된 Integration Demo (DemoMotion.cpp)에서 Demo Motion 예제를 참고해도 됩니다. 여기에는 지원하는 모든 플랫폼에서 대해 작동하는 예제가 나와있습니다.
먼저, 다른 플러그인과 마찬가지로 해당 파일을 포함시키고 라이브러리를 연결해야 합니다 (Wwise 네이티브 개발에만 해당, Unity에는 필요 없음).
다음으로, Wwise 프로젝트의 Wwise Motion Audio Device ShareSet 이름(여기서는 'Wwise_Motion')으로 다른 출력을 추가합니다 . 출력 ID는 0으로 설정되어 첫 번째로 연결된 게임 컨트롤러가 사용되도록 합니다.
다음으로, Event를 재생합니다. Wwise 프로젝트에서 'Play_Explosion' Event는 Sound SFX에 연결되고, Sound SFX는 Audio Device로서 'Wwise_Motion' ShareSet이 할당된 버스로 라우팅됩니다.
이 섹션에서는 네트워크 멀티플레이어 게임이 아니라, 하나의 콘솔에서 여러 플레이어의 동작을 설정하는 방법을 설명합니다. 멀티플레이어의 경우, 게임 월드에서 플레이어의 관점을 표현하기 위해 동작이나 플레이어별 출력의 조합이 달라야 합니다. 그러므로 플레이어는 자신만의 Listener가 필요합니다.
각 플레이어에 대한 출력을 추가합니다. 하나의 Audio Device ShareSet를 여러 번 사용할 수 있으므로 여러 개의 Audio Device ShareSet를 만들 필요는 없습니다. 모든 컨트롤러에 대한 실제 장치 ID를 제공해야 합니다. 이 예제는 Windows의 Xbox 컨트롤러를 사용합니다. 특정 플랫폼에 대한 장치 ID를 구하는 방법은 게임 설정 표를 참고하세요.
다음으로, Event를 재생합니다. Wwise 프로젝트에서 'Play_GunFire' Event는 Sound SFX에 연결되고, Sound SFX는 Audio Device ShareSet로서 'Wwise_Motion'이 할당된 버스로 라우팅됩니다.
여러 기기에 영향을 미치는 Event를 재생하려면 새로운 Game Object를 설정하고 모든 플레이어 전용 Listener가 해당 Event를 수신하도록 해야 합니다.
멀티플레이어 설정의 예는 IntegrationDemo 예제의 DemoMotion
클래스를 참조하세요.
특정 장치가 하나의 장치로 동작을 수신하려면 다음이 필요합니다.
AkMotionSink
라이브러리에 연결합니다. AkMotionSinkFactory.h
를 포함시키고 AkMotionSink
라이브러리와 연결합니다. 참고: Unity와 Unreal에서는 플러그인 라이브러리가 자동으로 관리됩니다. 이 단계는 필요하지 않습니다. |
AK::SoundEngine::RegisterGameObj를
사용하여 모션 Event를 호출하고 수신하는 Game Object를 생성합니다.Ak::SoundEngine::AddOutput
을 호출합니다. 멀티플레이어의 경우 각각에 대한 Listener 오브젝트를 제공합니다.Wwise 프로젝트에 Motion을 추가하려면,
문제를 해결하려면 애플리케이션을 프로파일링하는 것이 좋습니다. Wwise Authoring에서 프로파일링에 설명된 대로 애플리케이션을 프로파일링할 수 있습니다. 몇몇 도구는 문제가 있는 소스코드를 이해하는 데 도움이 될 수 있습니다. Capture Log 보기에 오류 코드가 빨간색으로 나열됩니다. Graph 뷰는 사운드 엔진 파이프라인을 시각적으로 표현해 출력합니다. 모션 장치는 파이프라인의 끝에 나타납니다. 모션 장치가 표시되지 않으면 지정한 장치를 사운드 엔진이 찾을 수 없습니다. 마지막으로, Emitter/Listener 탭에 모든 Emitter-Listener 조합이 표시됩니다. Motion Effect가 작동하지 않는 경우, Emitter가 모션 장치에 지정된 Listener와 연결되지 않았을 수 있습니다.
Motion 효과를 트리거 했지만 작동하지 않는다면, 다음 사항을 확인하세요.
AkMotionSinkFactory.h
를 포함시키고 AkMotionSink
라이브러리에 연결했는지 확인하세요.AddOutput
을 호출하면 Capture Log에 오류가 표시됩니다.RegisterGameObj
, SetListeners
, AddOutput
의 호출을 확인하세요.Android 기기의 경우 애플리케이션의 AndroidManifest.xml 파일에 권한을 추가하세요.
프로젝트를 등록하세요. 아무런 조건이나 의무 사항 없이 빠른 시작을 도와드리겠습니다.
Wwise를 시작해 보세요