蓝鸥Untiy-RPC-Sample

使用UnityEngine中的NetWork创建的服务器类

LO_GameServer.cs

** 通过该工具类能够在Unity程序中快速的创建一个游戏房间服务器,查询房间列表,及发送消息功能 **

using System;
using UnityEngine; namespace LO_Tool
{
public class LO_GameServer:MonoBehaviour
{
#region 单例化
private LO_GameServer ()
{
} private static GameObject s_LO_GameServer_object;
private static LO_GameServer s_LO_GameServer = null;
private static NetworkView s_LO_NetworkView = null; public static LO_GameServer DefaultServer
{
get{
if (s_LO_GameServer == null)
{
s_LO_GameServer_object = new GameObject("DefaultServer");
s_LO_GameServer = s_LO_GameServer_object.AddComponent<LO_GameServer>();
s_LO_NetworkView = s_LO_GameServer_object.AddComponent<NetworkView>();
} return s_LO_GameServer;
}
} private static NetworkView DefalutNetworkView
{
get{
return s_LO_NetworkView;
}
}
#endregion /// <summary>
/// init server...
/// </summary>
/// <param name="ip">Ip.</param>
/// <param name="port">Port.</param>
public bool InitServer(string ip,int port)
{
//set property
MasterServer.ipAddress = ip;
MasterServer.port = port; return true;
} /// <summary>
/// Starts the server.
/// </summary>
/// <returns><c>true</c>, if server was started, <c>false</c> otherwise.</returns>
public bool StartServer()
{
//start...
Network.InitializeServer(1000,25000,!Network.HavePublicAddress()); //register a game
MasterServer.RegisterHost("Card","XiaoHao's Doudizhu"); return true;
} public delegate void RequestRoomComplete(HostData[] list);
private RequestRoomComplete complete_block = null;
public RequestRoomComplete CompleteBlock{
set{
complete_block = value;
}
get{
return complete_block;
}
} public void StartRequestRoom(RequestRoomComplete block)
{
LO_GameServer.DefaultServer.CompleteBlock = block; MasterServer.RequestHostList("Card");
} public delegate void JoinHostRoomDelegate(int state); private JoinHostRoomDelegate join_delegate = null;
public void JoinHostRoom(HostData room,JoinHostRoomDelegate block)
{
this.join_delegate = block; NetworkConnectionError error = Network.Connect(room.ip[0],room.port); Debug.Log(error);
} public void SendGameMessage(string message)
{
LO_GameServer.DefalutNetworkView.RPC("RemoteReceiveMessage",RPCMode.All,message);
} [RPC]
public void RemoteReceiveMessage(string message)
{
Debug.Log(message);
} #region Behaviour Actions /// <summary>
/// some event notification from master server
/// </summary>
/// <param name="ev">Ev.</param>
public void OnMasterServerEvent(MasterServerEvent ev)
{
switch (ev) {
case MasterServerEvent.RegistrationSucceeded:
{
break;
} case MasterServerEvent.RegistrationFailedNoServer:
{
break;
}
case MasterServerEvent.RegistrationFailedGameType:
{
break;
}
case MasterServerEvent.RegistrationFailedGameName:
{
break;
}
case MasterServerEvent.HostListReceived:
{
LO_GameServer.DefaultServer.CompleteBlock(MasterServer.PollHostList());
break;
}
default:
break;
} } public void OnPlayerConnected(NetworkPlayer player)
{ } public void OnConnectedToServer()
{
this.join_delegate(0);
Debug.Log("OnConnectedToServer");
} #endregion
}
}

我们发现几点与通常单例类不同的地方

  • LO_GameServer类继承于MonoBehaviour脚本类
  • 静态对象s_LO_GameServer,是通过AddComponent函数实例化的,这与Unity引擎脚本类的实例化机制有关
  • LO_GameServer单例类与其他单例类不同的地方在于,需要多创建一个静态的GameObject变量,用来存储该单例脚本对象

除了以上几点不同之处,在该类中同样定义了几个委托类型,用来做回调功能的处理

  • RequestRoomComplete委托类型,当请求房间列表成功后就会调用该委托类型的变量complete_block
  • JoinHostRoomDelegate委托类型,当加入房间成功后就会调用该委托类型的变量join_delegate

应用举例

	private HostData[] room_list = null;
private bool isConnected = false;
void OnGUI()
{
if (GUILayout.Button("StartServer"))
{
LO_GameServer.DefaultServer.StartServer();
} if (GUILayout.Button("RequestRoom"))
{
LO_GameServer.DefaultServer.StartRequestRoom((HostData[] list)=>{
this.room_list = list;
});
} if (this.room_list != null) {
GUILayout.BeginVertical(); foreach (HostData item in this.room_list)
{
GUILayout.BeginHorizontal(); GUILayout.Label(item.ip[0],GUILayout.Width(200f),GUILayout.Height(40f));
GUILayout.Label(item.gameName,GUILayout.Width(200f),GUILayout.Height(40f)); string title = null;
Action<HostData> action = null; Action<HostData> state_connect = (HostData data)=>{
LO_GameServer.DefaultServer.SendGameMessage(user.ToString());
}; Action<HostData> state_no_connect = (HostData data) =>
{
LO_GameServer.DefaultServer.JoinHostRoom(data,(int state)=>{ isConnected = state == 0; });
}; if (isConnected) {
title = "Send";
action = state_connect;
}
else
{
title = "Connect";
action = state_no_connect;
} if (GUILayout.Button(title,GUILayout.Width(60f),GUILayout.Height(40f)))
{
action(item);
} GUILayout.EndHorizontal();
} GUILayout.EndVertical();
}
}

使用C#语言中的System.Xml与System.IO库完成实体对象与XML转换的工具类

LO_XMLTool.cs

通过该工具类,能够快速的将C#中的实体对象与XML进行转换,方便大家在编写代码完成进行数据交互的功能

using System;
using System.Xml;
using System.Xml.Serialization;
using System.IO; namespace AssemblyCSharp
{
public class LO_XMLTool
{ #region 反序列化
/// <summary>
/// 反序列化
/// </summary>
/// <param name="type">类型</param>
/// <param name="xml">XML字符串</param>
/// <returns></returns>
public static object Deserialize(Type type, string xml)
{
try
{
using (StringReader sr = new StringReader(xml))
{
XmlSerializer xmldes = new XmlSerializer(type);
return xmldes.Deserialize(sr);
}
}
catch (Exception e)
{ return null;
}
}
/// <summary>
/// 反序列化
/// </summary>
/// <param name="type"></param>
/// <param name="xml"></param>
/// <returns></returns>
public static object Deserialize(Type type, Stream stream)
{
XmlSerializer xmldes = new XmlSerializer(type);
return xmldes.Deserialize(stream);
}
#endregion #region 序列化
/// <summary>
/// 序列化
/// </summary>
/// <param name="type">类型</param>
/// <param name="obj">对象</param>
/// <returns></returns>
public static string Serializer(Type type, object obj)
{
MemoryStream Stream = new MemoryStream();
XmlSerializer xml = new XmlSerializer(type);
try
{
//序列化对象
xml.Serialize(Stream, obj);
}
catch (InvalidOperationException)
{
throw;
}
Stream.Position = 0;
StreamReader sr = new StreamReader(Stream);
string str = sr.ReadToEnd(); sr.Dispose();
Stream.Dispose(); return str;
} #endregion
}
}

[Unity]蓝鸥Untiy-RPC-Sample的更多相关文章

  1. photon Unity RPC 调用流程

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51425225 作者:car ...

  2. [Unity Socket]在Unity中如何实现异步Socket通信技术

    在刚刚开发Unity项目的过程中,需要用到即时通信功能来完成服务器与客户端自定义的数据结构封装. 现在将部分主要功能的实现代码抽取出来实现了可以异步Socket请求的技术Demo. 客户端脚本Clie ...

  3. Unity中进程间通信——使用异步Socket

    开发Unity项目过程中,即时通信功能来完成服务器与客户端自定义的数据结构封装. 如果要序列化和数据封装参考:Unity3D之C#用Socket传数据包 蓝鸥3G封装的类 客户端脚本ClientScr ...

  4. 转:Oculus Unity Development Guide开发指南(2015-7-21更新)

    http://forum.exceedu.com/forum/forum.php?mod=viewthread&tid=34175 Oculus Unity Development Guide ...

  5. 轻量级分布式 RPC 框架

    @import url(/css/cuteeditor.css); 源码地址:http://git.oschina.net/huangyong/rpc RPC,即 Remote Procedure C ...

  6. 【转】轻量级分布式 RPC 框架

    第一步:编写服务接口 第二步:编写服务接口的实现类 第三步:配置服务端 第四步:启动服务器并发布服务 第五步:实现服务注册 第六步:实现 RPC 服务器 第七步:配置客户端 第八步:实现服务发现 第九 ...

  7. RPC 实现

    PC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Servic ...

  8. RPC框架原理与实现

    了解一个框架最好的思路就是寻找一个该类型麻雀虽小五脏俱全的开源项目,不负所期,轻量级分布式 RPC 框架 RPC,全称 Remote Procedure Call(远程过程调用),即调用远程计算机上的 ...

  9. Unity文档阅读 第三章 依赖注入与Unity

    Introduction 简介In previous chapters, you saw some of the reasons to use dependency injection and lea ...

随机推荐

  1. mysql具体语句示例

    建表:(not null ,auto_increment, unique , primary key) create database balfish;use balfish;create table ...

  2. 【转】linux grep命令详解

    简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它 ...

  3. awstats + tomcat + windows

    下载: 1.apache-tomcat-7.0.67 2.ActivePerl-5.22.1.2201-MSWin32-x86-64int-299574.msi 3.awstats-7.4.zip 修 ...

  4. elasticsearch高级配置之(二)----线程池设置

    elasticsearch 配置 线程池  一个Elasticsearch节点会有多个线程池,但重要的是下面四个:  索引(index):主要是索引数据和删除数据操作(默认是cached类型)  搜索 ...

  5. Git学习 -- 新建版本库

    创建目录 mkdir git cd git 2 初始化git init #会在目录下自动创建一个.git目录,用于跟踪管理版本库,不要修改 3 向版本库中添加文件git add readme.txt ...

  6. CodeForces 546 D. Soldier and Number Game(素数有关)

    Description Two soldiers are playing a game. At the beginning first of them chooses a positive integ ...

  7. 关于python的可变和不可变对象

    在python中所有都是对象,在python中只有list和dict是可变对象,其他都是不可变对象. 具体参照:http://www.cnblogs.com/lovemo1314/archive/20 ...

  8. 第11章 类的高级特性--final

    1.final变量 (1)final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值.通常,由final定义的变量为常量.例如:final double PI=3.14; final关 ...

  9. Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率

    测试 目前主流的就bdd和tdd,自己查一下差异 推荐 mocha和tape 另外Jasmine也挺有名,angularjs用它,不过挺麻烦的,还有一个选择是qunit,最初是为jquery测试写的, ...

  10. css 内联与块

    内联元素可以理解为不能直接设置宽度和高度元素,比如span,你为他设置宽度和高度没有效果,除非你把它设置成块级元素. 如下面的代码把display:block;属性值去掉的话,宽度和高度都不会起作用了 ...