原创

Unity与IOS通信

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cordova/article/details/51111606

一、Unity调用OC函数,主要用于第三方SDK接入


从Unity传送消息调用OC代码在Unity场景上打开一个UIWebView并传入url打开一个原生网页


要想在Unity界面上打开一个原生的UIWebView需要在unity界面上覆盖一个新的UIView及其UIViewController,原理是获取当前的unity场景(其实在IOS中也是一个UIViewController)的UIViewController,然后添加子页面子控制器


这里在Unity中新建一个场景,放置一个按钮,实现点击按钮打开一个IOS原生UIWebView覆盖在当前场景上,Unity工程结构如下:



将Test.cs脚本里面的OpenWebView函数绑定在按钮上,点击按钮触发此函数打开UIWebView,Test.cs脚本定义如下:

//
//Test.cs
//
// Created by [JiangXinhou]
//
// Copyright jiangxinhou@outlook.com (http://blog.csdn.net/cordova)
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;// 加入运行时动态加载服务

public class Test : MonoBehaviour {

	///打开一个IOS原生网页
	public void OpenIOS(){
		OpenWebView ("http://blog.csdn.net/cordova");
	}

	//引入内部动态链接库函数【注意多个函数要多次添加下面的DllImport语句】
	[DllImportAttribute("__Internal")] // 或[DllImport("__Internal")]
	public static extern int OpenWebView (string url);
}


Test.mm文件和IOS原生类文件在导出Xcode工程后编辑,Unity打包导出Xcode工程后打开:

              


这里我们关心的是Class目录下的UnityAppController.mm和Libraries目录下的Plugins目录,Plugins目录即在Unity中新建的Plugins文件夹,以Plugins命名的文件夹会被系统识别出来,其子目录IOS(或iOS)和Android目录同样会被识别,这里在IOS目录下新建Test.mm文件和一个UIWebViewController类文件,Test.mm用于通过c语言代码衔接Unity脚本和OC语言进行通信,获取当前Unity场景,并在场景上覆盖一个UIWebView,Test.mm代码如下:

//
//  Test.m
//
// Created by [JiangXinhou]
//
// Copyright jiangxinhou@outlook.com (http://blog.csdn.net/cordova)
#import <Foundation/Foundation.h>
#import "UnityAppController.h"
#import "OpenWebViewController.h"

extern "C" int OpenWebView(const char *url){
    //获取Unity rootviewcontroller
    UIViewController *unityRootVC = UnityGetGLViewController();
    UIView *unityView = UnityGetGLView();
    //创建我们需要打开的webview
    OpenWebViewController *webVC = [[OpenWebViewController alloc]init];
    //传入需要打开的网址
    webVC.url = [NSString stringWithUTF8String:url];
    //添加一个自定义导航视图把将要打开的webview作为根视图
    UINavigationController *navVC = [[UINavigationController alloc]initWithRootViewController:webVC];
    //添加到Unity场景的rootview
    [unityRootVC addChildViewController:navVC];
    [unityView addSubview:navVC.view];
    return 0;
}


其中的UIWebView可以换成任何UIKit的ViewController,然后就可以写OC代码了,这里UIWebViewController示例代码如下:

//
//  OpenWebViewController.h
//  Demo
//
//  Created by 919575700@qq.com on 4/30/16.
//  Copyright (c) 2015 Jiangxh. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface OpenWebViewController : UIViewController

/**
 *  网址参数传入
 */
@property (nonatomic, copy)NSString *url;

@end

//
//  OpenWebViewController.m
//  Demo
//
//  Created by 919575700@qq.com on 4/30/16.
//  Copyright (c) 2015 Jiangxh. All rights reserved.
//
#import "OpenWebViewController.h"

@interface OpenWebViewController ()<UIWebViewDelegate>

/**
 *  webview
 */
@property (nonatomic, strong)UIWebView *webView;

/**
 *  加载网址页面
 */
- (void)loadWebViewWithString: (NSString *)urlStr;

@end

@implementation OpenWebViewController

/**
 *  视图加载
 */
- (void)viewDidLoad {
    [super viewDidLoad];
    
    //背景色
    self.view.backgroundColor = [UIColor grayColor];
    //标题显示当前网址
    self.title = _url;
    
    //添加导航栏返回按钮
    UIButton *returnBtn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [returnBtn setTitle:@"返回" forState:UIControlStateNormal];
    [returnBtn sizeToFit];
    [returnBtn addTarget:self action:@selector(CloseWebView) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *returnItem = [[UIBarButtonItem alloc]initWithCustomView:returnBtn];
    self.navigationItem.leftBarButtonItem = returnItem;
    
    //屏幕尺寸
    CGFloat ApplicationW = [[UIScreen mainScreen] bounds].size.width;
    CGFloat ApplicationH = [[UIScreen mainScreen] bounds].size.height;
    
    // webview
    _webView = [[UIWebView alloc] init];
    //frame
    [_webView setFrame:CGRectMake(2, 2, ApplicationW, ApplicationH - 2)];
    //自适应
    _webView.autoresizingMask = UIViewAutoresizingFlexibleHeight |UIViewAutoresizingFlexibleWidth;
    _webView.scalesPageToFit = YES;
    //设置webview的代理
    _webView.delegate = self;
    //添加到页面
    [self.view addSubview:_webView];
    //加载网页
    [self loadWebViewWithString:_url];
}

/**
 *  加载网址页面
 */
- (void)loadWebViewWithString:(NSString*)urlStr {
    // 网址字符串转URL
    NSURL *url = [NSURL URLWithString:urlStr];
    // url请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    // 加载url请求
    [_webView loadRequest:request];
}

/**
 *  关闭webview页面
 */
- (void)CloseWebView {
    [self.navigationController.view removeFromSuperview];
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
}

#pragma mark webview委托方法
/**
 *  开始加载
 */
- (void)webViewDidStartLoad:(UIWebView *)webView {
    NSLog(@"开始加载...");
}
/**
 *  加载完成
 */
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSLog(@"加载完成...");
}
/**
 *  加载出错
 */
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error {
    NSLog(@"加载出错:%@",[error localizedDescription]);
}

@end




@上面的Xcode工程如果在真机上调试会报错无法打开网页,解决办法在下面你的文章中:

http://blog.csdn.net/cordova/article/details/50853420


@还会出现会出现一种运行崩溃现象,报错:ression_pvrtc OPENGL LOG: Creating OpenGL ES 2.0 graphics device (lldb)解决办法如下:

http://blog.csdn.net/cordova/article/details/51286551


运行结果:





二. IOS调用Unity脚本的函数(UnitySendMessage函数)


在iOS中使用oc代码调用unity脚本函数间接控制unity场景里面的object等等,下面这篇文章的例子比简单典型:

http://blog.csdn.net/htttw/article/details/7982134


orz......有问题吐槽请留言,帮到您烦请帮顶一下,谢谢^_^

展开阅读全文

没有更多推荐了,返回首页

博客模板©2019 由CSDN提供 模版主题为:skin-blackboard by CSDN官方博客 设计