通过一个简易的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

相关文章

python实现简易SSL的项目实践

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

使用PyQt实现简易文本编辑器

《使用PyQt实现简易文本编辑器》这篇文章主要为大家详细介绍了如何使用PyQt5框架构建一个简单的文本编辑器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录分析主窗口类 (MyWindow)菜单操作语法高亮 (SyntaxHighlighter)运行程序主要组件代码图示分析实现

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

用Java打造简易计算器的实现步骤

《用Java打造简易计算器的实现步骤》:本文主要介绍如何设计和实现一个简单的Java命令行计算器程序,该程序能够执行基本的数学运算(加、减、乘、除),文中通过代码介绍的非常详细,需要的朋友可以参考... 目录目标:一、项目概述与功能规划二、代码实现步骤三、测试与优化四、总结与收获总结目标:简单计算器,设计

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

通过C#和RTSPClient实现简易音视频解码功能

《通过C#和RTSPClient实现简易音视频解码功能》在多媒体应用中,实时传输协议(RTSP)用于流媒体服务,特别是音视频监控系统,通过C#和RTSPClient库,可以轻松实现简易的音视... 目录前言正文关键特性解决方案实现步骤示例代码总结最后前言在多媒体应用中,实时传输协议(RTSP)用于流媒体服

起点中文网防止网页调试的代码展示

起点中文网对爬虫非常敏感。如图,想在页面启用调试后会显示“已在调试程序中暂停”。 选择停用断点并继续运行后会造成cpu占用率升高电脑卡顿。 经简单分析网站使用了js代码用于防止调试并在强制继续运行后造成电脑卡顿,代码如下: function A(A, B) {if (null != B && "undefined" != typeof Symbol && B[Symbol.hasInstan

linux 内核提权总结(demo+exp分析) -- 任意读写(四)

hijack_modprobe_path篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     原理同hijack_prctl, 当用户执行错误格式的elf文件时内核调用call_usermod

linux 内核提权总结(demo+exp分析) -- 任意读写(三)

hijack_prctl篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   prctl函数: 用户态函数,可用于定制进程参数,非常适合和内核进行交互 用户态执行prctl函数后触发prctl系统

linux 内核提权总结(demo+exp分析) -- 任意读写(二)

hijack_vdso篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     vdso: 内核实现的一个动态库,存在于内核,然后映射到用户态空间,可由用户态直接调用 内核中的vdso如果被修改