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 视频播放器 本章代码关键字 1234567891011121314151617181920212223videoPlayer.playOnAwake //是否自动播放videoPlayer.renderMode //渲染模式VideoRenderMode //渲染模式的枚举VideoRenderMode.RenderTexture //要渲染的目标贴图videoPlayer.targetCamera //要渲染到的目标摄像机videoPlayer.texture //放置视频内容的内部纹理,可以每帧通过此属性获取视频显示内容,当renderMode属性为APIOnly时必须使用此属性获取视频内容videoPlayer.targetCameraAlpha //视频透明度,渲染模式选择摄像机相关时videoPlayer.source ...
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...
U4S3L1——视频格式和编解码器
U4S3L1——视频格式和编解码器 为什么学习视频格式和编解码器 视频格式和视频的编解码器,会影响 Unity 在不同平台是否能正常播放视频 所以我们必须简单了解视频格式和编解码器的本质,才能学习关于视频兼容性相关的知识 所以学了这节课,我们之后才能学习视频兼容性相关知识点 视频文件的本质 视频文件本质上就是一个“数据容器”,它不仅可以包含视频数据本身,它还包括: 音频 字幕 轨道信息(轨道还可以有多个,比如不同语言的字幕,不同语言的音频) 等等其它内容 不同格式的视频文件,比如 .mp4、.mov、.avi、.webm 等,他们表示视频文件中的数据是使用某种容器格式排列的 说人话:视频的本质就是一堆数据(图像、音频、字幕等等)的集合,不同格式的视频区别就是存读数据的方式方法不同而已 视频的编码器和解码器 我们了解了视频本质就是一堆数据的集合,为了节省带宽和存储空间, 视频中每个轨道(不同的音频,字幕等等信息)都使用“编解码器”进行编码和解码, 编码器负责压缩数据,解码器负责解压数据,通过他们对视频数据进行压缩和解压 常见的视频编解码格式为...
U4S3——视频播放
U4S3——视频播放 为什么要学习视频播放相关 在游戏开发中我们常常会有播放视频的需求,比如: 游戏开始时通过视频来交代游戏背景 剧情触发时通过视频来表现剧情发展 所以学习了视频播放相关知识点,我们就可以制作对应的功能需求 Unity的视频播放解决方案 几乎淘汰的 Unity 老版本功能电影纹理 MovieTexture 目前主流的视频播放器 VideoPlayer **** 组件 第三方插件,比如 AVPro Video 等 他们都可以用于制作视频播放功能 我们将学习什么 我们在视频播放相关课程中主要学习,Unity 提供的视频播放器 VideoPlayer 组件 只要是播放视频相关的功能,几乎都可以使用 VideoPlayer 组件来进行完成 它几乎能够应对日常开发中所有视频播放的相关需求 本系列学习内容 视频格式和编解码器 Unity中的视频兼容性 Video Player 视频剪辑设置相关 Video...
U4S2SL4——单例模式化的获取数据
U4S2SL4——单例模式化的获取数据 为什么要单例模式化的获取数据 对于只用不变并且要复用的数据,比如配置文件中的数据,我们往往需要在很多地方获取他们 如果我们直接通过在脚本中public关联 或者 动态加载,如果在多处使用,会存在很多重复代码,效率较低 如果我们将此类数据通过单例模式化的去获取,可以提升效率,减少代码量 实现单例模式化获取数据 知识点:面向对象、单例模式、泛型等等 我们可以实现一个ScriptableObject数据单例模式基类,让我们只需要让子类继承该基类,就可以直接获取到数据 而不再需要去通过public关联 和...
U4S2SL3——数据带来的多态行为
U4S2SL3——数据带来的多态行为 数据带来的多态行为 某些行为的变化是因为数据的不同带来的,我们可以利用面向对象的特性和原则,以及设计模式相关知识点 结合ScriptableObject做出更加方便的功能 比如随机音效,物品拾取,AI等等等 随机音效(里氏替换原则和依赖倒转原则) 播放音乐时,可能会随机播放多个音效当中的一种 物品拾取(里氏替换原则和依赖倒转原则) 比如拾取一个物品,物品给玩家带来不同的效果 AI 不同数据带来的不同行为模式 为了方便我们使用,我们可以利用ScriptableObject的可配置性来制作这些功能 其实下面的例子中的功能就算不用ScriptableObject也是能够用面向对象的思想,结合配置文件来完成的 但是ScriptableObject具备自己的几个优点 更方便的配置 共享数据节约内存 在实现某些功能的时候,使用ScriptableObject会更加方便我们的使用 举例说明 随机音效 123456using UnityEngine;public abstract class AudioPlayBase :...
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...
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); ...