Unity 与 Android 、IOS交互笔记

一、C#调OC:

1、为了使用DllImport,需要 using System.Runtime.InteropServices;
2、这些函数前面要加入[DllImport(“__Internal”)],说明这是从dll导入的函数,并且来源于游戏本身的dll。函数必须声明为
private static extern 。
3、需要在c#中声明OC的函数:

[DllImport("__Internal")]
private static extern void IosMethod(); //IosMethod 对应的OC中的函数名

二、OC调Unity C#代码:

1、当C#调用OC方法,OC方法处理完后,需要向C#返回处理的结果,这就需要使用Unity提供的发送回调事件的方法。
2、从Unity导出的xcode工程中,UnityInterface.h中声明了一个方法:

// obj-游戏物体名字,method-方法名字,msg-数据,通常把需要的数据打包成一个json字符串
void UnitySendMessage(const char* obj, const char* method, const char* msg);

三、C#调Android:

1、AndroidJavaClass主要是读取arr包或者jar包中的类对象,用来读取静态属性或方法
2、AndroidJavaObject主要作用于生成实例对象,用来读取对象的实例属性或方法

//加载com.al.player.MainActivity类
AndroidJavaClass _JC = new AndroidJavaClass("com.al.player.MainActivity");
 
//实例com.al.player.test对象
AndroidJavaObject _JO = new AndroidJavaObject("com.al.player.test");

//调用com.al.player.MainActivity类中的Test静态方法
_JC.CallStatic("Test");

//调用com.al.player.MainActivity类中的Test静态方法,带返回值(不带返回值去掉<bool>)
bool flag = _JO.CallStatic<bool>("Test");

//调用com.al.player.test类中的TestInstance实例方法,带返回值(不带返回值去掉<string>),"TestString"-传值
string str = _JO.Call<string>("TestInstance", "TestString");

// 获取Unity导出的Activity对象
AndroidJavaClass _JC = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = _JC.GetStatic<AndroidJavaObject>("currentActivity");

四、Android调Unity C#代码:

// obj-游戏物体名字,method-方法名字,msg-数据(可空”“)
UnityPlayer.UnitySendMessage(string obj, string method, string msg);

五、C#请求摄像机权限代码:

	// 请求摄像机使用权限
    public void RequestPermission(){
        // 是否已同意摄像机使用权限
        if (!Permission.HasUserAuthorizedPermission(Permission.Camera))
        {
            // 请求摄像机权限
            Permission.RequestUserPermission(Permission.Camera);
        }
    }

六、Unity C#修改Xcode项目配置代码:

1、XCodeProject文件要放在Editor文件夹下

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using UnityEngine.Android;
using System.Runtime.InteropServices;

public class XCodeProject : MonoBehaviour
{
    [PostProcessBuild]
    private static void OnBuildFinsh(BuildTarget buildTarget, string buildPath)
    {
        Debug.Log("构建完成:"+buildPath+" 路径:"+ buildPath);
#if UNITY_IPHONE
    SetXCodeProject(buildPath);
#endif
    }
    public static void SetXCodeProject(string buildPath)
    {
        PBXProject project = new PBXProject();
        project.ReadFromString(File.ReadAllText(PBXProject.GetPBXProjectPath(buildPath)));

        // 添加库
        string targetGuid = project.GetUnityFrameworkTargetGuid();
        project.AddFrameworkToProject(targetGuid, "AVKit.framework", false);
        project.WriteToFile(PBXProject.GetPBXProjectPath(buildPath));
		
		// 设置签名证书
        project.SetBuildProperty(targetGuid, "CODE_SIGN_IDENTITY", "test123");

        // 为目标文件设定编译标识
        string fileGuid = project.FindFileGuidByProjectPath("MainApp/main.mm");
        project.SetCompileFlagsForFile(targetGuid, fileGuid, new List<string>() {"xxx"});

        // 添加权限
        PlistDocument plist = new PlistDocument();
        plist.ReadFromString(File.ReadAllText(Path.Combine(buildPath, "Info.plist")));
        plist.root.SetString("NSCameraUsageDescription", "请求摄像机权限");
        project.WriteToFile(Path.Combine(buildPath, "Info.plist"));
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值