美文网首页iOS
Unity 和 iOS之间的通信(交互)

Unity 和 iOS之间的通信(交互)

作者: 罗平油菜花 | 来源:发表于2021-12-03 16:11 被阅读0次

    上一篇主要说了将Unity集成到原生iOS应用程序中,集成之后肯定是要通信的,所以这篇来说一下Unity 和 iOS之间的通信。

    1、iOS调用Unity的方法并传参数

    在UnityFramework中提供的有专门的方法,因此我们只要调用就可以了。
    首先在AppDelegate.h中声明一个调用方法,方便后面使用。

    - (void)sendMessageWithName:(const char*)goName functionName:(const char*) functionName message:(const char*)msg;
    

    在AppDelegate.m中实现方法

    - (void)sendMessageWithName:(const char*)goName functionName:(const char*) functionName message:(const char*)msg{
         [self.ufw sendMessageToGOWithName:goName functionName:name message:msg];
    }
    

    这三个参数还是要解释一下的

    goName:表示Unity里面的场景的名字,Unity中方法一般是通过添加脚本的方式,使用C#来进行定义,每一个脚本都对应一个使用的场景,这边后面会简单说一下这个场景。

    functionName:就很好理解,iOS调用Unity具体的方法名字。

    msg:就是方法的参数

    针对上面👆的,我们简单做一个小demo(会的就直接跳过 );

    我们就简单将原生iOS的值传递给Unity,并通过Label显示出来。

    我们在unity中创建一个Text和脚本,并把脚本绑定在这个场景中。


    双击脚本进入代码编写,我这时候添加一些库的引用,声明上面的Text,以及书写方法修改Text的指,这里的方法正是给原生调用的方法。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using System.Runtime.InteropServices;
    
    public class ChangeLabel : MonoBehaviour
    {
         public Text text;
        [DllImport("__Internal")]
     
        public void changeLabel(string speedStirng) {
            text.text = speedStirng;
        }
    }
    
    

    到这unity工程就到此结束了。
    在原生工程中调用了

    AppDelegate *appDelegate = (AppDelegate *)([UIApplication sharedApplication].delegate);
        [appDelegate showUnityView];
        [appDelegate sendMessageWithName:"Canvas" functionName:"changeLabel" message:"好硬好强呀~~~~~"]
    

    2、Unity调用iOS的方法并传参数

    首先创建一个.h和.mm文件,用来书写需要交互的方法。
    上代码 NativeCallProxy.h

    #import <Foundation/Foundation.h>
    @protocol NativeCallsProtocol
    
    @required
    
    - (void)iOSLog:(NSString *)value;
    
    
    @end
    
    __attribute__ ((visibility("default")))
    
    @interface FrameworkLibAPI : NSObject
    // call it any time after UnityFrameworkLoad to set object implementing NativeCallsProtocol methods
    +(void) registerAPIforNativeCalls:(id<NativeCallsProtocol>) aApi;
    
    @end
    
    

    iOSLog 用来打印unity中的的文本。
    NativeCallProxy.mm

    #import <Foundation/Foundation.h>
    #import "NativeCallProxy.h"
    
    
    @implementation FrameworkLibAPI
    
    id<NativeCallsProtocol> api = NULL;
    +(void) registerAPIforNativeCalls:(id<NativeCallsProtocol>) aApi
    {
        api = aApi;
    }
    
    @end
    
    
    extern "C" {
    
    void iOSLog(const char * value);
    
    }
    
    
    void iOSLog(const char * value){
        
        return [api iOSLog:[NSString stringWithUTF8String:value]];
        
    }
    
    

    然后将刚才的两个文件拖到unity 中

    在Assets文件夹中新建Plugins文件夹,然后在Plugins文件夹中新建iOS。将上诉两个文件拖入其中。


    image.png

    现在我们在场景上新建一个输入框和一个按钮,点击按钮将输入框的内容,通过iOSLog打印出来。


    image.png

    控件创建好之后,在脚本中申明一下input。并书写相应逻辑
    上代码

    using System.Collections;
    using System.Collections.Generic;
    using System.Runtime.InteropServices;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class ChangeLabel : MonoBehaviour
    {
        public Text tmpText;
        public InputField tmpInput;
    
        
        public void changeLabel(string speedStirng) {
            tmpText.text = speedStirng;
        }
    
        public void btnClick(){
           iOSLog(tmpInput.text);
        }
    
        //这个很重要,关联iOS方法
        [DllImport("__Internal" )]
         static extern void iOSLog(string value);
    }
    
    
    

    申明之后就是将input关联到场景中。


    image.png

    然后就OK了,打包出来看看效果。
    按照上一篇文章中说的,整合在一起。


    image.png

    看到了我们添加的文件了。


    image.png
    改为public
    image.png
    按照之前的操作 image.png

    添加#import <UnityFramework/NativeCallProxy.h>引用

    注册协议
    [NSClassFromString(@"FrameworkLibAPI") registerAPIforNativeCalls:self];

    最后可以在Appdelegate中实现协议里面的方法了

    然后就可以run了

    结果正确


    image.png

    代码都在里面了(unity和Xcode 工程包也在里面):https://pan.baidu.com/s/13ywva1gPPkc334o7YCW_Lg

    提取码:e90o

    相关文章

      网友评论

        本文标题:Unity 和 iOS之间的通信(交互)

        本文链接:https://www.haomeiwen.com/subject/jnuuwltx.html