上周,我一直在尝试在手机上玩几款游戏,发现当发生某些事情时,有些游戏将振动用作玩家的“反馈”,例如:


玩家撞到了墙上。
玩家进行了完美的发射;
玩家获得了大奖。


等等...

我真的很喜欢如何通过给手机一些振动或轻微震动,通过不仅仅显示在屏幕上或来自扬声器的输出,基本告诉玩家发生了(对于游戏而言)重要的事情。

我正在使用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;

10-08 05:44