大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。
Scut提供Unity3d Sdk包。便利的高速发展和Scut游戏server对接; 看Unity3d示为以下的比率:
启动Unity3d项目
打开Scutc.svn\SDK\Unity3d\Assets文件夹下的TestScene.unity项目文件,选中Main Camera。将TestGUI.cs文件拖动到Inspector窗体的Script,如图:
点击执行。例如以下:
文件夹层次说明
1) Net层:封装Http与Socket请求操作,以及网络协议的数据解析和请求參数的打包,当中NetWriter里有SetMd5Key为设置网络协议请求參数的Key,用于跟服务校验请求參数的有效性
2) Reflect层:提供高性能的反射功能
3) Security层:加密操作
4) Serialization层:封装对象的序列化操作
5) Game层:游戏业务逻辑层代码实现功能,此文件夹下的Action和Behaviour文件夹,依据业务自己实现代码
6) CustomHeadFormater类:自定的结构消息头解析器
7) TestGUI.cs为測试脚本
TestGUI代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
using UnityEngine; public class TestGUI : MonoBehaviour { // Use this for initialization void Start() { //todo 启用自定的结构 Net.Instance.HeadFormater = new CustomHeadFormater(); } // Update is called once per frame void Update() { } void OnGUI() { // Now create any Controls you like, and they will be displayed with the custom Skin if (GUILayout.Button( "Click Http" )) { Net.Instance.Send(( int )ActionType.RankSelect, null ); } // Any Controls created here will use the default Skin and not the custom Skin if (GUILayout.Button( "Click Socket" )) { NetWriter.SetUrl( "ph.scutgame.com:9001" ); Net.Instance.Send(( int )ActionType.RankSelect, null ); } } } |
Send方法接口会依据url是否带http字段来推断是否是用http还是socket,
Action和Behaviour文件夹下实现自己的业务代码
自定头部解析类CustomHeadFormater代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | using System; using GameRanking.Pack; using ZyGames.Framework.Common.Serialization; /// <summary> /// 定制的头部结构解析 /// </summary> public class CustomHeadFormater : IHeadFormater { public bool TryParse( byte [] data, out PackageHead head, out byte [] bodyBytes) { bodyBytes = null ; head = null ; int pos = 0; if (data == null || data.Length == 0) { return false ; } int headSize = GetInt(data, ref pos); byte [] headBytes = new byte [headSize]; Buffer.BlockCopy(data, pos, headBytes, 0, headBytes.Length); pos += headSize; ResponsePack resPack = ProtoBufUtils.Deserialize<ResponsePack>(headBytes); head = new PackageHead(); head.StatusCode = resPack.ErrorCode; head.MsgId = resPack.MsgId; head.Description = resPack.ErrorInfo; head.ActionId = resPack.ActionId; head.StrTime = resPack.St; int bodyLen = data.Length - pos; if (bodyLen > 0) { bodyBytes = new byte [bodyLen]; Buffer.BlockCopy(data, pos, bodyBytes, 0, bodyLen); } else { bodyBytes = new byte [0]; } //UnityEngine.Debug.Log(string.Format("ActionId:{0}, ErrorCode:{1}, len:{2}", resPack.ActionId, resPack.ErrorCode, bodyBytes.Length)); return true ; } private int GetInt( byte [] data, ref int pos) { int val = BitConverter.ToInt32(data, pos); pos += sizeof ( int ); return val; } } |
BaseAction代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/// <summary> /// 自定结构Action代理基类 /// </summary> public abstract class BaseAction : GameAction { protected BaseAction( int actionId) : base (actionId) { } protected override void SetActionHead(NetWriter writer) { MessagePack headPack = new MessagePack() { MsgId = Head.MsgId, ActionId = ActionId, SessionId = Head.SessionId, UserId = Head.UserId }; byte [] data = ProtoBufUtils.Serialize(headPack); writer.SetHeadBuffer(data); writer.SetBodyData( null ); } } |
Action1001代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | using System; using System.Collections.Generic; using GameRanking.Pack; using ZyGames.Framework.Common.Serialization; public class Action1001 : BaseAction { private Response1001Pack _responseData; public Action1001() : base (( int )ActionType.RankSelect) { } protected override void SendParameter(NetWriter writer, object userData) { //自定对象參数格式 Request1001Pack requestPack = new Request1001Pack() { PageIndex = 1, PageSize = 10 }; byte [] data = ProtoBufUtils.Serialize(requestPack); writer.SetBodyData(data); } protected override void DecodePackage(NetReader reader) { if (reader.StatusCode == 0) { //自定对象格式解包 _responseData = ProtoBufUtils.Deserialize<Response1001Pack>(reader.Buffer); } } protected override void Process( object userData) { if (_responseData != null ) { UnityEngine.Debug.Log( string .Format( "ok, count:{0}" , _responseData.PageCount)); } } } |
一个完整的样本Sample For Unity3d源代码下载
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/117324.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...