Unity3d與iOS的互動(1)
今天我們介紹Unity3d與iOS互動第一部分:iOS傳訊息到Unity3d中。下面我們開始吧:
1.
首先用Unity3d建立一個Plain,並調整好攝像機的角度以及光源的位置,如下所示:
2.
然後我們建立一個Cube,我們會在iOS中用Objective-C代碼來控制它旋轉:
3.
然後我們建立一個Rotate.js的指令碼並把它關聯到Cube上:
var vrotate : Vector3; //Rotate Leftfunction RotateLeft() {print("Rotate Left");transform.Rotate(Vector3.up * Time.deltaTime * 100, Space.World);} //Rotate Rightfunction RotateRight() {print("Rotate Right");transform.Rotate(Vector3.down * Time.deltaTime * 100, Space.World); } //Rotate Upfunction RotateUp(){print("Rotate Up");transform.Rotate(Vector3.right * Time.deltaTime * 100, Space.World); } //Rotate Downfunction RotateDown(){print("Rotate Down");transform.Rotate(Vector3.left * Time.deltaTime * 100, Space.World); }
上面的四個函數分別朝不同角度選擇Cube。我們會在iOS程式中調用這幾個Unity3d中的函數。
4.
然後在Unity3d中Build為XCode項目,開啟該項目。首先建立一個基於NSObject的類,名為MyViewInit,我們會將我們自己的介面初始化代碼都放在其中。修改MyViewInit.h如下:
//// MyViewInit.h// Unity-iPhone//// Created by tao hu on 9/15/12.// Copyright (c) 2012 __MyCompanyName__. All rights reserved.//#import <UIKit/UIKit.h>@interface MyViewInit : NSObject+(void)CreateButton:title rect:(CGRect)rect action:(SEL)action controller:(UIViewController *)controller;+(void)CreateTitle:(UIViewController *)controller;+(void)LeftButtonPressed;+(void)RightButtonPressed; +(void)UpButtonPressed;+(void)DownButtonPressed;+(void)Init:(UIViewController *)controller;@end
其中的方法都是類方法。在Init函數中我們完成了所有我們自訂介面的繪製(添加了四個UIButton和一個UILabel)。
5.
修改MyViewInit.m如下:
//// MyViewInit.m// Unity-iPhone//// Created by tao hu on 9/15/12.// Copyright (c) 2012 __MyCompanyName__. All rights reserved.//#import "MyViewInit.h"@interface MyViewInit ()@end@implementation MyViewInit//建立按鈕+(void)CreateButton:title rect:(CGRect)rect action:(SEL)action controller:(UIViewController *)controller{ UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; //設定按鈕範圍 btn.frame = rect; //設定按鈕顯示內容 [btn setTitle:title forState:UIControlStateNormal]; //設定按鈕改變後綁定的回應程式法 [btn addTarget:self action:action forControlEvents:UIControlEventTouchUpInside]; //加入View中 [controller.view addSubview:btn];}//建立標籤+(void)CreateTitle:(UIViewController *)controller{ //建立label視圖 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 40)]; //設定顯示內容 label.text = @"旋轉控制"; //設定背景顏色 label.backgroundColor = [UIColor blueColor]; //設定文字顏色 label.textColor = [UIColor whiteColor]; //設定顯示位置置中 label.textAlignment = UITextAlignmentCenter; //設定字型大小 label.font = [UIFont fontWithName:[[UIFont familyNames] objectAtIndex:10] size:20]; [controller.view addSubview:label];}//向左按鈕 +(void)LeftButtonPressed{ UnitySendMessage("Cube", "MoveLeft",""); } //向右按鈕 +(void)RightButtonPressed{ UnitySendMessage("Cube", "MoveRight",""); } //向上按鈕 +(void)UpButtonPressed{ UnitySendMessage("Cube", "MoveUp",""); } //向下按鈕 +(void)DownButtonPressed{ UnitySendMessage("Cube", "MoveDown",""); } +(void)Init:(UIViewController *)controller{ [self CreateTitle:controller]; [self CreateButton:@"左旋轉" rect:CGRectMake(0, 50, 100, 40) action:@selector(LeftButtonPressed) controller:controller]; [self CreateButton:@"右旋轉" rect:CGRectMake(0, 100, 100, 40) action:@selector(RightButtonPressed) controller:controller]; [self CreateButton:@"上旋轉" rect:CGRectMake(0, 150, 100, 40) action:@selector(UpButtonPressed) controller:controller]; [self CreateButton:@"下旋轉" rect:CGRectMake(0, 200, 100, 40) action:@selector(DownButtonPressed) controller:controller];}@end
其中:
UnitySendMessage函數有三個參數:
第一個是Scene中的模型的名稱,第二個是已經綁定在模型上的某個函數,第三個是char *類型的參數,用來將參數傳遞給這個函數。
我們可以用這個方法調用Unity3d中的任意一個模型上的任意一個函數。
6.
最後我們要做的是在程式啟動時調用上面的Init函數。找到AppController.mm檔案:
int OpenEAGL_UnityCallback(UIWindow** window, int* screenWidth, int* screenHeight, int* openglesVersion)
函數在Unity3d程式啟動時會被調用,其中的EAGLView 就是Unity3d的背景的那個View。我們在這個函數中調用我們的Init函數。修改OpenEAGL_UnityCallback如下:
int OpenEAGL_UnityCallback(UIWindow** window, int* screenWidth, int* screenHeight, int* openglesVersion){CGRect rect = [[UIScreen mainScreen] bounds];// Create a full-screen window_window = [[UIWindow alloc] initWithFrame:rect]; EAGLView* view = [[EAGLView alloc] initWithFrame:rect];UnityViewController *controller = [[UnityViewController alloc] init]; sGLViewController = controller;#if defined(__IPHONE_3_0)if( _ios30orNewer )controller.wantsFullScreenLayout = TRUE;#endifcontroller.view = view;[_window addSubview:view]; [MyViewInit init:controller];if( !UnityUseOSAutorotation() ){_autorotEnableHandling = true;[[NSNotificationCenter defaultCenter] postNotificationName: UIDeviceOrientationDidChangeNotification object: [UIDevice currentDevice]];}......
其實我們只加入了一句話:
[MyViewInit init:controller];
並在該檔案首部加入:
#import "MyViewInit.h"
7.
好了,終於要在真機上運行了:
初始介面:
點擊下旋轉按鈕:
旋轉Cube:
我們發現在XCode的Console視窗中輸出了Unity3d中的pirnt語句。因此,Unity3d中的print函數在真機上運行時是輸出到XCode的Console中。
最後代碼太大了,無法上傳,有需要的可以和我聯絡或在下面留言。
本文參考了雨松MOMO的文章,在此表示感謝:
http://blog.csdn.net/xys289187120/article/details/6926746
完成!