Unity3d与iOS之间的相互调用

本文详细介绍了Unity3D与iOS平台之间的交互方法,包括从Unity3D调用iOS的Objective-C代码,以及从iOS调用Unity3D中的C#方法。通过具体的代码示例,展示了如何使用DllImport在C#中调用非托管的Objective-C函数,以及如何在iOS中通过UnitySendMessage调用Unity中的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Unity3d与iOS的交互

  1. U3D调用IOS

    1.1 实现原理
    ios开发使用的语言是objective-c(也称object-c),u3d中使用DllImport的Attribute,以非托管方式将库中 的方法导出到C#中进行使用。而传入"__Internal"则是表示这个是一个静态库或者是一个内部方法。通过上面的声明,这个方法就可以在C#里面进行调用了。

      using UnityEngine;
      using System.Collections;
      using System.Runtime.InteropServices;		//DllImport的命名空间
      public class CallAppIOS
      {
          /* Interface to native implementation */
      
          [DllImport("__Internal")]
          private static extern string _getAppendString(string str1, string str2);	//IOS中方法
      
          public static string GetAppendString(string str1, string str2)
          {
              return _getAppendString(str1, str2);
          }
      }
    

    1.2 编写IOS文件
    创建iOSUtilUnity3dBridge.h和iOSUtilUnity3dBridge.mm两个文件,放到Plugins->IOS文件夹下(string 对应const char*)

    #import <Foundation/Foundation.h>
    
    @interface iOSUtilUnity3dBridge : NSObject
    extern "C"
    {
    	const char* _getAppendString(const char *str1, const char *str2);
    }
    @end
    
    #import <Foundation/Foundation.h>
    #import "iOSUtilUnity3dBridge.h"
    
    extern "C"
    {    
    	//NSString 转char*
        char* _MakeStringCopy(const char* str){
            if(str == NULL){return NULL;}
            char* res = (char*)malloc(strlen(str)+1);
            strcpy(res, str);
            return res;
        }
        
        const char* _getAppendString(const char *str1, const char *str2)
        {
    		NSString *string1 = [[NSString alloc] initWithUTF8String:str1];
    		NSString *string2 = [[NSString alloc] initWithUTF8String:str2];
    
            NSString *string3 = [NSString stringWithFormat:@"%@/%@", string1, string2];
    		return _MakeStringCopy([string3 UTF8String]);	//注意返回值
        }
    }
    
    

    1.3 C#中调用

    	void Start () {
    
    #if UNITY_IOS && !UNITY_EDITOR
            string str = CallAppIOS.GetAppendString("Hello", "Wrold");
            Debug.Log(str);
    #endif
    
    }
    
  2. IOS调用U3D
    2.1 iOS中调用U3D的接口,与Android相似,通过UnitySendMessage方法来调用Unity所定义的方法

    	const char* _getAppendString(const char *str1, const char *str2)
        {
    		NSString *string1 = [[NSString alloc] initWithUTF8String:str1];
    		NSString *string2 = [[NSString alloc] initWithUTF8String:str2];
    
            NSString *string3 = [NSString stringWithFormat:@"%@/%@", string1, string2];
            
            //Main Camera 场景中接受消息的Object名字, ReceiveiOS 方法名, string3.UTF8String参数
            UnitySendMessage("Main Camera", "ReceiveiOS", string3.UTF8String);	//调用
            
    		return _MakeStringCopy([string3 UTF8String]);	//注意返回值
        }
    

    2.2 编写C#代码,挂载到Main Camera上

        public void ReceiveiOS(string str)
        {
            Debug.Log("ReceiveiOS " + str);
        }
    

    2.3 还有一种方法是通过入口参数,传入一个U3D的非托管方法,然后调用该方法,这里不做详解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值