1. 程式人生 > >Unity與IOS通訊

Unity與IOS通訊

一、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 [email protected] (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 [email protected] (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 [email protected] 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 [email protected] 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工程如果在真機上除錯會報錯無法開啟網頁,解決辦法在下面你的文章中:

@還會出現會出現一種執行崩潰現象,報錯:ression_pvrtc OPENGL LOG: Creating OpenGL ES 2.0 graphics device (lldb)解決辦法如下:

執行結果:


二. IOS呼叫Unity指令碼的函式(UnitySendMessage函式)

在iOS中使用oc程式碼呼叫unity指令碼函式間接控制unity場景裡面的object等等,下面這篇文章的例子比簡單典型:

orz......有問題吐槽請留言,幫到您煩請幫頂一下,謝謝^_^

相關推薦

UnityIOS通訊

一、Unity呼叫OC函式,主要用於第三方SDK接入從Unity傳送訊息呼叫OC程式碼在Unity場景上開啟一個UIWebView並傳入url開啟一個原生網頁要想在Unity介面上開啟一個原生的UIWebView需要在unity介面上覆蓋一個新的UIView及其UIViewC

unity反饋訊息到ios Unityios互動

本文學習怎麼在unity裡返回訊息到iOS,現實功能(點選unity裡面的按鈕傳遞一個字串到ios顯示在訊息對話方塊上,並且開啟一個新的VeiwContoller)。言歸正傳 首先我們建立一個unity工程,建立一個MainScript指令碼,程式碼如下: using

UnityJava通訊

因為unity需要接入java的sdk,所以今天主要學習了一下相關的通訊方法。需要先做如下準備工作:   1、下載android SDK安裝包,http://pan.baidu.com/s/1dDGM8oD,裡面會包含sdk和eclipse兩個資料夾;  

UnityIOS互動,呼叫IOS系統相機和相簿

前面兩篇總結了一下unity與android的簡單互動和呼叫安卓系統相機和相簿,比較蛋疼的是,後來發現不同的測試機上會有不同的bug。。。下階段要一個一個的解決一下 今天總結一下與IOS的互動。這次我會跳過ios單獨的呼叫相機和相簿的講解,因為我對IOS不專業,講不好,如

unityios互動那點事兒

unity與ios互動 Unity中呼叫Objective-C/C++方法 1、[DllImport("__Internal")] 特性 在Unity新建專案中,Progect --> Create --> C# Script ,然後使用 [DllIm

UnityAndroid通訊 04匯入Aar包

切換檢視到Project去,找到Testlibrary=>Build=>outputs=>aar,找到aar包,在aar包裡的XML不動包名,刪除lcon和Lable屬性,包裡的libs下的classe

Unity LuaFrameWorkSkynet通訊

百度了一下用Unity 與SKYNET通訊的基本沒什麼有手把手的文章。。打算搞一篇。不過對於新手來說。。SKYNET不好上手,相關的資料比較少。而且SKYNET使用的主體語言是LUA,在Unity方面,為了熱更新大家都會使用ToLua#, ToLua#的現成框架就是LuaFr

iOS 主動native 通訊

flutter與Native互動是必不可少的,今天梳理一下,flutter監聽native訊息 大致流程 flutter註冊EventChannel flutter EventChannel監聽native訊息 native通過EventChannel傳送訊息 程式碼梳

通過aar包實現Unity安卓間的通訊

前言:(最近做了一個虛擬現實和物聯網專案,名字聽起來高大上,其實就是用Unity做個安卓端的虛擬現實場景,然後通過藍芽接收單片機發來的溫度資料,在場景裡顯示。由於Unity引擎本身沒法呼叫藍芽,所以需要通過呼叫安卓aar包來呼叫藍芽,所以涉及到了安卓和unity之間的通訊。)

IOS藍芽4.0讀卡器通訊

IOS學習也一段時間了,該上點乾貨了。前段時間研究了一下IOS藍芽通訊相關的東西,把研究的一個成果給大家分享一下。 一 專案背景 簡單介紹一下做的東西,裝置是一個金融刷卡器,通過藍芽與iphone手機通訊。手機端的app通過傳送不同的指令(通過藍芽)控制刷卡器執行一些動作

iOS Client WebSocket 通訊(一)

         這一篇我們先了解一下基本知識,這樣對我們後面的學習更加有幫助  。           Socket,WebSocket,Http,Tcp等這些我們已經聽的耳朵有繭了,但是用得時候

Unity C#伺服器 實現Socket的UDP通訊(多客戶端)

前言 上一篇簡單的介紹了下Unity客戶端和伺服器的Socket通訊,但是還不能實現多個客戶端與伺服器的通訊,所以今天在這邊把前面的工程完善一下(使用的是上篇講到的UdpClient類來實現),實現多個客戶端與伺服器的udp通訊。效果圖如下,兩個客戶端可以向伺服器傳送訊息,

使用UDP方式 iOS端App通訊

首先需要安裝一個TCP&UDP測試工具 連線型別選擇UDP 目標IP 設定手機的IP, 埠8888 (這個埠在App端用來繫結) 指定埠, 是App向回發信息所需要的埠,

Node.js 基於 ursa 模組的 RSA 加密解密(已IOS,Android實現加密通訊

前幾天除錯一個RSA加密,遇到一些問題,在網上找了好久好久,與Node.js相關的資源少得非常可憐,最後還是靠自己一步一步解決了,今天把程式碼和一些心得拿出來分享一下: cnode連結地址:https://cnodejs.org/topic/54d2de4cf

unity android交互

andro android版本 代碼 http 分享 cnblogs 希望 java blog 使用eclipse新建一個Android應用工程,在新建的過程中,使得這個工程的包名和Unity工程的包名一致,我選的android版本為4.x。unity 的版本是5.4.1

unityxcode交互的問題集錦

分享 com img ges nbsp 題集 unit unity xcode unity與xcode交互的問題集錦

UnityAndroid交互-Unity接入高德地圖實現定位以及搜索周邊的功能(使用Android Studio)詳細操作

nac mcc 以及 分享 pack create lis red 效果 剛進公司給安排的任務就是Unity接入高德地圖,算是踩了不少坑總算做出來了,抽點時間寫個博客記錄一下 廢話不多說 先上效果圖 獲取定位並根據手機朝向顯示周邊信息 使用的Unity

UnityAndroid的問題

jdk android unity r.java appcompat 先說下自己的開發環境Win7 x64Unity5.2.2Android Studio 2.3.2(以下簡稱AS)JDK1.7再說下創建項目在AS中創建一個新項目用empty activity將Unity中的classes

unityiOS小細節

cnblogs bsp unit logs .com blog 細節 alt unity unity 轉 iOS小細節

Unity23種設計模式】狀態模式(State)

unity public text 開始 sys 狀態模式 改變 val 繼承 定義: “讓一個對象的行為隨著內部狀態的改變而變化,而該對象也像是換了類一樣” 應用場景: 角色AI:控制角色在不同狀態下的AI行為 服務器連接狀態:開始連線、連線中、斷線等狀態 關卡進