Unity3d與iOS的互動(1)

來源:互聯網
上載者:User

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





完成!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.