RichHaptic — Unity를 위한 오픈 소스 햅틱 (Haptics) 패키지 (iOS + Android)
요약
RichHaptic은 Unity 개발자를 위한 오픈 소스 햅틱 패키지입니다. iOS의 Core Haptics와 Android의 VibrationEffect를 직접 사용하여 의존성 없이 실시간 햅틱 변조를 지원합니다.
핵심 포인트
- iOS 및 Android 네이티브 API와 직접 통신
- 외부 의존성 및 컴파일된 네이티브 바이너리 없음
- 실시간 햅틱 변조(Live Modulation) 기능 지원
- Unity 6000.3 이상 버전 호환
저는 Unity를 위한 견고한 오픈 소스 햅틱 (Haptics) 패키지를 찾고 있었지만, 여전히 유지 관리되고 있는 것을 찾을 수 없었습니다. Nice Vibrations가 예전에는 이 분야의 표준이었기에, 저는 그것에서 영감을 받아 직접 만들기로 결심했습니다.
그 결과물이 바로 RichHaptic입니다. 이는 iOS의 Core Haptics 및 Android의 VibrationEffect와 직접 통신하는 의존성 없는 (zero-dependency) Unity 패키지입니다. 컴파일된 네이티브 바이너리도, 제3자 런타임 (third-party runtime)도 없습니다. 전체 네이티브 표면은 하나의 .mm 파일과 직접 읽어볼 수 있는 몇 가지 JNI 호출로 구성되어 있습니다.
GitHub logo Acharad / RichHaptic
실시간 변조 (live modulation)가 가능한 iOS 및 Android용 Unity 햅틱 (haptics). Core Haptics 및 VibrationEffect와 직접 통신하며, 네이티브 바이너리나 의존성이 없습니다.
RichHaptic
Core Haptics 및 VibrationEffect와 직접 통신하는 Unity용 햅틱 (haptics) 패키지입니다. 컴파일된 네이티브 블롭 (native blob), 제3자 런타임 (third-party runtime), 의존성 (dependencies)이 없으며, 코어 어셈블리 (core assembly)에 TextMeshPro조차 포함되어 있지 않습니다.
이 패키지가 구축된 핵심은 **재생 중에 변조할 수 있는 연속적인 피드백 (continuous feedback)**입니다. 예를 들어, 손가락 아래에서 팽팽해지는 활시위나 스로틀에 따라 회전수가 올라가는 엔진 같은 것입니다. 대부분의 무료 햅틱 패키지는 사전 설정된 탭 (preset taps)만 실행합니다. 이 패키지도 그것을 수행할 수 있지만, 실시간 경로 (live path)가 존재하는 이유입니다.
이 패키지는 의도적으로 게임패드 럼블 (gamepad rumble), 루핑 (looping), 시킹 (seeking)을 지원하지 않으며, 제작된 클립 라이브러리를 제공하지도 않습니다. 이러한 기능이 필요하다면 하단의 비교 섹션을 참조하십시오.
설치 (Install)
OpenUPM을 통해 설치:
openupm add com.acharad.richhaptic
또는 Package Manager → Add package from git URL을 통해 설치:
선택적 샘플로서 데모 씬(demo scene)이 포함되어 있으며, Package Manager의 패키지 페이지에서 가져올 수 있습니다. 이 씬은 기본적으로 제공되는 TextMeshPro가 필요합니다...
주요 기능
모든 기능은 별도의 설정 없이 하나의 정적 클래스(static class)를 통해 작동합니다:
using RichHaptic;
Haptics.PlayPreset(PresetType.Success);
- 프리셋 (Presets) — 총 9가지(선택, 성공, 경고, 실패, 5단계 충격 레벨)가 제공됩니다. iOS에서는 시스템 자체의 피드백 생성기(feedback generators)를 호출하므로, Apple이 설정을 변경하더라도 네이티브 느낌을 그대로 유지하며 정확하게 작동합니다.
- 연속 피드백 (Continuous feedback) — 세션을 시작하고, 매 프레임마다 새로운 강도(intensity)/날카로움(sharpness) 값을 전달한 뒤, 작업이 끝나면 중지합니다. 그리기 제스처나 차징(charge-up) 동작 등에 유용합니다. iOS에서는 실시간으로 끊김 없이 작동하며, Android에서는 플랫폼 특성상 실시간 변조(live-modulation) 핸들이 없고 "재생(play)"과 "취소(cancel)" 기능만 지원하기 때문에 약 150ms 단위로 업데이트가 병합(coalesced)됩니다.
- 클립 (Clips) — 인스펙터(Inspector)에서 편집할 수 있는
ScriptableObject로, 이벤트별 강도와 날카로움이 포함된 간단한 이벤트 목록입니다. - 우선순위 (Priority) — 하나의 액추에이터(actuator)에 여러 호출자가 있을 때,
AudioSource.priority와 동일한 규칙에 따라 낮은 우선순위 숫자가 우선권을 갖습니다.
알아두면 좋은 사항
- Android는 진동을 안정적으로 루프(loop)시키는 것을 허용하지 않습니다. Galaxy A54에서 반복되는 파형이 첫 번째 세그먼트에서 조용히 잘려버리는 것을 직접 경험하며 알게 되었습니다. 따라서 현재 두 플랫폼 모두 네이티브 루핑에 의존하는 대신, 하나의 긴 세그먼트를 실행하고 조기에 중지하는 방식을 사용합니다.
- iOS 프리셋은 하드코딩된 진폭(amplitude) 값을 전혀 사용하지 않습니다. Apple이 기기별로 최적화하기 때문에 고정된 수치로는 이를 맞출 수 없으므로, UIKit의 피드백 생성기를 직접 호출합니다.
현재 버전은 1.0 미만(0.1.0)이며, 143개의 에디트 모드(EditMode) 테스트를 거쳤고, iPhone 15 Pro와 Galaxy A54에서 수동으로 검증되었습니다. Unity 프로젝트에서 연속적인 햅틱 피드백을 구현하고 있다면 살펴보시기 바랍니다. 피드백과 기기 관련 보고는 언제나 환영합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기