Unity调用IOS和Android

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通讯

  1. 首先打开Xcode,新建一个工程Vibrator,然后新建一个类VibratorTool继承NSObject,具体代码如下:
VibratorTool.h文件:
//
//  VibratorTool.h
//  Vibrator
//
//  Created by 飞杨 on 02.12.20.
//

#import 

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 

@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

  1. 在unity随便个文件夹,把这两个文件拖进去,勾选iOS平台


    勾选对应平台.png
  2. 在unity引入命名空间:

using System.Runtime.InteropServices;

新建类 Visrator.cs 具体的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.InteropServices;

/// 
/// 震动反馈
/// Author JerryYang
/// Create by 2020.12.03
/// 

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通讯

  1. 首先打开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 文件中添加:


  1. 在unity随便个文件夹,把这个文件拖进去,勾选Android平台


    勾选对应平台.png
  2. 在 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("currentActivity");
        long l = (long)(Intensity * 10);
        jo.Call("setVibrator", actObj,l);
#elif UNITY_IOS && !UNITY_EDITOR
           setVibrator(Intensity);
#endif
    }

这样简单的通讯功能就完成了,同时用到了OC,C#,Java,C++。

注意:只有真机才能测试哦!

你可能感兴趣的:(Unity调用IOS和Android)