Unity3D Cinemachine 高级应用详解

embedded/2025/3/4 21:17:50/

引言

Cinemachine 是 Unity3D>Unity3D 中一个强大的相机管理系统,它允许开发者通过简单的配置实现复杂的相机行为。Cinemachine 的核心思想是基于虚拟相机(Virtual Camera),通过虚拟相机的优先级、混合、跟随、注视等设置,实现各种复杂的相机效果。本文将深入探讨 Cinemachine 的高级应用,包括自定义相机行为、动态切换、多相机混合、以及如何通过代码扩展 Cinemachine 的功能。

对惹,这里有一游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

1. Cinemachine 基础回顾

在深入高级应用之前,我们先回顾一下 Cinemachine 的基础概念:

  • 虚拟相机(Virtual Camera):Cinemachine 的核心组件,每个虚拟相机代表一个独立的相机视角。
  • 优先级(Priority):决定哪个虚拟相机当前处于激活状态,优先级高的虚拟相机会覆盖优先级低的。
  • 跟随(Follow):虚拟相机可以跟随一个目标对象,通常用于第三人称视角。
  • 注视(Look At):虚拟相机可以注视一个目标对象,通常用于第一人称视角或聚焦某个物体。
  • 混合(Blending):当切换虚拟相机时,Cinemachine 可以通过混合实现平滑过渡。

2. 自定义相机行为

Cinemachine 提供了丰富的组件来控制相机的行为,但有时我们需要实现一些自定义的行为。例如,我们可能希望相机在特定条件下改变跟随目标或注视目标。

2.1 动态切换跟随目标

假设我们有一个场景,玩家可以切换控制不同的角色,我们希望相机能够动态切换跟随目标。我们可以通过脚本来实现这一点。

using Cinemachine;
using UnityEngine;public class CameraTargetSwitcher : MonoBehaviour
{public CinemachineVirtualCamera virtualCamera;public Transform[] targets;private int currentTargetIndex = 0;void Update(){if (Input.GetKeyDown(KeyCode.Space)){SwitchTarget();}}void SwitchTarget(){currentTargetIndex = (currentTargetIndex + 1) % targets.Length;virtualCamera.Follow = targets[currentTargetIndex];}
}

在这个例子中,我们通过按下空格键来切换相机的跟随目标。virtualCamera.Follow 属性用于设置虚拟相机的跟随目标。

2.2 动态调整相机参数

有时我们需要根据游戏状态动态调整相机的参数,例如相机的 FOV(视野)或跟随距离。

using Cinemachine;
using UnityEngine;public class CameraParameterAdjuster : MonoBehaviour
{public CinemachineVirtualCamera virtualCamera;public float minFOV = 40f;public float maxFOV = 60f;public float zoomSpeed = 5f;void Update(){float scroll = Input.GetAxis("Mouse ScrollWheel");if (scroll != 0){float newFOV = virtualCamera.m_Lens.FieldOfView - scroll * zoomSpeed;newFOV = Mathf.Clamp(newFOV, minFOV, maxFOV);virtualCamera.m_Lens.FieldOfView = newFOV;}}
}

在这个例子中,我们通过鼠标滚轮来调整相机的 FOV,实现缩放效果。

3. 多相机混合

Cinemachine 支持多个虚拟相机之间的平滑过渡。通过设置虚拟相机的优先级和混合时间,可以实现复杂的相机切换效果。

3.1 基本相机切换

假设我们有两个虚拟相机,分别用于不同的视角。我们可以通过脚本来控制它们的优先级,实现相机切换。

using Cinemachine;
using UnityEngine;public class CameraSwitcher : MonoBehaviour
{public CinemachineVirtualCamera camera1;public CinemachineVirtualCamera camera2;void Update(){if (Input.GetKeyDown(KeyCode.Alpha1)){camera1.Priority = 10;camera2.Priority = 5;}else if (Input.GetKeyDown(KeyCode.Alpha2)){camera1.Priority = 5;camera2.Priority = 10;}}
}

在这个例子中,按下 1 键切换到 camera1,按下 2 键切换到 camera2

3.2 相机混合

Cinemachine 支持相机之间的平滑过渡。我们可以通过设置 CinemachineBlenderSettings 来控制混合效果。

using Cinemachine;
using UnityEngine;public class CameraBlender : MonoBehaviour
{public CinemachineVirtualCamera camera1;public CinemachineVirtualCamera camera2;public float blendTime = 2f;void Update(){if (Input.GetKeyDown(KeyCode.Space)){StartCoroutine(BlendCameras());}}IEnumerator BlendCameras(){camera1.Priority = 10;camera2.Priority = 5;yield return new WaitForSeconds(blendTime);camera1.Priority = 5;camera2.Priority = 10;}
}

在这个例子中,按下空格键后,相机会在 camera1 和 camera2 之间平滑过渡。

4. 扩展 Cinemachine 功能

Cinemachine 提供了丰富的 API,允许开发者通过代码扩展其功能。例如,我们可以创建一个自定义的相机行为组件。

4.1 自定义相机行为组件

假设我们想要创建一个相机震动效果,我们可以通过扩展 CinemachineExtension 来实现。

using Cinemachine;
using UnityEngine;[SaveDuringPlay]
[AddComponentMenu("")] // Hide in menu
public class CameraShakeExtension : CinemachineExtension
{public float shakeDuration = 0.5f;public float shakeAmount = 0.1f;private float shakeTimeRemaining = 0f;protected override void PostPipelineStageCallback(CinemachineVirtualCameraBase vcam,CinemachineCore.Stage stage, ref CameraState state, float deltaTime){if (stage == CinemachineCore.Stage.Body){if (shakeTimeRemaining > 0){Vector3 shakeOffset = Random.insideUnitSphere * shakeAmount;state.PositionCorrection += shakeOffset;shakeTimeRemaining -= deltaTime;}}}public void ShakeCamera(){shakeTimeRemaining = shakeDuration;}
}

在这个例子中,我们创建了一个 CameraShakeExtension 组件,它会在相机上添加一个震动效果。我们可以通过调用 ShakeCamera() 方法来触发震动。

4.2 使用自定义组件

我们可以通过脚本来触发自定义的相机行为。

using UnityEngine;public class CameraShakeTrigger : MonoBehaviour
{public CameraShakeExtension cameraShake;void Update(){if (Input.GetKeyDown(KeyCode.Space)){cameraShake.ShakeCamera();}}
}

在这个例子中,按下空格键会触发相机的震动效果。

5. 总结

Cinemachine 是 Unity3D>Unity3D 中一个非常强大的相机管理系统,通过虚拟相机、优先级、跟随、注视和混合等功能,开发者可以轻松实现复杂的相机行为。本文介绍了 Cinemachine 的高级应用,包括自定义相机行为、动态切换、多相机混合以及如何通过代码扩展 Cinemachine 的功能。希望这些内容能够帮助你在项目中更好地使用 Cinemachine,创造出更加丰富的游戏体验。

更多教学视频

Unity3D>Unity3D教程​www.bycwedu.com/promotion_channels/2146264125


http://www.ppmy.cn/embedded/170009.html

相关文章

ADC采集模块与MCU内置ADC性能对比

2.5V基准电压源: 1. 精度更高,误差更小 ADR03B 具有 0.1% 或更小的初始精度,而 电阻分压方式的误差主要来自电阻的容差(通常 1% 或 0.5%)。长期稳定性更好,分压电阻容易受到温度、老化的影响,长…

CyberRT(apollo) 定时器模块简述及bug分析

timer 模块 timer的定义,cyberrt中timer模块用于设置定时器任务,字面意思,设置设置定时周期及出发频次(周期 or oneshot),到达指定时间时间触发callback time wheel 时钟节拍轮,常见的定时器设计&#x…

机器学习基础概念详解:从入门到应用

在机器学习领域,掌握基础概念是理解复杂模型和应用场景的关键。本文将以简洁的方式介绍机器学习的核心概念,帮助读者快速构建知识框架。 一、数据集的划分:训练集、验证集与测试集 1. 训练集(Training Set) 用途&…

扫描纸质文件转pdf---少页数+手机+电脑协作

针对手机上扫描软件扫描文件转pdf要收费的问题,提供一种在页数较少时的免费替代方案 。 实现方法:手机软件的免费功能将文件扫描并保存为图片电脑端在word中将图片拼成文档word转pdf 1.借助于“扫描全能王”APP可以免费扫描文件为图片的功能&#xff0…

StarRocks 在爱奇艺大数据场景的实践

作者:林豪,爱奇艺大数据 OLAP 服务负责人 小编导读: 本文整理自爱奇艺工程师在 StarRocks 年度峰会的分享,介绍了爱奇艺 OLAP 引擎演化及引入 StarRocks 后的效果。 在广告业务中,StarRocks 替换 ImpalaKudu 后&#x…

blog点赞功能的实现

重点1 使用 Set 数据结构实现一人只能点赞一次 选择set的原因 (1)不重复特性:Set 集合中的元素具有唯一性,这与 “一个用户只能对一篇博客点赞一次” 的业务需求高度契合。当用户进行点赞操作时,将用户 ID 作为元素添…

nuxt常用组件库html-validator、@nuxtjs/i18n、@nuxt/image、@unocss/nuxt使用解析

html-validator 主要用于自动验证nuxt服务器呈现的HTML(SSR和SSG),以检测可能导致水合错误的HTML常见问题,有助于减少水合错误,检测常见的可访问性错误。 安装 npx nuxilatest module add html-validator配置 若自动更新nuxt.config.ts配置文…

Oracle 数据库基础入门(四):分组与联表查询的深度探索(上)

在 Oracle 数据库的学习进程中,分组查询与联表查询是进阶阶段的重要知识点,它们如同数据库操作的魔法棒,能够从复杂的数据中挖掘出有价值的信息。对于 Java 全栈开发者而言,掌握这些技能不仅有助于高效地处理数据库数据&#xff0…