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 initialization void 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); //cartMove dirLight.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中还有一些其他的相机,都相对比较简单,就不一一介绍了,如果有什么疑问,欢迎来留言讨论。