1. 程式人生 > >Unity3D 嵌入iOS原生程式碼,並實現unity iOS之間的互動

Unity3D 嵌入iOS原生程式碼,並實現unity iOS之間的互動

Unity iOS嵌入 互動 傳值

專案需要用到iOS和Unity之間的互動, 就捯飭了一下

我專案是Unity工程大, iOS工程小, 所以在是Unity匯出的xcode工程裡嵌入iOS的原生程式碼

先看下我的檔案目錄


iOS 放iOS 原生工程程式碼(我是在這邊做好 測試好才合併的)

Unity 放Unity的原生工程程式碼

Unity_iOS   方Unity匯出的xcode專案(這個也是最後的合併版)

1.先建一個簡單的unity工程(我專案有用到Vuforia 我就先建立了一個簡單的Vuforia的介面)


2.開始匯出xcode 專案(請先確保你的unity可以正常執行 )

3.設定Player Setting  (根據你專案需求配置)

注意:Vuforia工程的話Auto Graphics API 刪除Metal, 單是unity專案不用管它


4.路徑選擇到Unity_iOS檔案下

5.開啟匯出後的工程, 正常的話配置下team 就可以執行

6.建立ARCKRAppController 繼承自 UnityAppController

 把.h .m合併在一起 程式碼如下(先不要編譯,此檔案是要拖到unity工程裡的,在xcode裡寫是有提示方便寫)

#import "UnityAppController.h"
#import <UI/UnityView.h>
#import <UI/UnityViewControllerBase.h>
#import "MyMainViewController.h"
@interface ARCKRAppController :UnityAppController
@property (nonatomic,strong)UINavigationController *navc;
//-(void)createViewHierarchyImpl;
-(void)createUI;
@end
@implementation ARCKRAppController
//iOS8後 createViewHierarchyImpl棄用更改方法為
//-(void)createViewHierarchyImpl{
-(void)createUI{
    _rootController = [[UIViewControlleralloc]init];
    _rootView = [[UIViewalloc]initWithFrame:[UIScreenmainScreen].bounds];
    _rootController.view =_rootView;
    MyMainViewController *vc = [[MyMainViewControlleralloc]init];
    self.navc = [[UINavigationControlleralloc]initWithRootViewController:vc];
    [_rootViewaddSubview:self.navc.view];
   _window.rootViewController =_rootController;
    [_windowbringSubviewToFront:_rootView];
    [_windowmakeKeyAndVisible];
}
@end
IMPL_APP_CONTROLLER_SUBCLASS(ARCKRAppController)


7.上面的MyMainViewController 是我的首介面,我是把unity介面直接當做首介面了,你可以用自己的介面


在其他任何你想顯示unity 介面的控制器中加這兩句程式碼就可以 記得檔案字尾改.mm

[self.viewaddSubview:GetAppController().unityView];

GetAppController().unityView.frame = self.view.frame;

 做為首介面 [selfinitUI]; 放在viewDidLoad裡 會縮小unity的介面,所以把它放在viewDidAppear裡了

測試其他介面 在viewDidLoad里加載是正常的;

#import "MyMainViewController.h"
#import <UI/UnityView.h>
#import <UI/UnityViewControllerBase.h>
#import "UnityAppController+ViewHandling.h"
#import <UIKit/UIKit.h>
#import "UserViewController.h"

@interfaceMyMainViewController ()
@end
@implementation MyMainViewController
- (void)viewDidLoad {
    [superviewDidLoad];
    self.view.backgroundColor = [UIColorclearColor];
    self.title [email protected]"MyMain";
}
-(void)initUI{
    [self.viewaddSubview:GetAppController().unityView];
    GetAppController().unityView.frame =self.view.frame;
    UIButton *btn = [UIButtonbuttonWithType:UIButtonTypeSystem];
    btn.frame =CGRectMake(0,0,300,100);
    btn.center =self.view.center;
    [btn setTitle:@"go"forState:UIControlStateNormal];
    [btn addTarget:selfaction:@selector(go)forControlEvents:UIControlEventTouchUpInside];
    [self.viewaddSubview:btn];
}
//寫在viewDidAppear裡,等到原始介面載入完再載入,寫在viewDidLoad裡顯示不是全屏
-(void)viewDidAppear:(BOOL)animated{
    [selfinitUI];
}

-(void)go{
   UserViewController *vc = [[UserViewControlleralloc]init];
   [self.navigationControllerpushViewController:vc animated:YES];
}
- (void)didReceiveMemoryWarning {
    [superdidReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end


8.你可以建幾個空介面進行測試跳轉

9.然後把ARCKRAppController.mm 檔案拖到unity工程下 注意檔案存放目錄,並刪除xcode裡的ARCKRAppController.mm

一定要是Assets-Plugins-iOS 這個目錄


10.command + B 編譯,不要重新導,只編譯ARCKRAppController 會自動編譯到xcode專案下


11.現在執行可以 跳轉, 嵌入成功

首先iOS調Unity的方法

使用 Untiy寫好的方法 UnitySendMessage

為了方便直接改MyMain裡go的方法進行測試

#import "MyMainViewController.h"
#import <UI/UnityView.h>
#import <UI/UnityViewControllerBase.h>
#import "UnityAppController+ViewHandling.h"
#import <UIKit/UIKit.h>
#import "UserViewController.h"

@interface MyMainViewController ()
@end

@implementation MyMainViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor clearColor];
    self.title = @"MyMain";
}
-(void)initUI{
     [self.view addSubview:GetAppController().unityView];
       GetAppController().unityView.frame = self.view.frame;
    UIButton *btn = [UIButton buttonWithType:UIButtonTypeSystem];
    btn.frame = CGRectMake(0, 0, 300, 100);
    btn.center = self.view.center;
    [btn setTitle:@"go" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(go) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
}
-(void)viewDidAppear:(BOOL)animated{
    [self initUI];
}

-(void)go{
    //引數1 場景中模型的名字
    //引數2 指令碼名稱方法
    //引數3 想unity傳遞一個char型別的資料
   UnitySendMessage("iOSSendMessageToUnity", "ChangeCameraDirection", "");
}


unity裡程式碼如下


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class iOSSendMessageToUnity : MonoBehaviour {

    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        
    }
    public    void ChangeCameraDirection(){
        Debug.Log(@"更改相機方向");
    }
}



Unity 調iOS

我在介面左下角建立了一個button 這個是用來測試呼叫iOS方法的

UnitySendMessageToiOS 準備用作工具類 放所有呼叫iOS的方法

using UnityEngine;
using System.Runtime.InteropServices;

public class UnitySendMessageToiOS : object {

    //匯出按鈕以後將在xcode專案中生成這個按鈕的註冊
    //iOS中的註冊格式

    [DllImport("__Internal")]
    private static extern void _PressShareBtn();

    public static void ShareSceneIniOS(){
        if (Application.platform != RuntimePlatform.OSXEditor) {
            _PressShareBtn ();
        }
    }
}

btton關聯的指令碼 和方法
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MainScene : MonoBehaviour {

    public GameObject shareBtn;

    public void OnShareBtnClick(){
        UnitySendMessageToiOS.ShareSceneIniOS (); 
    }
    // Use this for initialization
    void Start () {
        
    }

    // Update is called once per frame
    void Update () {
        
    }
}

然後到xcode裡, 我建立了一個空的類 用來接收unity 發來的訊息
#import "ReceiveUnitySystemEvent.h"
@interface ReceiveUnitySystemEvent ()

@end

@implementation ReceiveUnitySystemEvent

void _PressShareBtn()
{
    UIAlertView *alert = [[UIAlertView alloc]init];
    [alert setTitle:@"分享];
    [alert setMessage:@"點選了分享 按鈕"];
    [alert addButtonWithTitle:@"確定"];
    [alert show];
}




相關推薦

Unity3D 嵌入iOS原生程式碼,實現unity iOS之間互動

Unity iOS嵌入 互動 傳值 專案需要用到iOS和Unity之間的互動, 就捯飭了一下 我專案是Unity工程大, iOS工程小, 所以在是Unity匯出的xcode工程裡嵌入iOS

iOS原生程式碼通過webView與js指令碼互動

  前段時間公司的一個專案需要使用的到OC程式碼與js指令碼的互動。對於入行不久的我,當時也是在部落格裡面爬文來解決。做下來之後把我自己通過實踐和學習得來的東西整理一下,以便在這方面接觸不多的人能夠快速的掌握OC與js的互動。新手教程,大神勿噴,如有錯誤,多多指教。    

Unity3D-呼叫IOS原生分享的實現

連線 最近專案需要更改分享方式,以前接入各種SKD去分享的,現在要求直接使用IOS原生分享的介面! 一開始去網上找,發現並沒有人直接寫程式碼使用,但是在Unity的AssetStore中我找到了一個外掛,也就是IOSNative外掛,但是外掛帶的功能比較多,我自己基本用不到

[iOS 原生程式碼實現掃描二維碼/條形碼] AVCaptureDevice

//參照別人的教程的作業貼 記錄一下注意點 掃碼的主要原生程式碼如下 這裡比較關鍵的是對掃碼作用範圍的確定,metdataOutput.rectOfInterest 如果不設定,那麼預設就

cocos2d-x + Lua接入iOS原生SDK的實現方案

相信很多朋友在使用cocos2d-x+lua開發遊戲時都遇到過接入iOS原生SDK的問題,比如常見的接應用內支付SDK,廣告SDK或是一些社交平臺SDK等等,我也沒少接過這類SDK。這篇文章主要是對我做過專案中接入iOS原生SDK實現方案的一個總結,在這裡分享給大家,希望對自己和大家的開發工作都有幫

思科模擬器配置DNCP,實現不同Vlan之間的通信

設置 虛擬 fill 數據 orm ont box 指向 break 1.準備工作:一臺DHCP服務器,一臺路由器,一臺三層交換機,二臺交換機,四臺PC機2.實驗環境:四臺PC名為PC1,PC2,PC3,PC4,倆臺二層交換機名為SW2,SW3。三層交換機名為SW1。路由器

關於"一個作業系統下如何安裝多個不同版本的JDK?"、實現不同版本之間的相互切換使用

本文章將教你如何在一個作業系統下安裝多個不同版本的JDK, 並且實現不同版本直接的相互切換使用。 JDK的各個版本如下:  由於以前我們總是習慣直接在Oracle官網上找到所需的版本進行直接下載JDK, 但是筆者我今天也是埋頭直接去了官網, 奈何Oracle官方已經限制了

Android新增Activity,實現多Activity之間的切換

開啟 AndroidManifest.xml 找到節點 application 並增加 activity <activity android:name="TestActivity" android:theme="@style/AppTheme">

[unity3d]unity中打包成.unity3d格式實現本地加載出來

1.首先我們把這段程式碼拷貝下來,放進工程,不要託給任何物體,就放在那不要理它。 using UnityEngine; using UnityEditor; public class ExportAssetBundles { [MenuItem("Export/B

vue 實現 ios 原生picker 效果(實現思路分析)

sta 效果 cursor touchend orm dex tex sub alt 以前最早實現了一個類似的時間選擇插件,但是適用範圍太窄,索性最近要把這個實現方式發布出來,就重寫了一個高復用的vue組件。 支持安卓4.0以上,safari 7以上 效果預覽 gitHu

Unity(Android版)和Android原生APP簡單實現版本更新

directory 代碼 server 頁面 提示框 自動安裝 obj nis 查看 版本檢測接口說明:(1)請求post,無參數(2)調用地址:http://www.baidu.com/rs/ver/info(3)返回結果:{ "verCode": "2",

WebViewJavascriptBridge實現js與android和ios原生交互

WebViewJavascriptB Android IOS js 1、實現原生與js交互 <!-- 申明交互 這段代碼固定必須有 --> function setupWebViewJavascriptBridge(callback) { //android使用

iOS截屏修改截圖然後分享的功能實現

interact nslog getheight enable esc EDA sid nsf style 一. 實現的效果類似微博的截圖分享 不僅截圖分享的時候還進行圖片的修改,增加自己的二維碼 二.實現方式 蘋果在ios7之後提供了一個新的通知類型:UIApplic

Unity呼叫iOS原生內購

Unity在5.x以後的版本,都附帶了各種平臺的IAP(內購),網上一搜Unity IAP,就一大堆如何如何接入的教程,據說還挺方便的。本人也是用Unity 5.x,也曾經用了一下Unity的IAP,那為何現在還要討論呼叫iOS原生的IAP呢? 在這裡不得不吐槽一下Unity的IAP,雖然它目的

IOS 原生介面和Weex容器互相跳轉實踐 附部分js和原生程式碼

weex相關原理,請看官方網站 此IOS Weex demo實現的功能,從原生介面跳轉到Weex容器頁面,然後點選Weex容器頁面的button(js)跳轉到另一個原生介面。 一. 先上效果圖   二.實現 1. weex容器渲染的js程式碼如下,上面

一個很簡單的基於棧式過程虛擬機器的實現,它執行目標平臺【x86】的原生程式碼

    本文提供的 “棧式過程虛擬機器” 的實現,掛在本人的 github 上面,對想要深入瞭解 “棧式過程虛擬機器” 的人,它或許可以起到一個不錯的作用,但是本人建議一般性瞭解就可以了,另外順帶一提:如果你想要依靠它維持生活,在咋們國家是不可能不現實的,到時候你就只有 “多冷的

unity3d嵌入iOS工程(3d物體和iOS控制元件顯示在同一個view上)

最近公司要開發一款用於3d展示的應用,通過在網上拜讀各大神的帖子,終於完美解決此類問題。(unity3d版本2017.3,xcode9.2) 前邊unity3d打包iOS工程的方法在此就不做贅述,其他帖子基本可以解決,本帖直接上乾貨。 1、在打包好的iOS工程中,找到UnityAppCont

持續整合之整合Jenkins與程式碼質量管理平臺Sonar實現構建失敗郵件通知

一:Sonar是什麼?Sonar 是一個用於程式碼質量管理的開放平臺,通過外掛機制,Sonar 可以整合不同的測試工具,程式碼分析工具,以及持續整合工具。與持續整合工具(例如 Hudson/Jenkins 等)不同,Sonar 並不是簡單地把不同的程式碼檢查工具結果(例如FindBugs,PMD等)直接顯示在

unity iOS原生代碼總結(一)

1.  專案能直接運行了,但是程式碼的實際資料流動任然會有問題。 2.  unity的程式碼能這麼簡單的被呼叫簡直是奇蹟一樣,不需要大的改動就能夠使用。 3.  目前需要注意的問題就是,unity的內容還太少,基本不夠看的。有時間找幾個好看的模型吧(利用周4的上課時間嗎) 4.  unity iOS之間

[TensorFlowJS只如初見]實戰一·JavaScript原生程式碼實現梯度下降求最小值

[TensorFlowJS只如初見]實戰一·JavaScript原生程式碼實現梯度下降 問題描述: 求解y1 = xx -2 x +3 + 0.01*(-1到1的隨機值) 與 y2 = 0 的最小距離點(x,y) 給定x範圍(0,3 不使用學習框架,手動編寫梯度下降公式求解,提示