Meta XR Haptics SDK 패키지 Example을 다운받으시면 Haptic SDK Play Sample 스크립트를 발견하실 수 있습니다.
해당 스크립트는 Haptic Clip Player Class을 이용해서 Haptic을 사용하는 예제가 담겨 있는데요.
해당 스크립트에 대해서는 다루지 않겠습니다.
이번 포스팅에서는 Haptic Clip Player Class에 대해서만 알아보겠습니다.
Haptic Clip Player 클래스란?
Haptic Clip Player는 Meta Quest Controller의 진동을 제어하는 유틸리티 클래스입니다.
Haptic Clip Player의 핵심 기능에는 다음과 같습니다.
메서드/프로퍼티 | 기능 설명 | 특징 |
Play(Controller) | 할당된 HapticClip을 지정된 컨트롤러(왼쪽/오른쪽)에서 재생합니다. | 컨트롤러 지정 가능. (Left / Right) |
Stop() | 현재 재생 중인 HapticClip을 즉시 중지합니다. | 클립이 재생 중이든 아니든 호출 가능. |
isLooping | 진동 클립의 반복 여부를 설정합니다. 또는 가져올 수 있습니다. | true로 설정 시 클립이 계속 반복됨. Stop으로 멈출 수 있음. |
clipDuration | 현재 로드된 진동 클립의 길이를 초 단위로 가져옵니다. | 클립이 없으면 0을 반환. |
amplitude | 재생되는 진동 클립의 진폭(진동 강도)을 설정하거나 가져옵니다. | 클립의 기본 진폭과 곱해져 0.0~1.0 범위로 클램핑됨. |
frequencyShift | 재생되는 진동 클립의 주파수 이동량을 설정하거나 가져옵니다. | -1.0에서 1.0 사이의 값을 가지며, 초과 시 예외가 발생됨. |
priority | Haptic Clip Player의 우선순위를 설정하거나 가져옵니다. | 0(높음)~255(낮음) 범위. 동일 우선순위면 가장 최근 재생된 클립이 우선. |
clip | 현재 할당된 Haptic Clip을 설정합니다. | JSON 포맷으로 된 유효한 클립만 허용. 이전 클립이 자동 해제됨. |
Dispose() | 메모리 해제를 위해 Haptic Clip Player를 명시적으로 해제합니다. | 호출 후 해당 객체 메서드 호출 시 런타임 오류 발생. |
Dispose(bool) | 내부 메모리 해제 처리용으로 사용됩니다. | _clipId와 _playerId가 유효하지 않게 설정됨. |
사용 예제
[SerializeField] private HapticClip clip1;
[SerializeField] private HapticClip clip2;
private HapticClipPlayer leftClipPlayer;
private HapticClipPlayer rightClipPlayer1;
private HapticClipPlayer rightClipPlayer2;
protected virtual void Start()
{
// We create two haptic clip players for each hand.
leftClipPlayer1 = new HapticClipPlayer(clip1);
leftClipPlayer2 = new HapticClipPlayer(clip2);
rightClipPlayer1 = new HapticClipPlayer(clip1);
rightClipPlayer2 = new HapticClipPlayer(clip2);
// We increase the priority for the second player on both hands.
leftClipPlayer2.priority = 1;
rightClipPlayer2.priority = 1;
}
Clip을 인스펙터에서 설정할 수 있습니다. 아래와 같이 말이죠.
각각(Left/Right) Haptic Clip Player에 Clip을 설정해주었습니다. 이때 다른 Clip을 설정했지요.
그리고 우선순위가 Player2가 높습니다. 이때 만약 leftClipPlayer1과 leftClipPlayer2가 동시에 실행되는 경우가 생긴다면,
우선순위가 높은 leftClipPlayer2가 실행되게 됩니다.
rightClipPlayer1.Play(Controller.Right);
haptic Clip Player를 실행시킬 때는 매개인자로 Controller Enum타입을 넘겨주면 됩니다.
두 컨트롤러 동시에 실행시키려면 Controller.Both를 넘겨주면 됩니다.
rightClipPlayer1.Stop();
Player를 중지시킬 때는 Stop메서드를 사용하면 됩니다.
그 외는 넘어가고 중요한 부분만 언급하겠습니다.
protected virtual void OnDestroy()
{
leftClipPlayer1?.Dispose();
leftClipPlayer2?.Dispose();
rightClipPlayer1?.Dispose();
rightClipPlayer2?.Dispose();
}
Haptic Clip Player가 그 씬에서 더 이상 사용되지 않는다면 메모리 해제를 위해 Dispose를 해주어야 합니다.
그리고 게임이 완전이 종료된다면 내부 메모리를 해제하기 위해
protected virtual void OnApplicationQuit()
{
Haptics.Instance.Dispose();
}
Haptics.Instance.Dispose를 명시적으로 표기해주어야 합니다.