利用寒假找了一个线上的实习,直接让我负责了一个消除类型的游戏,里面在每次放入时都要有一个轻微的振动效果,然而Unity仅仅提供了一个Handheld.Vibrate()供我们实现一个0.5s的振幅比较大(在我看来十分大,有种被电的感觉)的振动,没有任何参数可以调节振动幅度和大小,网上搜了半天也都是说这要写安卓底层的代码去控制,然而并没有人给出具体做法,这不拉垮了吗…不过还好公司有安卓和iOS工程师,在那位大哥的帮助下解决了这个问题,我直接导出了一个UnityPackage到资源中:
上传时是0积分,抓紧下载,哈哈
然后分装了一系列方法:
直接挂载然后调用VibrateForGivenDuration(int DurationInMilliseconds)方法即可,参数DurationInMilliseconds可以控制振动时长和幅度,在10左右进行调试即可
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
public class UnityVibrator : MonoBehaviour
{
#if UNITY_ANDROID && !UNITY_EDITER
private static AndroidJavaObject plugin = null;
# elif UNITY_IPHONE && !UNITY_EDITER
[DllImport("__Internal")]
public static extern void Vibrate();
#endif
void Awake ()
{
#if UNITY_ANDROID && !UNITY_EDITER
plugin = new AndroidJavaClass("com.game.util.UnityAndroidVibrator").CallStatic<AndroidJavaObject>("instance");
#endif
}
public void VibrateCustom()
{
#if UNITY_ANDROID && !UNITY_EDITER
if(plugin!=null)
plugin.Call("CustomVibrate", new long[]{0,5,10,5});
# elif UNITY_IPHONE && !UNITY_EDITER
try{
Vibrate();
}catch (System.Exception){
}
#endif
}
public void VibrateForGivenDuration(int DurationInMilliseconds)
{
#if UNITY_ANDROID && !UNITY_EDITER
if(plugin!=null)
plugin.Call("VibrateForGivenDuration", DurationInMilliseconds);
# elif UNITY_IPHONE && !UNITY_EDITER
try{
Vibrate();
}catch (System.Exception){
}
#endif
}
public void StopVibrate()
{
#if UNITY_ANDROID && !UNITY_EDITER
if(plugin!=null)
plugin.Call("StopVibrate");
# elif UNITY_IPHONE && !UNITY_EDITER
#endif
}
public void CustomVibrate(long[] Pattern)
{
#if UNITY_ANDROID && !UNITY_EDITER
if(plugin!=null)
plugin.Call("CustomVibrate", Pattern);
# elif UNITY_IPHONE && !UNITY_EDITER
#endif
}
}