WP8:Unity3D之间的值传递
在前面的讨论中,我们介绍了如何在Unity3D for WP8中使用高于.Net 3.5的第三方库,传送门:http://www.cnblogs.com/zhxilin/p/3311240.html
在Unity3D和WP8的交互当中,如果要使用第三方插件(dll),通常的方式都会想到直接在Unity3D的Assets中添加一堆Plugins。但是这种做法的局限性非常明显,就是只能添加基于.Net3.5的dll。如果第三方插件是基于.Net 3.5编写的完全没有问题,但令人头疼的是大部分第三方插件都不是基于.Net3.5来编写的,至少使用了.Net 4或.Net 4.5,如果再以Plugins添加到U3D的Assets中是根本编译不通过的。因此才有了我们前面那篇文章的讨论,借助UnityPlayer中UnityApp类的SetLoadedCallback来回调操作。
在实际的开发需求中,除了通过回调来调用第三方库的方法,还能通过消息机制通知Unity3D一些值的变化。每个Unity3D的脚本类都继承了Component类,Component类实现了几个向game object发送消息的方法,包括BroadcastMessage、SendMessage以及SendMessageUpwards
在Unity的API文档定义如下
| 方法 | 描述 |
| BroadcastMessage | Calls the method named methodName on every MonoBehaviour in this game object or any of its children. |
| SendMessage | Calls the method named methodName on every MonoBehaviour in this game object. |
| SendMessageUpwards | Calls the method named methodName on every MonoBehaviour in this game object and on every ancestor of the behaviour. |
举个例子,假设在一个MonoBehaviour中,需要使用到OpenXLive提供的PlayerID,前面提到,OpenXLive是基于.Net 4.5的第三方游戏社交平台,我们无法直接将OpenXLive.dll作为Plugins的形式导入Unity工程,所以我们没法直接在MonoBehaviour里取到PlayerID。但是我们可以利用消息机制,很好地将需要的值从WP8中传递给Unity。
假设我们创建了一个C#脚本叫MyScript.cs,定义一个UsePlayerID方法
using System.Reflection.Emit;
using UnityEngine;
using System.Collections;
using System; public class MyScript : MonoBehaviour { public event EventHandler GameCenterButtonPressed;
public event EventHandler SubmitScoreButtonPressed; void OnGUI()
{
if (GUILayout.Button("Game Center", GUILayout.Width(), GUILayout.Height()))
{
if (GameCenterButtonPressed != null)
{
GameCenterButtonPressed(this, EventArgs.Empty);
}
}
} void UsePlayerID(string Id)
{
// Use the player id here.
}
}
那么在MonoBehaviour中就可以随处调用GetPlayerID方法拿到玩家的ID,然而它的值从何而来?
将Unity工程导出为WP8工程并打开,在MainPage.xaml.cs中,可以看到DrawingSurfaceBackground_Loaded方法中UnityApp.SetLoadedCallback(() => { Dispatcher.BeginInvoke(Unity_Loaded); });
在Unity加载完成后就通知了这里的Unity_Loaded方法,完成加载后就可以取出Unity中的脚本对象:
private MyScript script; private void Unity_Loaded()
{
script = (MyScript)UnityEngine.Object.FindObjectOfType(typeof(MyScript));
script.GameCenterButtonPressed += script_GameCenterButtonPressed;
} private void script_GameCenterButtonPressed(object sender, EventArgs e)
{
this.Dispatcher.BeginInvoke(delegate
{
OpenXLive.Features.GameSession session = OpenXLive.XLiveGameManager.CreateSession("xxxxxxxxxxxxxxxxxxxxxx");
session.CreateSessionCompleted += session_CreateSessionCompleted; XLiveUIManager.Initialize(Application.Current, session);
session.Open();
});
} void session_CreateSessionCompleted(object sender, OpenXLive.AsyncEventArgs e)
{
this.Dispatcher.BeginInvoke(delegate
{
if (e.Result.ReturnValue)
{
script.SendMessage("UsePlayerID", XLiveGameManager.CurrentSession.AnonymousID);
}
});
}
调用SendMessage方法,将PlayerID作为UsePlayerID所需的参数传递过去,通知MyScript对象执行UsePlayerID方法。
以上,介绍了在WP8和Unity3D之间进行值传递
WP8:Unity3D之间的值传递的更多相关文章
- Backbone中父子view之间的值传递
backbone中,使用最多的莫过于在view中进行操作,如模板的渲染以及事件函数的定义.为了提高代码的可维护性,一般地我们会写多个视图即view,将界面按照功能的不同进行模块化划分,模块与view一 ...
- 通过$broadcast或$emit在子级和父级controller之间进行值传递
通过$broadcast或$emit在controller之间进行值传递,不过这些controller必须是子级或者父级关系, $emit只能向父级parent controller传递事件event ...
- vue.js 同级组件之间的值传递方法(uni-app通用)
vue.js 兄弟组件之间的值传递方法 https://blog.csdn.net/jingtian678/article/details/81634149
- Vue父子之间的值传递
将通过两个input框实现父子之间的值传递作为演示,效果图 先注册父子各一个组件,代码如下 <div id="app"> <parent></pare ...
- jni java和C之间的值传递(int String int[])
我们通过jni调用C代码不可能每次只是去调一个方法,通常,我们需要传递一些值过去. 例如,播放电影,那就肯定需要你把电影的 url给 C的播放器吧,等等. 接下来就看一看怎么去传递这些值: 首先是最简 ...
- wp8.1 Study1: 页面导航&页面间值传递
摘要:wp8.1与wp8中很多API是不一样了,wp8.1把以前wp7.x时的api去掉了,更多与win8.1的API相似.比如以下的页面导航和页面之间的值传递 1.页面导航 利用Frame.Navi ...
- iframe兄弟间和iframe父子间的值传递问题
在网上查了资料.iframe的参数传递问题.有很多答案都是不可行的.现在将收集的资料整理一下.已经验证通过.以下如有问题请及时指正. 1. iframe兄弟之间值传递 举例说明:index页面中有两个 ...
- JVM内存划分以及值传递和引用传递的区别
Day05_SHJavaTraing_4-8-2017 一.JVM对自己的内存划分为5个区域 1.方法栈:所有的方法运行的时候进入内存 2.堆:存储的是容器和对象 3.方法和数据共享 ...
- 发展合作-ASP.Net传递页面之间的值
在合作开发中,在页面串传值的时候,遇到了一些困难.在网上搜罗了一下,发现好多的传值方式,能够简单地分下面三种. 一. URL传值 原页面的值放到目标页面的URL中.然后通过QueryString方法获 ...
随机推荐
- The prefix "context" for element "context:component-scan" is not bound.
在beans里面加上下面信息: xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLo ...
- oracle中SQL根据生日日期查询年龄的方法
方法:SELECT Trunc(MONTHS_BETWEEN(SYSDATE,BIRTH_DATE)/12) FROM 某表 Trunc函数在这里对带有小数位数的数字取整数部分: SYSDATE为or ...
- mongoDB 使用手册
1.基本操作db.AddUser(username,password) 添加用户db.auth(usrename,password) 设置数据库连接验证db.cloneDataBase(fromh ...
- (Java和C++)二进制date数据写进android保存为yuv格式
Java实现函数: String strpath = "/storage/emulated/0/DCIM/" + i + "output.yuv"; bool ...
- LCD如何显示图像
1.LCD显示主要相关概念 (1)像素(pixel) 整个图像是由一个个的像素组成的,像素就是一个显示点.像素就是组成图像的最基本元素,或者说显示中可以被控制的最小单位,整个图像就是由很多个像素组成的 ...
- .Net的错误机制
//优先级1 protected void Page_Error(object sender, EventArgs e) { Exception objErr = Serv ...
- 深刻理解和运用XMLHttpRequest
本文为转载文章,因见猎心喜,担心失传,故贴此以备不时之需. 原文地址:传送 你真的会使用XMLHttpRequest吗? xmlhttprequest http cors ajax ruoyiqing ...
- zookeeper client 常用操作
#获取权限(类似于登陆) addauth digest admin-user:admin-password #查看权限 getAcl /collections/meixin_product/state ...
- C4.5算法
C4.5算法是对ID3算法的改进,在决策树的生成过程中,使用了信息增益率作为属性选择的方法,其具体的算法步骤如下: 输入:训练数据集D,特征集A,阈值e 输出:决策树T 1.如果D中所有实例属于同一类 ...
- Android之ImageView 旋转
方案一: (1)获取ImageView对应的图片,并将其转成Bitmap; (2)创建Matrix对象; (3)调用matrix.setRotate( );设置旋转度数 (4)重新创建bitm ...