[Unity] 유니티 진동 울리기
안녕하세요
오늘은 유니티에서 진동을 울리는 방법에 대해 알아보도록 하겠습니다.
퍼즐게임에서 퍼즐을 잘못찾았거나 여러가지 경고를 띄울 때 주로 진동을 울리는 경우가 많이 있습니다.
이럴때 사용하는 진동을 유니티에서도 호출할 수 있습니다.
진동 울리는 함수
Handheld.Vibrate();
진동이 울려야 할 위치에 위의 함수를 호출하면 진동이 1초간 울립니다.
진동 세부설정
Handheld.Vibrate() 함수를 이용하면, 울리는 시간을 설정할 수 없고 1초간 진동이 울리는 것만 가능합니다.
1초말고 진동울리는 시간과 울리는 패턴 설정할 수 있습니다.
안드로이드 자바 클래스를 사용합니다.
사용하려면 진동권한이 필요합니다.
진동권한 추가를 위해서 매니페스트 수정이 필요합니다.
C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Apk
이 폴더에서 AndroidManifest.xml파일을 해당 프로젝트 폴더의 Asset\Plugins\Android\에 넣습니다.
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
|
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.unity3d.player"
xmlns:tools="http://schemas.android.com/tools"
android:installLocation="preferExternal">
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"
android:anyDensity="true"/>
<application
android:theme="@style/UnityThemeSelector"
android:icon="@mipmap/app_icon"
android:label="@string/app_name">
<activity android:name="com.unity3d.player.UnityPlayerActivity"
android:label="@string/app_name">
<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>
</application>
<uses-permission android:name="android.permission.VIBRATE" />
</manifest>
|
cs |
VIBRATE권한을 맨 밑에 </application>와 </manifest>사이에 넣으면 됩니다.
1
2
|
<uses-permission android:name="android.permission.VIBRATE" />
|
cs |
다음 클래스를 추가한 후 사용하면 됩니다.
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
46
47
|
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
}
}
|
cs |
실제 사용 예제
위 스크립트를 Assets폴더에 추가를 합니다.
빈오브젝트를 생성해서 버튼 이벤트에 사용할 스크립트를 추가합니다.
ButtonEvent 스크립트를 다음과 같이 작성합니다.
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
|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ButtonEvent : MonoBehaviour
{
public void OnClick1()
{
Vibration.Vibrate((long)5000);
}
public void OnClick2()
{
long[] pattern = new long[4];
pattern[0] = 1000;
pattern[1] = 200;
pattern[2] = 1000;
pattern[3] = 200;
Vibration.Vibrate(pattern, 1);
}
public void OnClick3()
{
long[] pattern = new long[4];
pattern[0] = 1000;
pattern[1] = 5000;
pattern[2] = 2000;
pattern[3] = 1000;
Vibration.Vibrate(pattern, -1);
}
public void OnClick4()
{
Vibration.Cancel();
}
}
|
cs |
1. OnClick1() 함수는 5초동안 진동을 울립니다.
2. OnClick2() 함수는 1초쉬고 0.2초 울리고, 1초 쉬고, 0.2초 울린 후 1초에 한번씩 1초 진동을 반복합니다.
3. OnClick3() 함수는 1초쉬고 5초 울리고, 2초 쉬고, 1초 울린 후 반복되지 않습니다.
4. OnClick4() 함수는 진동 울리는 도중에 진동을 취소합니다.
그 후 버튼을 다음과 같이 4개 추가해서 추가합니다.
버튼에 OnClick1~onClick4를 다음과 같이 넣습니다.
Button에 OnClick1을 넣습니다.
Button (1)에 OnClick2을 넣습니다.
Button (2)에 OnClick3을 넣습니다.
Button (3)에 OnClick4을 넣습니다.
버튼을 누를 때마다 해당되는 이벤트가 실행되는 것을 확인할 수 있습니다.
그리고 검색하다가 Android 8.0(API 레벨 26)이상에서는 다르게 작업을 해야한다고 작업을 해야한다고 찾았는데, 갤럭시 S8(안드로이드 9.0)에서 테스트 했을 때 진동이 안울렸습니다.
혹시나 특정 최신 휴대폰에서 진동이 울리지 않는다면, 다음 웹페이지를 참조하시는 것도 좋을 것 같습니다.
https://gist.github.com/munkbusiness/9e0a7d41bb9c0eb229fd8f2313941564
안드로이드의 vibrate함수 사용은 다음 웹페이지에서 확인할 수 있습니다.
https://developer.android.com/reference/android/os/Vibrator#vibrate(long[],%20int)
틀린 부분이나 제가 잘못 올린부분은 댓글을 남겨주시면 수정하도록 하겠습니다.