Unity开发教程 打造战棋手游《天地劫》

教学视频观看

点击进入

学习建议:先看地图,再看细节

学习建议:先看地图,再看细节

学习建议:先看地图,再看细节

先过一遍视频流程,再去看课程的细节部分

由于采用逆向讲解,从框架到细节,从面到点
所以在学习过开始时,新手经常会把注意力放在细节上,试图弄懂每一章节的细节
但其实,这些细节在后边才展开的

第一节:场景搭建

完成以下场景的搭建

通过搭建场景,掌握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 和AssetBundle
Resources 开发简单,缺点不能做动态更新
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_g
hpImage_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,json
xls2protobuf (或者每个公司内部的转表工具)
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个单位



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

Unity开发教程 打造战棋手游《天地劫》相关推荐

  1. unity课设小游戏_【Unity3D开发小游戏】《跑酷小游戏》Unity开发教程

    一.前言 最近跑酷游戏比较流行,开发教程也很多,但是大部分都是不太详细,这篇文章就带着大家一步一步开发出来一个跑酷类的游戏,教程比较基础,适合大部分Unity开发的初学者. 还有就是,此专栏已经开通收 ...

  2. 【Unity3D开发小游戏】《跑酷小游戏》Unity开发教程

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 最近跑酷游戏比较流行,开发教程也很多,但是大部分都是不太详细,这篇 ...

  3. 【Unity3D开发小游戏】《战棋小游戏》Unity开发教程

    一.前言 这次想要做的一个小游戏,或者说一个小Demo,其实是一个简单且传统的战棋战斗场景.初步的设计是:在2D世界里创建一张由六边形地块组成的战斗地图,敌我双方依据体力在地图上轮流行动并向对方发动攻 ...

  4. 【Unity3D开发小游戏】《植物大战僵尸游戏》Unity开发教程

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 文章目录 一.前言 二.源码 三.正文 版本 1.主摄像机设置 2.创造草地 ...

  5. 【Unity3D开发小游戏】《我的世界游戏》Unity开发教程

    推荐阅读 CSDN主页 GitHub开源地址 Unity3D插件分享 简书地址 我的个人博客 QQ群:1040082875 一.前言 这套教程涵盖了Unity Mesh编程.模拟水算法(water s ...

  6. 【Unity3D开发小游戏】《打砖块》Unity开发教程

    文章目录 一.前言 二.源码 三.教程 版本 1.相机设置 2.背景设置 3.设置分层 4.添加边界 5.添加球拍 6.球拍移动 7.这个球 8.添加球的脚本 9.球拍碰撞角 10.添加块 四.总结 ...

  7. 【Unity3D开发小游戏】《宝石迷阵游戏》Unity开发教程

    文章目录 一.前言 二.资源下载 三.正文 1.摄像机调整 2.宝石 3.网格 4.gemAt函数 5.生成宝石 6.使宝石下落 7.寻找匹配 8.解决匹配 9.宝石选择 10.交换宝石 11.摘要 ...

  8. 【Unity3D开发小游戏】《2D乒乓球游戏》Unity开发教程

    一.前言 本篇文章教大家如何用unity制作一个2D游戏--乒乓球游戏,主要用到的Unity知识包括碰撞,Transfrom等知识,希望大家可以在这个小教程中学习到东西 效果图: 二.资源下载 UI资 ...

  9. 【Unity3D开发小游戏】《俄罗斯方块》Unity开发教程

    文章目录 一.前言 二.下载链接 三.正文 Unity版本 项目设置 关于方块和方块组 创建游戏布局 添加边框(边界) 创建方块组 Spawn 类 Gird 类 roundVec2()函数 insid ...

  10. 【Unity3D开发小游戏】《塔防游戏》Unity开发教程

    文章目录 一.前言 二.源码 二.版本 三.开始 1.游戏规则 2.艺术风格 3.摄像机设置 4.光线设置 5.地面设置 6.建筑物设置 7.城堡设置 8.怪物设置 9.生成怪物 10.子弹设置 11 ...

最新文章

  1. OpenGL开发学习指南二(glfw+glad)
  2. guid主分区表损坏怎么办_轻钢龙骨隔墙怎么办?轻钢龙骨隔墙的做法
  3. ArrayBlockingQueue原理分析-put方法
  4. 无需另配定时器在STM32 HAL下实现微秒级延时(兼容FreeRTOS)
  5. pdf转word python_Python实现PDF转Word
  6. utf-8与unicode是什么关系
  7. Eclipse使用技巧--设置编辑器背景护眼色和设置字体
  8. 16G DWDM SFP+光模块特性及解决方案
  9. 红警教育2020版笔记本芯片级维修教材(含军工级)
  10. 原生javascript手风琴图片切换案例
  11. [CSP冲刺班]CSP-J2021模拟赛#9
  12. 百度网盘PC端扫描二维码登录时无法加载二维码问题解决方法
  13. 在Word2010文档中设置和显示隐藏文字
  14. Vin码/车架号OCr识别
  15. tomcat启动就运行我的写的java类
  16. 10382 - Watering Grass(贪心 区间覆盖问题)洒水面覆盖
  17. [20120919] 关于紫光输入法.txt
  18. 资本赋能,跨境电商Starday逐鹿年终场
  19. 【树莓派】树莓派4配件,简单汇总玩树莓派4需要购买的配件
  20. 世界上最贵的摩托车是什么车?

热门文章

  1. vscode更换主题颜色(护眼色)
  2. win10 无法安装Hp1020和HP1106打印机问题
  3. [bzoj3812]主旋律
  4. 山东大学(青岛)博士后招聘-微生物技术国家重点实验室专场
  5. 淘宝搜索页面爬取数据
  6. 获取支付宝小程序链接
  7. html邮件模板美化,设计利器:定制你的炫酷邮件模板
  8. Android实现多国语言适配:app名称随系统的语言而更换
  9. 案例分析:传统媒体如何借力微信平台推广
  10. 如何将HTML与win10桌面壁纸,Win10默认桌面背景怎么设置