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层:封装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" ))
{
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代码
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源代码下载
Scut游戏server引擎Unity3d访问相关推荐
- Scut游戏服务器引擎6.1.5.6发布,直接可运行,支持热更新
1. 增加exe版(console),web版本(IIS)的游戏服宿主程序 2. 增加Model支持脚本化,实现不停服更新 3. 增加Language支持脚本化 4. 修改Sns与Pay Center ...
- Scut游戏引擎改造兼容Codis。
原生的Scut引擎是采用redis来做数据缓存层,引擎在以异步的方式(时间可配置,默认100ms)实现数据同步.为了提高redis的可扩展性.高可用性,把redis换成codis,因为codis有部分 ...
- scut服务器引擎 性能,Scut游戏引擎
本词条缺少信息栏.概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! Scut游戏引擎是一款免费开源的游戏服务器引擎,适用于开发AVG.SLG.RPG.MMOG等类型的网络游戏. Scut ...
- 我们月光工作室和我们的3款游戏被国内Unity3D游戏引擎第一技术论坛--“游戏蛮牛” 报道啦!...
注明:目前月光工作室已经停止更新,因为创业伙伴回国,小编自己忙于<程序员联盟>社区的各样事务.以后也许会重拾App开发吧.谨以此文纪念那段美好的时光!以下的某些链接也已失效. 我们月光工作 ...
- 如何学好游戏3D引擎编程(摘抄)
网上看到,觉得很好,因此收藏一下,侵删. <如何学好游戏3D引擎编程> 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才能攀登到游戏技术 ...
- 虚幻引擎4简介,UE4简介--这是一个强大的游戏开发引擎
虚幻引擎4简介 这是一个强大的游戏开发引擎 虚幻引擎(Unreal Engine /UE)是EpicGames公司打造的游戏引擎,而UE4则其第四个大版本.虽然目前UE 5已经发布,但是仅仅是发布,U ...
- 如何学好游戏3D引擎编程
<如何学好游戏3D引擎编程> 此篇文章献给那些为了游戏编程不怕困难的热血青年,它的神秘要我永远不间断的去挑战自我,超越自我,这样才能攀登到游戏技术的最高峰 --阿哲VS自己 QQ7 ...
- 爆款小游戏用的都是什么游戏开发引擎?
随着微信生态中,小程序应用指数级的增长,许多休闲游戏变成为了众多游戏厂商流量变现的新手段.以近期很火的"羊了个羊"为例,它便是我们常常所说的小游戏. 游戏和小游戏的区别 要盘点小游 ...
- Unity,最炙手可热的游戏开发引擎
近日,Unity亚洲开发者大会在国家会议中心成功举行,引得业内人士高度关注.而纵观各大网站招聘信息,用人单位对unity开发人员的招聘可谓求贤若渴,除去高薪诱惑.升职诱惑,甚至不惜打起感情牌,动之以情 ...
- Unity+GME 腾讯新版的游戏语音(游戏多媒体引擎)
前言: 之前用的GCloudVoice,一个很坑的SDK.后来用着用着突然发现不能用了,神奇!然后去登录控制台一查,发现腾讯把这个东西的相关网页从腾讯云平台上删除了.现在只能在百度上面搜到他的原始网页 ...
最新文章
- Java ExecutorService 线程池
- 如何看待 70% 的程序员,缺乏数据结构和算法知识?
- python网管系统_IT外包网管服务,Python密度聚类算法-DBSCAN实践
- mysql命令导出数据库_MYSQL 数据库导入导出命令
- MIP 脚本域名地址变更公告
- 华为Mate 50系列明年亮相:或首发高通骁龙898 4G芯片
- 【翻译】IdentityServer4:基于资源的配置
- 可管理多台远程mysql服务器的phpmyadmin_修改phpMyAdmin使其能够管理多台远程MySQL服务器...
- 使用VS2012新建空白解决方案
- java对接金蝶webapi
- android 7.0 so.toc,[toc]文档导航 侧边栏目录 markdown
- sin_cos_tan_cot_sec_cosec 三角函数计算器
- SD卡和SDHC卡操作
- 了凡四训 第一篇《立命之学》
- jqgrid实现表头合并功能
- python自带库zlib_python中的zlib解压
- 如何有效的对云专线进行测速
- Window10设置图标名、文件名的字体大小方法
- python写金字塔(数字金字塔)
- UE4鼠标滚轮轴缩放事件设置无效
热门文章
- asp.net 设置敲回车触发按钮
- PHP - Redis实现入队出队
- 如何写出优质干净的代码,这6个技巧你不能错过
- MySQL使用规范手册,程序员必知必会
- Matlab函数——wgn
- config.guess: unable to guess system type、config.sub: missing argument
- 代码管理学:常量类应该单独一个目录,还是在模块目录下?
- 编译WINDOWS版FFmpeg:编译FFmpeg
- 编译OpenJDK8:NMAKE : fatal error U1077
- NWT纪事:说是闷声发大财,不干活就发财了?