关于unity:主流游戏相机实现-之Cinemachine-概述

47次阅读

共计 2663 个字符,预计需要花费 7 分钟才能阅读完成。

《支流游戏相机实现》通过 Unity 3D 引擎和 Cinemachine 组件来实现支流游戏的相机设置,切换和治理的概念,习惯,基本原理,教训参数等。实现内容以动作游戏相机为主,但不限于动作游戏,也能够用于横版搏斗、FPS、RPG 等类型,须要自行调整和钻研。

课程属于根底和进阶课程,适宜对镜头管制感兴趣的读者。

《支流游戏相机实现》目录
1|Cinemachine 概述
2|《战双》相机合成和实现
3|《Sifu/ 徒弟》战斗相机局部合成与实现
4|多指标相机实现
5|《对马岛之魂》战斗相机局部实现
6|相机碰撞和场景交互解决
7|Demo 工程


本文节选自 UWA 学堂的《支流游戏相机实现》第一节《Cinemachine 概述》。

1 根本组件组成

Cinemachine 外围组件包含 BrainVirtual Camera(虚构相机),Brain 负责相机的切换,虚构相机负责拍摄。

Virtual Camera 虚构相机次要由六个模块组成,别离是:
Lens:包含调整 FOV 等参数;
Body:负责解决相机和跟踪目标之间的绝对地位的这样一个关系;
Aim:负责解决焦点和跟踪目标在镜头中的绝对地位;
Noise:模仿手持相机的晃动;后处理模块:让每个镜头有不同的后处理成果;
Extnesions 可扩大模块:包含碰撞解决等性能。

Body属性提供了下列算法来挪动虚构相机:

  • Do Nothing:不挪动虚构相机。
  • Framing Transposer:在屏幕空间,放弃相机和追随指标的绝对地位,能够设置缓动。
  • Hard Lock to Target:虚构相机和追随指标应用雷同地位。
  • Orbital Transposer:相机和追随指标的绝对地位是可变的,还能接管用户的输出。常见于玩家管制的相机。
  • Tracked Dolly:相机沿着事后设置的轨道挪动。
  • Transposer:相机和追随指标的绝对地位固定,能够设置缓动。

Aim属性提供了下列算法来旋转相机对准 Look At 的指标:

  • Composer:将指标放弃在相机镜头内,能够设置多种束缚
  • Group Composer:将多个指标放弃在相机镜头内
  • Do Nothing:不旋转相机
  • POV:依据用户的输出旋转相机
  • Same As Follow Target:将相机的旋转和追随指标的旋转同步
  • Hard Look At:将 Look At 指标固定在镜头核心的地位。

组织构造:
1.1 Brain 和 Virtual Camera 执行过程

CinemachineBrain 每帧通过 VirtualCamera 计算实在相机的地位,并同步到实在相机上。真正的数据计算又是通过 VirtualCamera 上的流水线来计算的。这是一个简化的流程阐明,实在计算还有相机切换时的混合、流水线之外的 Extension、和 CinemachineCore 对 Cinemachine 的全局治理等。

1.2 CinemachineBrain 具体调用流程
次要能够分为两个工夫节点和三件事。

  • 工夫节点

    • FixedUpdate 之后
    • LateUpdate
  • 三件事

    • 保护虚构相机的状态,永远在 LateUpdate。
    • 通过虚构相机计算 State,依据 UpdateMethod 的设置,在 FixedUpdate 之后或 LateUpdate。
    • 将虚构相机的 State 同步到实在相机上,依据 BlendUpdateMethod 的设置,在 FixedUpdate 之后或 LateUpdate。

VirtualCamera 中 State 计算流程

VirtualCamera 中 Pipeline Stage
流水线阶段

UpdateComponentPipeline(); 
//
if (m_ComponentOwner != null && m_ComponentOwner.gameObject != null)
{
    // 排序 the pipeline
    list.Sort((c1, c2) => (int)c1.Stage - (int)c2.Stage);
    m_ComponentPipeline = list.ToArray();}
//  预处理 camState
for (int i = 0; i < m_ComponentPipeline.Length; ++i)
    m_ComponentPipeline[i].PrePipelineMutateCameraState(ref state, deltaTime);


// 按 body 到 final 程序执行 CametaState,有 2 个例外
CinemachineComponentBase postAimBody = null;
for (var stage = CinemachineCore.Stage.Body; stage <= CinemachineCore.Stage.Finalize; ++stage)
{
    ...
    if (stage == CinemachineCore.Stage.Body && c.BodyAppliesAfterAim)
    {
        postAimBody = c;
        continue; // do the body stage of the pipeline after Aim
    }
    c.MutateCameraState(ref state, deltaTime);
}
InvokePostPipelineStageCallback(this, stage, ref state, deltaTime);


if (stage == CinemachineCore.Stage.Aim)
{if (c == null)
        state.BlendHint |= CameraState.BlendHintValue.IgnoreLookAtTarget;
    // If we have saved a Body for after Aim, do it now
    if (postAimBody != null)
    {postAimBody.MutateCameraState(ref state, deltaTime);
        InvokePostPipelineStageCallback(this, CinemachineCore.Stage.Body, ref state, deltaTime);
    }
}

适宜读者
1、从事第三人称 3D 游戏研发的策动、程序、美术、分镜师以及独立制作人
2、心愿晋升游戏体验设计和实现能力,零碎了解业务与技术如何联合的开发者
3、具备肯定 Unity 引擎相机根底的同学
4、对镜头管制感兴趣的同学
5、器重 3C 和晋升相机体现品质的群体

你将取得
1、支流游戏相机管制的实现思路和技巧
2、优化玩家体验的能力
3、优化产品品质和表现力的思路
4、运行视频以及 Unity 工程源码

更多精彩内容,欢送关注 UWA 学堂:edu.uwa4d.com

正文完
 0