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

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值