Scut提供Unity3d Sdk包,方便開發人員快速與Scut游戲服務器對接; 先看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代碼
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"))
{
NetWriter.SetUrl("http://ph.scutgame.com/service.aspx");
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代碼
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代碼
/// <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代碼
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源碼下載
