Unity3D 研究院之IOS高级界面发送消息与Unity3D消息的接收

今天和盆友们讨论IOS的高级界面与unity3d游戏引擎的交互,这个在开发中是非常重要的,unity3d 毕竟是一个面向多平台的一个游戏引擎,它不可能全部为IOS 考虑的面面俱到,引擎中也不存在针对IOS的高级界面的控件的使用。

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

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

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

// 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];
}

到这里盆友们可以将这个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 覆盖在它上面。

// 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

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

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

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

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

文章出自:http://www.unitymanual.com/thread-20376-1-1.html

Unity3D 研究院之IOS高级界面发送消息与Unity3D消息的接收

时间: 2024-10-13 13:01:41

Unity3D 研究院之IOS高级界面发送消息与Unity3D消息的接收的相关文章

Unity3D研究院之IOS本地消息通知LocalNotification的使用

原地址:http://www.xuanyusong.com/archives/2632   现在的游戏里一般都会有本地消息,比如每天定时12点或者下午6点告诉玩家进入游戏领取体力.这种东西没必要服务器去推送,客户端就可以完成.Unity里面提供了本地任务的功能但是只有IOS上才支持,开始我有点不解为什么Android上不支持,当我把Android的本地通知做完后,我才明白.IOS源生的API中就支持固定时间循环推送,而Android上需要自己开启一个Services,启动一个AlarmManag

Unity3D研究院之IOS全自动打包生成ipa

接着上一篇文章, 自动生成framework,这篇文章我把shell自动化打包ipa整理了一下,希望大家喜欢,嘿嘿.. 建议大家先看一下上一篇文章.http://www.xuanyusong.com/archives/2720 首先我们要先搞清楚nity全自动打包的重要步骤. 1.自动生成xcode工程. 2.自动生成.ipa和dsym文件. 3.上传appstore(本篇略) 首先我们在做渠道包时,一般每个渠道都有自己一些特殊的需求,比如 游戏名子 .游戏图标.SDK.等等.那么我在在做自动化

Unity3D研究院之IOS全自动编辑framework、plist、oc代码

Unity打IOS时会先生成一个Xcode工程,如果你需要增加一些第三方的framework那么需要手动一条一条的添加,这太烦了..而且可能你还需要修改Plist文件,甚至还可能要修改unity自动生成的oc代码,每次打包都要修改的话,那太累了..这篇文章就是全自动打包的第一步..建议使用XUPorter,我在它的基础上拓展了两个类,一个用来修改plist,一个用来修改unity生成出来的OC代码.文章的最后我会给出代码.. 那么我用一个比较变态的SDK举个例子ShareSDK,它就需要自动添加

Unity3D研究院之IOS本地消息通知LocalNotification的使用(六十七)

来自:http://www.xuanyusong.com/archives/2632 现在的游戏里一般都会有本地消息,比如每天定时12点或者下午6点告诉玩家进入游戏领取体力.这种东西没必要服务器去推送,客户端就可以完成.Unity里面提供了本地任务的功能但是只有IOS上才支持,开始我有点不解为什么Android上不支持,当我把Android的本地通知做完后,我才明白.IOS源生的API中就支持固定时间循环推送,而Android上需要自己开启一个Services,启动一个AlarmManager的

【转载】Unity3D研究院之IOS&Andoird使用Sharesdk遇到的坑

这两天研究了一下ShareSDK,说实话挺好用的,但是还是有点坑的地方.那么雨松MOMO写下博文记录一下来我遇到的坑,嘿嘿. 大部分内容它的文档上已经说的很清楚了. http://wiki.sharesdk.cn/Unity3D%E5%BF%AB%E9%80%9F%E9%9B%86%E6%88%90%E6%8C%87%E5%8D%97 这里我直说文档上没说的部分. 分享图片的时候 它的例子写的是 网络图片. content["image"] = “http://img.baidu.co

【转载】Unity3D研究院之IOS触摸屏手势控制镜头旋转与缩放

前几篇文章介绍了很多Unity3D引擎自身的一些问题, 今天我们在回到IOS设备上讨论一些触摸屏幕手势,本章的目标是通过触摸iPhone屏幕手势 实现模型左右的旋转,与模型的缩放. 大家想一想模型的旋转,实际上是镜头的旋转.模型的缩放实际上是镜头Z轴方向的坐标.那么实现本章的内容只需要控制镜头的位置方可实现. 我们创建一个简单的游戏平面, 然后平面中放一个箱子做为旋转缩放的参照物.如下图所示,选中摄像机,给摄像机添加一个脚本名称为Move. 脚本中有一个参数 Target,它的作用是设置摄像头旋

(转)Unity3D研究院之IOS&Android收集Log文件

转自:http://www.xuanyusong.com/archives/2477 有段时间没有写过文章了,不知道大伙儿还记得雨松MOMO吗? 嘿嘿. 开发项目的时候尤其在处理与服务器交互这块,如果服务端程序看不到客户端请求的Log信息,那么无法修改BUG.在Windows上Unity会自动讲Log文件写入本地,但是在IOS和Android上确没有这个功能,所以我想了个办法,把Log信息写在手机的客户端里.把如下脚本挂在任意游戏对象上即可. using UnityEngine; using S

【转载】Unity3D研究院之IOS自定义游戏摇杆与飞机平滑的移动

移动开发游戏中使用到的触摸游戏摇杆在iPhone上是非常普遍的,毕竟是全触摸屏手机,今天MOMO 通过一个小例子和大家讨论Unity3D 中如何自定义一个漂亮的全触摸游戏摇杆.        值得高兴的是,Unity3D 游戏引擎的标准资源中已经帮助我们封装了一个游戏摇杆脚本,所以实现部分的代码可以完全借助它的,具体调用需要我们自己来.  Joystick.js是官方提供的脚本,具体代码如下,有兴趣的朋友可以仔细研究研究,MOMO就不多说啦.哇咔咔- 1 2 3 4 5 6 7 8 9 10 1

Unity3D研究院之Jenkins的使用(七十八)

长夜漫漫无心睡眠,来一篇嘿嘿.我相信如果已经用Shell脚本完成IOS和Android打包的朋友一定需要Jenkins 怎么才能让策划打包ipa和apk?怎么才能彻底省去程序的时间,只要在同一局域网内不需要unity的开发环境,只要它有浏览器,它就能打包Jenkins无疑是最佳选择. Unity3D研究院之IOS全自动编辑framework.plist.oc代码(六十七) Unity3D研究院之IOS全自动打包生成ipa(六十八) Unity3D研究院之Android全自动打包生成apk(六十九