原文地址:
http://blog.csdn.net/xys289187120/article/details/6933456
本例实现游戏背景是Unity3D 的游戏世界,前面添加4个IOS的高级界面的按钮,并且点击这些按钮可以将消息传递给背景的Unity3D ,让它做一些事情。
- var vrotate : Vector3;
- //向左旋转
- function MoveLeft()
- {
- var rotate : float = Time.deltaTime * 100;
- vrotate = Vector3.up * rotate;
- transform.Rotate(vrotate, Space.World);
- }
- //向右旋转
- function MoveRight()
- {
- var rotate : float = Time.deltaTime * 100;
- vrotate = Vector3.down* rotate;
- transform.Rotate(vrotate, Space.World);
- }
- //向上旋转
- function MoveUp(){
- var rotate : float = Time.deltaTime * 100;
- vrotate = Vector3.right* rotate;
- transform.Rotate(vrotate, Space.World);
- }
- //向下旋转
- function MoveDown(){
- var rotate : float = Time.deltaTime * 100;
- vrotate = Vector3.left* rotate;
- transform.Rotate(vrotate, Space.World);
- }
到这里盆友们可以将这个Unity工程导出成Xcode项目,不会的盆友请看我之前的文章哈,Xcode项目导出成功后,我们先添加4个高级界面的按钮用来点击响应上面脚本的这4个旋转箱子的方法。
找到下面这个方法,来添加view
int OpenEAGL_UnityCallback(UIWindow** window, int* screenWidth, int* screenHeight, int* openglesVersion)
EAGLView 是Unity3D 背景的那个View, 下面我们添加一个我们自己写的View 覆盖在它上面。
- // Create a full-screen window
- _window = [[UIWindow alloc] initWithFrame:rect];
- EAGLView* view = [[EAGLView alloc] initWithFrame:rect];
- [_window addSubview:view];
- MyView * myView = [[MyView alloc] init];
- [_window addSubview:myView.view];
贴出MyView的代码,写完发现忘释放内存了,呵呵,懒得改了,本章主要的介绍的不是这个哦。
- //
- // MyView.m
- // Unity-iPhone
- //
- // Created by 雨松MOMO on 11-11-1.
- // Copyright 2011 __MyCompanyName__. All rights reserved.
- //
- #import "MyView.h"
- @implementation MyView
- // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- - (void)viewDidLoad {
- [super viewDidLoad];
- //创建label视图
- UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
- //设置显示内容
- label.text = @"雨松MOMO的程序世界";
- //设置背景颜色
- label.backgroundColor = [UIColor blueColor];
- //设置文字颜色
- label.textColor = [UIColor whiteColor];
- //设置显示位置居中
- label.textAlignment = UITextAlignmentCenter;
- //设置字体大小
- label.font = [UIFont fontWithName:[[UIFont familyNames] objectAtIndex:10] size:20];
- //创建按钮
- UIButton *button0 = [UIButton buttonWithType:1];
- //设置按钮范围
- button0.frame = CGRectMake(0, 40, 100, 30);
- //设置按钮显示内容
- [button0 setTitle:@"矩形左旋转" forState:UIControlStateNormal];
- //设置按钮改变后 绑定响应方法
- [button0 addTarget:self action:@selector(LeftButtonPressed) forControlEvents:UIControlEventTouchUpInside];
- //创建按钮
- UIButton *button1 = [UIButton buttonWithType:1];
- //设置按钮范围
- button1.frame = CGRectMake(0, 100, 100, 30);
- //设置按钮显示内容
- [button1 setTitle:@"矩形右旋转" forState:UIControlStateNormal];
- //设置按钮改变后 绑定响应方法
- [button1 addTarget:self action:@selector(RightButtonPressed) forControlEvents:UIControlEventTouchUpInside];
- //创建按钮
- UIButton *button2 = [UIButton buttonWithType:1];
- //设置按钮范围
- button2.frame = CGRectMake(0, 160, 100, 30);
- //设置按钮显示内容
- [button2 setTitle:@"矩形上旋转" forState:UIControlStateNormal];
- //设置按钮改变后 绑定响应方法
- [button2 addTarget:self action:@selector(UpButtonPressed) forControlEvents:UIControlEventTouchUpInside];
- //创建按钮
- UIButton *button3 = [UIButton buttonWithType:1];
- //设置按钮范围
- button3.frame = CGRectMake(0, 220, 100, 30);
- //设置按钮显示内容
- [button3 setTitle:@"矩形下旋转" forState:UIControlStateNormal];
- //设置按钮改变后 绑定响应方法
- [button3 addTarget:self action:@selector(DownButtonPressed) forControlEvents:UIControlEventTouchUpInside];
- //向view添加
- [self.view addSubview:label];
- [self.view addSubview:button0];
- [self.view addSubview:button1];
- [self.view addSubview:button2];
- [self.view addSubview:button3];
- }
- //向左按钮
- -(void)LeftButtonPressed{
- UnitySendMessage("Cube","MoveLeft","");
- }
- //向右按钮
- -(void)RightButtonPressed{
- UnitySendMessage("Cube","MoveRight","");
- }
- //向上按钮
- -(void)UpButtonPressed{
- UnitySendMessage("Cube","MoveUp","");
- }
- //向下按钮
- -(void)DownButtonPressed{
- UnitySendMessage("Cube","MoveDown","");
- }
- - (void)didReceiveMemoryWarning {
- // Releases the view if it doesn't have a superview.
- [super didReceiveMemoryWarning];
- // Release any cached data, images, etc. that aren't in use.
- }
- - (void)viewDidUnload {
- [super viewDidUnload];
- }
- - (void)dealloc {
- [super dealloc];
- }
- @end
参数1:场景中的模型名称,Cube就是我们定义的一个箱子。
参数2:脚本方法名称MoveLeft就是上面脚本中的方法,
参数3:为一个char *类型的 可以向Unity中传递数据。
UnitySendMessage("Cube","MoveLeft","");
我们可以向Unity3D中任意模型发送消息调用它绑定的脚本中的方法,当前前提是模型名称、方法名称、 参数都填写正确。
这里4个按钮都是以这种方式传递消息,下面是iPhone 真机的效果图,我们触摸点击4个高级界面的按钮可以实现Unity3D世界中的模型旋转, 所以大家一定要切记这个方法,很重要噢,哇咔咔~
补充: 由于Unity3.5在渲染3D的时候添加了 sGLViewController,所以按照以前的方法添加的视图是无法接收旋转事件的。对应3.5的版本大家需要修改一下代码。
还是在 OpenEAGL_UnityCallback方法中,在此方法的末尾添加代码:
MyViewController * myView = [[MyViewController alloc] init];
[sGLViewController.view addSubview:myView.view];
MyViewController是我们新定义的,
也就是说把我们的写的视图添加至
sGLViewController当中,这样就完事OK啦。 Unity每次升级都会小改动一下,所以我们也需要小改动一下,哈哈!
上一章介绍了IOS高级界面向Unity3D 发送消息与Unity3D 接收消息的过程,有去的消息当然要有回的消息这样的过程才算完美,本章MOMO向大家介绍Unity3D消息的回馈。
如下图所示,本章我们的目标是在Unity3D 界面中添加两个GUI按钮,并且在iPhone上点击这两个按钮后分别弹出两个IOS 高级界面的对话框。相信盆友们对GUI应该不会太陌生,在这里我在前调一下GUI就是Unity3D 提供的一套UI系统。图中的两个UI 按钮我就是用GUI做出来的。
Project栏目中创建一个c#脚本,命名为Main.cs ,之前没有使用过 C#写脚本,今天我用C#来写这个脚本,哇咔咔~~~ 如下图所示将脚本拖动在摄像机上,脚本中声明两个Texture 类型变量用来保存按钮绘制的图片资源。
Main.cs 代码
- using UnityEngine;
- using System.Collections;
- public class Main : MonoBehaviour {
- //声明两个Texture变量,图片资源在外面连线赋值
- public Texture Button0;
- public Texture Button1;
- // Use this for initialization
- void Start () {
- }
- // Update is called once per frame
- void Update () {
- }
- //这个方法用于绘制
- void OnGUI() {
- //绘制两个按钮
- if(GUI.Button(new Rect(0,44,120,120),Button0))
- {
- //返回值为ture说明这个按钮被点击
- SDK.ActivateButton0();
- }
- //绘制两个按钮
- if(GUI.Button(new Rect(200,44,120,120),Button1))
- {
- //返回值为ture说明这个按钮被点击
- SDK.ActivateButton1();
- }
- }
- }
这里详细说一下SDK这个类,这个类我们看作它是一个管理类,它不赋值在任意对象身上,只接受调用管理,点击两个按钮后将分别调用下面方法中的_ActivateButton0() 与 _ActivateButton1(),而这两个方法则是去调用xcode 我们自己实现的方法_pressButton0() 与 _pressButton1(), 前提上须下面代码中的注册,这样子导出项目的时候xcode会帮我们 生成注册信息,我们只须要实现这两个方法就可以了。
SDK.cs 代码
- using UnityEngine;
- using System.Runtime.InteropServices;
- public class SDK
- {
- //导出按钮以后将在xcode项目中生成这个按钮的注册,
- //这样就可以在xocde代码中实现这个按钮点击后的事件。
- [DllImport("__Internal")]
- private static extern void _PressButton0 ();
- public static void ActivateButton0 ()
- {
- if (Application.platform != RuntimePlatform.OSXEditor)
- {
- //点击按钮后调用xcode中的 _PressButton0 ()方法,
- //方法中的内容须要我们自己来添加
- _PressButton0 ();
- }
- }
- //和上面一样
- [DllImport("__Internal")]
- private static extern void _PressButton1 ();
- public static void ActivateButton1 ()
- {
- if (Application.platform != RuntimePlatform.OSXEditor)
- {
- _PressButton1 ();
- }
- }
- }
这样子Unity3D 部分已经完成,将Untiy3D项目导出成Xcode项目,我们用Xcode打开它。添加Unit3D中GUI按钮点击后的响应事件。创建一个类命名为MyView.h 、MyView.m,用它来接收Unity3D 回馈回来的消息,_PressButton0 与 _PressButton1 这两个方法在Unity3D中已经注册过,所以在这个类中我们须要对它进行Xcode中的实现。
MyView.m
- #import "MyView.h"
- @implementation MyView
- //接收Unity3D 传递过来的信息
- void _PressButton0()
- {
- UIAlertView *alert = [[UIAlertView alloc] init];
- [alert setTitle:@"雨松MOMO程序世界"];
- [alert setMessage:@"点击了第一个按钮"];
- [alert addButtonWithTitle:@"确定"];
- [alert show];
- [alert release];
- }
- void _PressButton1()
- {
- UIAlertView *alert = [[UIAlertView alloc] init];
- [alert setTitle:@"雨松MOMO程序世界"];
- [alert setMessage:@"点击了第二个按钮"];
- [alert addButtonWithTitle:@"确定"];
- [alert show];
- [alert release];
- }
- @end
OK大功告成,连上真机运行我们的项目,我们在iPhone中点击了Unity3D 中GUI这两个按钮后,通过消息的回馈顺利的弹出IOS高级界面 的对话框,哇咔咔~