暗黑战神游戏开发游戏学习笔记
- 第一章:初始场景与UI界面制作
- 光照系统
- 有哪些参数可以设置光源?
- 1、点光源
- 2、window界面下的LightSetting
- 光照系统的优化方法
- Animation系统
- 第二章:UI逻辑框架与配置文件
- 第三章:网络通信与服务器逻辑框架
- 第四章:数据库与服务器缓存层
- 第五章:主城UI逻辑及角色控制
- 光照渲染烘焙
- UI搭建(经验进度条自增长、UI动画)
- 进度条的实现:
- 动画的UI实现
- 摇杆制作
- 主角人物控制
- 主场景加载配置
- 第六章:角色展示系统与任务引导系统
- 常规信息显示
- 任务引导系统开发
- 人物的自动寻路
- NPC对话界面
- 新增服务器数据交互
- 第七章:强化升级系统
- 第八章:世界聊天系统与资源交易系统
- 世界聊天系统
- 资源交易系统
- 第九章:任务奖励系统与副本业务系统
- 任务系统
- 副本业务
- 第十章:战斗系统之资源制作与架构设计
- 场景制作
- 架构设计
- 第十一章:战斗系统之技能效果与技能位移
- 第十二章:战斗系统之技能配置与技能伤害
- 玩家使用技能之后如何判断
- 第十三章:战斗系统之数值显示与普攻连招
- 怪物血条显示
- 普攻连招
第一章:初始场景与UI界面制作
光照系统
有哪些参数可以设置光源?
1、点光源
2、window界面下的LightSetting
光照系统的优化方法
光照系统渲染可以分为实时渲染和预渲染
对于动态物体可以进行实时渲染,但是对于一些不动的物体,可以设置为预渲染模式,会将一部分内容预先保存到贴图文件。
Animation系统
制作最简易的动画,每一帧几率下需要更改组件的内容,游戏运行的时候自动播放。
第二章:UI逻辑框架与配置文件
本章内容主要是讲解UI、场景切换的相关API,以及调用xml文件,都是一些API调用,没有什么技术含量,百度查询相关文章即可。
第三章:网络通信与服务器逻辑框架
主要使用PESocket插件,没有什么难度,也是API调用。
第四章:数据库与服务器缓存层
这一章比较复杂,首先梳理一下简易流程。
1、用户输入完账号密码点击进入游戏。
2、服务器端接收到用户发来的请求,判断当前要求是哪种类型,分发给网络服务层,网络服务判断是否可以执行,然后再回传给客户端。
3、客户端接收到服务端返回的数据,本地网络服务判断服务器返回的数据是何种类型,(是登录则切换界面,是。。则。。)
第五章:主城UI逻辑及角色控制
光照渲染烘焙
和第一章内容差不多,对静态物体进行渲染,没啥好总结的。
UI搭建(经验进度条自增长、UI动画)
需要实现如图以下效果:
进度条的实现:
定义一个空物体作为父类,挂在Grid Layout组件,通过代码定义好参数,下面有十个子类,每个子类分别是一个蓝色的方块。
需要注意的点:不同分辨率情况下极其容易出错,在这种情况下,我们要根据放大的比例算出父类的宽,然后去掉中间9个黑色部分的宽度,然后除以10,即可获得每个蓝色小方块的宽高。然后判断当前百分比,遍历蓝色小方块的显示。
动画的UI实现
定义两个动画,一个关闭,一个开启。
开启动画:两帧:第一帧保持原样,第二帧将所有图标回归原点(与父类相对位置为0),开关按钮旋转45°。
关闭动画:两帧,与开启动画反着来即可。window脚本中定义一个bool变量判断是开启还是关闭。
摇杆制作
摇杆有三个关键地方,点击,拖拽,松手。
定义一个监听工具类如下:
在windowroot基类中定义获取组件的方法,传入需要监听的游戏物体。
在MainCityWindow中调用。
点击,和抬起都很简单,只是显示初始位置以及复位。
拖拽有一点小麻烦,偏移量可以通过当前位置减去最初位置获得,然后可以限制一下移动的范围(有现成的API可以调用,但是此处也需要算入不同分辨率的宽高比)即可。
主角人物控制
主角在场景中只有两个动作,一个待机,一个移动,可以通过添加Animator组件控制。
难点是算出主角的移动方向。
由图可以看出,主角是朝向Z轴,所以主角想要转向,应该更改Y轴的值。
此时通过玩家的操作,拿到玩家希望移动的方向,然后算出偏移量,再将值赋给Y轴即可。
至于移动,以及动作切换就相对来说比较简单了。为了提高平滑度,可以设置一下Animator中的blend。
需要注意一下摄像机的相对偏移,让相机一直跟随主角。
运行流程:palyerController挂载在角色上,移动方法写在update中,palyerController是MainCitySys的成员,MainCityWindow移动时,调用MainCitySys的单例给palyerController设置方向以及Blend参数,palyerController的update中检测到状态以及方向的改变,开始移动。
Blend参数会在拖拽时变成1,手抬起时变成0。
主场景加载配置
这部分没有啥好说的,将主角,摄像头应该加载的相关数据写入xml文件中,加载的时候读取赋值即可。
第六章:角色展示系统与任务引导系统
常规信息显示
没啥好讲解的,都是UI搭建,需要注意一点的是,个人信息显示页面应该显示当前角色。
这里,我们可以使用renderTexture配上多摄像头的用法。
任务引导系统开发
人物的自动寻路
任务引导系统是新手教程必被内容,当玩家点击自动引导时,角色自动跑到目标地点,并触发相应事件。
实现过程:
1、首先烘焙场景。
需要注意:需要烘焙的场景中的物体,Mesh Render需打开。传入目标地点。2、给玩家操纵角色添加NavMeshAgent组件。
NavMeshAgent与已经存在的CharacterController组件可能存在冲突,因此只有在玩家点击引导时才将NavMeshAgent组件设置为true。
注意点:
1、玩家在自动跑路过程中如果自己移动,需要解除自动寻路功能。
2、需要写一个判断是否已经到达目标点的方法,并且定义一个相关参数在update中循环判断。如下图所示:
当玩家点击寻路时,是否已经到达目标地点,如果到了触发相应事件,如果没到,那么继续跑路,此时一直判断循环调用自身,直到到了触发事件。
NPC对话界面
没啥好说的,UI搭建,根据参数判断当前是谁在说话,切换相应的UI即可。
此处读取xml,根据#区分, 0 1分别是NPC与玩家,|后的内容是对话。
新增服务器数据交互
这一点很重要,玩家完成任务之后,奖励应该是从服务端发送到客户端,而不能直接调用客户端XML文件。避免数据异常,客户端XML文件数据的任务只是显示而已。
第七章:强化升级系统
本章没有啥技术点,全是业务系统。
角色有六个装备,#0#0这样分开,有10个等级,客户端传过来需要强化的装备参数,服务端执行强化方法,然后返回强化的数据。
注意点:客户端本地需要验证是否满足强化条件,避免不必要的带宽消耗,另外只需要传入关键参数即可,例如只需要传入需要强化装备的索引。
服务端会根据传过来参数,从缓存层拿到账户数据,判断能否强化,然后将数据返回给客户端,客户端UI界面进行相应的更新。
第八章:世界聊天系统与资源交易系统
世界聊天系统
功能非常简单,客户端搭建相应的UI,用户输入内容点击发送之后服务器收到消息之后给所有在线的人广播。
注意点:
1、因为是广播,所以会发给很多人,网络数据传输只能使用二进制,所以在发送前需要将数据转换成二进制,避免资源消耗。
2、世界聊天信息的频率,可以添加个参数用协程控制,保证每几秒只能发送一条。
协程的使用介绍
资源交易系统
功能也很简单,搭建UI,客户端传输局,服务端接收处理再返回。
注意点:
用户点击之后应该有相应的机制避免连续点击,因为网络交互存在延时,此时可以将按钮设置不可触发,等接收到服务器的消息之后再设置为可以触发。
第九章:任务奖励系统与副本业务系统
任务系统
内容相对简单,客户端传送完成的任务ID号,服务器端根据ID去配置文件读取,给予账号相对应的奖励,然后将需要更新的数据发回客户端,客户端定义相关的方法对数据进行更新。
副本业务
内容相对简单,搭建对应的UI,点击UI中的场景切换场景,读取xml文件,将角色加载到对应的界面即可。
第十章:战斗系统之资源制作与架构设计
场景制作
内容相对简单,没啥好介绍的,灯光烘焙等,参考第一章
架构设计
个人觉得非常重要。
先看下结构图:
问题1:都是战斗系统的内容,为什么要单独弄出一个BattleMgr管理类,直接让BattleSys管理不好吗?
答:与前面UI界面内容不同,战斗系统相对复杂,全部交给Sys负责不是不可以,但是会导致代码太混乱。详细架构:
BattleMgr类:状态管理器,技能管理器,玩家逻辑实体类都是他的成员。
玩家逻辑实体类:BattleMgr,StateMgr,SkillMgr,Controller都是他的成员。
状态接口
需要传进来逻辑实体,以及相对应的参数。
例如,玩家由静止状态变成了跑步状态,会将自身传入到该状态中,然后由状态管理类调用相对应的方法。
即,运行流程是:进入战斗场景先创建一个玩家逻辑实体类,以及相对应的初始化。
在战斗场景中,假设玩家按了1技能,PlayerCtrlWnd会调用BattleSys的单例,执行使用技能的方法。BattleSys会下发到内部的BattleMgr的调用技能方法,BattleMgr在发给自身的玩家逻辑实体类成员,玩家类再交给自身的状态管理类,技能管理类的执行进入,执行,退出状态的方法,传入玩家逻辑实体类,状态类调用自身的方法,在调用传进来的玩家逻辑实体类调用自身的方法,玩家类在调用自身的技能管理器去执行技能(此处也需要传入玩家类),玩家类再根据当前技能调用controller类调用动画组件执行相应的操作。至此,完成一系列的操作。
玩家控制界面调用点击方法,BattleSys调用单例执行技能方法。
进入到BattleSys类中,调用自身battleMrg执行技能方法。
BattleMgr调用自身的玩家类。
玩家类调用技能管理类。
技能管理类下发到某个详细的状态类。
此处攻击类调用玩家类的方法。
玩家类调用技能类的方法。
技能类读取XML文件,获取技能相关的数据,再交给玩家类调用。
玩家类再交给控制类调用动画组件
至此一套流程运行完成。
第十一章:战斗系统之技能效果与技能位移
主要运行流程都在第十章内容,本章主要是具体实现逻辑,读取xml,调用组件做相关事情,没有啥好说的,偏向于业务层。
技能特效:将组件拖到角色下,控制setActive即可。
第十二章:战斗系统之技能配置与技能伤害
此章内容与10、 11差不多,补充了数值以及人物战斗与怪物的交互
玩家使用技能之后如何判断
在玩家使用攻击技能之后增加一个伤害的方法。
在BattleMgr中写一个获取所有当前怪物的方法,然后根据玩家的技能,判断距离等条件判断怪物是否会被攻击。
经过一系列闪避、穿甲的暴击计算之后,判断怪物是进入被攻击状态还是死亡状态。
第十三章:战斗系统之数值显示与普攻连招
本章主要内容是怪物血条、暴击等显示,与连招系统
怪物血条显示
搭建相应的UI,血条有俩种背景,一种红色,另一种黄色,红色瞬间掉血,然后黄色紧随其后,实现一个类似于lol英雄血条被打的效果。
问题是,血条在UI层,然而怪物实体在3D层,此时应该怎么办呢?
答案是调用Camer中的左边转换方法,将游戏物体左边转换为屏幕坐标(要注意UI的适配比例)。
普攻连招
普攻效果有五段,当玩家快速点击的时候,应该按照顺序执行。
连击时间是0.5S,如果0.5S内玩家没有点击,那么将连击归0并且重新计时。
此时有五个参数,假设是1-5,根据当前传入的参数执行不同的动作。每按一次都将这个参数加入到队列中。
在另一个类中,不停地对这个队列进行判断,如果Count不为0,那么就执行下一个动作。否则归0。