上周,我一直在尝试在手机上玩几款游戏,发现当发生某些事情时,有些游戏将振动用作玩家的“反馈”,例如:
玩家撞到了墙上。
玩家进行了完美的发射;
玩家获得了大奖。
等等...
我真的很喜欢如何通过给手机一些振动或轻微震动,通过不仅仅显示在屏幕上或来自扬声器的输出,基本告诉玩家发生了(对于游戏而言)重要的事情。
我正在使用Unity开发游戏。
在我的游戏中,当玩家崩溃时以及当他获得丰厚的奖金时,我会让手机震动,就像我看到过其他精美的游戏一样。
我已经尝试使用默认的振动:Handheld.Vibrate()
,它起作用了,但是由于我的需要它持续了很长时间,因此我无法更改其中的任何内容。
我读过,要做到这一点,我需要编写一个单独的插件,或者使用已经存在的插件。我还没有找到工作的人,也不知道如何写一个!
我只需要调用vibrateFor(100)
之类的东西,其中100是毫秒。
一些游戏,例如“ Perfect Slices”,似乎经常使用它。
那么,有人可以为我制作这样的插件,还是指出现有的Android插件?
谢谢您的帮助!
编辑:否则,谁能向我详细解释如何使用似乎对其他人有用的this插件?
Unity版本是2019.2.8f1。
最佳答案
从2018.3版本开始,Unity允许您将.java文件添加到Unity项目中,并且在构建Android播放器时会对其进行编译。
1)将输出UnityAndroidVibrator.java和AndroidManifest.xml文件复制到Unity项目中的Assets / Plugins / Android目录中。
2)转到:[文件]> [内部设置]> [播放器设置]> [播放器],然后复制程序包名称。
3)在这两个类中,找到“ uav.uav.uav”程序包名称并将其替换为您在步骤2)中复制的名称。
UnityAndroidVibrator.cs类:
using UnityEngine;
public class UnityAndroidVibrator : MonoBehaviour
{
#if UNITY_ANDROID || UNITY_EDITOR
private static AndroidJavaObject plugin = null;
#endif
// Use this for initialization
void Awake ()
{
#if UNITY_ANDROID && !UNITY_EDITOR
plugin = new AndroidJavaClass("uav.uav.uav.UnityAndroidVibrator").CallStatic<AndroidJavaObject>("instance");
#endif
}
/// <summary>
/// <para>Vibrates For Given Amount Of Time.</para>
/// <para>1 sec = 1000 Millseconds :)</para>
/// </summary>
/// <param name="DurationInMilliseconds">Duration in milliseconds.</param>
public void VibrateForGivenDuration(int DurationInMilliseconds)
{
plugin.Call("VibrateForGivenDuration", DurationInMilliseconds);
}
/// <summary>
/// Stoping All Vibrate.
/// </summary>
public void StopVibrate()
{
plugin.Call("StopVibrate");
}
/// <summary>
/// <para>Customs Vibrate or Vibration with Pattern.</para>
/// <para>Start without a delay</para>
/// <para>Each element then alternates between vibrate, sleep, vibrate, sleep...</para>
/// <para>long[] Pattern = {0, 100, 100, 300};</para>
/// </summary>
/// <param name="Pattern">Pattern.</param>
public void CustomVibrate(long[] Pattern)
{
plugin.Call("CustomVibrate", Pattern);
}
}
UnityAndroidVibrator.java类:
package uav.uav.uav;
import android.os.Vibrator;
import com.unity3d.player.UnityPlayer;
public class UnityAndroidVibrator
{
private static UnityAndroidVibrator _instance;
public UnityAndroidVibrator() {
}
public void VibrateForGivenDuration(int duration) {
Vibrator vibs = (Vibrator)UnityPlayer.currentActivity.getApplicationContext().getSystemService("vibrator");
vibs.vibrate((long)duration);
}
public void StopVibrate() {
Vibrator vibs = (Vibrator)UnityPlayer.currentActivity.getApplicationContext().getSystemService("vibrator");
vibs.cancel();
}
public void CustomVibrate(long[] Pattern) {
Vibrator vibs = (Vibrator)UnityPlayer.currentActivity.getApplicationContext().getSystemService("vibrator");
vibs.vibrate(Pattern, -1);
}
public static UnityAndroidVibrator instance()
{
if (_instance == null)
{
_instance = new UnityAndroidVibrator();
}
return _instance;
}
}
AndroidManifest.xml文件:
<?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">
<application>
<activity android:name="com.unity3d.player.UnityPlayerActivity" android:theme="@style/UnityThemeSelector" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:hardwareAccelerated="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.VIBRATE" />
</manifest>
注意:例如,如果您的程序包名称为“ com.my.app”,则结果名称为:
“ UnityAndroidVibrator.cs”类:
plugin = new AndroidJavaClass("com.my.app.UnityAndroidVibrator").CallStatic<AndroidJavaObject>("instance");
“ UnityAndroidVibrator.java”类:
package com.my.app;
import android.os.Vibrator;
import com.unity3d.player.UnityPlayer;