Unity

Unity에서 버튼 클릭 시 햅틱(진동) 피드백 적용하기 (iOS & Android)

정보처리마법사 2025. 2. 25. 15:56
반응형

# Unity에서 버튼 클릭 시 햅틱(진동) 피드백 적용하기 (iOS & Android)

모바일 앱에서 햅틱 피드백(진동 효과)은 UX 향상에 중요한 요소입니다. Unity에서는 기본적으로 Handheld.Vibrate()를 제공하지만, 세밀한 햅틱 효과를 위해 플랫폼별로 다른 방법을 사용해야 합니다. 이 글에서는 Unity에서 iOS 및 Android에서 버튼 클릭 시 햅틱을 적용하는 방법을 완벽하게 정리하겠습니다.


1. 프로젝트 준비

✅ Unity 프로젝트에서 햅틱 기능을 구현하기 위해 필요한 것

  • Unity 2020 이상 권장
  • Android 8.0 이상 & iOS 10 이상 지원
  • AndroidJavaObject를 사용한 Android 진동 API
  • Objective-C를 활용한 iOS 네이티브 햅틱 지원
  • Assets/Plugins/iOS/ 폴더에 HapticFeedback.m 추가 필요

2. Android에서 햅틱 효과 구현

Android에서는 Handheld.Vibrate()가 기본적으로 제공되지만, 더 세밀한 햅틱 피드백을 원한다면 VibrationEffect를 사용해야 합니다.

✅ 기본적인 Android 햅틱 (약한 진동)

using UnityEngine;

public class HapticFeedback : MonoBehaviour
{
    public void TriggerBasicHaptic()
    {
        #if UNITY_ANDROID
        Handheld.Vibrate();
        #endif
    }
}

✅ 강한 햅틱 효과 (Android 8.0 이상 지원)

using UnityEngine;

public class HapticFeedback : MonoBehaviour
{
    public void TriggerStrongHaptic()
    {
        #if UNITY_ANDROID
        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
        AndroidJavaObject vibrator = currentActivity.Call<AndroidJavaObject>("getSystemService", "vibrator");
        vibrator.Call("vibrate", 100); // 100ms 동안 진동
        #endif
    }
}

⚠️ 주의점

✅ AndroidManifest.xml에서 VIBRATE 권한 추가 필요

<uses-permission android:name="android.permission.VIBRATE"/>

✅ Android 8.0(Oreo) 이상에서는 VibrationEffect를 지원하지만, 이전 버전에서는 기본 진동만 지원


3. iOS에서 햅틱 효과 구현 (Taptic Engine 활용)

iOS에서는 Handheld.Vibrate()가 작동하지 않으므로 Taptic Engine을 사용해야 합니다.

✅ iOS 네이티브 코드 추가 (Assets/Plugins/iOS/HapticFeedback.m)

#import <UIKit/UIKit.h>

extern "C" {
    void TriggeriOSHaptic(int type)
    {
        UIImpactFeedbackGenerator *generator;
        switch (type) {
            case 1:
                generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleLight];
                break;
            case 2:
                generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium];
                break;
            case 3:
                generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleHeavy];
                break;
            default:
                generator = [[UIImpactFeedbackGenerator alloc] initWithStyle:UIImpactFeedbackStyleMedium];
                break;
        }
        [generator prepare];
        [generator impactOccurred];
    }
}

✅ iOS에서 C# 코드에서 호출하기

using System.Runtime.InteropServices;
using UnityEngine;

public class HapticFeedback : MonoBehaviour
{
    [DllImport("__Internal")]
    private static extern void TriggeriOSHaptic(int type);

    public void VibrateIOS(int type = 1)
    {
        #if UNITY_IOS
        TriggeriOSHaptic(type); // 1: Light, 2: Medium, 3: Heavy
        #endif
    }
}

⚠️ 주의점

Assets/Plugins/iOS/ 폴더가 없으면 생성 후 HapticFeedback.m을 추가해야 함 ✅ TriggeriOSHaptic()을 호출할 때 UNITY_IOS 매크로를 반드시 포함해야 함 ✅ iOS 시뮬레이터에서는 작동하지 않음! 반드시 iPhone 실기기에서 테스트 필요


4. Unity UI 버튼 클릭 시 햅틱 실행

using UnityEngine;
using UnityEngine.UI;

public class ButtonHaptic : MonoBehaviour
{
    public Button myButton;
    private HapticFeedback hapticFeedback;

    void Start()
    {
        hapticFeedback = GetComponent<HapticFeedback>();
        myButton.onClick.AddListener(() => hapticFeedback.VibrateIOS(2)); // iOS Medium 햅틱 실행
    }
}

이제 버튼을 클릭하면 iOS & Android에서 햅틱 피드백이 실행됩니다.


5. 최종 테스트 및 Xcode 설정 확인

1️⃣ Unity에서 iOS 빌드 실행 (Build & Run) 2️⃣ Xcode에서 프로젝트 열기 3️⃣ Target → UnityFramework → Build Phases → Compile Sources

  • HapticFeedback.m이 포함되어 있는지 확인 (없다면 직접 추가) 4️⃣ iPhone 실기기에서 실행하여 햅틱 테스트

🚀 최종 결론

Android에서는 Handheld.Vibrate() 또는 VibrationEffect를 활용하여 햅틱 효과 추가 가능iOS에서는 UIImpactFeedbackGenerator를 사용하여 네이티브 방식으로 햅틱 제공해야 함버튼 클릭 시 TriggerHaptic()을 호출하면 플랫폼에 따라 적절한 햅틱 효과 실행됨iOS에서는 반드시 실기기에서 테스트해야 함! 시뮬레이터에서는 동작하지 않음

이제 Unity에서 완벽한 햅틱 효과를 구현할 수 있습니다! 🚀

반응형