一、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......有问题吐槽请留言,帮到您烦请帮顶一下,谢谢^_^