蓝鸥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. springMVC中ajax的运用于注意事项

    ajax的运用: 注意事项: dataType:"json"在ajax中可写可不写(ajax能够自动识别返回值类型),写了更加规范,可以在ajax识别错误返回值类型的时候,指定返回 ...

  2. 做.net的早晚会用到,并且网上还没有这方面的正确资料或几乎很少

    原文网址:http://www.cnblogs.com/langu/archive/2012/03/23/2413990.html 一直以来,找安装程序的msi源文件路径得到的都是“system32” ...

  3. CSS Day04 css核心基础

    1.在HTML中引入CSS的方法 (1)行内式 行内式即在标记的style属性中设定CSS样式,这种方式本质上没有体现出CSS的优势,因此不推荐使用.  例如:  <h1 style=“colo ...

  4. Tree Cutting

    Tree Cutting Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/131072 K (Java/Others) Prob ...

  5. UVA 571 Jugs ADD18 小白书10 数学Part1 专题

    只能往一个方向倒,如c1=3,c2=5,a b从0 0->0 5->3 2->0 2->2 0->2 5->3 4->0 4->3 1->0 1- ...

  6. svn 设置文件可执行权限

    本地文件在commit到仓库之前若没有chmod +x 权限的话,那在svn仓库里的文件将会保持当前无可执行属性状态. 即使在本地chmod +x filename 之后,再提交到仓库也是没有用的.c ...

  7. Windows API 之 CreateFile

    Creates or opens a file or I/O device. The most commonly used I/O devices are as follows: file, file ...

  8. redis 工具类 单个redis、JedisPool 及多个redis、shardedJedisPool与spring的集成配置

    http://www.cnblogs.com/edisonfeng/p/3571870.html http://javacrazyer.iteye.com/blog/1840161 http://ww ...

  9. Chapter 1 First Sight——16

    I drove around the school, following the line of traffic. 我开车绕学校随着交通线. 我开车穿过校园,紧跟着大部队. I was glad to ...

  10. BootStrap详解之(一)

    一.BootStrap简介 BootStrap是一个用来构建网站前段框架的一个插件.无论你是想构建应用程序.博客还是CMS网站,Bootstrap都特别的使用,只要你想得到,它就能行.Bootstra ...