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方法获 ...
随机推荐
- Java运算符的优先级(从高到低)
运算符的优先级(从高到低) 优先级 描述 运算符 1 括号 ().[] 2 正负号 +.- 3 自增自减,非 ++.--.! 4 乘除,取余 *./.% 5 加减 +.- 6 移位运算 << ...
- Linux操作系统奥秘02-系统引导(GRUB)
GRUB的加载流程 GRUB是GNU的一款多重引导软件.GRUB包含了3个重要的文件:stage1 ,e2fsstage1_5,stage2.这三个文件分别代表了GRUB运行的3个阶段. 1.stag ...
- TCheckListBox
TCheckListBox.CheckListBox http://www.cnblogs.com/mingdep/archive/2012/03/20/2408282.html 全部打勾 for ( ...
- Reactjs 入门基础(二)
如果我们需要向组件传递参数,可以使用 this.props 对象,实例如下: <body> <div id="example"></div> & ...
- 三天没有写题了,罪过!--Hash Table Start
(1)Island Perimeter 解题思路: 在矩阵上循环并记录岛(1)的个数;如果当前节点是岛,则检查其是否具有任何右邻居或下邻居,有的话邻居计数加1 ;岛的周长结果为islands * 4 ...
- hibernate学习(设计一对一 关系 映射)
//主表 package org.crazy.app.domain; import javax.persistence.*; @Entity @Table(name="person_inf& ...
- linux--分卷压缩解压缩
1.先压缩目录为一个文件 root@ip# tar zcvf apk.tar apk/ 2.对文件进行切分,-d表示切分后的文件后缀已数字区分(如apk_2015.tar01,apk_2015.tar ...
- 解析XML文件的几种常见操作方法—DOM/SAX/DOM4j
解析XML文件的几种常见操作方法—DOM/SAX/DOM4j 一直想学点什么东西,有些浮躁,努力使自己静下心来看点东西,哪怕是回顾一下知识.看到了xml解析,目前我还没用到过.但多了解一下,加深点记忆 ...
- 如何把android中布局文件(.xml)与相关的类(.java)进行关联?
eg:把一个布局文件名为page1.xml与MainActivity.java(工程自动生成)进行 1.在存放使用资源的res文件夹下的layout文件夹内新建一个XML布局文件,如命名为:page1 ...
- 20145225《Java程序设计》 实验三 "敏捷开发与XP实践"
20145225<Java程序设计> 实验三 "敏捷开发与XP实践" 实验报告 实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 git 上 ...