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

【狗刨学习网】

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

启动Unity3d项目

打开Scutc.svnSDKUnity3dAssets目录下的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("[color=blue !important]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));

}

}

}

声明:此篇文档时来自于【狗刨学习网】社区,是网友自行发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。

更多精彩内容:www.gopedu.com

时间: 2024-08-29 01:31:24

Scut游戏服务器引擎之Unity3d接入的相关文章

手机游戏服务器引擎Scut免费开源

scut 官网:http://www.scutgame.com/ Scut是一个开源.免费.稳定.快速开发的手机游戏服务器引擎,支持开发人员使用Python脚本语言或C#语言开发:底层采用C#编写,基于MVC框架思想设计, 开发人员只需要关注如何定义数据实体类及属性,不再需要关注多据库(MSSQL.MySql等)及表设计,Scut会帮助你自动检测生成相应数据库的表结构:它还提供了丰富的AIP和成熟的游戏模块中间件,快速开发你的游戏服务器应用,和Cocos2d-x完美结合,提供基于Cocos2d-

使用GoWorld游戏服务器引擎轻松实现分布式聊天服务器

GoWorld游戏服务器引擎简介 GoWorld是一款开源的分布式可扩展的游戏服务器引擎,使用Go语言(Golang)编写.它采用类似BigWorld的结构,使用了简化的场景-对象框架.以一个典型的MMORPG为例,每个服务器上会有多个场景,每个场景里可以包含多个对象,这些对象包括玩家.NPC.怪物等.GoWorld服务器可以将场景分配到在不同的进程甚至不同的机器上,从而使得游戏服务器的负载是可扩展的. 开源分布式游戏服务器引擎:https://github.com/xiaonanln/gowo

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请求操作,以及网络协议的数据解析和请求參数的打包

MMO 游戏服务器引擎设计

一. 网络游戏开发的基本流程 ◆ 项目文档 ◆ 开发的进行和文档准备流程 ◆ 技术人员文档 二. MMO游戏架构 ◆ MMO游戏特点 ◆ MMO架构的特有内容 三. 策划文档 ◆ 考虑示例游戏的题材 ◆ 详细设计文档 ◆ MMO庞大的游戏设定 ◆ 5种设计文档 系统的基本结构图 进程关系图 资源评估文档 协议定义文档 数据库设计图 ◆ 设计上的重要判断 四. 系统基本结构图 ◆ 系统基本结构图的基础 ◆ 服务器必须具有可扩展性 ---- 商业模式的确认 ◆ 各瓶颈 ---- 扩展方式的选择 ◆ 

GoWorld – 用Golang写一个分布式可扩展、可热更的游戏服务器

GoWorld代码:https://github.com/xiaonanln/goworld Golang具有运行效率高.内存安全等优良特性,因此是非常适合用来进行服务器开发.使用Golang开发游戏服务器有如下的优点: 运行效率远高于各种脚本语言,大幅度提升服务器承载能力 内存安全,不会像C++服务器那样出现内存错误导致服务器down机 Goroutine能够很好地利用多核计算能力,提升承载能力 Golang本身非常简单好用,大家都喜欢 然而使用Golang编写游戏服务器也面临一定的困难,主要

游戏服务器设计之NPC系统

游戏服务器设计之NPC系统 简介 NPC系统是游戏中非常重要的系统,设计的好坏很大程度上影响游戏的体验.NPC在游戏中有如下作用: 引导玩家体验游戏内容,一般游戏内有很多主线.支线任务,而任务的介绍.接取.领取奖励等操作都是通过NPC的操作,一般会有几个核心NPC,再不停的任务引导中,玩家会对核心npc印象深刻,强化了游戏代入感. 核心功能的展示和操作.游戏大部分功能都会放到游戏主界面,但是全部功能都放进去是不现实的,其他功能则以NPC的方式提供,比如进入某副本的入口等. 一些运营活动,比如道具

游戏服务器

服务分架构很多游戏公司不是web架构都是自己开发的CS端,因为游戏交互强而web架构只支持C->S的单工. 一般的网站应用程序,是典型的Request-Response模式,通过tcp和服务器建立一次链接,而请求数据和影响数据通过http协议进行组装,当完成一次交互的时候,服务器端和客户端tcp链接就会释放,把服务器端socket资源留给新的客户端.通常web程序是比较好扩展的,通过硬件负载均衡和添加web服务器来实现,这一套方案业界都已经比较成熟了.网游比较特殊,最大的特点在于客户端和服务器端

FPS游戏服务器设计的问题 【转】

一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时候自己没想到这么全,但大概想法都是一致的,摘录下来再学习一下. 1.网络游戏程序员须知 UDP vs TCP 作者:[email protected] 首发链接:http://blog.csdn.net/rellikt/archive/2010/08/21/5829020.aspx 这篇教程让我们就

[Unity3D]Unity3D游戏开发之从Unity3D到Eclipse

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本