在xcode中调用unity3d

原文地址:

http://blog.csdn.net/xys289187120/article/details/6933456


         本例实现游戏背景是Unity3D 的游戏世界,前面添加4个IOS的高级界面的按钮,并且点击这些按钮可以将消息传递给背景的Unity3D ,让它做一些事情。


上一章介绍了触摸IOS屏幕 移动摄像机的位置,下面有盆友问我说他不想移动摄像机的位置,就想移动物体的位置,我在这里补充一下,可以把脚本绑定在箱子上,参照物选择为主摄像机,这样子更新箱子的脚本就OK啦。今天例子,我就将脚本绑定在箱子上,如下图所示,把Move脚本绑定在这个 Cube中。









先把Move脚本的代码贴出来,这里面我写了4个方法分别处理这个箱子的旋转,这4个方法是由IOS上的代码向Unity发送消息后调用的,下面我会介绍具体操作的方法。

[javascript] view plain copy
  1. var vrotate : Vector3; 
  2.  
  3. //向左旋转 
  4. function MoveLeft() 
  5.     var rotate : float = Time.deltaTime * 100;  
  6.     vrotate = Vector3.up * rotate; 
  7.     transform.Rotate(vrotate, Space.World);   
  8.  
  9. //向右旋转 
  10. function MoveRight() 
  11.     var rotate : float = Time.deltaTime * 100;  
  12.     vrotate = Vector3.down* rotate; 
  13.     transform.Rotate(vrotate, Space.World);   
  14.  
  15. //向上旋转 
  16. function MoveUp(){ 
  17.     var rotate : float = Time.deltaTime * 100;  
  18.     vrotate = Vector3.right* rotate; 
  19.     transform.Rotate(vrotate, Space.World);   
  20.  
  21. //向下旋转 
  22. function MoveDown(){ 
  23.     var rotate : float = Time.deltaTime * 100;  
  24.     vrotate = Vector3.left* rotate; 
  25.     transform.Rotate(vrotate, Space.World);   


到这里盆友们可以将这个Unity工程导出成Xcode项目,不会的盆友请看我之前的文章哈,Xcode项目导出成功后,我们先添加4个高级界面的按钮用来点击响应上面脚本的这4个旋转箱子的方法。

创建一个类继承UIViewController,用来添加我们的高级界面的视图,我暂且命名为MyView.

打开Unity3D导出的AppController.mm这个类,头文件处先导入我们的这个类 #import "MyView"

找到下面这个方法,来添加view

int 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]; 



贴出MyView的代码,写完发现忘释放内存了,呵呵,懒得改了,本章主要的介绍的不是这个哦。


  1. // 
  2. //  MyView.m 
  3. //  Unity-iPhone 
  4. // 
  5. //  Created by 雨松MOMO on 11-11-1. 
  6. //  Copyright 2011 __MyCompanyName__. All rights reserved. 
  7. // 
  8.  
  9. #import "MyView.h" 
  10.  
  11.  
  12. @implementation MyView 
  13.  
  14.  
  15. // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
  16. - (void)viewDidLoad { 
  17.     [super viewDidLoad]; 
  18.     //创建label视图   
  19.     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];   
  20.     //设置显示内容   
  21.     label.text = @"雨松MOMO的程序世界";   
  22.     //设置背景颜色   
  23.     label.backgroundColor = [UIColor blueColor];   
  24.     //设置文字颜色   
  25.     label.textColor = [UIColor whiteColor];   
  26.     //设置显示位置居中   
  27.     label.textAlignment = UITextAlignmentCenter;   
  28.     //设置字体大小   
  29.     label.font = [UIFont fontWithName:[[UIFont familyNames] objectAtIndex:10] size:20]; 
  30.      
  31.     //创建按钮   
  32.     UIButton *button0 = [UIButton buttonWithType:1];   
  33.     //设置按钮范围   
  34.     button0.frame = CGRectMake(0, 40, 100, 30);   
  35.     //设置按钮显示内容   
  36.     [button0 setTitle:@"矩形左旋转" forState:UIControlStateNormal];   
  37.     //设置按钮改变后 绑定响应方法   
  38.     [button0 addTarget:self action:@selector(LeftButtonPressed) forControlEvents:UIControlEventTouchUpInside];   
  39.      
  40.     //创建按钮   
  41.     UIButton *button1 = [UIButton buttonWithType:1];   
  42.     //设置按钮范围   
  43.     button1.frame = CGRectMake(0, 100, 100, 30);   
  44.     //设置按钮显示内容   
  45.     [button1 setTitle:@"矩形右旋转" forState:UIControlStateNormal];   
  46.     //设置按钮改变后 绑定响应方法   
  47. [button1 addTarget:self action:@selector(RightButtonPressed) forControlEvents:UIControlEventTouchUpInside];
  48.  
  49.     //创建按钮   
  50.     UIButton *button2 = [UIButton buttonWithType:1];   
  51.     //设置按钮范围   
  52.     button2.frame = CGRectMake(0, 160, 100, 30);   
  53.     //设置按钮显示内容   
  54.     [button2 setTitle:@"矩形上旋转" forState:UIControlStateNormal];   
  55.     //设置按钮改变后 绑定响应方法   
  56.     [button2 addTarget:self action:@selector(UpButtonPressed) forControlEvents:UIControlEventTouchUpInside];   
  57.      
  58.     //创建按钮   
  59.     UIButton *button3 = [UIButton buttonWithType:1];   
  60.     //设置按钮范围   
  61.     button3.frame = CGRectMake(0, 220, 100, 30);   
  62.     //设置按钮显示内容   
  63.     [button3 setTitle:@"矩形下旋转" forState:UIControlStateNormal];   
  64.     //设置按钮改变后 绑定响应方法   
  65.     [button3 addTarget:self action:@selector(DownButtonPressed) forControlEvents:UIControlEventTouchUpInside];   
  66.      
  67.      
  68.     //向view添加 
  69.     [self.view addSubview:label]; 
  70.     [self.view addSubview:button0]; 
  71.     [self.view addSubview:button1]; 
  72.     [self.view addSubview:button2]; 
  73.     [self.view addSubview:button3]; 
  74.  
  75. //向左按钮 
  76. -(void)LeftButtonPressed{ 
  77.     UnitySendMessage("Cube","MoveLeft",""); 
  78.  
  79. //向右按钮 
  80. -(void)RightButtonPressed{ 
  81.     UnitySendMessage("Cube","MoveRight",""); 
  82. //向上按钮 
  83. -(void)UpButtonPressed{ 
  84.     UnitySendMessage("Cube","MoveUp",""); 
  85.  
  86. //向下按钮 
  87. -(void)DownButtonPressed{ 
  88.     UnitySendMessage("Cube","MoveDown",""); 
  89.  
  90.  
  91.  
  92. - (void)didReceiveMemoryWarning { 
  93.     // Releases the view if it doesn't have a superview. 
  94.     [super didReceiveMemoryWarning]; 
  95.      
  96.     // Release any cached data, images, etc. that aren't in use. 
  97.  
  98. - (void)viewDidUnload { 
  99.     [super viewDidUnload]; 
  100.  
  101.  
  102. - (void)dealloc { 
  103.     [super dealloc]; 
  104.  
  105.  
  106. @end 


这里我主要说一下下面这个方法,它是Unity底层帮我们写好的一个方法,意思iPhone向向Unity发送消息,

参数1:场景中的模型名称,Cube就是我们定义的一个箱子。

参数2:脚本方法名称MoveLeft就是上面脚本中的方法,

参数3:为一个char *类型的 可以向Unity中传递数据。

UnitySendMessage("Cube","MoveLeft","");


我们可以向Unity3D中任意模型发送消息调用它绑定的脚本中的方法,当前前提是模型名称、方法名称、 参数都填写正确。

这里4个按钮都是以这种方式传递消息,下面是iPhone 真机的效果图,我们触摸点击4个高级界面的按钮可以实现Unity3D世界中的模型旋转,  所以大家一定要切记这个方法,很重要噢,哇咔咔~









最后欢迎各位盆友可以和MOMO一起讨论Unity3D游戏开发,哇咔咔~~~ 附上Unity3D工程的下载地址,Xcode项目我就不上传了,不早了,大家晚安,哇咔咔~~




补充: 由于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 代码


[csharp] view plain copy
  1. using UnityEngine; 
  2. using System.Collections; 
  3.  
  4. public class Main : MonoBehaviour { 
  5.  
  6. //声明两个Texture变量,图片资源在外面连线赋值 
  7. public Texture Button0; 
  8. public Texture Button1; 
  9.  
  10.     // Use this for initialization 
  11.     void Start () { 
  12.      
  13.     } 
  14.      
  15.     // Update is called once per frame 
  16.     void Update () { 
  17.      
  18.     } 
  19.      
  20.     //这个方法用于绘制 
  21.     void OnGUI() { 
  22.         //绘制两个按钮 
  23.         if(GUI.Button(new Rect(0,44,120,120),Button0)) 
  24.         { 
  25.             //返回值为ture说明这个按钮被点击 
  26.             SDK.ActivateButton0(); 
  27.         }    
  28.          
  29.         //绘制两个按钮 
  30.         if(GUI.Button(new Rect(200,44,120,120),Button1)) 
  31.         { 
  32.             //返回值为ture说明这个按钮被点击 
  33.             SDK.ActivateButton1(); 
  34.         }    
  35.     } 



这里详细说一下SDK这个类,这个类我们看作它是一个管理类,它不赋值在任意对象身上,只接受调用管理,点击两个按钮后将分别调用下面方法中的_ActivateButton0() 与 _ActivateButton1(),而这两个方法则是去调用xcode 我们自己实现的方法_pressButton0() 与 _pressButton1(), 前提上须下面代码中的注册,这样子导出项目的时候xcode会帮我们 生成注册信息,我们只须要实现这两个方法就可以了。




SDK.cs 代码

[csharp] view plain copy
  1. using UnityEngine; 
  2. using System.Runtime.InteropServices; 
  3.  
  4. public class SDK 
  5.       
  6.      //导出按钮以后将在xcode项目中生成这个按钮的注册, 
  7.      //这样就可以在xocde代码中实现这个按钮点击后的事件。 
  8.      [DllImport("__Internal")] 
  9.      private static extern void _PressButton0 (); 
  10.       
  11.      public static void ActivateButton0 () 
  12.      { 
  13.          
  14.         if (Application.platform != RuntimePlatform.OSXEditor)  
  15.         { 
  16.             //点击按钮后调用xcode中的 _PressButton0 ()方法, 
  17.             //方法中的内容须要我们自己来添加 
  18.             _PressButton0 (); 
  19.         } 
  20.      } 
  21.       
  22.      //和上面一样 
  23.      [DllImport("__Internal")] 
  24.      private static extern void _PressButton1 (); 
  25.       
  26.      public static void ActivateButton1 () 
  27.      { 
  28.         if (Application.platform != RuntimePlatform.OSXEditor)  
  29.         { 
  30.             _PressButton1 (); 
  31.         } 
  32.      } 
  33.  





这样子Unity3D 部分已经完成,将Untiy3D项目导出成Xcode项目,我们用Xcode打开它。添加Unit3D中GUI按钮点击后的响应事件。创建一个类命名为MyView.h 、MyView.m,用它来接收Unity3D 回馈回来的消息,_PressButton0 与 _PressButton1 这两个方法在Unity3D中已经注册过,所以在这个类中我们须要对它进行Xcode中的实现。


MyView.m

[csharp] view plain copy
  1. #import "MyView.h"   
  2.  
  3.  
  4. @implementation MyView   
  5.  
  6. //接收Unity3D 传递过来的信息 
  7.  
  8. void _PressButton0() 
  9.     UIAlertView *alert = [[UIAlertView alloc] init]; 
  10.     [alert setTitle:@"雨松MOMO程序世界"]; 
  11.     [alert setMessage:@"点击了第一个按钮"]; 
  12.     [alert addButtonWithTitle:@"确定"]; 
  13.     [alert  show];   
  14.     [alert release]; 
  15.  
  16. void _PressButton1() 
  17.      
  18.     UIAlertView *alert = [[UIAlertView alloc] init]; 
  19.     [alert setTitle:@"雨松MOMO程序世界"]; 
  20.     [alert setMessage:@"点击了第二个按钮"]; 
  21.     [alert addButtonWithTitle:@"确定"]; 
  22.     [alert  show];   
  23.     [alert release]; 
  24. @end   




OK大功告成,连上真机运行我们的项目,我们在iPhone中点击了Unity3D 中GUI这两个按钮后,通过消息的回馈顺利的弹出IOS高级界面 的对话框,哇咔咔~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值