主流游戏相机实现 之Cinemachine 概述
《主流游戏相机实现》通过Unity 3D引擎和Cinemachine组件来实现主流游戏的相机设置,切换和管理的概念,习惯,基本原理,经验参数等。实现内容以动作游戏相机为主,但不限于动作游戏,也可以用于横版格斗、FPS、RPG等类型,需要自行调整和研究。
课程属于基础和进阶课程,适合对镜头控制感兴趣的读者。
《主流游戏相机实现》目录
1|Cinemachine 概述
2|《战双》相机分解和实现
3|《Sifu/师傅 》战斗相机部分分解与实现
4|多目标相机实现
5|《对马岛之魂》战斗相机部分实现
6|相机碰撞和场景交互处理
7|Demo工程
本文节选自UWA学堂的《主流游戏相机实现》第一节《Cinemachine 概述》。
1 基本组件组成
Cinemachine核心组件包括Brain和Virtual 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目标固定在镜头中心的位置。
![](https://img-blog.csdnimg.cn/img_convert/9dbeb4fbb34bf2a8de0896e98942b9ff.png)
![](https://img-blog.csdnimg.cn/img_convert/4345cbd65758d0262f4c76d92f5e0f6b.jpeg)
组织结构:
1.1 Brain和Virtual Camera执行过程
![](https://img-blog.csdnimg.cn/img_convert/526754b4046fbb498db23d7d3b7fe3e8.png)
CinemachineBrain每帧通过VirtualCamera计算真实相机的位置,并同步到真实相机上。 真正的数据计算又是通过VirtualCamera上的流水线来计算的。 这是一个简化的流程说明,真实计算还有相机切换时的混合、流水线之外的Extension、和CinemachineCore对Cinemachine的全局管理等。
1.2 CinemachineBrain详细调用流程 主要可以分为两个时间节点和三件事。
-
时间节点
-
FixedUpdate之后
-
LateUpdate
-
-
三件事
-
维护虚拟相机的状态,永远在LateUpdate。
-
通过虚拟相机计算State,根据UpdateMethod的设置,在FixedUpdate之后或LateUpdate。
-
将虚拟相机的State同步到真实相机上,根据BlendUpdateMethod的设置,在FixedUpdate之后或LateUpdate。
-
![](https://img-blog.csdnimg.cn/img_convert/ffd79b10f8d936a211d5d4253bfdfb80.png)
VirtualCamera中State计算流程
![](https://img-blog.csdnimg.cn/img_convert/53101093ef378517c07b41882836cd6b.png)
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工程源码
相关文章
- Unity3D_(游戏)甜品消消乐03_游戏UI设计
- 使用行为树(Behavior Tree)实现游戏AI
- win8 开发之旅(17) --足球游戏揭秘3
- 西游释厄传2游戏技巧
- 使用游戏引擎实现的水波纹
- Java实现 LeetCode 810 黑板异或游戏 (分析)
- Java实现 LeetCode 529 扫雷游戏(DFS)
- Java实现 LeetCode 529 扫雷游戏(DFS)
- Java实现 LeetCode 292 Nim游戏
- java实现 猜数字游戏
- java实现 猜数字游戏
- java实现第三届蓝桥杯火柴游戏
- java实现第八届蓝桥杯生命游戏
- java实现第八届蓝桥杯生命游戏
- Java实现 蓝桥杯VIP 算法提高 开灯游戏
- Java实现蓝桥杯 算法提高 盾神与积木游戏
- 【ANDROID游戏开发二十二】(图文详解)游戏中灵活实现动画播放!简述J2ME的游戏类库与ANDROID游戏开发!
- 55. 跳跃游戏-最大值法
- 3D游戏引擎一 win32编程
- 计算机图形学学习方法和相关书籍,做游戏,GIS,虚拟现实,三维引擎的都能够看看.
- leaflet自定义游戏瓦片tile地图,进行3级zoom加载(106)
- 3D游戏引擎设计与实现(3)
- 打造免费的游戏开发环境
- 游戏制作之路(11)实现眼睛上下转动
- 游戏制作之路(19)角色实现向上跳动
- 【Leetcode刷题Python】174. 地下城游戏
- 【python游戏制作】拼图永不过时,这就是我这个年龄该玩的游戏~
- 【taro react】(游戏) ---- 小游戏 2048 的实现
- Unity官方实例教程 Space Shooter(太空射击游戏)