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

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反序列化过程,人物读取实体对象并且更新数据

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

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

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

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210517193122377.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvbGp5MTEx,size_16,color_FFFFFF,t_70
这节课重点的内容
全局对象的设计,避免 空引用 事件

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

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

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

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

在线答疑篇

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

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

支持2D吗?

资源加载支持吗异步吗?

在这里插入图片描述

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

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

所以,我们只需要拿到节点数据进行算法加工即可得到自定义路径
在这里插入图片描述

在这里插入图片描述
自定义路径
在这里插入图片描述

Unity六边形战棋

在这里插入图片描述
先上效果
在这里插入图片描述
对A星数据结构和算法熟系的话,很快就能修改出来
关键步骤
相邻节点改为6个
偶数列节点偏移1.5个单位
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
节点偏移后需要加强空间坐标查找地图坐标,否则会出现查找不正确
在这里插入图片描述

  • 13
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Unity是一款功能强大的游戏制作引擎,它可以用来制作各种类型的游戏,包括手游。在Unity中,联机功能是非常重要的一部分,因为联机可以将多个玩家连接到同一个游戏世界中,让游戏变得更加有趣和有挑战性。 首先,在Unity中实现联机功能需要使用网络编程的知识,因此,你需要理解TCP/IP协议、网络数据传输等相关内容。然后,你需要用Unity中的UNET(Unity Networking)组件来构建联机功能。UNET是Unity自带的一个网络组件,它可以让你轻松地将游戏中的玩家连接到同一个服务器上。使用UNET,你可以创建主机和客户端,主机会将游戏状态同步到它所有的客户端上。 接下来,你需要设置玩家角色的同步方式。玩家角色有多种同步方式,例如平滑插值、插值、预测、快照等。你需要根据你的游戏特点来选择适合的同步方式。 最后,你需要处理数据同步的问题。在联机游戏中,多个玩家需要同时看到同一状态。所以需要对游戏的状态进行同步,以保证所有玩家看到的游戏状态都是一致的。例如,当一个玩家移动时,需要将其位置同步到其他玩家的客户端上。 总的来说,在Unity中实现联机功能需要先理解网络编程的知识,然后利用UNET组件构建联机实现。最后,需要通过适当的同步方式和数据同步来保证游戏的玩法和状态一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程之力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值