欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Unity3d与iOS之间的相互调用

程序员文章站 2022-03-03 22:05:37
Unity3d与iOS的交互实现原理ios开发使用的语言是objective-c(也称object-c),u3d中使用DllImport的Attribute,以非托管方式将库中的方法导出到C#中进行使用。而传入"__Internal"则是表示这个是一个静态库或者是一个内部方法。通过上面的声明,这个方法就可以在C#里面进行调用了。 using UnityEngine; using System.Collections; using System.Runtime.InteropServi...

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的非托管方法,然后调用该方法,这里不做详解。

本文地址:https://blog.csdn.net/wangningzk123/article/details/107359522

相关标签: unity3d IOS