Unity战棋卡牌游戏开发教程

您所在的位置:网站首页 laya教程好少 Unity战棋卡牌游戏开发教程

Unity战棋卡牌游戏开发教程

2023-05-27 05:03| 来源: 网络整理| 查看: 265

Unity开发教程 打造战棋手游

教学视频观看

点击进入

学习 爆款戏战棋游戏开发过程

学习案例:

小张:顺利的完成了毕业设计(游戏开发专业)

小明:具备了制作独立游戏的能力

张三:为公司的虚拟仿真项目(VR/AR)提供了资源更新方案

李四:为公司项目提供了成C#热更方案

所以这堂课具备学习和商业价值

课程从简单到困难,依次分成了4个维度

第一季:战棋游戏基础开发

第二季: 资源管理和更新

第三季:ILRUNTIME代码热更设计

第四季:联网对战(包含前后端,ET框架)

打消你的一切顾虑,先看后买,专人服务

因为部分开发者基础欠缺,课程购买之后发现看不懂

所以课程全部免费观看。

但是

购买课程后可以获得

完整素材和源码

专人的服务和解答

学习建议:

完整的看一遍目录,先了解你到底需要什么。大部分学生只需要学习第一季

前期不要过多关注细节!前期不要过多关注细节!前期不要过多关注细节!

因为在前期观看时,部分开发者会遇到不明白的地方

(这句代码到底哪里来的?是什么意思)

而这些内容是放在后面讲解的,坚持顺着课程看下去很重要

购买课程的用户,遇到问题添加QQ972421090。

老师会协助处理问题。

注明-战棋游戏开发

第一节:场景搭建

完成以下场景的搭建

通过搭建场景,掌握U3D的常用功能,包含(动画系统,地形编辑器,LOD大型场景优化等。。。)

放入人物,如何人物动起来,放入树木,草地,创建地形,优化讲解(LOD在国内的游戏案例,和平精英)完结

第二节:A星寻路——移动范围

战棋游戏的核心功能1:人物的行走范围2:点击目标点时能够避开障碍物走到目标点3:遇到草地,雪地时移动范围会减少4:遇到水面只有会游泳的人才能过去,遇到断崖时会飞的单位才能过去5:战斗模块的技能范围(可归类为第一个问题)6:地图数据的编辑所以 掌握了前面4个要点就意味着掌握了战棋游戏的核心算法!!!

因为本节课涉及的理论比较多

第一个问题:如何显示移动范围?

如何让人物在水中行走?

表示算法可遍历水节点

遇到草地,雪地减少移动范围

给开发者话:

在我们这期课程中,我们使用了 A* Pathfinding Project 进行开发A星插件是方便我们快速的制作游戏。如果只是独立制作游戏,那么这款插件足以满足开发需求

如果是想在国内从事游戏开发,还是要学习A星的算法和理论,可以在百度查询到很多相关理论资料

那么为要理论能帮助我们找到更好的工作?

因为面试官是要在一群人中挑出少部分人选,一般只有10多分钟的初试时间,为了减少招聘成本(时间)往往会看一些指标,那么算法和理论就是一个很好的参照物

第三节:寻路移动

鼠标选中人物后显示范围,并且播放准备动画

讲解 GameCtrl.cs

(导入包gridMeshManagerV2)

选定人物时点击地面,进行寻路移动

多个人物的情况的细节

已经选中人物的状态下如果用户再次点击的人物就要判断和当前选中的对象是否一致,如果一致则什么都不做如果用户点击地面则进行移动否则把当前人物的指令取消切换人物后再执行准备指令

细节:(实现)地图路径节坐标转世界坐标增加一个跑步动作ABPATH的约束修改路径显示器插件动画系统的过渡参数连线

第四节:敌人路径

设置可操作的单位选择人物后假如是 敌人则显示移动范围否则人物调用准备指令

设置 移动路径不可以穿过敌人

实现:GameDefine创立门派

PlayerCtrl指定门派

GameCtrl设置可控门派

范围路径 加入敌人节点进行约束

第五节:攻击范围

在移动范围路径的基础上,对每个节点范围搜索

创建 搜索规则 (攻击距离路径规则) StrikingRangePath (没有约束条件)

计算之后会得到,会得到攻击范围

显示攻击范围=攻击范围-移动范围

定义玩家攻击范围Player 添加 Attribute(属性)

第六节:攻击敌人的路径

GameCtrl在选定我方角色的情况下,假如点击了敌人判断是否在攻击距离内如果是进行攻击 敌人否则跑过去攻击 敌人->记录人物状态(这个时候不再执行鼠标点击逻辑)

为了实现以上功能会用到新的知识点

包含 委托的使用,A星 节点遍历规则约束

第七节:远程走位攻击

在游戏中中,普通攻击的方式分别大致可以归纳为3种(法师)0-2格,(侠客)0-1格,(弓箭手)1-2格所以说弓箭手不能够近身攻击

例如:上边的图就是最大范围为2,最小范围为1,有效范围=大范围-小范围

弓箭手在点击敌人时,也要处理好站位问题

自动理论:以攻击点生成最小范围,移动范围-攻击最小范围=走位范围

然后利用获取最近点的API,查找规则是 以敌人为开始点,约束规则是 走位范围

即可求得最适合的位置

我们首先处理移动范围 查找 攻击节点的问题,如下图,右边的人物显示移动范围时 因为人物占位了移动范围,所以不行射程查找

期望的执行结果

先讲一下编码规范,变量一般要写在文件的前面,因为我是采用倒推方式写,变量是靠IDE生成的, 如果在团队协作开发的话务必按照上述规则进行变量的定义

第八节:攻击,受击,反击,阵亡 逻辑

先演示视频

需求文档:先计算好总伤害,然后实现交互伤害动画效果

播放攻击动画,且配置好打击动画帧

在打击帧数 里 播放 敌人受击动画,且输出伤害信息

攻击完毕后,判断敌人是否 能进行还击

还击条件:还活着且在 攻击范围内

第九节打击特效,资源加载 对象池,事件派发

显示特效-> 资源加载->实例化对象-> 回收对象

资源加载 分为两大类-> Resources 和AssetBundleResources 开发简单,缺点不能做动态更新AssetBundle 可动态更新,开发难度相对复杂

因为目前我们项目还是处在一个开发阶段,首要的目标就是快速做出功能所以采用了 Resources 这种方案

为了便于在后期换成 AssetBundle 进行动态更新我们定义 Resources 的加强类 ResourcesExt,通过该类进行资源管理这样的好处是根据项目进度采用不同的加载策略

第十节 UI模块 -伤害飘血

创建画布,制作艺术字体,制作伤害字体预制体

U3D艺术字体的制作文档文章https://blog.csdn.net/koljy111/article/details/106071430

在玩家受到伤害时派发显示飘血事件创建UICtrl , 订阅 事件 ,在 执行方法里 对象池加载伤害字体预制体

为了效果更好看,我们用动画编辑器制作字体放大缩放的效果

第十一节 血条跟随显示+待机指令

导入素材,配置待机按钮在右下角,执行待机结束后,显示下一个玩家

需求整理选择玩家是已方单位 且 状态 为 Idle 则显示 待机UI

在取消选择时关闭待机UI

点击待机命令后设置玩家状态为待机

各种小细节1:待机状态中选择人物不显示待机UI

2:待机状态下不能执行撤销移动和被选择

3:战斗中不能执行任何指令

4:防止待机同时执行游戏游戏指令(三维和UI 操作重叠判断)

5:攻击结束后把攻击者设置为待机

6:待机状态下不能移动

…这些细节的处理根据变量决定哪些函数被跳过或者执行,所以没有太多学习的价值所以这里稍微带一带过

ui层级配置Canvas/ActionPanel/wait

Resources/prefab/ui/hpImage_ghpImage_r

第十二节 技能系统

从技能结构分析,执行时机,条件,作用 种类多变。

遇到这种需求要最好的应对方法就是《设计模式》的封装思想

–哪里变化就封装哪里–

最后总结抽象封装的利弊,可以应对变化方便读表后配置技能,但是维护和阅读成本会比较大

第十三节:被动技能-克敌先机

这节课讲解了技能执行条件+行为条件

通过上节课和这节课我们能通过节点组合配置出不同的技能

//技能1 [时机1][条件1] [作用1]//技能2 [时机2][条件2] [作用2]//技能3 [时机1][条件2] [作用1+作用2+作用n]

//克敌先机        //遭受近战[攻击] 对战开始时 防御+7%        //遭受近战[攻击] 发动 [先攻] , 每回合一次        skill = new Skill();        skill.name = "克敌先机 ";        //触发条件  遭受近战        //定义一个战斗开始状态        start_state = skill.addState();        start_state.timing = ExecuteTiming.FightingStart;        //触发条件->遭受近战[攻击]        var condition = new AttackedByMelee_Condition();        //先攻节点        var fastAttackNode = new FastAttack();        //成功后执行 执行执行先攻        condition.successTodoNodes.Add(fastAttackNode);        condition.successTodoNodes.Add(add_node);        start_state.actionNodes.Add(condition);       // start_state.actionNodes.Add(add_node);        //战斗结束时 移除状态        var end_state = skill.addState();        end_state.timing = ExecuteTiming.FightingEnd;        //执行compelet 去除加防状态        end_state.actionNodes.Add(condition);        skillMap.Add(Skill_ID.kedixianji, skill);

第十四节:处理_技能叠加和技能实例(引用类型常见事项)

人物2个被动技能 都是增加14%防御假设人物 防御=100 ,预期结果需要为100+(10014%)+(10014%)=128但目前架构结果则为129

因为第2次的计算是在第一次的结果上进行运算的,所以需要修改

加入战斗前的属性

当前属性=当前属性+(战前属性14%)+(战前属性14%)

因为当前人物属性是引用类型class

所以保存战前属性不能直接用=号赋值,因为值类型的赋值表示为战前属性是当前属性的引用,内存里只有一个属性表

所以至少需要2分表才能进行计算,为属性编写克隆方法,克隆之后 两个 变量都属于独立的存在

第二个问题是2名敌人各配置一个先攻技能,但却只发动了一次

解决方法: 为每个人物单独分配的技能实例

第15节 技能插槽UI和滑动控制镜头第16节 主动技能设计-(治疗+群体治疗)

在制作本节的内容之前,我们要搭建UI,导入技能图片,字体制作,特效等

以上内容相信大家看了之前的课程已经掌握制作了方法,这里就把素材包导入,把课程重点放在程序的编码和实现

第17节 技能CD设计和回合制逻辑

第十八节主动伤害技能+范围显示的实现(GridMesh)

第十九 行为树AI-使用技能攻击

在游戏开发中,AI的解决方案常见的有2种,行为树和状态机

这次我们项目用行为树作用AI解决方案

上图是行为树设计图转换成代码的执行过程,看起来用直接用代码实现更加简洁易于理解

从需求简单的情况下来讲,硬编码是最优选

但如果项目的AI复杂程度越高,硬编码的代码就会变得难以阅读和维护

行为树则是应对AI复杂度高的项目而设计的。灵活度比较高,维护和拓展性高,加上可视化编辑器工具随意组合节点,让AI制作 成为摆放积木一样简单

缺点:任何一个简单的操作都必须要使用节点,功能类过多会出现类爆炸

每个方案各有利弊和他们的适用场景

作为游戏开发者的话,行为树是很值得掌握的一种编程思想,所以这里采用行为树作为解决方案

我们会通过硬编码逐步迭代到行为树,课程这样设计是为了从业务需求看透行为树的诞生设计。

因为 设计思想相比代码细节 更能让开发水平得到质变

第二十节 行为树流程控制(Sequence,Selector)

Selector只要子节点有一个返回true,则停止执行其它子节点,并且Selector返回true。如果所有子节点都返回false

Sequence只要有一个子节点返回false,则停止执行其它子节点,并且Sequence返回false。如果所有子节点都返回true,则Sequence返回true。

以上这两种设计是非常巧妙的他们的出现可以让行为树通过不同的节点组合进行流程控制

为行为树可配置化的提供了重要的作用

第二十一节 AI策略最优解

实现原理:穷举出所有情况,对比所有方案,选择出最佳的结果

第二十二节 不同类型AI的权重分配

作为当前行动的玩家,他有2个选择,进攻敌人或是为队友治疗

进攻型:伤害技能>普攻>辅助治疗辅助型:辅助治疗>伤害技能>普攻

因为本节课的编码细节更多的是一个业务逻辑代码的复制粘贴,封装,调整顺序流程所以采用讲解形式进行本课程,着重讲解设计思想

第二十三节 AI托管第二十四节 声音系统+配置读写

开始游戏时播放背景音乐

按钮音效

打击音效

被动技能触发音效

搭建声音控制UI面板

声音开关配置的读取和保存

第二十五节 人物等级设定+读取策划excel表

今天要制作人物等级系统

我们收到了数值策划的excel表单

可以清晰看到人物每一级的属性变化

那么这份表怎么把他具体化到我们的游戏里就是我们这节课的主要内容

因为移动平台不具备excel表直接读取功能,所以第一步:把表转换成程式可识别数据

一般常用的格式常见有两种 protobuf,jsonxls2protobuf (或者每个公司内部的转表工具)excel2json (或者每个公司内部的转表工具)

共同点能把xls表转换成易于程度读取的数据格式不同点xls2protobuf 数据内容会更小所以网络传输性能会更好,搭建环境相对繁琐excel2json 配置和使用简单数

如果是制作大型网络游戏,因为会要和后端打交道,业内一般用 protobuf

这里选用 excel2json ,为了课程方便学习,更容易梳理开发流程

在学习上对我们开发者而言,无非是导出excel表所使用的工具和类库不同

excel2json是github一个开源工具,他可以完成xls导出json格式和数据层模型

第二步编写Json反序列化过程,人物读取实体对象并且更新数据

--------------------------------分隔线-------------------------------------

第二十六节 场景加载和切换(事件清除)

从开始页面 加载战斗场景设置->返回首页->退出战斗->事件清理->加载开始页面

这节课重点的内容全局对象的设计,避免 空引用 事件

首页和战斗场景都需要用到声音模块

所以声音模块需要改写成 只能实例化一次 ,且不受场景加载销毁

这样就能保证声音模块是全局唯一对象

unity3d 教程unity3d 新手教程u3d教程u3d新手教程unity2019

在线答疑篇

地图高低起伏怎么处理?1:人物行走2:路径显示

如何自定义路径?比如直线,十字,田字?了解A星的数据结构和算法,自定义算法

支持2D吗?

资源加载支持吗异步吗?

如果想深入了解投影原理,可以查阅图形学相关的资料,这是推荐的书籍或视频学习时长在24小时左右

在本次课程中我们用了A星插件,该插件的设计是建立在A星算法理论之上的通过学过A星算法我们知道,寻路算法是对节点信息进行迭代计算

所以,我们只需要拿到节点数据进行算法加工即可得到自定义路径

自定义路径

Unity六边形战棋

先上效果

对A星数据结构和算法熟系的话,很快就能修改出来关键步骤相邻节点改为6个偶数列节点偏移1.5个单位

节点偏移后需要加强空间坐标查找地图坐标,否则会出现查找不正确



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3