반응형

안녕하세요

오늘은 유니티에서 진동을 울리는 방법에 대해 알아보도록 하겠습니다.

퍼즐게임에서 퍼즐을 잘못찾았거나 여러가지 경고를 띄울 때 주로 진동을 울리는 경우가 많이 있습니다.

이럴때 사용하는 진동을 유니티에서도 호출할 수 있습니다.

 

진동 울리는 함수

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

 

Vibration for Unity3d with Android native Call that supports both the new vibrationEffectClass and the old simple vibrate, with

Vibration for Unity3d with Android native Call that supports both the new vibrationEffectClass and the old simple vibrate, with fallback to Handlheld.Vibrate(). - Vibration.cs

gist.github.com

안드로이드의 vibrate함수 사용은 다음 웹페이지에서 확인할 수 있습니다.

https://developer.android.com/reference/android/os/Vibrator#vibrate(long[],%20int)

 

Vibrator  |  Android 개발자  |  Android Developers

Vibrator public abstract class Vibrator extends Object java.lang.Object    ↳ android.os.Vibrator Class that operates the vibrator on the device. If your process exits, any vibration you started will stop. Summary Public methods abstract void cancel() Turn

developer.android.com

틀린 부분이나 제가 잘못 올린부분은 댓글을 남겨주시면 수정하도록 하겠습니다.

 

반응형

+ Recent posts