Author :JerryYang
Create by 2020.12.07
环境:
Unity:2019.4.2f1
Xcode:12.2
Android Studio:4.1.1
在用unity进行移动端开发时,有时会需要和原生进行通讯。接下来以unity调用原生震动为例
unity自己有震动的接口:
Handheld.Vibrate();
这个接口调用一次震动时长为0.5s,不能修改,并且手机关闭震动的情况下无效。
那么我们就需要在IOS和安卓端分别写好接口给unity调用。
一、unity和iOS通讯
- 首先打开Xcode,新建一个工程Vibrator,然后新建一个类VibratorTool继承NSObject,具体代码如下:
VibratorTool.h文件:
//
// VibratorTool.h
// Vibrator
//
// Created by 飞杨 on 02.12.20.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface VibratorTool : NSObject
@end
NS_ASSUME_NONNULL_END
VibratorTool.m文件:
//
// VibratorTool.m
// Vibrator
//
// Created by JerryYang on 02.12.20.
//
#import "VibratorTool.h"
#import <UIKit/UIImpactFeedbackGenerator.h>
@implementation VibratorTool
#if defined (__cplusplus)
extern "C"
{
#endif
void setVibrator(float Intensity){
UIImpactFeedbackGenerator * generator;
if (@available(iOS 13.0, *)) {
generator = [[UIImpactFeedbackGenerator alloc]init];
[generator impactOccurredWithIntensity:Intensity];
} else {
if (Intensity< 0.33) {
generator = [[UIImpactFeedbackGenerator alloc]initWithStyle:UIImpactFeedbackStyleLight];
}else if(Intensity >=0.33 && Intensity < 0.66){
generator = [[UIImpactFeedbackGenerator alloc]initWithStyle:UIImpactFeedbackStyleMedium];
}else{
generator = [[UIImpactFeedbackGenerator alloc]initWithStyle:UIImpactFeedbackStyleHeavy];
}
[generator impactOccurred];
}
}
#if defined (__cplusplus)
}
#endif
@end
-
在unity随便个文件夹,把这两个文件拖进去,勾选iOS平台
勾选对应平台.png -
在unity引入命名空间:
using System.Runtime.InteropServices;
新建类 Visrator.cs 具体的代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;
/// <summary>
/// 震动反馈
/// Author JerryYang
/// Create by 2020.12.03
/// </summary>
public class Visrator
{
#if UNITY_IOS && !UNITY_EDITOR
[DllImport("__Internal")]
private static extern void setVibrator(float Intensity);
#endif
public void SetVibrator(float Intensity = 1)
{
#if UNITY_IOS && !UNITY_EDITOR
setVibrator(Intensity);
#endif
}
}
二、unity和android通讯
- 首先打开Android,新建一个工程Vibrator,然后新建一个类VibratorTool,具体代码如下:
package com.example.vibrate;
import android.content.Context;
import android.os.Vibrator;
public class VibratorTool {
public void setVibrator(Context act, long t){
Vibrator vibrator = (Vibrator) act.getSystemService(Context.VIBRATOR_SERVICE);
vibrator.vibrate(t);
}
}
unity默认是加了震动权限,如果没有权限,请在 AndroidManifest.xml 文件中添加:
<uses-permission android:name="android.permission.VIBRATE" />
-
在unity随便个文件夹,把这个文件拖进去,勾选Android平台
勾选对应平台.png - 在 Visrator.cs 文件中修改SetVibrator方法为:
public void SetVibrator(float Intensity = 1)
{
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidJavaObject jo = new AndroidJavaObject("com.example.vibrate.VibratorTool");
AndroidJavaClass act = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
var actObj = act.GetStatic<AndroidJavaObject>("currentActivity");
long l = (long)(Intensity * 10);
jo.Call("setVibrator", actObj,l);
#elif UNITY_IOS && !UNITY_EDITOR
setVibrator(Intensity);
#endif
}
这样简单的通讯功能就完成了,同时用到了OC,C#,Java,C++。
注意:只有真机才能测试哦!
网友评论