[Unity]蓝鸥Untiy-RPC-Sample
蓝鸥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的更多相关文章
- photon Unity RPC 调用流程
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51425225 作者:car ...
- [Unity Socket]在Unity中如何实现异步Socket通信技术
在刚刚开发Unity项目的过程中,需要用到即时通信功能来完成服务器与客户端自定义的数据结构封装. 现在将部分主要功能的实现代码抽取出来实现了可以异步Socket请求的技术Demo. 客户端脚本Clie ...
- Unity中进程间通信——使用异步Socket
开发Unity项目过程中,即时通信功能来完成服务器与客户端自定义的数据结构封装. 如果要序列化和数据封装参考:Unity3D之C#用Socket传数据包 蓝鸥3G封装的类 客户端脚本ClientScr ...
- 转:Oculus Unity Development Guide开发指南(2015-7-21更新)
http://forum.exceedu.com/forum/forum.php?mod=viewthread&tid=34175 Oculus Unity Development Guide ...
- 轻量级分布式 RPC 框架
@import url(/css/cuteeditor.css); 源码地址:http://git.oschina.net/huangyong/rpc RPC,即 Remote Procedure C ...
- 【转】轻量级分布式 RPC 框架
第一步:编写服务接口 第二步:编写服务接口的实现类 第三步:配置服务端 第四步:启动服务器并发布服务 第五步:实现服务注册 第六步:实现 RPC 服务器 第七步:配置客户端 第八步:实现服务发现 第九 ...
- RPC 实现
PC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Servic ...
- RPC框架原理与实现
了解一个框架最好的思路就是寻找一个该类型麻雀虽小五脏俱全的开源项目,不负所期,轻量级分布式 RPC 框架 RPC,全称 Remote Procedure Call(远程过程调用),即调用远程计算机上的 ...
- Unity文档阅读 第三章 依赖注入与Unity
Introduction 简介In previous chapters, you saw some of the reasons to use dependency injection and lea ...
随机推荐
- OpenGL 图形管道(graphics pipeline)过程
1.总结:Graphics pipeline 主要分为两部分工作 把3D坐标转换成2D坐标 把2D坐标转换成真实的有颜色的像素 2.下图就是一个顶点数据经过几个步骤后转化成显示在屏幕上像素的过程(一般 ...
- Hibernate 系列教程17-查询缓存
在二级缓存配置成功的基础上进行查询缓存配置 Product public class Product { private Long id; private String name; Product.h ...
- oracle中的exists 和in
有两个简单例子,以说明 “exists”和“in”的效率问题 1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ; ...
- php 大转盘抽奖
包在文件中 lottery.zip <!DOCTYPE HTML><html><head><meta charset="utf-8"> ...
- 在Activity之间使用Intent传值和Bundle传值的区别和方式
两者本质上没有任何区别.Bundle只是一个信息的载体 将内部的内容以键值对组织 Intent负责Activity之间的交互 自己是带有一个Bundle的Intent.putExtras(Bundle ...
- scala模式匹配与样例类
样本类:添加了case的类便是样本类.这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定.如下: 1.添加与类名一致的工厂方法.也就是说,可以写成Var("x") ...
- Junit单元测试的简单使用(主要是在spring框架下的项目)
首先是解释什么是单元测试,单元测试是指对于一个大型项目里,对于单一模块或者单一接口的测试. 然后解释为什么要写单元测试,首先对于一个大型的项目,如果你每次都要重启一遍服务器调页面或者接口的bug,那就 ...
- JSP文件上传--Smartupload组件
把smartupload.jar copy到D:\apache-tomcat-7.0.57\lib下. 创建htm上传文件:smartupload_demo01.htm 由于是上传文件,需要对表单进行 ...
- Eclipse中代码提示框的背景色修改
Preferences->General->Appearance->Colors and Fonts 修改Basic中的Content Assist backgroud color[ ...
- git:解决The current branch is not configured for pull No value for key branch.master.merge found in config
网上多半都是命令行下的解决方案,我用的是EGit,所以要在eclipse里(我的版本是kepler)把下面这句话添加到配置文件中. Window->Preference->Team-> ...