点击进入
先过一遍视频流程,再去看课程的细节部分
由于采用逆向讲解,从框架到细节,从面到点
所以在学习过开始时,新手经常会把注意力放在细节上,试图弄懂每一章节的细节
但其实,这些细节在后边才展开的
通过搭建场景,掌握U3D的常用功能,包含(动画系统,地形编辑器,LOD大型场景优化等。。。)
放入人物,如何人物动起来,放入树木,草地,创建地形,优化讲解(LOD在国内的游戏案例,和平精英)完结
战棋游戏的核心功能
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,通过该类进行资源管理
这样的好处是根据项目进度采用不同的加载策略
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名敌人各配置一个先攻技能,但却只发动了一次
解决方法: 为每个人物单独分配的技能实例
在制作本节的内容之前,我们要搭建UI,导入技能图片,字体制作,特效等
以上内容相信大家看了之前的课程已经掌握制作了方法,这里就把素材包导入,把课程重点放在程序的编码和实现
在游戏开发中,AI的解决方案常见的有2种,行为树和状态机
上图是行为树设计图转换成代码的执行过程,看起来用直接用代码实现更加简洁易于理解
从需求简单的情况下来讲,硬编码是最优选
但如果项目的AI复杂程度越高,硬编码的代码就会变得难以阅读和维护
行为树则是应对AI复杂度高的项目而设计的。灵活度比较高,维护和拓展性高,加上可视化编辑器工具随意组合节点,让AI制作 成为摆放积木一样简单
缺点:任何一个简单的操作都必须要使用节点,功能类过多会出现类爆炸
每个方案各有利弊和他们的适用场景
作为游戏开发者的话,行为树是很值得掌握的一种编程思想,所以这里采用行为树作为解决方案
我们会通过硬编码逐步迭代到行为树,课程这样设计是为了从业务需求看透行为树的诞生设计。
因为 设计思想相比代码细节 更能让开发水平得到质变
Selector
只要子节点有一个返回true,则停止执行其它子节点,并且Selector返回true。如果所有子节点都返回false
Sequence
只要有一个子节点返回false,则停止执行其它子节点,并且Sequence返回false。
如果所有子节点都返回true,则Sequence返回true。
以上这两种设计是非常巧妙的
他们的出现可以让行为树通过不同的节点组合进行流程控制
为行为树可配置化的提供了重要的作用
实现原理:穷举出所有情况,对比所有方案,选择出最佳的结果
作为当前行动的玩家,他有2个选择,进攻敌人或是为队友治疗
进攻型:伤害技能>普攻>辅助治疗
辅助型:辅助治疗>伤害技能>普攻
因为本节课的编码细节更多的是一个业务逻辑代码的复制粘贴,封装,调整顺序流程
所以采用讲解形式进行本课程,着重讲解设计思想
开始游戏时播放背景音乐
按钮音效
打击音效
被动技能触发音效
搭建声音控制UI面板
声音开关配置的读取和保存
可以清晰看到人物每一级的属性变化
那么这份表怎么把他具体化到我们的游戏里就是我们这节课的主要内容
因为移动平台不具备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星算法我们知道,寻路算法是对节点信息进行迭代计算