【Cinemachine】VirtualCamera虚拟相机详解(一)

2023-11-04

摘要:VirtualCamera虚拟相机是Cinemachine系统中的核心组成部分,咱们一起来看看虚拟相机是怎么用的吧。

你好,我是跟着大智学Unity的萌新,我叫小新,这是我本周的学习总结报告哦。

虚拟相机

Cinemachine中的Virtual Camera(虚拟相机)可以说是最核心的组件。

使用Cinemachine时,你需要记住一个准则:场景中一般只有一个Unity相机(除了需要制作分屏、画中画等效果的时候),上面挂着CinemachineBrain脚本;其他相机都是使用Cinemachine中的虚拟相机,可以有很多个。

给场景添加一个虚拟相机的流程如下:
1、菜单栏,选择Cinemachine > Create Virtual Camera。Unity会在场景中添加一个GameObject,上面有一个Virtual Camera组件。如果你的Unity相机上没有CinemachineBrain脚本,Cinemachine也会自动添加CinemachineBrain脚本到Unity相机上。

2、如果相机需要跟随物体移动,指定一个物体到Follow属性上。虚拟相机会自动将Unity相机的位置和Follow物体保持相对位置,包括Follow物体移动的时候。

3、如果相机镜头需要保持对准物体,指定一个物体到Look At属性上,这样相机镜头就会一直对准这个物体。

4、虚拟相机还有很多属性,可以根据需要设置,后续会继续详解。可以为位置跟随和镜头对准设置不同的算法,通过调节参数得到不同感觉的相机。

Virtual Camera中的AimBodyNoise属性,用来控制相机在移动、旋转时是什么样子。

在任意时间,每个Virtual Camera处于下列的状态之一:

  • Live活动状态:活动状态的虚拟相机会控制Unity相机,一般情况下只有一个Live状态的相机。有个特例的情况,当Cinemachine Brain控制一个虚拟相机混合到下一个虚拟相机时,两个虚拟相机都处于Live活动状态。当混合结束后,恢复到只会有一个活动虚拟相机。

  • Standby待命状态:处于待命状态的虚拟相机并不控制Unity相机。但是它仍然跟随和瞄准它的目标物体,并且每帧更新。处于待命状态的虚拟相机的物体时active状态,并且优先级priority不高于活动状态的虚拟相机。

  • Disable禁用状态:处于禁用状态的相机既不控制Unity相机也不会跟随或瞄准他的目标,也不占用运行资源。想要禁用一个虚拟相机,只要禁用它所在的GameObject即可。在Scene窗口中,被禁用的虚拟相机还会显示,但是是禁用状态。但是有特殊情况被禁用的相机仍然可以控制Unity相机:虚拟相机正在参与混合或者受Timeline控制

CinemachineVitualCamera组件的属性解读

Solo:用于调试。选中这个按钮时,此虚拟相机会直接控制Unity相机显示在Game窗口中,用于相机的调试。(忽略优先级,但是需要所在GameOjbect是激活状态)

Game Window Guides:勾选时,Game窗口会显示辅助线,用于设置虚拟相机的各个属性。需要注意的是,仅在以下任一属性赋值时显示辅助线:

  • Look At属性设置了物体,Aim设置为Composer或Group Composer
  • Follow属性设置了物体,Body设置为Framing Composer

Save During Play:虚拟相机的属性在运行时的修改可以被保存下来,退出Play状态时不会被重置。

Priority优先级:虚拟相机的重要程度,用于Live镜头的选择。数值越高代表优先级越高。Cinemachine Brain会根据这个属性从所有激活的虚拟相机中选择活动的虚拟相机。在Timeline上使用时这个属性不生效。

Follow跟随目标:虚拟相机会跟随这个物体移动。Body属性基于这个目标物体更新Unity相机的位置。如果你想让相机保持它自己的位置不变,不要设置这个属性。

Look At瞄准:镜头瞄准的物体目标。Aim属性使用这个属性来更新Unity相机的旋转。如果你想相机保持原来的角度,不要设置这个属性。

Standby Update 待命时的更新方式,当虚拟相机物体没有被禁用,但是优先级不足时,虚拟相机处于待命状态。这个属性会影响性能,通常设置为Never是最好的,但是有时候可能需要虚拟相机更新来做一些镜头相关的计算判断。

  • Never 不更新
  • Always 每帧更新
  • Round Robin 循环更新:所有的待命虚拟相机循环更新,每帧更新一个相机(例如有10个待命的相机,第一帧更新第一个相机,第2帧更新第2个相机,…,第11帧更新第1个相机,以此类推)

Lens镜头设置:对应Unity相机中的属性,也可以从Preset中选择或者从现有的设置创建新的Preset。

  • Dutch镜头旋转。这个属性在Unity相机中是没有的,可以用来控制镜头的旋转。(在屏幕空间的旋转)

Transitions相机转换的相关设置:

Blend Hint混合方式:

  • None 无,默认线性混合
  • Spherical Position 根据Look At的物体球面旋转混合
  • Cylindrical Position 根据Look At的物体柱面旋转混合(水平方向圆弧,垂直方向线性)
  • Screen Space Aim When Target 在屏幕空间瞄准目标

Inherit Positon 下一个相机变成活动相机时,从上一个相机继承位置,即保持两个相机位置相同。

On Camera Live事件,相机变为活动时会触发对应的事件。

BodyAimNoise后面深入学习。

Extension:可以给虚拟相机添加额外的扩展。后面深入学习。

保存运行时的修改

调节相机时,很多时候需要在运行时进行调节,因为有很多动画在运行时才能知道它具体的位置。但是默认情况下,Unity不会保存任何运行时的修改和改动。

那有没有什么办法能保存运行时的修改呢?其实在《大话Unity:新手村》专题中,咱们提到过如何保存运行时的修改,稍微复习一下:

  • 在Play模式下Copy Component,然后退出运行模式后Paste Component Values
  • 在Play模式下将修改后的GameObject拖成Prefab,然后退出运行模式后再放到场景中

但是Cinemachine通常涉及到很多相机,如果用上面的方法会很麻烦,那有没有什么简单的办法呢?

Cinemachine知道你有这个需求,已经提供了一个特殊的功能来保存运行时的修改。

如上图,在任意一个Virtual Camera上勾选Save During Play可以启用保存运行时修改的功能。这是一个全局的属性,不需要每个相机单独设置,只要在一个Virtual Camera上勾选或者取消勾选即可。

退出Play模式时,Cinemachine会一次性保存Virtual Camera上的修改。同时也可以通过Edit > Undo(Ctrl+Z)来撤销修改。

再深入一下,Cinemachine是如何实现这个功能的呢?

它是通过Cinemachine命名空间中的一个特殊的属性[SaveDuringPlay]。如果你自己的脚本也需要运行时保存的功能,只需要在类上加上这个属性即可。如果不想要类中的某些成员在运行时保存,可以给这些成员加上[NoSaveDuringPlay]属性。

using Cinemachine;
using UnityEngine;

[SaveDuringPlay]
public class PlayModeSaving : MonoBehaviour
{
    [NoSaveDuringPlay]
    public string Name;
    public int Age;
    public string Address;
}

【扩展学习】洪流学堂公众号回复timeline可以下载Timeline&Cinemachine系列教程全文带目录PDF


好了,今天就就让小新絮絮叨叨到这里了。没讲清楚的地方欢迎评论,不点赞收藏我可能不会回复你的哦(¬、¬) (¬_¬)

我是大智,你的技术探路者,下次见!

别走!点赞收藏哦!

好,你可以走了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Cinemachine】VirtualCamera虚拟相机详解(一) 的相关文章

  • Unity3D之MonoBehaviour

    Unity3D中的MonoBehaviour是一种基于组件的编程架构 用于开发游戏和应用程序 它是Unity引擎中用于创建行为的基类之一 并且可以让你通过重写其方法来定义对象在游戏运行时的行为 首先 在Unity中创建一个游戏对象并向其添加
  • Unity集成Leap Motion

    转载自 http www cocoachina com game 20150716 12625 html 演示视频文章最后 如果你已经熟悉编程的概念 理解并在C 语言方面有一定的经验 并且对面向对象编程思想和设计概念有所熟悉 如果你了解3D
  • unity如何解决每次写完敲代码,调试时需要卡个进度条

    解决办法如下 勾选上之后程序就可以立刻运行起来了 再也不用一直卡进度条了 不过也有弊端的 会影响静态字段初始化有问题还有Dotween的一些效果会发生变化 谨慎避免入坑
  • unity 五种旋转方式localEulerAngles、eulerAngles、rotation、localRotation和Rotate的区别

    1 1 transform localEulerAngles 使用localEulerAngles进行旋转的时候 我们要使用transform localEulerAngles new Vector3 x y z 其中 new Vector
  • Unity InputSystem 实现同一按键单击、双击、长按执行不同逻辑

    最近学习了一下Unity InputSystem 该系统可用于实现 管理复杂的操作逻辑 上限很高 但由于它有一定的学习成本 导致一些和我一样的小白一入门时不得要领 之前卡住我的一个需求就是通过InputSystem 实现同一按键单击 双击
  • unity中通过touch旋转、放大和缩小物体以及滑动方向的判断

    unity中通过touch旋转 放大和缩小物体以及滑动方向的判断这个需求在游戏开发中也是非常频繁 话不多说直接上代码 using System Collections using System Collections Generic usi
  • Unity_场景之间的跳转

    跳转场景之前 需要在 File gt Build Settings gt Add Open Scenes 或者 直接把 场景 拖拽进来 跳转场景方法1 已过时 跳转场景方法 public void OnStartGame string Sc
  • 服务器时间管理器

    时间戳管理器 using System using UnityEngine public class SyncTime Singleton
  • 我的和unity3d的小故事1——恶魔射手之鼠标控制移动之input.getaxis("Horizontal")与input.getaxis("Vertical")

    跟着恶魔射手视频学习的过程中遇到的第一个问题是怎么也移动不了 那么问题来了 打印出来是获得的下面两个值都是0 怎么办呢 改edit下面的projectsetting里面的input属性下面两个值的type都改成mouse movement
  • 【Unity3d】Animator和Animation组件使用注意事项

    一 Animator一般用于人物动画控制 特点是动画是持续的 可能有动作切换 Animation一般用于间断性的动画的控制 比如一个场景特效的播放 只播放一次就完了 二 实测Animation速度比Animator快10 左右 内存占用没测
  • JPush极光推送Unity插件iOS设备无法获取DeviceToken

    前言 最近在使用JPush进行极光推送 Unity插件GitHub地址https github com jpush jpush unity3d plugin 问题描述 但是发现了一个问题 按照官方文档操作 最终仍然无法获取DeviceTok
  • RAIN{INDIE} 自动寻路

    Unity游戏中有较多的自动寻路插件 看过几个 大同小异 而RAIN中的Behavior Tree感觉很好 听名字就知道很条理 下面 就用它做个简单的寻路小例子 首先 导入RAIN的包 结构如下 在使用的过程当中还会产生几个文件夹用来存放E
  • 【Unity-学习-021】异步实现HTTP请求

    对Http访问操作 Unity中一般使用协程操作 但是协程有一个比较要命的要求就是所在Mono必须在场景中是激活的 所以一些操作就会被限制 所以我们就找办法替代掉协程做一些异步的操作 那就用异步方法 首先扩展一下AsyncOperation
  • Unity使用Newtonsoft报错的解决方案

    文章目录 Unity 使用 Newtonsoft 报错的解决方案 问题描述 解决方法 方法一 使用 Unity 的 Package Manager 自动导入 方法二 访问 GitHub 下载 unitypackage 文件手动导入 Unit
  • unity3d 输入法相关API

    Input inputString 获取输入的文字 正在打的中文是接受不到的 只有在文字写到文本框才能获取 Input imeCompositionMode 是否是激活输入框状态 on 是 Input compositionString 空
  • Unity动画系统详解5:BlendTree混合树是什么?

    摘要 Animator中有一个功能 用来解决多个动画之间的混合 经常用于移动动画之间的混合 这个功能叫做BlendTree 混合树 洪流学堂 让你快人几步 你好 我是跟着大智学Unity的萌新 我叫小新 这几周一起来复 yu 习 xi 动画
  • Unity3D 官方文档 平台特殊化之Standalone和多显示器的处理

    版本 unity 5 6 语言 C 总起 Standalone 我一眼看下去的理解就是PC机平台 官方文档中说该平台指的是Mac Windows和Linux 这篇文章主要讲的是Standalone平台下的设置 通过点击菜单栏的File gt
  • unity的LOD组件

    本文转载自http blog csdn net huutu article details 52106468 LOD是Level Of Detais 的简称 多细节层次 在游戏场景中 根据摄像机与模型的距离 来决定显示哪一个模型 一般距离近
  • Unity3D的四种坐标系

    1 World Space 世界坐标 我们在场景中添加物体 如 Cube 他们都是以世界坐标显示在场景中的 transform position可以获得该位置坐标 2 Screen Space 屏幕坐标 以像素来定义的 以屏幕的左下角为 0
  • Unity3d中脚本无法编译问题(Monodevelop)

    使用Monodevelop打开脚本 编译时报错 具体错误忘记了 原因是 net框架引起 升级到 net框架4 5后解决

随机推荐

  • JavaScript和TypeScript入门

    文章目录 前言 一 JavaScript特点 二 JavaScript初步 一 基本语法 二 流程结构 1 顺序结构 2 选择结构 3 循环结构 三 函数 四 对象 1 创建对象 2 MATH对象 3 日期对象 4 字符串对象 五 数组 1
  • rabbitMQ的详细介绍

    1 概述 RabbitMQ是一个消息中间件 它接受并转发消息 你可以把它当做一个快递站点 当你要发送一个包裹时 你把你的包裹放到快递站 快递员最终会把你的快递送到收件人那里 按照这种逻辑RabbitMQ是一个快递站 一个快递员帮你传递快件
  • 哈希值相同的规律

    分享哈希值相同的一个规律 System out println Aa hashCode System out println BB hashCode 2112 2112 我们发现Aa和BB是相同的哈希值 然后我们多做几次试验可以发现一个规律
  • 作为开发人员您会喜欢的 7 个免费公共 API

    1 JSON 占位符 JSON Placeholder是一项服务 可为您提供用于测试和原型制作的假在线REST API 这是每个开发人员的首选 API 2 谷歌翻译 Google有大量的API 但其中大部分是付费的 值得庆幸的是 Trans
  • 河南省网络安全高校战队联盟CTF训练营-web文件上传第一期

    文件上传 个人介绍 姓名 飞羽 CTF菜菜一枚 例题来源 ctfhub https www ctfhub com pwnthebox https insider pwnthebox com ctfshow https ctf show 工具
  • stduino IDE(国产)安装及使用感受!

    文章目录 一 了解stduino IDE 二 安装stduino 三 stduino完成STM32串口通信 四 总结与使用感受 五 参考 一 了解stduino IDE 大概是受到Ardunio IDE的启发 网上有一个国人版的MCU集成开
  • Sublime Text2中的快捷键一览表(Sublime 键盘快捷键大全 )

    Sublime Text 提供了无比强大的快捷键阵容 如果能够在Coding的时候灵活的使用快捷键 将能够使得你的效率倍增 相信在不久的将来 Sublime Text将是你跨平台使用的最佳Coding利器 Sublime Text 2默认使
  • matlab 求单/多元函数极值

    matlab 求单 多元函数极值 单元函数极值 平时如果手算的话 就会先求导数 再求驻点 最终代值算出极值 如果用matlab代码求的话 就可以减少很多不必要的计算 fun inline 0 5 x exp x 2 ezplot fun 0
  • 一个全新的数字化转型和新的营销方式已经来临!

    云翼港最新推出一套直播系统 一部直播手机 一套直播辅助软件 一个人只需一台直播手机 可以在不同的直播平台进行直播 一个人可以同时管理5 10个账号 甚至更多 轻松实现多平台的直播 这款直播辅助软件不仅可以使用数字人 也支持真人直播 还可以在
  • python从入门到入土

    一 基础语法 1 字变量 字变量 在代码中 被写下来的固定的值 字符串 python中用双引号包裹起来的都是字符串 本代码演示了 各类字变量的写法 通过print语句输出各类字变量 写一个整数字变量 666 写一个浮点数字变量 13 14
  • SQLite 数据库存取图片(QT方式)

    目录 实战演示 效果展示 SQLite 数据库可以存取图片 存取的格式为 BLOB 格式 需要把图片转为 QByteArray 格式进行存取 1 实战演示 以下实战代码 复制便可以直接运行 希望可以帮助到你 include
  • oracle报错:ORA-01839: date not valid for month specified(指定月份的日期无效)

    场景 日期值存的是10位字符串 如2020 02 01 sql筛选时需要选1年以内的 select from t user where to date app date yyyy MM dd gt sysdate 360 1 2 3 查看日
  • linux搭建geth私有节点

    linux创建节点 下载文件并上传服务器解压 Downloads Go Ethereum tar zxvf geth linux amd64 1 10 11 7231b3ef tar gz mv geth linux amd64 1 10
  • 2022年智能机器人与系统国际研讨会(ISoIRS 2022)

    2022年智能机器人与系统国际研讨会 ISoIRS 2022 重要信息 会议网址 www isoirs org 会议时间 2022年10月14 16日 召开地点 中国成都 截稿时间 2022年8月30日 录用通知 投稿后2周内 出版社 IO
  • C/C++时间戳转换函数

    目录 生成时间戳 time函数 函数原型 获取当前时间戳 转换时间戳为北京时间
  • 基于springboot+vue前后端分离的小区物业管理系统

    小区物业管理系统 简介 这是一个 SpringBoot Vue 的前后端分离小区物业管理系统 前端使用了若依的后台管理模板 使用 ElementUI 作为 UI 组件 使用 Vue Router 来进行路由跳转 使用 Vuex 来存储状态信
  • WPF自定义控件CustomControl中依赖属性、命令的使用

    Generic xaml中的UI代码
  • Redis中key的操作命令

    文章目录 Redis中key的操作命令 1 keys 查找所有符合模式pattern的key 2 exists 判断key是否存在于数据库中 3 move 移动指定的key到指定的数据库实例 4 ttl 查看key的剩余生存时间 5 exp
  • CoreML 的 C++部署 [2] 模型类抽象

    接上一篇 CoreML 的 C 部署 1 模型转换和预处理 再解决了预处理的问题后 部署部署还剩下模型类的抽象 主要包括初始化 推理以及获取输出 模型类的抽象 什么是模型类 可以参考 CoreML模型分析 我们是以MobileNetV2 m
  • 【Cinemachine】VirtualCamera虚拟相机详解(一)

    摘要 VirtualCamera虚拟相机是Cinemachine系统中的核心组成部分 咱们一起来看看虚拟相机是怎么用的吧 你好 我是跟着大智学Unity的萌新 我叫小新 这是我本周的学习总结报告哦 虚拟相机 Cinemachine中的Vir