요약: 이 페이지는 Nice Vibrations가 무엇인지 및 그에 대한 정보를 찾는 방법을 설명합니다.
테이블 내용
- 햅틱 샘플 - 데모 - Nice Vibrations를 게임에 추가하기
- 어떤 종류의 햅틱 기능을 지원하나요? - 내 장치가 모든 햅틱 기능을 갖추지 못하면 어떻게 되나요? - 진동을 어떻게 트리거하나요? - 햅틱 프리셋 재생 - 햅틱 클립 재생 - 햅틱 프리셋으로 대체
- 실시간 변조 - 햅틱 재생이 완료되었는지 알기 - 글로벌 제어 - 햅틱 컴포넌트 - 햅틱 클립에 변형 추가
- 안드로이드 - 게임패드
- AdMob을 사용 중이며 광고를 닫은 후 iOS에서 소리가 나지 않습니다 - 클라우드 빌드로 빌드하는 데 문제가 있습니다 |
Nice Vibrations란 무엇인가요?
Nice Vibrations는 iOS, 안드로이드, PC 및 콘솔 게임에 고해상도(HD) 햅틱 피드백을 추가하기 위한 간단하면서도 강력한 솔루션입니다. Lofelt와 More Mountains의 파트너십을 통해 개발되었으며, Lofelt Studio SDK를 기반으로 구현되었습니다. Nice Vibrations는 iOS 및 안드로이드 장치와 게임패드를 동시에 쉽게 타겟팅할 수 있는 범용 인터페이스를 제공합니다.
이 솔루션은 검증되고 실전 테스트를 거친 것으로, 작업을 확실히 수행합니다.
Feel 내에 선물로 포함되어 있으며, 모든 햅틱 및 럼블 요구를 충족할 수 있습니다.
지원 플랫폼
Nice Vibrations는 각 플랫폼의 햅틱 API를 통합된 방식으로 최적의 성능을 발휘할 수 있게 해줍니다. 물론, 더 나은 햅틱을 제공하도록 설계된 하드웨어에서는 더 높은 품질의 햅틱을 경험할 수 있습니다. 일반적으로 iOS 폰은 안드로이드 폰보다 성능이 훨씬 뛰어나고 더 많은 제어를 제공하므로, 사용자들은 아이폰에서 더 만족스러운 경험을 하게 됩니다. 게임패드의 경우, 진동을 미세 조정할 수 있는 정도가 크게 다릅니다.
모바일 기기: 아이폰과 안드로이드 폰이 지원됩니다.
콘솔: Nice Vibrations는 PS4, Xbox 및 스위치 컨트롤러를 각 콘솔에 연결했을 때 완전히 지원합니다. 프로젝트에 콘솔 전용 입력 패키지를 추가로 설치해야 할 수도 있습니다. 자세한 내용은 게임패드 요구 사항을 확인하세요.
PC: PS4 및 Xbox 컨트롤러가 지원됩니다.
Mac: 현재는 PS4 컨트롤러만 지원됩니다.
이 플러그인은 Unity 2019.4.16 LTS 버전 및 최신 안정 버전에서 작동합니다.
지원되는 빌드 환경: 안드로이드 기기, PC 또는 콘솔을 타겟팅하는 경우 어디서나 빌드할 수 있습니다. iOS용으로 빌드하려면 Mac에서 빌드해야 합니다. 대부분의 상황에서는 Windows에서 빌드할 수 있지만, 상황에 따라 더 복잡할 수 있습니다. 현재로서는 Unity가 네이티브 API와의 연결 방식을 변경했기 때문에 Unity Cloud Build에서 빌드하는 것은 거의 불가능합니다.
애셋의 내용물
애셋에는 무엇이 포함되어 있나요?
Unity 2019.4.16f 또는 최신 버전을 실행 중이라면, 애셋을 가져온 후 다섯 개의 폴더를 볼 수 있습니다.
만약 다섯 개의 폴더 구조를 보지 못한다면, 아마도 이전 버전의 Nice Vibrations를 사용 중일 것입니다. 이 경우, Unity를 최신 버전으로 업데이트해야 합니다(2019.2.9 이상에서는 v2.0, 2019.3 이상에서는 v3.0, 2019.4.16f 이상에서는 v4.0 사용 가능).
애셋의 내용을 삭제하지 않는 것을 권장합니다. 하지만 어떤 이유로 삭제해야 한다면, 각 폴더에 무엇이 들어있는지 아래를 참조하세요:
- Scripts: 햅틱 재생을 트리거하는 데 필요한 모든 스크립트가 포함되어 있습니다. 이 폴더의 내용을 삭제하지 않는 것을 강력히 권장합니다.
- HapticSamples: Lofelt에서 디자인한 80개 이상의 로열티 프리 햅틱 클립이 포함되어 있습니다. 이 클립들은 다양한 사용 사례를 다루며, 몇 초 만에 시작할 수 있습니다.
- Demo: 애셋의 잠재력을 보여주는 데모 씬이 포함되어 있습니다. Demo 폴더의 "Common" 폴더에는 UI 및 기타 공통 기능을 처리하는 대부분의 데모에 사용되는 스크립트가 있습니다. 데모 폴더가 필요하지 않다고 느낀다면 전체 데모 폴더를 삭제할 수 있으며, 이는 완전히 선택 사항입니다.
- Plug-ins: iOS 및 안드로이드를 위한 Lofelt Studio SDK 라이브러리로, Nice Vibrations의 핵심 기능을 제공합니다.
- OlderVersions: 최신 버전으로 전환하는 것이 프로젝트에 맞지 않을 경우를 대비해 이전 버전의 Nice Vibrations가 포함되어 있습니다. 이 폴더에는 .unitypackage 파일이 포함되어 있으며, 이를 프로젝트에 간단히 풀어 넣을 수 있습니다. 이 작업을 수행하기로 결정했다면 최신 버전을 먼저 제거해야 합니다. 현재로서는 AHAP 지원을 원할 경우에도 이 작업이 필요합니다.
햅틱 샘플
80개 이상의 로열티 프리 햅틱 샘플 중에서 선택할 수 있으며, 애플리케이션 UX, 사운드 효과, 음악 등 다양한 사용 사례를 다룹니다. 이러한 샘플은 게임을 더 빠르게 몰입감 있게 만드는 데 도움이 됩니다.
샘플에는 Studio로 햅틱 클립을 만드는 데 사용된 오디오 파일도 포함되어 있습니다.
데모
Nice Vibrations 4는 플러그인이 제공하는 다양한 햅틱 피드백 옵션을 보여주는 7개의 데모를 제공합니다. 또한 이러한 데모의 전체 코드를 제공하여 애셋의 메서드를 실제로 볼 수 있습니다:
- Wobble: 작은 워블 패드가 터치될 때 GameObject 컴포넌트 HapticSource를 트리거합니다. 각 패드는 다른 피치의 사운드와 햅틱을 재생합니다.
- Ball: 튀어 오르는 공이 낙하 높이에 따라 다양한 진폭과 주파수의 강조 햅틱을 트리거합니다.
- Continuous: 이 데모는 선택한 진폭, 주파수 및 지속 시간으로 연속적인 햅틱을 트리거할 수 있게 합니다. 연속적인 햅틱 효과가 재생되는 동안 진폭과 주파수를 변경할 수 있습니다.
- HapticClips: 9가지의 사전에 디자인된 햅틱 클립을 탐색할 수 있습니다. 이 클립들은 Haptics Studio를 사용하여 관련 사운드에 맞추어 설계되었습니다.
- Emphasis: 짧고 제어된 햅틱 피드백을 제공하는 강조 햅틱을 실험할 수 있습니다.
- Car: 노브를 좌우로 돌리면 자동차의 엔진이 가속되는 것을 느낄 수 있습니다. 연료가 떨어지지 않도록 주의하세요!
- Base presets: 기본 프리셋 데모를 사용하여 9가지의 다른 기본 햅틱 패턴을 경험할 수 있습니다(현재 Nice Vibrations 3.9에서만 사용 가능).
Nice Vibrations를 게임에 추가하기
이것을 게임에 어떻게 추가하나요?
Nice Vibrations를 사용하려면, 애셋 패키지를 가져와 프로젝트에 NiceVibrations 폴더를 추가하기만 하면 됩니다. 그게 전부입니다.
코드 전용 API를 사용하려면, 씬에 아무 것도 추가하거나 컴포넌트를 추가할 필요가 없습니다. 스크립트 어디에서나 Nice Vibrations의 메서드를 호출할 수 있습니다.
진동을 호출하는 스크립트 상단에 Nice Vibrations 네임스페이스를 추가해야 한다는 점을 유의하세요. 대부분의 IDE는 이를 자동으로 추가해 줍니다.
using Lofelt.NiceVibrations;
MonoBehaviours를 사용하고자 한다면, 코드를 작성하지 않고도 씬의 GameObject에 컴포넌트를 추가하여 햅틱을 트리거할 수 있습니다. 이는 오디오를 통합하는 방식과 유사합니다. 자세한 내용은 아래의 햅틱 컴포넌트 섹션을 참조하세요.
코드 전용 API와 MonoBehaviour API에 대한 자세한 내용은 API 문서를 참조하세요.
내 장치가 지원되는지 어떻게 알 수 있나요?
모든 기기가 햅틱 피드백을 지원하는 것은 아니며, 모든 기기가 동일하게 햅틱을 지원하는 것도 아닙니다.
Nice Vibrations로 햅틱을 재생하기 위한 요구 사항은 다음 기준에 따라 다릅니다:
기기에 액추에이터가 있어야 합니다, 기기 플랫폼이 필요한 네이티브 햅틱 API를 지원해야 합니다. 기기가 햅틱을 재생하기 위한 최소 요구 사항을 확인할 수 있습니다.
Nice Vibrations로 햅틱을 재생하기 위한 기기의 최소 요구 사항은 다음과 같습니다:
- iPhone: iPhone 7 이상 / iOS 11 이상
- Android: Android API 레벨 17 (Jelly Bean) / 액추에이터가 있어야 함
- Gamepad: 새로운 Unity Input System을 사용하여 Rumble을 지원하는 게임패드
어떤 종류의 햅틱 기능을 지원하나요?
기본 햅틱 기능
기본 기능으로는 미리 정의된 햅틱을 트리거할 수 있습니다. 안드로이드와 같은 일부 플랫폼에서는 진동의 강도가 아닌 일부 진동의 지속 시간을 제어할 수도 있습니다. 기기가 이 기능만 있는 경우, Haptics Studio로 작성된 햅틱 클립을 재생할 수 없습니다.
기기가 기본 햅틱 기능을 가지고 있는지 확인하려면 이 속성을 확인하세요:
bool hapticsSupported = DeviceCapabilities.isVersionSupported;
이 값이 false인 경우, 기기가 Nice Vibrations를 사용한 햅틱 재생을 지원하지 않는다는 의미입니다.
고급 햅틱 기능
고급 기능은 진동 강도를 제어하고 햅틱 클립을 재생할 수 있게 합니다.
기기가 고급 햅틱 기능을 가지고 있는지 확인하려면 다음 조건을 충족하는지 확인해야 합니다:
if (DeviceCapabilities.meetsAdvancedRequirements == true)
고급 햅틱 기능을 가진 기기에 대한 정보는 기술 요구 사항 섹션을 확인하세요.
실시간 햅틱 기능
이 기능은 고급 기능을 가지고 있는지 여부에 따라 달라집니다. 실시간으로 진폭 또는 주파수를 제어할 수 있으며, 햅틱 재생을 중지할 필요가 없습니다.
기기가 진폭 또는 주파수의 실시간 제어(변조)를 허용하는지 확인하려면 다음을 확인하세요:
bool amplitudeModulationSupported = DeviceCapabilities.hasAmplitudeModulation;
bool frequencyModulationSupported = DeviceCapabilities.hasFrequencyModulation;
내 장치가 모든 햅틱 기능을 갖추지 못하면 어떻게 되나요?
이상적으로는 모든 기기가 고급 및 실시간 제어 기능을 갖추기를 원하지만, 안타깝게도 게임패드와 안드로이드의 경우에는 그렇지 않습니다.
Nice Vibrations는 특정 플랫폼에서 지원되지 않는 기능에 대해서는 아무 것도 하지 않거나, 구형 기기를 위한 대체 지원을 활성화할 수 있습니다. 코드에 가드 체크를 추가할 필요는 없습니다.
예를 들어, HapticController.clipFrequencyShift는 현재 안드로이드 기기에서는 아무런 영향을 미치지 않지만, 기기가 이를 지원하는지 확인하는 가드 체크를 추가할 필요가 없습니다. 오류, 경고 또는 예외가 발생하지 않으며, 안드로이드에서는 단순히 아무 일도 일어나지 않습니다.
또 다른 예로, DeviceCapabilities.meetsAdvancedRequirements가 false인 경우가 있습니다. 이는 기기가 Haptics Studio로 작성된 햅틱 클립을 재생할 수 없음을 의미합니다. 하지만 다음 섹션에서 볼 수 있듯이, 햅틱 프리셋으로 대체할 수 있습니다.
그러나 런타임에 일부 기능이 없는 경우 어떻게 할지 결정할 수도 있습니다. 이를 확인하려면 DeviceCapabilities 클래스를 사용하면 됩니다. 자세한 내용은 API 문서에서 확인할 수 있습니다.
진동을 어떻게 트리거하나요?
Nice Vibrations는 다양한 종류의 진동을 트리거할 수 있는 많은 메서드를 제공합니다. 우선 강조 햅틱을 트리거하는 것부터 시작할 수 있습니다. 강조 햅틱은 짧지만 강렬한 진동으로, iOS 및 안드로이드 기기에서 모두 재생할 수 있습니다. 다음과 같이 어디서든 호출할 수 있습니다:
HapticPatterns.PlayEmphasis(1.0f, 0.0f);
매개변수는 진동의 진폭과 주파수를 나타냅니다. 진폭은 진동의 강도를 의미하고, 주파수는 햅틱 효과의 피치 또는 톤을 나타냅니다. 값이 증가할수록 주파수는 높아집니다. 이러한 값을 조정하여 경험을 더 잘 파악할 수 있습니다.
지정된 시간 동안 일정한 진동을 트리거하는 또 다른 간단한 방법은 다음과 같습니다:
HapticPatterns.PlayConstant(1.0f, 0.0f, 1.0f);
이는 진폭 1.0과 주파수 0.0으로 1초 동안 일정한 진동을 재생합니다. 물론, 더 오랜 시간 동안 재생할 수도 있습니다.
아마도 눈치채셨겠지만, 위의 두 메서드에 사용된 정적 클래스는 HapticPatterns라고 합니다. 이 클래스는 플러그인에 내장된 미리 정의된 간단한 진동 패턴을 재생할 수 있게 하며, 이를 통해 쉽게 게임에 햅틱을 추가할 수 있습니다.
햅틱 프리셋 재생
HapticPatterns 클래스를 사용하면, 세부적인 햅틱 클립 없이 간단하고 짧은 햅틱 패턴이 필요할 경우 햅틱 프리셋을 재생할 수 있습니다.
이 클래스에는 씬에 미묘한 햅틱을 쉽게 추가할 수 있는 9개의 미리 정의된 햅틱 패턴이 포함되어 있습니다.
진동 모터가 있는 안드로이드 기기의 Unity 지원 버전과 iPhone 7 / iOS 11 이상 버전의 iOS 기기에서도 이를 트리거할 수 있습니다.
예를 들어, 단일 코드 줄로 "Warning" 햅틱 프리셋을 트리거할 수 있습니다:
HapticPatterns.PlayPreset(HapticPatterns.PresetType.Warning)
햅틱 클립 재생
HapticPatterns를 재생하는 것 외에도 HapticClip을 재생할 수도 있습니다. 햅틱 클립은 HD 품질의, 기기 비종속적(haptic data)을 포함하고 있으며, Nice Vibrations는 이를 사용하여 재생 기기에서 최적의 햅틱 효과를 생성합니다.
Unity 애플리케이션에서 사용하고자 하는 모든 햅틱 클립은 먼저 프로젝트에 추가해야 합니다. 구체적으로, 햅틱 클립(확장자가 .haptic로 끝나는 파일)은 프로젝트의 Assets 폴더(또는 원하는 하위 폴더)에 추가해야 합니다. Finder/Explorer에서 이 폴더로 직접 햅틱 클립을 드래그하거나, Unity Project Explorer에 드래그할 수 있습니다.
HapticSamples 폴더에 있는 햅틱 클립을 즉시 사용할 수 있습니다. 또는 오디오에서 직접 만들고 싶다면 Haptics Studio를 사용할 수 있습니다.
using UnityEngine;
using Lofelt.NiceVibrations;
public class PlayerCharacter : MonoBehaviour
{
// Inspector 창에서 점프 햅틱을 선택할 수 있는 GUI 요소를 표시합니다
public HapticClip jumpHaptic;
public void Jump()
{
// jumpHaptic을 재생합니다
HapticController.Play(jumpHaptic);
}
}
위의 스크립트와 유사한 코드를 사용하는 경우, 다음으로 Unity Editor로 이동하여 HapticSamples 폴더에서 HapticClip을 선택한 후, 이를 스크립트의 Inspector 속성에 드래그 앤 드롭해야 합니다. 이 경우 "Jump Haptic" 속성에 해당됩니다.
HapticPatterns.PlayConstant(..) 또는 HapticController.Play(..)가 호출된 후, 햅틱이 끝나기 전에 중지하고 싶다면, 다음을 호출하기만 하면 됩니다:
HapticController.Stop()
그게 전부입니다.
햅틱 프리셋으로 대체
기기가 햅틱 클립을 재생할 수 없는 경우(DeviceCapabilities.meetsAdvancedRequirement가 false를 반환하는 경우), 대신 다음 예제와 같이 대체 햅틱 프리셋을 트리거할 수 있습니다:
HapticController.fallbackPreset = HapticPatterns.PresetType.Selection;
HapticController.Play(jumpClip);
이 예제는 jumpClip 햅틱 클립 또는 대체 햅틱 프리셋 HapticPatterns.PresetType.Selection을 재생합니다. 이는 HapticController.Play(HapticClip clip)에 의해 자동으로 수행되며, DeviceCapabilities.meetsAdvancedRequirement를 확인하고 햅틱 클립이나 햅틱 프리셋을 재생할지 결정합니다.
햅틱 제어
Nice Vibrations를 사용하여 게임에 햅틱을 추가하는 것 외에도 할 수 있는 일이 많습니다. 예를 들어, 햅틱 클립에서 특정 시간으로 이동하거나, 원하는 때에 햅틱의 진폭과 주파수를 제어하거나, GameObject에 햅틱 컴포넌트를 추가하는 등의 작업이 가능합니다.
재생 제어
Nice Vibrations를 사용하면 햅틱 클립 내에서 특정 시간으로 앞뒤로 이동할 수 있습니다:
HapticController.Load(jumpHaptic);
HapticController.Seek(0.2);
HapticController.Play();
Seek(float time)은 호출되기 전에 햅틱 클립이 로드되어 있어야 하며, 재생 후에만 적용됩니다. 이 경우, 햅틱 클립에서 0.2초로 이동합니다.
또한 하나의 햅틱 클립만으로도 다양한 종류의 햅틱 효과를 얻기 위해 클립을 반복 재생할 수도 있습니다.
HapticController.Load(loopHaptic);
HapticController.Loop(true);
HapticController.Play();
이렇게 하면 haptic 클립 loopHaptic이 HapticController.Stop()이 호출될 때까지 반복 재생됩니다.
실시간 변조
Nice Vibrations를 사용하면 런타임에 햅틱을 제어할 수 있습니다. 구체적으로, 다음과 같이 진폭과 주파수 분기점을 변경하여 햅틱 클립을 조절할 수 있습니다:
// 모든 진폭 엔벨로프 분기점을 0.7로 곱합니다
HapticController.clipLevel = 0.7;
// 모든 주파수 엔벨로프 분기점을 0.2로 이동시킵니다
HapticController.clipFrequencyShift = 0.2;
clipLevel은 오디오의 "볼륨 조절"과 동일합니다. 이 경우 1.0 이하의 값으로 감쇠시키고, 1.0 이상의 값으로는 이득을 추가할 수 있습니다. 1.0 이상의 값은 1.0으로 클리핑됩니다.
clipFrequencyShift를 사용하면 -1.0과 1.0 사이의 원하는 값을 추가하여 햅틱 클립의 "피치" 또는 "톤"을 설정할 수 있으며, 이 값도 1.0으로 클리핑됩니다.
이 기능을 어떻게 사용할 수 있는지 보려면 Demo/NiceVibrationsDemo.unity 씬의 Car 데모 탭을 확인하세요. CarDemoManager.cs 스크립트의 HandlePower() 메서드는 노브를 돌려 자동차 속도를 증가/감소시키는 것이 사용자 상호 작용에 따라 실시간으로 변경되는 햅틱을 생성하는 방법을 보여줍니다.
먼저, Knob 클래스에서 제공한 값으로 HapticPatterns.PlayConstant(..)이 호출됩니다. 이를 통해 일정한 진동을 트리거하는 초기 값이 설정됩니다.
protected virtual void HandlePower()
{
_knobValue = Knob.Active ? Knob.Value : 0f;
if (!_carStarted)
{
...
HapticPatterns.PlayConstant(_knobValue, _knobValue, MaximumPowerDuration);
CarEngineAudioSource.Play();
...
}
...
}
사용자가 노브와 상호작용할 때, 일정한 진동의 진폭과 주파수를 사용자의 상호작용에 맞게 업데이트해야 합니다. HapticController.SetAmplitudeMultiplication(float factor) 및 HapticController.ShiftFrequency(float shift)를 사용하여 진폭과 주파수의 실시간 변조를 생성할 수 있습니다.
이를 위해 HapticController.clipLevel 및 HapticController.clipShiftFrequency를 사용하여 진폭과 주파수의 실시간 변조를 생성합니다.
clipLevel은 햅틱의 진폭을 증가 또는 감소시키고, clipFrequencyShift는 진동의 피치를 이동시킵니다. 이러한 조합으로 가속 페달을 밟을 때와 유사한 효과를 얻을 수 있습니다. 페달을 밟으면 모터 소음과 진동이 강도와 피치 모두에서 증가하는 것을 느낄 수 있습니다.
if (_knobValue > MinimumKnobValue)
{
Power -= Time.deltaTime;
Power = Mathf.Clamp(Power, 0f, MaximumPowerDuration);
HapticController.clipLevel = _knobValue;
HapticController.clipFrequencyShift = _knobValue;
...
}
대안으로, HapticPatterns 대신 HapticClip을 사용할 수 있습니다. Haptics Studio를 사용하여 자동차 소리를 이용해 자동차 엔진 햅틱 클립을 설계할 수 있습니다. 이 경우, 다음을 사용하지 않게 됩니다:
HapticPatterns.PlayConstant(_knobValue, _knobValue,
MaximumPowerDuration);
CarEngineAudioSource.Play();
대신, 다음으로 재생을 초기화하게 됩니다:
HapticController.Play(carEngineHaptic); // carEngineHaptic은 HapticClip carEngineHaptic으로 정의됩니다
HapticController.clipLevel = _knobValue;
HapticController.clipFrequencyShift = _knobValue;
CarEngineAudioSource.Play();
노브 상호작용을 기반으로 한 진폭과 주파수의 실시간 변조를 위한 코드는 동일하게 유지됩니다.
햅틱 재생이 완료되었는지 알기
Nice Vibrations를 사용하면 햅틱 효과가 재생이 완료될 때 콜백을 받을 수 있습니다. 이러한 콜백을 생성하려면, 클래스 중 하나에 다음 코드를 작성하면 됩니다:
protected void OnHapticsStopped()
{
// 햅틱이 중지되었을 때 수행할 작업 - 일반적으로 재생이 완료되었기 때문
}
protected virtual void OnEnable()
{
HapticController.PlaybackStopped += OnHapticsStopped;
}
protected virtual void OnDisable()
{
HapticController.PlaybackStopped -= OnHapticsStopped;
}
이것을 연속 데모 탭에서 실제로 확인할 수 있습니다.
글로벌 제어
Nice Vibrations는 글로벌 출력 레벨 및 햅틱 활성화와 같은 글로벌 제어 기능을 제공합니다. 햅틱 효과는 놀랍지만 때로는 이를 끄거나 레벨을 낮추고 싶을 때가 있습니다. 햅틱을 켜고 끄려면 다음을 호출할 수 있습니다:
// 모든 햅틱을 끕니다
HapticController.hapticsEnabled = false;
// 모든 햅틱을 켭니다
HapticController.hapticsEnabled = true;
그리고 햅틱의 "메인 볼륨"과 유사하게 글로벌 출력 레벨을 조정하려면 다음을 호출할 수 있습니다:
// 진동 강도를 0.5로 조정합니다
HapticController.outputLevel = 0.5;
햅틱 컴포넌트
지금까지 Nice Vibrations 4의 코드 전용 API를 다뤘습니다. 또한 코드 작성 없이 또는 스크립트에 아주 적은 코드만 작성하여 햅틱 클립을 재생하기 위해 컴포넌트를 씬에 추가할 수도 있습니다.
Unity에서 오디오 시스템은 오디오 에셋을 다양한 GameObject에 할당하여 작동합니다. 최종 오디오 믹스는 플레이어나 카메라 주위의 GameObject 위치에 따라 결정됩니다. 카메라에는 Audio Listener 컴포넌트가 장착되고, 플레이어에는 Audio Source 컴포넌트가 있습니다.
Nice Vibrations 컴포넌트는 이와 유사한 원리로 작동합니다. HapticSource를 다양한 GameObject에 할당할 수 있으며, 이벤트 발생 시 또는 스크립트를 통해 재생을 트리거할 수 있습니다.
Haptic Receiver
첫 번째로 GameObject에 추가해야 할 컴포넌트는 HapticReceiver입니다. 이 컴포넌트는 전체 애플리케이션 동안 하나의 GameObject에만 추가해야 합니다. 대부분의 경우, AudioListener를 추가하는 것과 유사하게 MainCamera GameObject에 이를 추가해야 합니다. 프로젝트에 하나의 HapticReceiver 컴포넌트만 있는지 확인하세요.
이것이 어떻게 작동하는지 데모 씬에서 확인할 수 있습니다. 데모 씬의 오른쪽 하단에 MainCamera에 HapticReceiver가 사용되고 있습니다.
HapticReceiver를 통해 글로벌 출력 레벨을 설정하거나 햅틱을 켜거나 끌 수 있습니다.
아래는 데모 씬의 HapticSwitch와 유사하게, 코드를 작성하지 않고 HapticReceiver 속성을 사용하는 예입니다.
Haptic Source
HapticSource 컴포넌트는 AudioSource와 유사합니다. HapticSource는 HapticClip을 재생하는 역할을 담당합니다.
HapticSource에서는 루프, 우선 재생, 진폭 곱셈 및 주파수 이동과 같은 다양한 속성을 설정할 수 있습니다. HapticSource는 각 HapticClip을 재생하기 전에 이러한 속성을 지정해야 하는 HapticController보다 더 큰 유연성을 제공합니다.
GameObject에서 코드를 사용하지 않고도 지정된 HapticSource와 연관된 이벤트를 트리거하도록 결정할 수 있습니다.
하지만 아래의 Wobble 데모 예제와 같이 스크립트를 작성하여 사용할 수도 있습니다.
...
public virtual void OnPointerExit(PointerEventData data)
{
...
SpringAudioSource.Play();
SpringHapticSource.Play();
}
...
public virtual void SetPitch(float newPitch)
{
SpringAudioSource.pitch = newPitch;
SpringHapticSource.frequencyShift = NiceVibrationsDemoHelpers.Remap(newPitch, 0.3f, 1f, -1.0f, 1.0f);
}
이 경우, AudioSource가 트리거되면 HapticSource도 동일하게 트리거됩니다. 이는 오디오와 햅틱 간의 동기화를 시도하는 것입니다. Wobble 데모에서 각 버튼이 눌리면 오디오와 햅틱 모두에 대해 새로운 주파수 이동이 설정됩니다.
원한다면 HapticSource에 대한 속성을 코드에서 더 설정할 수도 있습니다:
// 햅틱 클립 재생을 루프로 설정
SpringHapticSource.loop = true;
// 햅틱 클립의 진폭 수준 설정, 예: 진동 "강도"
SpringHapticSource.level = 1.1;
// HapticSource의 재생 우선순위 설정;
// 가장 높은 우선순위는 0에 해당하며, 가장 낮은 우선순위는 255에 해당
SpringHapticSource.priority = 0;
여러 HapticSource 컴포넌트를 다룰 때 우선순위를 설정하는 것이 중요합니다. Nice Vibrations는 한 번에 하나의 HapticClip만 재생할 수 있습니다. 플레이어의 발소리와 관련된 HapticSource는 폭발과 관련된 HapticSource보다 낮은 우선순위를 가질 수 있습니다.
// 가장 낮은 우선순위
stepsHapticSource.priority = 255;
// 가장 높은 우선순위
explosionHapticSource.priority = 0;
만약 우선순위가 동일하다면, stepsHapticSource가 explosionHapticSource의 재생을 중단시킬 수 있습니다.
이 모든 예제는 코드로 작성되었지만, Unity Editor를 사용하여 동일한 작업을 수행할 수도 있습니다. 이는 Unity를 사용하는 방식에 따라 다릅니다.
햅틱 클립에 변형 추가
반복 피로를 줄이고 햅틱을 더욱 흥미롭게 만들기 위해, 실시간 진폭 또는 주파수 변조를 사용하여 햅틱 클립에 변화를 줄 수 있습니다.
예를 들어, 반복적인 발소리를 매번 약간 다르게 느껴지게 할 수 있습니다. 또는 플레이어와의 거리 기반으로 먼 폭발을 덜 강렬하게 느끼게 할 수 있습니다.
// 발소리 변동
footstepHapticSource.frequencyShift = Random.Range(0.0f, 0.4f);
footstepHapticSource.Play();
플랫폼 고려 사항
Nice Vibrations 4는 햅틱을 재생할 수 있는 범용 인터페이스를 제공하지만, 플랫폼마다 일부 기능 및 요구 사항에 차이가 있습니다.
iOS
iPhone에서는 기본 햅틱 기능을 위해 iPhone 7 또는 최신 모델과 iOS 11 또는 최신 버전이 필요합니다. 고급 기능을 위해서는 iPhone 8 또는 최신 모델과 iOS 13 또는 최신 버전이 필요합니다. 기본 기능은 강조와 프리셋만 재생할 수 있습니다. 일반적으로 iPhone이 고급 햅틱 기능을 갖추고 있는 경우에는 제한이 없습니다. 그러나 기기가 기본 햅틱 기능만 있는 경우, HapticPatterns.PlayConstant() 메서드는 대체 햅틱 프리셋이 제공될 때만 작동합니다.
안드로이드
안드로이드에서는 기본 햅틱 기능을 위해 Android API 레벨 17과 액추에이터가 필요합니다. 고급 기능을 위해서는 API 레벨 26과 진폭 제어가 가능한 액추에이터가 필요합니다.
현재 안드로이드는 iOS에 비해 몇 가지 재생 제한이 있습니다:
HapticController.SetFrequencyShift(), HapticSource.frequencyShift 및 주파수 엔벨로프가 있는 HapticClip은 안드로이드 폰에서 아무런 작동을 하지 않습니다. 현재 안드로이드 API는 전화기의 액추에이터가 얼마나 빨리 진동해야 하는지를 조작할 수 있는 방법을 제공하지 않습니다.
HapticPatterns.PlayEmphasis() 및 강조 포인트가 있는 HapticClip: iOS 13+에서는 CoreHaptics API에서 제공하는 "transient"라는 특별한 유형의 햅틱을 사용하여 강조 햅틱을 구현합니다. 현재 안드로이드는 이러한 유형의 햅틱을 지원하지 않으므로 연속적인 햅틱 출력 내에서 강조된 햅틱을 에뮬레이트합니다.
HapticController.Loop, HapticSource.loop: 안드로이드에서는 루핑에 문제가 있어 이를 안드로이드 팀에 보고했습니다. 이 문제는 안드로이드 12에서 수정되었습니다. 그러나 이전 버전에서는 여전히 루핑에 제한이 있습니다. 긴 햅틱 클립에서는 효과가 고르지 않게 느껴질 수 있지만, 짧은 클립에서는 충분히 괜찮을 수 있습니다.
게임패드
요구 사항
게임패드에서 햅틱을 재생하기 위해 Nice Vibrations 4는 Unity의 최신 Input System 패키지에 의존합니다. Nice Vibrations 4가 게임패드와 함께 작동하도록 하려면 프로젝트에 다음 작업을 수행해야 합니다:
- Input System 패키지를 설치하고 가져오기
- 프로젝트 플레이어 설정에서 "Active Input Handling"을 활성화하기. 아래 이미지에서 볼 수 있듯이 "Both"를 선택하는 것이 좋습니다.
이것이 Nice Vibrations 4가 필요로 하는 전부이며, 이를 통해 Windows 및 Mac에서 Unity의 Input System을 통해 럼블을 지원하는 게임패드에 햅틱을 재생할 수 있습니다. 지원되는 기기에 대한 자세한 내용은 Input System의 문서 Rumble 섹션을 참조하세요.
콘솔의 경우, 프로젝트에 콘솔 전용 Input System 패키지를 설치해야 합니다.
Unity의 Input System이 럼블을 지원하는 게임패드는 기본적으로 제한된 모든 햅틱 기능을 지원합니다. 대부분의 게임패드 액추에이터 기술은 HD 햅틱을 생성할 수 없는 ERM 액추에이터를 기반으로 합니다. 자세한 내용은 제한 사항 섹션을 참조하세요.
iOS 또는 안드로이드 기기에 연결된 게임패드 컨트롤러는 햅틱 재생을 지원하지 않습니다.
게임패드 지원을 비활성화하고 HapticClip 객체의 크기를 줄이려면, 플레이어 설정의 "Scripting Define Symbols"에서 플랫폼 커스텀 정의 NICE_VIBRATIONS_DISABLE_GAMEPAD_SUPPORT를 설정할 수 있습니다.
변경 후 모든 햅틱 클립 에셋을 다시 가져와야 합니다.
특정 API
HapticSource, HapticController 및 HapticPatterns와 같은 Nice Vibrations 4의 API는 게임패드가 연결되면 자동으로 게임패드에서 햅틱을 재생합니다. 그러나 게임에 여러 개의 게임패드가 연결된 경우, 어떤 게임패드에서 햅틱이 재생될지를 설정해야 할 수 있습니다. 이를 위해서는 GamepadRumbler 클래스에서 게임패드 전용 메서드를 호출해야 합니다.
GamepadRumbler.SetCurrentGamepad(2);
이 경우, 메서드는 세 번째 게임패드에 진동을 트리거하게 됩니다.
제한 사항
일반적으로, 대부분의 시장에 있는 게임패드의 액추에이터 기술로 인해 게임패드 햅틱의 품질은 최상이 아닙니다. 또한, Input System API 호출은 메인 스레드에서 이루어져야 하므로 햅틱 클립을 재생하기 위한 타이머 해상도는 최대 1/60 FPS입니다.
이로 인해 세부 사항이 많은 햅틱 클립은 게임패드에서 최상의 느낌을 제공하지 못합니다. 예를 들어, iOS에서 훌륭하게 느껴진다면, 게임패드에서의 느낌에 대한 기대를 관리해야 합니다.
우리는 향후 릴리스에서 Input System이 재생할 수 있는 분기점 수를 자동으로 조정하여 게임패드에서 햅틱 클립 재생의 품질을 개선할 계획입니다.
이 외에도 현재 게임패드에 대한 몇 가지 기능에는 제한이 있습니다:
HapticController.clipFrequencyShift와 HapticSource.frequencyShift는 게임패드에서 아무런 작동을 하지 않습니다.
HapticController.PlayConstant(): 현재 이 메서드의 주파수 매개변수를 변경해도 아무런 효과가 없습니다. 이는 사용 가능한 HapticController.clipFrequencyShift에 의존합니다.
Linux, 다중 게임패드 병렬 햅틱 재생 또는 모바일 전화에 연결된 게임패드 컨트롤러는 지원되지 않습니다.
문제 해결
iOS에서 시작 후 처음 30초 동안 진동이 작동하지 않습니다
iOS에서는 첫 번째 진동을 트리거한 후 처음 30초 동안 강조 진동 이외의 진동이 작동하지 않을 때가 있습니다. 이는 알려진 iOS 문제로, CoreHaptics가 초기화 직후 진동을 트리거하지 못할 때가 있습니다. 이 문제를 해결하기 위해, 초기화와 첫 진동 사이에 충분한 시간을 두어 CoreHaptics가 제대로 작동할 수 있도록 애플리케이션 시작 시 Nice Vibrations를 초기화해야 합니다. 이를 수행하는 두 가지 방법이 있습니다:
씬에 HapticReceiver를 배치합니다. 이는 씬이 로드될 때 Nice Vibrations를 초기화하는 작업을 처리합니다.
씬에 HapticReceiver를 배치하고 싶지 않은 경우, 씬의 GameObject의 MonoBehaviour의 Awake() 또는 Start() 메서드에서 직접 HapticController.Init()을 호출할 수 있습니다.
AdMob을 사용 중이며 광고를 닫은 후 iOS에서 소리가 나지 않습니다.
이 문제를 해결하기 위한 해결 방법은 광고를 표시하는 함수를 호출하기 전에 네이티브 바인딩을 해제하고, 호출한 후에 네이티브 바인딩을 초기화하는 것입니다:
// 햅틱 바인딩 해제
LofeltHaptics.Release();
// 광고가 닫힐 때까지 대기
await ShowRewardedAd();
// 햅틱 바인딩 초기화
LofeltHaptics.Initialize();
클라우드 빌드로 빌드하는 데 문제가 있습니다
현재로서는, Cloud Build를 바로 사용하여 우리의 플러그인을 사용할 수 없습니다. 기술적으로는 가능하지만, 경로를 수동으로 조정해야 하므로 번거로울 수 있습니다. 그동안에는 로컬에서 빌드하는 것을 권장합니다.
'유니티 에셋 > Feel' 카테고리의 다른 글
MMTools (0) | 2024.07.13 |
---|---|
Tweens and events (0) | 2024.07.13 |
Recipes (0) | 2024.07.11 |
Add juice to your game using springs (0) | 2024.07.10 |
Screen Shakes (0) | 2024.07.10 |