[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 }
}
时间: 2024-10-23 08:46:02

[Unity]Untiy-RPC-Sample的相关文章

一个入门rpc框架的学习

一个入门rpc框架的学习 参考 huangyong-rpc 轻量级分布式RPC框架 该程序是一个短连接的rpc实现 简介 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC, 它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC.会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化. 众所

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

第一步:编写服务接口 第二步:编写服务接口的实现类 第三步:配置服务端 第四步:启动服务器并发布服务 第五步:实现服务注册 第六步:实现 RPC 服务器 第七步:配置客户端 第八步:实现服务发现 第九步:实现 RPC 代理 第十步:发送 RPC 请求 总结 附录:Maven 依赖 RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 H

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

http://forum.exceedu.com/forum/forum.php?mod=viewthread&tid=34175 Oculus Unity Development Guide开发指南转载请保留原始地   http://t.cn/RAblKoh Oculus/GearVR开发者群 302294234 Welcometo the Unity Development GuideIntroduction简介Welcometo the Oculus Unity Developer Gui

轻量级分布式 RPC 框架(转)

RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Service 就是基于 HTTP 协议的 RPC,它具有良好的跨平台性,但其性能却不如基于 TCP 协议的 RPC.会两方面会直接影响 RPC 的性能,一是传输方式,二是序列化. 众所周知,TCP 是传输层协议,HTTP 是应用层协议,而传输层较应用层更加底层,在数据传输方面,越底层越快,因此,在一般情况下

学习别人的rpc框架

https://my.oschina.net/huangyong/blog/361751 https://gitee.com/huangyong/rpc 第一个链接为作者的描述,非常清晰,第二个为代码,包含以下几个功能包 自己的理解和摘取一些我认为值得记录的点 RPC:客户端发起请求,端封装请求,网络连接到某个服务端(服务治理),通过网络协议(tcp/http),序列化请求发送到服务端,服务端收到网络请求,反序列化请求本地服务,再将返回序列化,发送到客户端,客户端反序列化给本地展示结果. htt

3d max 动作Take 001改名

转自:http://www.cnblogs.com/zhaoqingqing/p/6533019.html 问题描述 带动作的Fbx文件导入Unity之后,动作名字为Take 001,如下所示: 在max那边是没有办法改名的,只能在Unity中改名. 方法1 1. 选中动画文件,按Ctrl + D,复制一份出来 2. 对复制出来的动作片段进行改名 方法2 通过观察Unity官方的Sample可以知道,他的动作文件命名都是 模型名@动作名 经过尝试,如果 fbx以 模型名@动作名 导入Unity3

photon Unity RPC 调用流程

本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51425225 作者:cartzhang 一.Photon简介 Photon是一款非常不错的游戏服务端引擎,是一个服务器应用程序,可以在你选择的机器上运行,并且完全是自定义和权威性的控制,你可以自由的配置和部署多人应用的基础设施. 在客户端,Photon支持多样的平台,使用C,C#,Flash进行编程的方式是不同的,但是基本的

Unity自带网络功能——NetworkView组件、Serialize、RPC

Unity拥有大量的第三方插件,专门提供了对网络功能的支持.可是,大部分开发人员第一次接触到的还是Unity自带的网络功能,也就是大家常常说到的Unity Networking API.这些API是借助于组件NetworkView发挥作用的,而它能够简化开发人员大量的网络功能编码任务.

untiy 3d ShaderLab_第6章_VertexLit渲染路径_4_顶点照明和Unity存放光源的第三种方式

6.4顶点照明和Unity存放光源的第三种方式 6.4.1   Unity为Vertex Pass准备的光源 是不是绝望了?世界没有光明怎么能行呢?当然不行,光明马上就来,Unity把它放到了unity_LightPosition[4]数组中. 可以简单地告诉你一个结果:在LightMode = Vertex的Pass内,unity_LightPosition[4]和unity_LightColor[4]是存取光源数据最可靠的第一首选手段,无论在Camera的RenderingPath为何,Ve

Unity RPC 链接

using UnityEngine;using System.Collections; public class Menu : MonoBehaviour { public string IP = "127.0.0.1"; public int Port = 25001; //public GameObject target; void OnGUI() { if (Network.peerType == NetworkPeerType.Disconnected) { if (GUI.B