UD3——JSON系列
UD3——JSON系列
数据持久化第三部分——系列代号UD3
JSON
全称:JavaScript 对象简谱(JavaScript Object Notation)
Json是国际通用的一种轻量级的数据交换格式
主要在网络通讯中用于传输数据,或本地数据存储和读取
易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率
我们一般使用Json文件来记录和传输数据
Json文档就是使用Json格式配置填写的文档
后缀一般为.json
我们在游戏中可以把游戏数据按照Json的格式标准
存储在Json文档中,再将Json文档存储在硬盘上或者传输给远端
达到数据持久化或者数据传输的目的
本系列学习内容
Json文件格式
Json基本语法和配置规则
Excel转Json
C#读取存储Json文件
JsonUtility
LitJson
JsonUtility和LitJson对比
Json和Xml的异同
共同点
都是纯文本
都有层级结构
都具有描述性
不同点
Json配置更简单
Json在某些情况下读写更快速
主要学习内容
Json文件格式
C# ...
UG3——UGUI系列
UG3——UGUI系列
UI系统第三部分——系列代号UG3
UGUI
UGUI是Unity引擎内自带的UI系统
官方称之为:Unity UI
是目前Unity商业游戏开发中使用最广泛的UI系统开发解决方案
它是基于Unity游戏对象的UI系统,只能用来做游戏UI功能
不能用于开发Unity编辑器中内置的用户界面
本系列学习内容:
UGUI基础
六大基础组件
Canvas 渲染模式控制组件
Canvas Scaler 分辨率自适应组件(在制作所有的UI之前,一定要先设置好这个控件)
Graphic Raycaster 射线事件交互组件
EventSystem和Standalone Input Module 点击事件监听组件
RectTransform UI 位置锚点组件
三大基础控件
Image 图片
Text 文本控件
RawImage (原始图片)大图控件
组合控件
Button 按钮
Toggle 单选多选框控件
InputField 文本输入控件
Slider 滑动条控件
ScrollBar 滚动条
ScrollView 滚动视图
Dropdown 下拉 ...
U3L20-4——导航网格动态障碍物组件(NavMesh Obstacle)
U3L20-4——导航网格动态障碍物组件(NavMesh Obstacle)
导航网格动态障碍组件
在游戏中常常会有这样的一个功能,场景中有一道门,如果这道门没有被破坏是不能自动导航到门后场景的
只有当这道门被破坏了,才可以通过此处前往下一场景,
而类似这样的物体本身是不需要进行寻路的,所以没有必要为它添加 NavMeshAgent 脚本
这时就会使用动态障碍组件实现该功能
导航动态障碍物组件的使用
为需要进行动态阻挡的对象添加 NavMeshObstacle 组件
设置相关参数
代码逻辑控制其的移动或者显隐
参数相关
Shape 动态障碍的形状
Capsule:胶囊
Box:盒装
Carve: 是否开启雕刻功能
开启后,障碍物会在导航网格中挖一个孔,
所谓挖孔就是会生成对应的网格信息,认为这篇区域无法前往
如果动态障碍物是固定不动的,建议开启,比如阻碍物门木桶栅栏等等
如果动态障碍物是频繁移动的,建议不开启该功能,比如汽车和玩家
Move Threshold: 移动阈值 当障碍物移动超过该距离时,会认为其为移动状态,会更新移动的孔
Time To Stat ...
U3L20-3——导航网格外连接组件(Off-Mesh Link)
U3L20-3——导航网格外连接组件(Off-Mesh Link)
导航网格外连接组件
我们在烘焙地形数据的时候
可以生成网格外连接
但是它是满足条件的都会生成
而且是要在编辑模式下生成
如果我们只希望两个未连接的平面之间只有有限条连接路径可以跳跃过去
并且运行时可以动态添加
就可以使用网格外连接组件
达到“指哪打哪”的效果
导航网格外连接组件的使用
使用两个对象作为两个平面之间的连接点(起点和终点)
添加Off Mesh Link脚本进行关联(哪里都能添加,起点或终点,或者另外一个物体上都可以)
设置参数
参数相关
Start 起始点
End 结束点
Cost Override 覆盖消耗值
负数或0则使用所属Area区域中的消耗值
如果为正数,则使用Area区域寻路消耗值*正数代表该连接点的寻路消耗
相当于我们可以自定义连接点的寻路消耗
主要用来解决当有"步行"和连接点都可以到达某一个目标时,希望优先选择步行区域,但是步行路径明显更远时修改该值
Bi Directional 是否开启双向连接点
开启后可以从Start到End,反之也可以
如果关闭,则只 ...
U3L20-2——导航网格寻路组件(NavMesh Agent)
U3L20-2——导航网格寻路组件(NavMesh Agent)
导航网格寻路组件
通过上节课导航网格生成知识点的学习
我们已经准备好了地形相关的数据
知道地形上哪些地方可以到达,哪些不能
那么寻路组件的作用就是帮助我们让角色可以在地形上准确的移动起来
寻路组件的本质就是根据烘焙出的寻路网格信息
通过基于A星寻路的算法计算出行进路径让我们在该路径上移动起来
本章代码关键字
1234567891011121314151617181920UnityEngine.AI //寻路组件相关命名空间NavMeshAgent //导航网格寻路组件类navMeshAgent.SetDestination() //自动寻路设置目标点navMeshAgent.isStopped //是否停止寻路navMeshAgent.speed //寻路移动速度navMeshAgent.acceleration //寻路移动加速度navMeshAgent.angul ...
U3L20-1——导航网格的生成(NavMesh)
U3L20-1——导航网格的生成(NavMesh)
准备地形
在进行导航寻路网格生成时,第一步是需要有地形,地形由美术同学制作
打开导航网格数据窗口
Window ——> AI ——> Navigation 打开Unity内置的导航网格生成窗口
参数相关
Object 场景对象设置页签
在这里设置需要烘焙导航网格的地形对象,以及该对象的地形性质
Sceme Filter: 场景过滤器,配合Hierarchy窗口使用
All:显示场景上所有对象
MeshRenderers:显示挂载的网格渲染器的对象
Terrains:显示挂载了地形脚本的对象
Navigation Static 导航静态物体开关
被选中的物体会自动变为Navigation Static
非常重要,所有想要为其生成导航网格的地形都需要选中它
Generate OffMeshLinks 生成网格连接点开关****例如两个分离开的地形如果要连接网格就需要选择它
Navigation Area 导航区域选择,配合Areas页签使用
该项将决定地形对象的寻路消耗
Bake 导航数据烘 ...
U3L20——导航寻路系统
U3L20——导航寻路系统
导航寻路系统
Unity中的导航寻路系统是能够让我们在游戏世界当中
让角色能够从一个起点准确的到达另一个终点
并且能够自动避开两个点之间的障碍物选择最近最合理的路径进行前往
Unity中的导航寻路系统的本质
就是在A星寻路算法的基础上进行了拓展和优化
注意!Unity2022版及以上的导航寻路系统发生了变化 ——> 具体可看 Unity2022及以上版本的导航寻路系统
学习内容
导航网格(NavMesh)的生成
要想角色能够在场景中自动寻路产生行进路径,那么必须得先有场景地形数据,导航网格生成就是生成用于寻路的地形数据
导航网格寻路组件(NavMesh Agent)
寻路组件就是帮助我们根据地形数据计算路径让角色动起来的关键
导航网格外连接组件(Off-Mesh Link)
当地形中间有断层,想让角色能从一个平面跳向另一个平面,网格连接组件时关键
导航网格动态障碍物组件(NavMesh Obstacle)
地形中可能存在的可以移动或动态销毁的障碍物需要挂载的组件
Unity2022及以上版本的导航寻路系统
将导航寻路系统从Unity中剥离,需要 ...
U3L19——角色控制器
U3L19——角色控制器
角色控制器
角色控制器是让角色可以受制于碰撞,但是不会被刚体所牵制
如果我们对角色使用刚体判断碰撞,可能会出现一些奇怪的表现
比如:
在斜坡上往下滑动
不加约束的情况碰撞可能让自己被撞飞
等等
而角色控制器会让角色表现的更加稳定
Unity提供了角色控制器脚本专门用于控制角色
注意:
添加角色控制器后,不用再添加刚体****能检测碰撞函数
能检测触发器函数
能被射线检测
注意!如果使用角色控制器,那就不再建议使用动画上的根运动了!建议关闭Apply Root Motion
我们会通过角色控制器来达到控制角色移动的目的
本章代码关键字
12345CharacterController //角色控制器类 characterController.isGrounded //检测是否在地面characterController.SimpleMove //受到重力的移动characterController.Move //不受重力的移动OnControllerColliderHit() { ...
U3L18-9——状态机复用
U3L18-9——状态机复用
状态机复用
游戏开发时经常遇到这样的情况
有n个玩家和n个怪物,他们的动画状态机行为都是一致的,只是对应的动作不同而已
这时如果我们为他们每一个对象都创建一个状态机进行状态设置和过渡设置无疑是浪费时间的
所以状态机复用就是解决这一问题的方案
主要用于为不同对象使用共同的状态机行为
减少工作量 提升开发效率
如何复用状态机
在Project窗口右键Create->Animator Override Controller
为Animator Override Controller文件在Inspector窗口关联基础的Animator Controller文件
Controller:要复用的状态机
Override:覆盖原状态机的对应的动画
关联需要的动画
U3L18-8——Statemachinebehaviour 状态机行为脚本
U3L18-8——Statemachinebehaviour 状态机行为脚本
状态机行为脚本
状态机行为脚本时一类特殊的脚本,继承指定的基类,它主要用于关联到状态机中的状态矩形上
我们可以按照一定规则编写脚本,当进入、退出、保持在某一个特定状态时我们可以进行一些逻辑处理
简单解释就是为Animator Controller状态机窗口中的某一个状态添加一个脚本
利用这个脚本我们可以做一些特殊功能
比如
进入或退出某一状态时播放声音
仅在某些状态下检测一些逻辑,比如是否接触地面等等
激活和控制某些状态相关的特效
本章代码关键字
12345678910StateMachineBehaviour //如果想要使一个脚本作为状态机脚本,则必须要继承这个基类OnStateEnter() { } //进入状态时,第一个Update中调用OnStateExit() { } //退出状态时,最后一个Update中调用OnStateIK() { } //OnAn ...