今天和大家討論iOS的高級界面與Unity3D游戲引擎的交互,這個在開發(fā)中是非常重要的,Unity3D 畢竟是一個面向多平臺的一個游戲引擎,它不可能全部為IOS 考慮的面面俱到,引擎中也不存在針對IOS的高級界面的控件的使用。

成都創(chuàng)新互聯(lián)公司專注于中大型企業(yè)的成都做網(wǎng)站、網(wǎng)站制作和網(wǎng)站改版、網(wǎng)站營銷服務(wù),追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計(jì)客戶數(shù)千家,服務(wù)滿意度達(dá)97%。幫助廣大客戶順利對接上互聯(lián)網(wǎng)浪潮,準(zhǔn)確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運(yùn)用,我們將一直專注品牌網(wǎng)站制作和互聯(lián)網(wǎng)程序開發(fā),在前進(jìn)的路上,與客戶一起成長!
本例實(shí)現(xiàn)游戲背景是Unity3D 的游戲世界,前面添加4個IOS的高級界面的按鈕,并且點(diǎn)擊這些按鈕可以將消息傳遞給背景的Unity3D ,讓它做一些事情。 上一章介紹了觸摸IOS屏幕 移動攝像機(jī)的位置,下面有盆友問我說他不想移動攝像機(jī)的位置,就想移動物體的位置,我在這里補(bǔ)充一下,可以把腳本綁定在箱子上,參照物選擇為主攝像機(jī),這樣子更新箱子的腳本就OK啦。今天例子,我就將腳本綁定在箱子上,如下圖所示,把Move腳本綁定在這個 Cube中。 先把Move腳本的代碼貼出來,這里面我寫了4個方法分別處理這個箱子的旋轉(zhuǎn),這4個方法是由IOS上的代碼向Unity發(fā)送消息后調(diào)用的,下面我會介紹具體操作的方法。
[代碼]js代碼:
| 01 |
var vrotate : Vector3; |
| 06 |
var rotate : float = Time.deltaTime * 100; |
| 07 |
vrotate = Vector3.up * rotate; |
| 08 |
transform.Rotate(vrotate, Space.World); |
| 14 |
var rotate : float = Time.deltaTime * 100; |
| 15 |
vrotate = Vector3.down* rotate; |
| 16 |
transform.Rotate(vrotate, Space.World); |
| 21 |
var rotate : float = Time.deltaTime * 100; |
| 22 |
vrotate = Vector3.right* rotate; |
| 23 |
transform.Rotate(vrotate, Space.World); |
| 28 |
var rotate : float = Time.deltaTime * 100; |
| 29 |
vrotate = Vector3.left* rotate; |
| 30 |
transform.Rotate(vrotate, Space.World); |
到這里盆友們可以將這個Unity工程導(dǎo)出成Xcode項(xiàng)目,不會的盆友請看我之前的文章哈,Xcode項(xiàng)目導(dǎo)出成功后,我們先添加4個高級界面的按鈕用來點(diǎn)擊響應(yīng)上面腳本的這4個旋轉(zhuǎn)箱子的方法。 創(chuàng)建一個類繼承UIViewController,用來添加我們的高級界面的視圖,我暫且命名為MyView. 打開Unity3D導(dǎo)出的AppController.mm這個類,頭文件處先導(dǎo)入我們的這個類 #import "MyView"
找到下面這個方法,來添加view
int OpenEAGL_UnityCallback(UIWindow** window, int* screenWidth, int* screenHeight, int* openglesVersion)
EAGLView 是Unity3D 背景的那個View, 下面我們添加一個我們自己寫的View 覆蓋在它上面。
[代碼]c#/cpp/oc代碼:
| 1 |
// Create a full-screen window |
| 2 |
_window = [[UIWindow alloc] initWithFrame:rect]; |
| 3 |
EAGLView* view = [[EAGLView alloc] initWithFrame:rect]; |
| 4 |
[_window addSubview:view]; |
| 6 |
MyView * myView = [[MyView alloc] init]; |
| 7 |
[_window addSubview:myView.view]; |
貼出MyView的代碼,寫完發(fā)現(xiàn)忘釋放內(nèi)存了,呵呵,懶得改了,本章主要的介紹的不是這個哦。
[代碼]c#/cpp/oc代碼:
| 005 |
// Created by 雨松MOMO on 11-11-1. |
| 006 |
// Copyright 2011 __MyCompanyName__. All rights reserved. |
| 012 |
@implementation MyView |
| 015 |
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. |
| 016 |
- (void)viewDidLoad { |
| 019 |
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 40)]; |
| 021 |
label.text = @"雨松MOMO的程序世界"; |
| 023 |
label.backgroundColor = [UIColor blueColor]; |
| 025 |
label.textColor = [UIColor whiteColor]; |
| 027 |
label.textAlignment = UITextAlignmentCenter; |
| 029 |
label.font = [UIFont fontWithName:[[UIFont familyNames] objectAtIndex:10] size:20]; |
| 032 |
UIButton *button0 = [UIButton buttonWithType:1]; |
| 034 |
button0.frame = CGRectMake(0, 40, 100, 30); |
| 036 |
[button0 setTitle:@"矩形左旋轉(zhuǎn)" forState:UIControlStateNormal]; |
| 037 |
//設(shè)置按鈕改變后 綁定響應(yīng)方法 |
| 038 |
[button0 addTarget:self action:@selector(LeftButtonPressed) forControlEvents:UIControlEventTouchUpInside]; |
| 041 |
UIButton *button1 = [UIButton buttonWithType:1]; |
| 043 |
button1.frame = CGRectMake(0, 100, 100, 30); |
| 045 |
[button1 setTitle:@"矩形右旋轉(zhuǎn)" forState:UIControlStateNormal]; |
| 046 |
//設(shè)置按鈕改變后 綁定響應(yīng)方法 |
| 047 |
[button1 addTarget:self action:@selector(RightButtonPressed) forControlEvents:UIControlEventTouchUpInside]; |
| 050 |
UIButton *button2 = [UIButton buttonWithType:1]; |
| 052 |
button2.frame = CGRectMake(0, 160, 100, 30); |
| 054 |
[button2 setTitle:@"矩形上旋轉(zhuǎn)" forState:UIControlStateNormal]; |
| 055 |
//設(shè)置按鈕改變后 綁定響應(yīng)方法 |
| 056 |
[button2 addTarget:self action:@selector(UpButtonPressed) forControlEvents:UIControlEventTouchUpInside]; |
| 059 |
UIButton *button3 = [UIButton buttonWithType:1]; |
| 061 |
button3.frame = CGRectMake(0, 220, 100, 30); |
| 063 |
[button3 setTitle:@"矩形下旋轉(zhuǎn)" forState:UIControlStateNormal]; |
| 064 |
//設(shè)置按鈕改變后 綁定響應(yīng)方法 |
| 065 |
[button3 addTarget:self action:@selector(DownButtonPressed) forControlEvents:UIControlEventTouchUpInside]; |
| 069 |
[self.view addSubview:label]; |
| 070 |
[self.view addSubview:button0]; |
| 071 |
[self.view addSubview:button1]; |
| 072 |
[self.view addSubview:button2]; |
| 073 |
[self.view addSubview:button3]; |
| 077 |
-(void)LeftButtonPressed{ |
| 078 |
UnitySendMessage("Cube","MoveLeft",""); |
| 082 |
-(void)RightButtonPressed{ |
| 083 |
UnitySendMessage("Cube","MoveRight",""); |
| 086 |
-(void)UpButtonPressed{ |
| 087 |
UnitySendMessage("Cube","MoveUp",""); |
| 091 |
-(void)DownButtonPressed{ |
| 092 |
UnitySendMessage("Cube","MoveDown",""); |
| 097 |
- (void)didReceiveMemoryWarning { |
| 098 |
// Releases the view if it doesn't have a superview. |
| 099 |
[super didReceiveMemoryWarning]; |
| 101 |
// Release any cached data, images, etc. that aren't in use. |
| 104 |
- (void)viewDidUnload { |
| 105 |
[super viewDidUnload]; |
這里我主要說一下下面這個方法,它是Unity底層幫我們寫好的一個方法,意思iPhone向向Unity發(fā)送消息,
參數(shù)1:場景中的模型名稱,Cube就是我們定義的一個箱子。
參數(shù)2:腳本方法名稱MoveLeft就是上面腳本中的方法,
參數(shù)3:為一個char *類型的 可以向Unity中傳遞數(shù)據(jù)。
UnitySendMessage("Cube","MoveLeft","");
我們可以向Unity3D中任意模型發(fā)送消息調(diào)用它綁定的腳本中的方法,當(dāng)前前提是模型名稱、方法名稱、 參數(shù)都填寫正確。
這里4個按鈕都是以這種方式傳遞消息,下面是iPhone 真機(jī)的效果圖,我們觸摸點(diǎn)擊4個高級界面的按鈕可以實(shí)現(xiàn)Unity3D世界中的模型旋轉(zhuǎn), 所以大家一定要切記這個方法,很重要噢,哇咔咔~
Move.unitypackage.zip
新聞標(biāo)題:Unity3D游戲引擎之iOS高級界面消息發(fā)送與接收
文章轉(zhuǎn)載:
http://fisionsoft.com.cn/article/ccecihd.html