博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WP8:Unity3D之间的值传递
阅读量:6501 次
发布时间:2019-06-24

本文共 2849 字,大约阅读时间需要 9 分钟。

原地址:http://www.cnblogs.com/zhxilin/p/3799210.html

在前面的讨论中,我们介绍了如何在Unity3D for WP8中使用高于.Net 3.5的第三方库,传送门:

在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发送消息的方法,包括、以及

在Unity的API文档定义如下

方法 描述
Calls the method named methodName on every MonoBehaviour in this game object or any of its children.
Calls the method named methodName on every MonoBehaviour in this game object.
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(300), GUILayout.Height(40)))        {            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之间进行值传递

你可能感兴趣的文章
Selenium的延迟等待
查看>>
jquery 1.6以上版本 全选
查看>>
AppCan 学习
查看>>
flask框架
查看>>
《疯狂Java讲义》学习笔记(十)异常处理
查看>>
Lua(Codea) 中 table.insert 越界错误原因分析
查看>>
ELK 5.x日志分析 (二) Elasticserach 5.2 安装
查看>>
sbt配置nexus仓库
查看>>
一次奇怪的AP注册异常问题处理
查看>>
TableStore: 海量结构化数据分层存储方案
查看>>
Unity 4.x游戏开发技巧集锦(内部资料)
查看>>
自适应网页设计
查看>>
获取BT节点信息bittorrent-discovery
查看>>
环形动画加载视图AnimatedCircleLoadingView
查看>>
Centos 7使用vsftpd搭建FTP服务器
查看>>
tcpdump抓包文件提取http附加资源
查看>>
linux下SVN不允许空白日志提交
查看>>
第2周第1课
查看>>
docker制作镜像篇(基于容器)
查看>>
山寨c 标准库中的getline 函数
查看>>