unity3D游戏制作—暗黑战神DarkGod

article/2025/10/5 11:07:25

前言

这段时间,用unity尝试制作了一款3D网游,用这篇博客记录这一阶段的学习成果,做个总结。有不对的地方也欢迎大家指正~~

一、技术需求

此游戏是在Unity2017.3.1上开发出来的,Unity2017.3.1可以支持2D、3D场景的编辑,本游戏是基于3D场景开发的。游戏中的脚本语言使用的是C#,Visual Studio 2019为脚本编辑、服务器连接提供了平台,Navicat for MySQL为此游戏数据库提供了创建平台。

二、功能需求

此游戏是一个ARPG网络游戏(ARPG(Action Role Playing Game),游戏术语,意思是动作角色扮演类游戏中,角色的动作(特别是攻击动作)与操作(如点击鼠标)相关的动作。),以刷副本刷材料以强化提升角色为主要玩法。玩家可以通过摇杆移动,然后攻击和释放技能击杀怪物。采用客户端,服务器,数据库三层结构实现登录注册,强化系统,自动任务引导,世界聊天,副本业务等系统。其中在客户端实现了资源动态加载,并设置缓存层。UI(用户界面)采用MVC(MVC模式中,M是指业务模型,V是指用户界面,C则是控制器,使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。),降低愈合,并用事件回调解决数据同步问题。项目采用数据驱动方式,所有数据采用XML(可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言)配置表实现,用XML配合C#自动序列化大大减少工作量。在服务器中,使用C#序列化数据,使用socket(在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据)传递数据,使用多线程处理网络IO,使用多线程实现计时回调,设置缓存层减少数据库查询。其制作包括对以下六大功能的需求:

(1)启动逻辑:只有一个启动脚本有Start入口,它会依次调用其他实现有序初始化;

(2)登录界面需要用通用、异步加载方式实现加载完成后的动作,每当启动进入一个根场景,它有一个不会被销毁的对象,所有需要实现的业务功能系统都附在上面,此外还有UI根路径,以此实现场景的自然切换

(3)数据分三层:数据库一层,服务器缓存一层,客户端显示一层,数据同步是主要修改服务器缓存,再向数据库和客户端发送更新;

(4)实现服务器连接,采用数据驱动方式(所有数据用XML配置表配置,XML配合C#自动序列化大大减少工作量),使用C#序列化数据,使用socket传递数据;

(5)实现游戏各个业务:①背景音乐管理、音效管理②注册登录③角色展示④任务导航⑤任务奖励⑥人物对话与发布公告⑦强化提升与充值购买⑧副本任务;

(6)异常处理:收到回复前,客户端禁止其他操作,如果超过一段时间没有收到回复认为网络异常,请求失败。

三、设计思路

DarkGod 是一款形式复杂多样且难度较高的网络游戏,以互联网为传输媒介,以服务器和用户计算机为处理终端,以游戏客户端为信息交互窗口实现娱乐、休闲、交流和取得虚拟成就的个体性多人在线游戏,因此使用unity开发工具、Visual Studio 2019、Navicat for MySQL来制作这款游戏。经过分析,首先要完成的是对素材(图片、音频、动画等)的收集。其次,我们需要对整个游戏进行模块划分,理清整个游戏是由哪几个模块组成的,如何实现与服务器、数据库之间的交互,经过讨论分析,得出这个游戏共需要九大模块。分析完之后,便进入了正式的游戏制作环节,我们需要对各个模块进行详细设计。完成各个模块的详细设计后,我们便可以在unity中对它们进行组装和拼接,启动服务器并运行测试,修改错误和不适当的地方。自此,整个游戏就设计完成了。

 四、游戏工程视图

在“Assets”文件夹放入游戏所需要的资源素材、脚本等材料。“Assets”文件夹中共包含有“Compond”:通用文件夹;“Plugins”:日志文件夹;“Resources”:资源素材文件夹(图文、音频、动画、UI界面场景);“Scripts”:脚本文件夹。总体工程视图如下:

 五、游戏界面布局

1 游戏登录界面LoadingWnd:由背景图、游戏名字、进度条组成,该界面上挂载LoadingWnd.cs脚本:

2  登录场景界面SceneLogin,在图片素材的基础上通过灯光渲染实现:

3  登录注册界面LoginWnd,该界面上挂载LoginWnd.cs脚本:

 4 角色创建界面CreateWnd,该界面上挂载CreateWnd.cs脚本:

 

5 主城主界面MainCityWnd,该界面上挂载MainCityWnd.cs脚本:

6 角色信息展示界面InfoWnd,角色信息展示界面InfoWnd如图3-17所示,该界面上挂载InfoWnd.cs脚本:

7  引导对话界面GuideWnd,该界面上挂载GuideWnd.cs脚本:

 

 8 角色强化界面StrongWnd,该界面上挂载StrongWnd.cs脚本:

 9 聊天界面ChatWnd,该界面上挂载BuyWnd.cs脚本:

10 购买交易窗口BuyWnd,该界面上挂载BuyWnd.cs脚本:

 11 任务奖励界面TaskWnd,该界面上挂载TaskWnd.cs脚本:

12  副本关卡选择界面FubenWnd,该界面上挂载FubenWnd.cs脚本:

 13  角色控制界面PlayerCtrlWnd,该界面上挂载PlayerCtrlWnd.cs脚本:

 14 战斗结算界面BattleEndWnd,该界面上挂载BattleEndWnd.cs脚本:

 六、功能模块设计实现

1. 初始场景与UI界面制作

制作需要的UI界面,需要注意设置Canvas根据窗口大小匹配,然后以高度为匹配对象,给UI上的各个物体添加锚点,进行自适应,如下图所示。否则会出现当屏幕宽和高翻了一倍后,UI还是原来的大小,原因就是没有去适配整个屏幕。

初始场景与UI界面制作成功后,要实现加载进度界面LoadingWnd、登录场景界面SceneLogin、登录注册界面LoginWnd和动态UI元素界面DynamicWnd 这四个场景的切换。

2. 网络通信系统模块

主要实现用户输入完账号密码点击进入游戏;服务器端接收到用户发来的请求,判断当前要求是哪种类型,分发给网络服务层,网络服务判断是否可以执行,然后再回传给客户端;客户端接收到服务端返回的数据,本地网络服务判断服务器返回的数据是何种类型。

VS2017中需要安装C#平台的支持,我们在windows上使用服务器。在这个项目中,我们使用PESocket开源网络库来实现网络通信。PESocket基于C#语言实现的高效便捷网络库。支持集成到Unity当中使用。

连接成功后将PENet.dll和Protocal.dll添加到unity项目中,ClientSession.cs用来进行客户端会话控制,与服务器端一致;GameStart.cs用来启动客户端,并进行测试。修改NetSvc和LoginSys中的方法,按照同样的方式添加客户端连接服务,然后在NetSvc中进行初始化。首先修改服务器的GmaeMsg.cs,让它知道发送过来的消息是什么,在客户端的LoginWnd.cs中给服务器发送登录的账号密码,在服务器端LoginSys.cs中添加回复登录请求的函数,在NetSvc.cs中增加消息队列,并且添加各种操作方法;为了方便回复消息,把之前的消息队列打包成<ServerSession,GameMsg>这两个,在LoginSys里面,分析登录验证逻辑和回应客户端,将NetSvc中的消息处理方法添加到服务器入口ServerStart中的主函数中去,让它一直执行。新建一个缓存层,里面主要负责服务器端数据检查等功能,在LoginSys中继续完成登录验证的方法,在GameMsg中,设置好错误代码和登录信息。缓冲层CacheSvc中添加两个方法:根据账号密码返回对应账号数据,密码错误返回null,账号不存在则默认;账号上线,缓存数据。

使用MySQL5.6和Navicat for MySQL进行数据库开发和设计。

实现网络通信框架导图如图所示:

 3. 角色展示系统模块

主角在场景中只有两个动作,一个待机,一个移动,可以通过添加Animator组件控制。难点是算出主角的移动方向。由图可以看出,主角是朝向Z轴,所以主角想要转向,应该更改Y轴的值。此时通过玩家的操作,拿到玩家希望移动的方向,然后算出偏移量,再将值赋给Y轴即可。至于移动,以及动作切换就相对来说比较简单了。为了提高平滑度,可以设置一下Animator中的blend。需要注意一下摄像机的相对偏移,让相机一直跟随主角。

 摇杆(如图所示)控制人物行动有三个关键地方,点击,拖拽,松手,点击。显示初始位置以及复位首先需要定义一个监听工具类,在windowroot基类中定义获取组件的方法,传入需要监听的游戏物体。最后在MainCityWindow中调用。拖拽的偏移量可以通过当前位置减去最初位置获得。

 4. 任务引导系统模块

人物的自动寻路 ,当玩家点击自动引导时,角色自动跑到目标地点,并触发相应事件。

NPC对话,将对话的UI搭建好,根据参数判断当前是谁在说话,切换相应的UI即可。读取xml文件,根据#区分,0和1分别是NPC与玩家,|后的内容是对话。

最后需要实现服务器数据交互,玩家完成任务之后,奖励应该是从服务端发送到客户端,而不能直接调用客户端XML文件。避免数据异常,客户端XML文件数据的任务只是显示而已。

5. 强化升级系统模块

角色有六个装备,#0#0这样分开,有10个等级,客户端传过来需要强化的装备参数,服务端执行强化方法,然后返回强化的数据。需要注意客户端本地需要验证是否满足强化条件,避免不必要的带宽消耗,另外只需要传入关键参数即可,例如只需要传入需要强化装备的索引。服务端会根据传过来参数,从缓存层拿到账户数据,判断能否强化,然后将数据返回给客户端,客户端UI界面进行相应的更新。为此服务器端创建一个StrongSys专门处理强化服务器端的信息,然后在服务器端ResSvc来加载强化升级配置,不断完善客户端处理消息的方法,让它能实时刷新星级。

6. 资源交易系统模块

搭建UI,客户端传输局,服务端接收处理再返回。需要注意用户点击之后应该有相应的机制避免连续点击,因为网络交互存在延时,此时可以将按钮设置不可触发,等接收到服务器的消息之后再设置为可以触发。具体为给BuyWnd创建脚本,然后进行初始化和按钮事件注册;完善之前的ChatWnd,然后打开ChatWnd时需要给其传类型,是购买体力还是购买金币。

 7. 世界聊天系统模块

客户端搭建相应的UI,用户输入内容点击发送之后服务器收到消息之后给所有在线的人广播。需要注意点因为是广播,所以会发给很多人,网络数据传输只能使用二进制,在发送前需要将数据转换成二进制,避免资源消耗。世界聊天信息的频率,可以添加个参数用协程控制,保证每几秒只能发送一条。具体为创建一个ChatWnd脚本,在MainCityWnd中添加打开聊天系统的方法,该方法通过调用MainCitySys中的方法实现。需要添加用来控制聊天分类按钮的显示方法,完成按钮点击的事件,分别是发送按钮,世界聊天按钮,公会聊天按钮和好友聊天按钮。首先在服务器端的GameMsg中定义好两个通信的消息类,一个是SndChat用来向服务器发送消息,一个是PshChat是将消息广播;在客户端的ChatWnd类中进行消息发送,在服务器端对发送的消息进行处理并广播,这些都在ChatSys里面处理。

 8. 任务奖励系统模块  

客户端传送完成的任务ID号,服务器端根据ID去配置文件读取,给予账号相对应的奖励,然后将需要更新的数据发回客户端,客户端定义相关的方法对数据进行更新(如下图所示)。具体为首先给在MainCityWnd界面中添加打开TaskWnd界面的方法,然后在BaseData中添加数据配置的类型,这里有两个,一个是基本的类型,另外一个是任务完成度的类型。在服务器端配置任务奖励,主要在CfgSvc中进行,从xml读取任务奖励数据。

9. 副本战斗系统模块

搭建对应的UI,点击UI中的场景切换场景,读取xml文件,将角色加载到对应的界面即可。游戏的战斗模式具体为:

1)请求服务器开始战斗,校验合法则开始加载战斗资源

2)玩家操控角色释放技能,本质是控制角色播放动作,在对应时间点播放技能特效与音效

3)计算攻击范围与伤害

4)保留相应运算结果,战斗数据发往服务器校验

5)结果合法则发送关卡奖励

战斗逻辑框架介绍,如图:

总结 

以上内容也只是一个总体框架的介绍,短时间内完成一个U3D游戏难度还是蛮大的,尤其是要实现服务器的连接让数据进行交互,但是也值得去尝试。第一次接触游戏是为了制作游戏,仿佛打开新世界的大门~~~


http://chatgpt.dhexx.cn/article/cv7QfUem.shtml

相关文章

DB破解(暗黑破坏神辅助)使用方法

下载网址:http://www.mochafuzhu.com/forum.php?mod=forumdisplay&fid=57 开始请先在网站里下载运行环境并安装,然后下载辅助。(Q群:528411948) 1、首先,一定要先 启动游戏,注意!辅助的路径千万不要有中文的目录,否则会造成辅助自动退出的问题。然后解压下载好…

Hacking Diablo II之外挂的工作原理

这一篇介绍外挂的工作原理。如果对外挂是怎么工作的没有一个大概的了解的话&#xff0c;那这一系列文章只能当故事看了。 如下图所示&#xff0c;大方框表示Diablo II.exe的进程空间&#xff0c;框内左侧的虚线表示游戏的主线程循环。游戏主线程循环所做的工作大约有&#xff…

Kratos技术系列|从Kratos设计看Go微服务工程实践

转载地址&#xff1a;https://mp.weixin.qq.com/s/D8py9Ia1KVoPZP-RCfwkgQ 在Kratos中&#xff0c;API定义、gRPC Service、HTTP Service、请求参数校验、错误定义、Swagger API json、应用服务模版等都是基于Protobuf IDL来构建的&#xff1a; 举一个简单的helloworld.proto例…

【kratos入门实战教程】2-实现注册登陆业务

1、系列目录 【kratos入门实战教程】0-商城项目介绍【kratos入门实战教程】1-kratos项目搭建和开发环境配置【kratos入门实战教程】2-实现注册登陆业务 2、概览 通过本篇文章&#xff0c;读者将会掌握kratos的一般开发流程&#xff0c;涵盖了从接口定义、自定义配置&#xff0…

golang 比较完美的通用框架,kratos v2.0 学习,一套轻量级 Go 微服务框架,包含大量微服务相关框架及工具。涵盖了互联网开发的常用功能模块的开发库。

目录 前言1&#xff0c;关于kratos v2.02&#xff0c;Principles 原则2&#xff0c;Features 特色3&#xff0c;Architecture 架构4&#xff0c;总结 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/120464687 未经博主允许不得转载。 博主地址是&…

Kratos战神微服务框架(二)

Kratos战神微服务框架&#xff08;二&#xff09; 目录 Kratos战神微服务框架&#xff08;二&#xff09;项目结构api编写protobuf编写使用makefileservice层接口实现biz层data层configs配置文件 项目结构 api编写 protobuf编写 syntax "proto3"; package realwor…

kratos项目启动笔记

项目启动笔记 1、git clone git地址 2、kratos run&#xff0c;启动成功后如下图 3、假如运行2错误提示如下&#xff1a; 解决方案&#xff1a; 1.在终端中运行go env查看GO111MODULE 的值 如果不为on&#xff0c;则需要开启GO111MODULE 开启命令&#xff1a;go env -w GO1…

新平台架构的解决方案,使用kratos快速搭建系统服务,做好分布式集群,找大一个哥们写的一系列文章,非常不错赶紧学习下。

目录 前言1&#xff0c;关于kratos2&#xff0c;相关文档 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/109504012 未经博主允许不得转载。 博主地址是&#xff1a;http://blog.csdn.net/freewebsys 1&#xff0c;关于kratos https://pandayche…

Ory Kratos 用户认证

Ory Kratos 为用户认证与管理系统。本文将动手实现浏览器&#xff08;ReactAntD&#xff09;的完整流程&#xff0c;实际了解下它的 API 。 代码: https://github.com/ikuokuo/start-ory-kratos 了解 Kratos 获取代码 git clone -b v0.7.0-alpha.1 --depth 1 https://githu…

go微服务框架kratos 安装及使用

windows: 代理和mod 设置 set GO111MODULEonset GOPROXYhttps://goproxy.cn/ 安装protobuf库文件 go get -u github.com/golang/protobuf/proto 安装goprotobuf插件 go install github.com/golang/protobuf/protoc-gen-golatest 安装gogoprotobuf插件和依赖 go install gith…

go用户中心kratos

用户中心kratos kratos介绍 ORY Kratos是根据云架构最佳实践构建的API优先身份和用户管理系统。它实现了几乎每个软件应用程序都需要处理的核心用例&#xff1a; 自助登录和注册:允许最终用户使用用户名/电子邮件和密码组合,社交登录(使用Google&#xff0c;GitHub登录),无密码…

Kratos 集成Gin

Kratos 集成 Gin 规范项目分层处理请求处理、响应编写路由routeKratos 集成gin注入 wire set中 源码 Kratos 可以在 .proto文件定义请求类型&#xff0c;URL&#xff0c;响应等等&#xff0c;如官方示例&#xff1a; service BlogService {rpc CreateArticle (CreateArticleRe…

kratos mysql_Kratos--安装及配置

安装GO环境 安装protoc以及相关的包和插件 安装Kratos Go version>1.12 and GO111MODULEon go get -u github.com/bilibili/kratos/tool/kratos 提示&#xff1a;安装过程中可能会出现部分包下载失败&#xff0c;可以手动下载包然后拷贝至相应文件目录。 快速开始 cd $GOPAT…

初识go-kratos

推荐看一下 Kratos 官方文档 更加流畅观看此文章&#xff0c;本机器这里已经安装好了 kratos、proto、wire、make 等所需的命令工具 1.先下载beer-shop模板 git clone https://github.com/go-kratos/beer-shop.git 2.删除api和app下的全部文件 3.修改go.mod文件 把module g…

kratos mysql_kratos微服务框架学习笔记一(kratos-demo)

本文将为您描述kratos微服务框架学习笔记一(kratos-demo),教程操作步骤: 目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服务框架学习笔记一(kratos-demo) 今年大部分时间飘过去了&#xff0c;没怎么更博和github&#xff0c;现在开发任务也差不多完成…

Kratos日志

一.如何在kratos框架中使用 参考官方文档中描述&#xff0c;为了方便业务自适配不同的 log 接入使用&#xff0c;Logger 只包含了最简单的 Log 接口。当业务需要在 Kratos 框架内部使用自定义的 log的时候&#xff0c;只需要简单实现方法即可。日志库较为公用建议放在kit基础库…

kratos框架学习,在Linux 下面使用kratos 创建demo 项目然后跑起来。使用 kratos new kratos-demo 一键创建项目,脚手架非常方便。但是依赖grpc没有起来

目录 前言1&#xff0c;关于kratos2&#xff0c;使用 kratos new kratos-demo 一键创建项目3&#xff0c;解决gRPC 编译问题4&#xff0c;只创建HTTP服务 前言 本文的原文连接是: https://blog.csdn.net/freewebsys/article/details/109139648 未经博主允许不得转载。 博主地址…

砥砺前行 | Kratos 框架 v2 版本架构演进之路

Kratos 是一套轻量级 Go 微服务框架&#xff0c;包含大量微服务相关功能及工具。名字来源于游戏《战神》&#xff0c;该游戏以希腊神话为背景&#xff0c;讲述了奎托斯&#xff08;Kratos&#xff09;由凡人成为战神并展开弑神屠杀的冒险历程。 写在前面 从 2021 年 2 月份&…

【kratos入门实战教程】1-kratos项目搭建和开发环境配置

1、系列目录 【kratos入门实战教程】0-商城项目介绍【kratos入门实战教程】1-kratos项目搭建和开发环境配置【kratos入门实战教程】2-实现注册登陆业务 2、概览 经过上一篇的说明&#xff0c;本篇教程正式开始搭建项目。深入解析工程项目的目录结构和介绍一些开发需要使用的工…

go微服务框架Kratos简单使用总结

Kratos是B站开源的一款go的微服务框架&#xff0c;最近PS5上的 战神诸神黄昏比较火&#xff0c;主角就是奎托斯。这个框架的名字就取自他。 在进行框架选型时&#xff0c;对比了目前主流的很多go微服务框架&#xff0c;如Zero&#xff0c;最后对比之下&#xff0c;选择了Krato…