Scut游戏server引擎Unity3d访问

Scut提供Unity3d Sdk包。便利的高速发展和Scut游戏server对接; 看Unity3d示为以下的比率:

启动Unity3d项目

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








点击执行。例如以下:

 

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

 

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源代码下载

posted @ 2015-08-09 20:20  yxwkaifa  阅读(305)  评论(0编辑  收藏  举报