上一章介绍了IOS高级界面向Unity3D 发送消息与Unity3D 接收消息的过程,有去的消息当然要有回的消息这样的过程才算完美,本章MOMO向大家介绍Unity3D消息的回馈。
如下图所示,本章我们的目标是在Unity3D 界面中添加两个GUI按钮,并且在iPhone上点击这两个按钮后分别弹出两个IOS 高级界面的对话框。相信盆友们对GUI应该不会太陌生,在这里我在前调一下GUI就是Unity3D 提供的一套UI系统。图中的两个UI 按钮我就是用GUI做出来的。
Project栏目中创建一个c#脚本,命名为Main.cs ,之前没有使用过 C#写脚本,今天我用C#来写这个脚本,哇咔咔~~~ 如下图所示将脚本拖动在摄像机上,脚本中声明两个Texture 类型变量用来保存按钮绘制的图片资源。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
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 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#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高级界面 的对话框,哇咔咔~
最后欢迎各位盆友可以和MOMO一起讨论Unity3D游戏开发,冬天就要来啦大家注意添加衣服,注意身体健康噢。哇咔咔~~~ 附上Unity3D工程的下载地址,Xcode项目我就不上传了,须要的自己导出。不早了,大家晚安,哇咔咔~~
- 本文固定链接: https://www.xuanyusong.com/archives/521
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
好厉害–看看——~~
问个问题,如果要在void _PressButton1()这个方法里,想要跳转到另一个视图里去,在 iOS 端该怎么写?SecondViewController *secondView = [[SecondViewController alloc]init];[UnityGetGLViewController().self.navigationController pushViewController:secondView animated:YES];我是这么写的,但是没有效果!Xcode6.4,Unity4.6.2!顺便能不能帮忙解释下为什么这样的方法中 “self” 用不了?
请问大神有解决么 求解决方法
目前用[UnityGetGLViewController().view addSubview:secondView.view];
然后想要取消掉的话就在 SecondViewController 里用[self.view removeFromSuperview];
我是这样解决的。至于提到的问题还是没有解决办法。。。。
好的,谢谢大神,另外想问一下,大大的项目刚启动进去的是unity界面还是iOS界面啊
您好,我想问一下您的参数是怎么传递的?
请问这个问题您解决了么?
嗯,我的编译没有错,但是发布后每点击一下按钮就会弹出这么一句话。(filename unknown两边是尖括号。)EntryPointNotFoundException: _PressButton1 at (wrapper managed-to-native) SDK:_PressButton1 () at SDK.ActivateButton1 () [0x00000] in (filename unknown):0 at Main.OnGUI () [0x00000] in (filename unknown):0
嗯,我的编译没有错,但是发布后每点击一下按钮就会弹出这么一句话。EntryPointNotFoundException: _PressButton1 at (wrapper managed-to-native) SDK:_PressButton1 () at SDK.ActivateButton1 () [0x00000] in :0 at Main.OnGUI () [0x00000] in :0
_PressButton1 这个对象没找到。
请问如果 _PressButton0 想返回一个字符串给 C# 该怎么样来实现呢?这种需求很多,比如调用平台SDK要获取用户名、ID什么的。
//和上面一样 [DllImport(“__Internal”)] private static extern void _PressButton1 (string str); public static void ActivateButton1 (string str) { if (Application.platform != RuntimePlatform.OSXEditor) { _PressButton1 (str); } } 能传递参数吗?
//和上面一样 [DllImport(“__Internal”)] private static extern void _PressButton1 (string str); public static void ActivateButton1 (string str) { if (Application.platform != RuntimePlatform.OSXEditor) { _PressButton1 (str); } } 能传递参数吗?
MOMO你一会C#一会js看的好头痛啊。。就不能来个双版本么。。
谢谢MOMO的教程,我想问一下,我下载工程试了一下,出现EntryPointNotFoundException: _PressButton1 at (wrapper managed-to-native) SDK:_PressButton1 () at SDK.ActivateButton1 () [0x00000] in :0 at Main.OnGUI () [0x00000] in :0 我是按照教程在XCODE工程中加入了MyView.h 和 MyView.m也无效,是不是我的.h文件中没写对还是其他什么原因,求指点~.h文件如下#import @interface MyView : NSObjectvoid _PressButton0();void _PressButton1();@end
哥们,模拟器下不行,真机才可以 但是 void returnSence() 这种定义的方法 里面不能放self啊 麻烦的
汗。。原来是模拟器的问题~明白了~非常感谢~
谢谢雨凇大大的教程,我是你一直来的支持者,我想请教您,我按照您的教程来,遇到了EntryPointNotFoundException: _PressButton0 at (wrapper managed-to-native) SDK:_PressButton0 () at SDK.ActivateButton0 () [0x00000] in :0 at Main.OnGUI () [0x00000] in :0 (Filename: Line: -1)点击button没反应啊,要被折磨疯了,求雨凇大大拯救~
感觉像是代码中哪里有问题。。
你好,问题解决了吗?求赐教!
同上,模拟器下不行,真机才可以。
Unity4.0出现问题,下载的工程代码也出现同样的问题。。。EntryPointNotFoundException: _pressBluetoothButton at (wrapper managed-to-native) SDK:_pressBluetoothButton () at SDK.ActivateBluetoothButton () [0x00000] in :0 at BluetoothScript.OnGUI () [0x00000] in :0 (Filename: Line: -1)-> force accelerometer registration
教程有问题!!!强烈建议把xcode 工程贴出来!!!
发现问题出在哪了!!!!! [DllImport(“__Internal”)],是两个”_”,不是一个!!!
好吧, 估计是我博客用插件自动生成了一个。。
先谢谢雨松MOMO 的 教程。 我想问下这个XCODE 里面还要写些什么? unity3d 里 怎么会自动调用MyView.m 里面的_PressButton0()..如果我还有个MyTest.m 里也有_PressButton0(),, ios会调用谁。。?
这样的话 编译不了,会提示错误
EntryPointNotFoundException: _PressButton0 at (wrapper managed-to-native) SDK:_PressButton0 () at SDK.ActivateButton0 () [0x00000] in :0 at gui.Show () [0x00000] in :0 UnityEngine.GameObject:SendMessage(String, Object, SendMessageOptions)UIButtonMessage:Send()UIButtonMessage:OnClick()UnityEngine.GameObject:SendMessage(String, Object, SendMessageOptions)UICamera:Notify(GameObject, String, Object)UICamera:ProcessTouch(Boolean, Boolean)UICamera:ProcessTouches()UICamera:Update()我使用了ngui插件来实现按钮,但是没有出现您那样的效果,这时为什么呢?
_PressButton0 没有找到这个喔。。
我按照您的这篇文章创建了 MyView。h和MyView。mm#import @interface MyView : NSObject@end#import “MyView.h”@implementation MyViewvoid _PressButton0(){ UIAlertView *alert = [[UIAlertView alloc] init]; [alert setTitle:@”雨松MOMO程序世界”]; [alert setMessage:@”点击了第一个按钮”]; [alert addButtonWithTitle:@”确定”]; [alert show]; [alert release];}@end还需要其他的步骤么?
[DllImport(“__Internal”)] private static extern void _PressButton0 ();这样的引用代码加了吗?
using UnityEngine;using System.Runtime.InteropServices;public class SDK { [DllImport(“__Internal”)] private static extern void _PressButton0 (); public static void ActivateButton0 () { if (Application.platform != RuntimePlatform.OSXEditor) { _PressButton0 (); } }}这样子写的
不应该啊。。。。我没出现过这样的错误。。。。。
。。。这个类,是放在class文件夹下面么?
public class SDK { }这个类是放在在unity里的、、
我和你遇到了一样的问题,你是怎么解决的啊?~
是创建MyView.m文件还是MyView.mm文件???不通过.mm文件用extern “C“连接.m文件可以吗??我向您说的那样做了,但是一点击buttonxcode就卡死了。
发现问题出在哪了!!!!! [DllImport(“__Internal”)],是两个”_”,不是一个,哈哈
正确的到底是几个”_”呢?
两个
当然可以的。。。
能不能给个传参的例子呢?按照这个例子不传参倒是没问题,传参的各种问题就来了,类型也不知道如何对应~~~谢谢啦~~~
同问~
同问,求个传参的例子,尤其是写在ios端的,多谢
请问i怎么把字符串作为参数传给ios plugin呢?我定义成char* unity编译的时候提示unsafe,android的参考你的代码是可以的
加个参数就可以了
搞定了,还有一个问题,就是ios上谈系统对话框很ok,一到android上一弹dialog就crash,有解决方案么?
是插件的问题吗?
参考你的java plugin写的jar,在c#调用android 的activity java函数弹出对话框,就会crash
有时间我研究研究。。。没注意过dialog
好,多谢了,研究完了更新下blog啊,我过来学习
请问_PressButton0 ()能否传递参数,例如_PressButton0 (“abc”)? 其实我想请教如何在unity中向ios传递消息