유니티 모바일 프로젝트에 진동 권한 부여하기
유니티 모바일 프로젝트에 진동 권한 부여하기
안드로이드 기준입니다!
유니티에서 진동은 기본적으로 Handheld.Vibrate()
의 형태로 제공되지만 진동의 강도나 지속 시간이 고정된다는 단점이 있어 주로 다음의 방법을 이용합니다.
Manifest 파일 추가하기
Edit / Project Settings / Player / Publishing Settings
에서Custom Main Manifest
항목을 체크합니다.- 프로젝트의
Assets/Plugins/Android
경로에 수정 가능한AndroidManifest.xml
파일이 생성됩니다. - 해당 파일의
manifest
태그 안에<uses-permission android:name="android.permission.VIBRATE" />
코드 한 줄을 추가하면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application>
<!--Used when Application Entry is set to Activity, otherwise remove this activity block-->
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:theme="@style/UnityThemeSelector">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
</activity>
<!--Used when Application Entry is set to GameActivity, otherwise remove this activity block-->
<activity android:name="com.unity3d.player.UnityPlayerGameActivity"
android:theme="@style/BaseUnityGameActivityTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="unityplayer.UnityActivity" android:value="true" />
<meta-data android:name="android.app.lib_name" android:value="game" />
</activity>
</application>
<uses-permission android:name="android.permission.VIBRATE" />
</manifest>
완성된 AndroidManifest.xml
파일은 위와 같이 나타납니다. 이 파일에 기반해 빌드된 어플은 진동 권한을 요구하게 되고, 플레이어가 허용하면 진동이 울릴 수 있게 됩니다.
Vibration 클래스 추가하기
프로젝트 경로 아무곳에서 C# 파일을 추가한 다음, 아래의 클래스를 붙여넣고 저장합니다. 주로 Assets/Scripts
경로 내에 작성합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System.Collections;
using UnityEngine;
public static class Vibration
{
#if UNITY_ANDROID && !UNITY_EDITOR
public static AndroidJavaClass AndroidPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
public static AndroidJavaObject AndroidcurrentActivity = AndroidPlayer.GetStatic<AndroidJavaObject>("currentActivity");
public static AndroidJavaObject AndroidVibrator = AndroidcurrentActivity.Call<AndroidJavaObject>("getSystemService", "vibrator");
#endif
public static void Vibrate()
{
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidVibrator.Call("vibrate");
#else
Handheld.Vibrate();
#endif
}
public static void Vibrate(long milliseconds)
{
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidVibrator.Call("vibrate", milliseconds);
#else
Handheld.Vibrate();
#endif
}
public static void Vibrate(long[] pattern, int repeat)
{
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidVibrator.Call("vibrate", pattern, repeat);
#else
Handheld.Vibrate();
#endif
}
public static void Cancel()
{
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidVibrator.Call("cancel");
#endif
}
}
이 클래스는 진동이 울리는 시간을 long
자료형 매개변수로 받아 AndroidVibrator.Call()
을 호출합니다. 정적 클래스로 제공되므로 프로젝트 어느 곳에 작성하더라도 잘 작동합니다. 예를 들어 Vibration.Vibrate(long(1000));
와 같이 사용할 수 있습니다. 개인적으로는 long(10)
정도로 사용하는 것이 좋았습니다.
사용 예시
1
2
3
4
5
public void Vibrate()
{
if (MainManager.ActivatedObject == gameObject)
Vibration.Vibrate((long)10);
}
위와 같이 사용한 적이 있습니다. 플레이어가 특정 오브젝트를 터치하면 해당 오브젝트가 활성화되며 MainManager
의 ActivatedObject
자리에 등록되는 방식인데, 좋은 코드는 아니지만 그 점을 제외하면 만족스럽게 잘 작동했습니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.