Unity3d与iOS的交互(1)
今天我们介绍Unity3d与iOS交互第一部分:iOS传消息到Unity3d中。下面我们开始吧:
1.
首先用Unity3d创建一个Plain,并调整好摄像机的角度以及光源的位置,如下所示:
2.
然后我们创建一个Cube,我们会在iOS中用Objective-C代码来控制它旋转:
3.
然后我们创建一个Rotate.js的脚本并把它关联到Cube上:
- var vrotate : Vector3;
- //Rotate Left
- function RotateLeft()
- {
- print("Rotate Left");
- transform.Rotate(Vector3.up * Time.deltaTime * 100, Space.World);
- }
- //Rotate Right
- function RotateRight()
- {
- print("Rotate Right");
- transform.Rotate(Vector3.down * Time.deltaTime * 100, Space.World);
- }
- //Rotate Up
- function RotateUp()
- {
- print("Rotate Up");
- transform.Rotate(Vector3.right * Time.deltaTime * 100, Space.World);
- }
- //Rotate Down
- function 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;
- #endif
- controller.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
From: http://blog.csdn.net/htttw/article/details/7982134