通过一个简易的Demo展示Cinemachine

2023-10-14 11:59
文章标签 展示 简易 demo cinemachine

本文主要是介绍通过一个简易的Demo展示Cinemachine,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Cinemachine的一些基本使用就不说了,说说自己动手做的一个简单的Demo来实现Cinemachine的基本功能

Cinemachine其实使用起来并不是很难,建议有不懂的可以从官方文档来学习。打开Cinemachine中的About,点击Documentation就可以查看到官方文档了。如图


首先介绍State-Driven Camera,它的功能非常强大,可以在游戏人物动画状态机切换的时候对应不同的镜头


左边是State-Driven Camera 底下的虚拟相机,右边是不同状态下对应要切换的虚拟相机,比如说当我人物站立时,我设置了一个拉近看背影的相机


当人物移动时我设置了一个FreeLook相机,这也是Cinemachine中的另一种相机功能,它可以实现像FPS游戏中通过鼠标控制镜头方向和距离的自由第三人称相机。比较简单就不展开介绍


当物体滑行时给它一个低镜头特效距离


当它跳跃时,给他一个右侧的特写:


其实把他做成gif图更酷,等我有时间再补上(因为懒= =)

PS:State-Driven Camera遇到的一些坑,想修改State-Driven Camera下的一个虚拟相机和人物的相对位置发现修改不了,这是为什么呢?那是因为你没有需要修改的相机放在State-Driven Camera下的第一位。如我要修改CM vcam1相机的位置,就把它放在State-Driven Camera的首位。如图


接着介绍Dolly Camera with track,三要素吧,轨道,脚本,相机。


      

脚本可以控制轨道的大小和速度,相机Follow轨道,LookAt物体,就可以生成一个沿着轨道滑行过程中注视物体的相机了。

画面截图:


轨道不同的方向截图:


画面感还行。PS:遇到的坑,有时候会发现相机偏离轨道,没有沿着轨道滑行,是因为在相机中Body中Follow Offset没设置好,不信你再试试看。

噢,差点忘了,如何是State-Driven Camera相机能切换到轨道相机呢。当然是通过Trriger脚本来控制,在Cinemachine中,当另外一个相机的状态改变时,主相机会自动改变到状态改变的相机,也就是说原来轨道相机是禁用的,通过Trriger激活了,所以相机就可以由State-Driven Camera切换到了轨道相机,下面是Trriger触发代码,顺便做了一个灯光的切换:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;public class SwitchToCam : MonoBehaviour {public GameObject dirLight; //场景中原来的光源public GameObject bloomLight;//灯光效果//public Transform arena;private CinemachineDollyCart dCartComp;public GameObject dollyCartToMove;public CinemachineVirtualCameraBase cartMove;public CinemachinePathBase.PositionUnits positionUnits = CinemachinePathBase.PositionUnits.Distance;public float speed = 5f; //轨道环绕速度private float transfromSpeed = 0.1f;//bool up = false;// Use this for initializationvoid Start () {if (dollyCartToMove){dCartComp = dollyCartToMove.GetComponent<CinemachineDollyCart>();dCartComp.m_Speed = 0;}}private void OnTriggerEnter(Collider other){if (other.CompareTag("Player") && dCartComp && cartMove){//  up = true;dCartComp.m_PositionUnits = positionUnits;dCartComp.m_Speed = speed;cartMove.VirtualCameraGameObject.SetActive(false);cartMove.VirtualCameraGameObject.SetActive(true);//cartMovedirLight.SetActive(false);bloomLight.SetActive(true);}}private void OnTriggerExit(Collider other){if(other.CompareTag("Player")&&dCartComp&& cartMove){//  up = false;dCartComp.m_Speed = 0f;cartMove.VirtualCameraGameObject.SetActive(false);dirLight.SetActive(true);bloomLight.SetActive(false);}}
}


然后介绍ClearShot Camera,这也是一个比较强大的相机,它能自动规避游戏中存在的障碍物,选择一个更易于观察的相机。


当然,想自动规避障碍物选择相机得加上右下角的Cinemachine Collider组件。


左边是Scene视图,右边是Game视图,继续前进。


当他进入隧道被遮挡住了自动切换到更易于观察的相机,如上图。

 


接着介绍2D Camera。


进入这个门,做一个传送效果,通过Trriger激活,把我们传送到2D场景中,注意设置2D相机的时候要切的模式

      把Main Camera中的相机投影设置为Orthographic,可以在Trriger中实现,下面是代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;public class In2DCube : MonoBehaviour {public CinemachineVirtualCamera cinemachine2D;//2D相机public GameObject player; //传送人物public Transform playerthransform; //传送人物的地点private Camera mainCamera; //用来控制主相机的投影模式public bool touch;public GameObject effect1; //特效的开关private void Start(){mainCamera = Camera.main;touch = false;}private void Update(){if (touch == true){effect1.SetActive(true);Invoke("Change", 1.0f);Invoke("ChangeEffect", 1.0f);touch = false;}}private void ChangeEffect(){effect1.SetActive(false);}private void Change(){mainCamera.orthographic = true;//mainCamera.orthographicSize = 6f;cinemachine2D.m_Lens.OrthographicSize = 4.9f;player.transform.position = playerthransform.transform.position;player.transform.rotation = playerthransform.transform.rotation;// player.transform.Rotate = new Vector3(0, 374.18f, 0);cinemachine2D.VirtualCameraGameObject.SetActive(false);cinemachine2D.VirtualCameraGameObject.SetActive(true);player.transform.localScale = new Vector3(0.6f, 0.6f, 0.6f);}private void OnTriggerEnter(Collider other){if (other.CompareTag("Player")){touch = true;           }}}

2D相机中还需要一个控制画面的组件:


最后生成的2D画面:


当然Cinemachine中还有一些其他的相机,都相对比较简单,就不一一介绍了,如果有什么疑问,欢迎来留言讨论。

这篇关于通过一个简易的Demo展示Cinemachine的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/210349

相关文章

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

基于Python实现简易视频剪辑工具

《基于Python实现简易视频剪辑工具》这篇文章主要为大家详细介绍了如何用Python打造一个功能完备的简易视频剪辑工具,包括视频文件导入与格式转换,基础剪辑操作,音频处理等功能,感兴趣的小伙伴可以了... 目录一、技术选型与环境搭建二、核心功能模块实现1. 视频基础操作2. 音频处理3. 特效与转场三、高

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参