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