Scut游戏服务器引擎之Unity3d接入

Scut提供Unity3d Sdk包,方便开发人员快速与Scut游戏服务器对接; 先看Unity3d示例如下:

启动Unity3d项目

打开Scutc.svn\SDK\Unity3d\Assets目录下的TestScene.unity项目文件,选中Main Camera,将TestGUI.cs文件拖动到Inspector窗口的Script,如图:


Scut游戏服务器引擎之Unity3d接入


Scut游戏服务器引擎之Unity3d接入


点击运行,如下:
Scut游戏服务器引擎之Unity3d接入
 

目录层次说明
1)       Net:封装HttpSocket请求操作,以及网络协议的数据解析和请求参数的打包,其中NetWriter里有SetMd5Key为设置网络协议请求参数的Key,用于跟服务校验请求参数的有效性
2)       Reflect层:提供高性能的反射功能
3)       Security层:加密操作
4)       Serialization层:封装对象的序列化操作
5)       Game:游戏业务逻辑层代码实现功能,此目录下的ActionBehaviour目录,根据业务自己实现代码
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,
ActionBehaviour目录下实现自己的业务代码

自定头部解析类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源码下载

 

你可能感兴趣的:(unity3d)