文档章节

[Unity]Untiy-RPC-Sample

浩浩老师
 浩浩老师
发布于 2015/10/15 13:53
字数 828
阅读 60
收藏 1

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 }
}

本文转载自:http://www.cnblogs.com/daxiaxiaohao/p/4726916.html

浩浩老师
粉丝 1
博文 80
码字总数 0
作品 0
海淀
程序员
私信 提问
刘国柱- Unity游戏开发深度学习 系列课程福利大放送

刘国柱--Unity游戏开发深度学习 系列课程福利大发送!不单优惠, 还送Unity最新版本必备实战书籍! HI, 各位热心的Unity爱好者与学员,《Unity3D/2D 游戏开发从0到1(第二版)》书籍已经正式发...

Liu_guozhu
2018/05/23
0
0
【Unity3D技术文档翻译】第3.6.6篇 光照探针概述 (Light Probes)

上一章:【Unity3D技术文档翻译】第3.6.5篇 LOD与烘焙光照贴图(LOD for baked lightmaps)) 本章原文所在章节:【Unity Manual】→【Graphics】→【Graphics Overview】→【Lighting】→【...

何三思
2018/08/17
0
0
Unity调用IOS的StoreKit实现在游戏内部的对游戏进行星级评价和评论

一 Xcode端的OC代码 在Xcode里面新建一个空的工程(不会搞的百度一下),然后创建一个.h和.m文件,记住要把.m的后缀改成.mm(.mm文件和.m文件的区别就是:.mm文件除了可以包含Objective-C和C...

caohonghong123
2018/04/19
0
0
【Unity3D技术文档翻译】第3.6.5篇 LOD与烘焙光照贴图(LOD for baked lightmaps)

上一章:【Unity3D技术文档翻译】第3.6.4篇 烘焙环境遮蔽(Baked ambient occlusion)) 本章原文所在章节:【Unity Manual】→【Graphics】→【Graphics Overview】→【Lighting】→【Globa...

何三思
2018/08/17
0
0
【原创】游戏数据 从Excel 转到 ScriptableObject, 再打包(AssetBundle)到真机

原创,转载需说明。 【需求】: 策划把游戏数据写到 Excel 中。并最简单步骤应用在游戏真机上。 【制作过程】: (这里简写,列条目,后续详解) 1. 解析Excel到UnityEditor内存中。 2. 由Uni...

qq_27941413
2018/05/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
5
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部