
本例实现游戏背景是Unity3D 的游戏世界,前面添加4个IOS的高级界面的按钮,并且点击这些按钮可以将消息传递给背景的Unity3D ,让它做一些事情。
上一章介绍了触摸IOS屏幕 移动摄像机的位置,下面有盆友问我说他不想移动摄像机的位置,就想移动物体的位置,我在这里补充一下,可以把脚本绑定在箱子上,参照物选择为主摄像机,这样子更新箱子的脚本就OK啦。今天例子,我就将脚本绑定在箱子上,如下图所示,把Move脚本绑定在这个 Cube中。
先把Move脚本的代码贴出来,这里面我写了4个方法分别处理这个箱子的旋转,这4个方法是由IOS上的代码向Unity发送消息后调用的,下面我会介绍具体操作的方法。
1.var vrotate : Vector3;
2.
3.//向左旋转
4.function MoveLeft()
5.{
6. var rotate : float = Time.deltaTime * 100;
7. vrotate = Vector3.up * rotate;
8. transform.Rotate(vrotate, Space.World);
9.}
10.
11.//向右旋转
12.function MoveRight()
13.{
14. var rotate : float = Time.deltaTime * 100;
15. vrotate = Vector3.down* rotate;
16. transform.Rotate(vrotate, Space.World);
17.}
18.
19.//向上旋转
20.function MoveUp(){
21. var rotate : float = Time.deltaTime * 100;
22. vrotate = Vector3.right* rotate;
23. transform.Rotate(vrotate, Space.World);
24.}
25.
26.//向下旋转
27.function MoveDown(){
28. var rotate : float = Time.deltaTime * 100;
29. vrotate = Vector3.left* rotate;
30. transform.Rotate(vrotate, Space.World);
31.}
复制代码
到这里盆友们可以将这个Unity工程导出成Xcode项目,不会的盆友请看我之前的文章哈,Xcode项目导出成功后,我们先添加4个高级界面的按钮用来点击响应上面脚本的这4个旋转箱子的方法。
创建一个类继承UIViewController,用来添加我们的高级界面的视图,我暂且命名为MyView.
打开Unity3D导出的AppController.mm这个类,头文件处先导入我们的这个类 #import “MyView”找到下面这个方法,来添加viewint OpenEAGL_UnityCallback(UIWindow** window, int* screenWidth, int* screenHeight, int* openglesVersion)
EAGLView 是Unity3D 背景的那个View, 下面我们添加一个我们自己写的View 覆盖在它上面。
1.// Create a full-screen window
2. _window = [[UIWindow alloc] initWithFrame:rect];
3. EAGLView* view = [[EAGLView alloc] initWithFrame:rect];
4. [_window addSubview:view];
5.
6. MyView * myView = [[MyView alloc] init];
7. [_window addSubview:myView.view];
8.贴出MyView的代码,写完发现忘释放内存了,呵呵,懒得改了,本章主要的介绍的不是这个哦。
9.
10.
11.// MyView.m
12.// Unity-iPhone
13.//
14.// Created by 雨松MOMO on 11-11-1.
15.// Copyright 2011 __MyCompanyName__. All rights reserved.
16.//
17.
18.#import "MyView.h"
19.
20.@implementation MyView
21.
22.// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
23.- (void)viewDidLoad {
24. [super viewDidLoad];
25. //创建label视图
26. UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
27. //设置显示内容
28. label.text = @"雨松MOMO的程序世界";
29. //设置背景颜色
30. label.backgroundColor = [UIColor blueColor];
31. //设置文字颜色
32. label.textColor = [UIColor whiteColor];
33. //设置显示位置居中
34. label.textAlignment = UITextAlignmentCenter;
35. //设置字体大小
36. label.font = [UIFont fontWithName:[[UIFont familyNames] objectAtIndex:10] size:20];
37.
38. //创建按钮
39. UIButton *button0 = [UIButton buttonWithType:1];
40. //设置按钮范围
41. button0.frame = CGRectMake(0, 40, 100, 30);
42. //设置按钮显示内容
43. [button0 setTitle:@"矩形左旋转" forState:UIControlStateNormal];
44. //设置按钮改变后 绑定响应方法
45. [button0 addTarget:self action:@selector(LeftButtonPressed) forControlEvents:UIControlEventTouchUpInside];
46.
47. //创建按钮
48. UIButton *button1 = [UIButton buttonWithType:1];
49. //设置按钮范围
50. button1.frame = CGRectMake(0, 100, 100, 30);
51. //设置按钮显示内容
52. [button1 setTitle:@"矩形右旋转" forState:UIControlStateNormal];
53. //设置按钮改变后 绑定响应方法
54. [button1 addTarget:self action:@selector(RightButtonPressed) forControlEvents:UIControlEventTouchUpInside];
55.
56. //创建按钮
57. UIButton *button2 = [UIButton buttonWithType:1];
58. //设置按钮范围
59. button2.frame = CGRectMake(0, 160, 100, 30);
60. //设置按钮显示内容
61. [button2 setTitle:@"矩形上旋转" forState:UIControlStateNormal];
62. //设置按钮改变后 绑定响应方法
63. [button2 addTarget:self action:@selector(UpButtonPressed) forControlEvents:UIControlEventTouchUpInside];
.
65. //创建按钮
66. UIButton *button3 = [UIButton buttonWithType:1];
67. //设置按钮范围
68. button3.frame = CGRectMake(0, 220, 100, 30);
69. //设置按钮显示内容
70. [button3 setTitle:@"矩形下旋转" forState:UIControlStateNormal];
71. //设置按钮改变后 绑定响应方法
72. [button3 addTarget:self action:@selector(DownButtonPressed) forControlEvents:UIControlEventTouchUpInside];
73.
74. //向view添加
75. [self.view addSubview:label];
76. [self.view addSubview:button0];
77. [self.view addSubview:button1];
78. [self.view addSubview:button2];
79. [self.view addSubview:button3];
80.}
81.
82.//向左按钮
83.-(void)LeftButtonPressed{
84. UnitySendMessage("Cube
85.}
86.
87.//向右按钮
88.-(void)RightButtonPressed{
. UnitySendMessage("Cube
90.}
91.//向上按钮
92.-(void)UpButtonPressed{
93. UnitySendMessage("Cube
94.}
95.
96.//向下按钮
97.-(void)DownButtonPressed{
98. UnitySendMessage("Cube
99.}
100.
101.- (void)didReceiveMemoryWarning {
102. // Releases the view if it doesn't have a superview.
103. [super didReceiveMemoryWarning];
104.
105. // Release any cached data, images, etc. that aren't in use.
106.}
107.
108.- (void)viewDidUnload {
109. [super viewDidUnload];
110.}
111.
112.- (void)dealloc {
113. [super dealloc];
114.}
复制代码
@end
这里我主要说一下下面这个方法,它是Unity底层帮我们写好的一个方法,意思iPhone向向Unity发送消息,
参数1:场景中的模型名称,Cube就是我们定义的一个箱子。
参数2:脚本方法名称MoveLeft就是上面脚本中的方法,
参数3:为一个char *类型的 可以向Unity中传递数据。
1.UnitySendMessage(“Cube”,”MoveLeft”,””);
复制代码
我们可以向Unity3D中任意模型发送消息调用它绑定的脚本中的方法,当前前提是模型名称、方法名称、 参数都填写正确。
这里4个按钮都是以这种方式传递消息,下面是iPhone 真机的效果图,我们触摸点击4个高级界面的按钮可以实现Unity3D世界中的模型旋转, 所以大家一定要切记这个方法,很重要噢,哇咔咔~
最后欢迎各位盆友可以和MOMO一起讨论unity3d游戏开发,哇咔咔~~~ 附上Unity3D工程的下载地址,Xcode项目我就不上传了,不早了,大家晚安,哇咔咔~
补充: 由于Unity3.5在渲染3D的时候添加了 sGLViewController,所以按照以前的方法添加的视图是无法接收旋转事件的。对应3.5的版本大家需要修改一下代码。
还是在 OpenEAGL_UnityCallback方法中,在此方法的末尾添加代码:
1.MyViewController * myView = [[MyViewController alloc] init];
2.
3.[sGLViewController.view addSubview:myView.view];
复制代码
MyViewController是我们新定义的, 也就是说把我们的写的视图添加至 sGLViewController当中,这样就完事OK啦。 Unity每次升级都会小改动一下,所以我们也需要小改动一下,哈哈! |
