U4S3L5——全景视频
U4S3L5——全景视频
Unity支持的全景视频
全景视频一般在VR项目中才会使用,我们也可以使用全景视频再游戏中来制作一些动态天空盒效果
等距圆柱投影布局(也称为球面投影、简化圆柱投影、矩形投影或普通圆柱投影)
的全景视频(视频宽高比为 2:1的360度内容 或 1:1的180度内容)
类似于这下面这种贴图:
立方体贴图布局(六个正方形纹理的集合)的全景视频(视频宽高比为1:6、3:4、4:3、6:1)
类似于下面这种贴图:
我们可以通过视频分辨率的比值判断该全景视频为哪一种
在Unity中使用全景视频
导入等距圆柱投影布局的视频文件
用Video Player以Render Texture渲染纹理播放视频
设置接受渲染纹理的天空盒材质,天空盒材质的着色器(shader)使用 Skybox>Panoramic(全景)
设置场景以使用天空盒材质 ——> 详细内容看这里
注意:尽量使用较高分辨率率的全景视频(4K或8K),这样效果更好
但是对于一些老设备或者移动设备可能最多只能使用2K分辨率,具体根据实际情况而定
...
U4S3L4——Video Player视频播放器
U4S3L4——Video Player视频播放器
本章代码关键字
123456789101112131415161718192021videoPlayer.playOnAwake //是否自动播放videoPlayer.renderMode //渲染模式VideoRenderMode //渲染模式的枚举VideoRenderMode.RenderTexture //要渲染的目标贴图videoPlayer.targetCamera //要渲染到的目标摄像机videoPlayer.targetCameraAlpha //视频透明度,渲染模式选择摄像机相关时videoPlayer.source //视频源VideoSource //视频源的枚举videoPlayer.clip //要播放的视频切片videoPlayer.url ...
U4S3L3——视频剪辑设置相关
U4S3L3——视频剪辑设置相关
为什么要对视频剪辑进行设置?
当我们将准备好的视频导入Unity后,我们可以选中该视频剪辑,并在Inspector窗口中进行设置
设置视频剪辑的主要原因:
预览视频效果
查看视频文件的基本信息
设置视频剪辑是否开启转码设置(重要)
通过对视频剪辑进行转码相关设置,我们可以保证在各平台都能正常播放
视频剪辑相关设置的主要目的,是为了设置视频转码相关方案,通过视频转码,可以让视频尽量支持各平台
关于各平台的转码规则 我们在上节课中就已经讲过
可用于硬件加速并且本机支持的最优视频编解码器是 H.264
当优先考虑跨平台支持时,VP8 是一个不错的选择。
VP8 得到广泛支持并具有全面的功能集,但与硬件加速的编解码器(例如 H.264)相比,需要消耗更多的资源。
在支持 H.265 的设备上可以使用 H.265。
Android 使用原生库支持 VP8,因此 VP8 在某些 Android 设备上也可能获得硬件辅助。
一劳永逸的方案是:mp4格式 + H.264编解码器,根据设备情况考虑使用 VP8 和 H.265 编解码器
视频剪辑设 ...
U4S3L2——Unity中的视频兼容性
U4S3L2——Unity中的视频兼容性
Unity编辑器中的兼容性问题
对于我们来说,游戏发布的目标平台兼容性更加重要
mp4格式 + H.264或者VP8编解码器,可以在绝大多数的操作系统上正常播放
如果为了极致的提高性能,可以准备多个视频文件
针对不同的设备使用不同的视频,能用H.265的就用H.265编解码器
视频兼容性的含义
所谓的兼容性就是指硬件之间、软件之间或是软硬件组合系统之间的相互协调工作的程度
对于视频文件的兼容性,可以理解为当游戏在不同的操作系统上运行时,该操作系统环境是否支持该视频的播放
Unity编辑器中的视频兼容性
我们可以在Windows、MacOS这两个常用操作系统上使用Unity进行开发,我们可以将很多不同格式的视频文件导入Unity中
但是如果我们想要正常的在Unity编辑器中预览视频文件,那么视频文件必须和这些平台兼容(必须是该平台支持的视频格式)
而视频是否兼容对应平台,主要由两个因素决定:
视频文件格式
常用操作系统对视频格式的支持如下:
扩展名
Windows
macOS
Linux
.asf
✓
.avi
✓
...
U4S3L1——视频格式和编解码器
U4S3L1——视频格式和编解码器
为什么学习视频格式和编解码器
视频格式和视频的编解码器,会影响Unity在不同平台是否能正常播放视频
所以我们必须简单了解视频格式和编解码器的本质,才能学习关于视频兼容性相关的知识
所以学了这节课,我们之后才能学习视频兼容性相关知识点
视频文件的本质
视频文件本质上就是一个“数据容器”,它不仅可以包含视频数据本身,它还包括:
音频
字幕
轨道信息(轨道还可以有多个,比如不同语言的字幕,不同语言的音频)
等等其它内容
不同格式的视频文件,比如.mp4、.mov、.avi、.webm等,他们表示视频文件中的数据是使用某种容器格式排列的
说人话:视频的本质就是一堆数据(图像、音频、字幕等等)的集合,不同格式的视频区别就是存读数据的方式方法不同而已
视频的编码器和解码器
我们了解了视频本质就是一堆数据的集合,为了节省带宽和存储空间,
视频中每个轨道(不同的音频,字幕等等信息)都使用“编解码器”进行编码和解码,
编码器负责压缩数据,解码器负责解压数据,通过他们对视频数据进行压缩和解压
常见的视频编解码格式为 H.264,常见的音频编解码格式为 AAC
说人 ...
U4S3——视频播放
U4S3——视频播放
为什么要学习视频播放相关
在游戏开发中我们常常会有播放视频的需求,比如:
游戏开始时通过视频来交代游戏背景
剧情触发时通过视频来表现剧情发展
所以学习了视频播放相关知识点,我们就可以制作对应的功能需求
Unity的视频播放解决方案
几乎淘汰的Unity老版本功能电影纹理MovieTexture
目前主流的视频播放器VideoPlayer组件
第三方插件,比如AVPro Video等
他们都可以用于制作视频播放功能
我们将学习什么
我们在视频播放相关课程中主要学习,Unity提供的视频播放器VideoPlayer组件
只要是播放视频相关的功能,几乎都可以使用VideoPlayer组件来进行完成
它几乎能够应对日常开发中所有视频播放的相关需求
本系列学习内容
视频格式和编解码器
Unity中的视频兼容性
Video Player
视频剪辑设置相关
Video Player视频播放器
全景视频
兼容性问题
当视频在目标平台或者编辑器中无法正常播放时不要着急,记住我们讲的格式和编解码器相关的知识点
H.264,H.265,VP8这3个编解码器基 ...
U4S2SL4——单例模式化的获取数据
U4S2SL4——单例模式化的获取数据
为什么要单例模式化的获取数据
对于只用不变并且要复用的数据,比如配置文件中的数据,我们往往需要在很多地方获取他们
如果我们直接通过在脚本中public关联 或者 动态加载,如果在多处使用,会存在很多重复代码,效率较低
如果我们将此类数据通过单例模式化的去获取,可以提升效率,减少代码量
实现单例模式化获取数据
知识点
面向对象、单例模式、泛型等等
我们可以实现一个ScriptableObject数据单例模式基类,让我们只需要让子类继承该基类,就可以直接获取到数据
而不再需要去通过public关联 和 资源动态加载
这种基类比较适合配置数据的管理和获取****当我们的数据是只用不变,并且是唯一的时候,可以使用该方式提高我们的开发效率
在此基础上你也可以根据自己的需求进行变形,比如添加数据持久化的功能,将数据从json中读取,并提供保存数据的方法
但是不建议大家用ScriptableObject来制作数据持久化功能,除非你有这方面的特殊需求
首先实现ScriptableObject数据单例模式基类
1234567891011121314151 ...
U4S2SL3——数据带来的多态行为
U4S2SL3——数据带来的多态行为
数据带来的多态行为
某些行为的变化是因为数据的不同带来的,我们可以利用面向对象的特性和原则,以及设计模式相关知识点
结合ScriptableObject做出更加方便的功能
比如随机音效,物品拾取,AI等等等
随机音效(里氏替换原则和依赖倒转原则)
播放音乐时,可能会随机播放多个音效当中的一种
物品拾取(里氏替换原则和依赖倒转原则)
比如拾取一个物品,物品给玩家带来不同的效果
AI
不同数据带来的不同行为模式
为了方便我们使用,我们可以利用ScriptableObject的可配置性来制作这些功能
其实下面的例子中的功能就算不用ScriptableObject也是能够用面向对象的思想,结合配置文件来完成的
但是ScriptableObject具备自己的几个优点
更方便的配置
共享数据节约内存
在实现某些功能的时候,使用ScriptableObject会更加方便我们的使用
举例说明
随机音效
123456using UnityEngine;public abstract class AudioPlayBase : Scriptable ...
CS5L13——LINQ入门实例
CS5L13——LINQ入门实例
LINQ
语言集成查询(Language-Integrated Query),也就是LINQ
语言集成的含义是,当你想对一个集合做查询操作时,
不再需要额外引用第三方库,而是可以直接使用原生的语法获取。
语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。
数据查询历来都表示为简单的字符串,没有编译时类型检查或 IntelliSense 支持。
此外,需要针对每种类型的数据源了解不同的查询语言:SQL 数据库、XML 文档、各种 Web 服务等。
借助 LINQ,查询成为了最高级的语言构造,就像类、方法和事件一样。
对于编写查询的开发者来说,LINQ 最明显的“语言集成”部分就是查询表达式。
查询表达式采用声明性 查询语法 编写而成。
使用查询语法,可以用最少的代码对数据源执行筛选、排序和分组操作。
可使用相同的基本查询表达式模式来查询和转换 SQL 数据库、ADO .NET 数据集、XML 文档和流以及 .NET 集合中的数据。
C# 中的语言集成查询 (LINQ) | Microsoft Learn
LINQ可用 ...
U4S2SL2——复用数据
U4S2SL2——复用数据
使用预设体对象可能存在的内存浪费问题
对于只用不变的数据,以面向对象的思想去声明对象类是可能存在内存浪费的问题的
我们以子弹对象为例
在以前,子弹对象挂载子弹脚本,子弹脚本包含子弹诸如移动速度和攻击力等数据,然后通过Resources等手段来在场景上创建子弹预设体
这样每个子弹都会有自己的子弹类对象,每个对象都会占用自己的内存,然而这些子弹脚本的数据其实都是相同且不变的
因此没有必要让子弹对象都分配多个的内存,我们完全可以让所有子弹对象共享一个子弹数据
123456789101112using UnityEngine;public class Bullet : MonoBehaviour{ public float speed; public int atk; void Update() { this.transform.Translate(speed * Time.deltaTime * Vector3.forward); }}
利用ScriptableObject数据对 ...