蓝鸥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. 转 由一次磁盘告警引发的血案:du 和 ls 的区别

    如果你完全不明白或者完全明白图片含义, 那么你不用继续往下看了. 否则, 这篇文章也许正是你需要的. 背景 确切地说,不是收到的自动告警短信或者邮件告诉我某机器上的磁盘满了,而是某同学人肉发现该机器写 ...

  2. css 重新学习系列(2)

    摘自: http://www.cnblogs.com/liuzhaoyang/articles/3289456.html Position定位:relative | absolute 定位一直是WEB ...

  3. Local declaration of 'XXX' hides instance variable

    今天调试程序遇到这么一个警告! Local declaration of 'XXX' hides instance variable 遇到这种原因,是因为本地变量跟函数参数变量同名.改变其一即可.

  4. FTP: Configuring server users..

    4 points to create a user to uploade to ftproot.. this user must be an administrator, and be able to ...

  5. stdafx文件介绍

    MSDN介绍: These files are used to build a precompiled header file Projname.pch and a precompiled types ...

  6. 常见的http状态码

    [200]请求已成功,请求所希望的响应头或数据体将随此响应返回. [301]被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一.如果可能,拥有连结编辑功能 ...

  7. ListView random IndexOutOfBoundsException on Froyo

    http://stackoverflow.com/questions/8431342/listview-random-indexoutofboundsexception-on-froyo 今天遇到个 ...

  8. EnglishWords----1

    upon在...上面 upright垂直的,直立的 upward向上的 outward外面的,向外的 downward向下的 vertical垂直的 parallel平行的 sow播种 cut切 ch ...

  9. Excel 帮助类

    using System; using System.Collections.Generic; using System.Data; using System.Drawing; using Syste ...

  10. jquery插件简单的声明方法

    (function($){     //  声明插件内容     $.fn.pluginName = function(options){         //  默认插件配置         var ...