游戏蛮牛学习群(纯技术交流,不闲聊):539178957
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2282

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2844|回复: 7

[bxh883] 快速了解Unity2017新功能:Cinemachine(3)_Clear Shot

[复制链接]  [移动端链接]
排名
1059
昨日变化
1

10

主题

96

帖子

1419

积分

Rank: 9Rank: 9Rank: 9

UID
3876
好友
0
蛮牛币
2994
威望
0
注册时间
2013-9-14
在线时间
330 小时
最后登录
2018-7-19

专栏作家

发表于 2018-4-29 21:50:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 bxh883 于 2018-4-29 21:50 编辑

简介
上一篇文章我们更深入地认识了Cinemachine,并且动手实践创建了一个基础的
镜头跟随效果,以及一个2D游戏常见的场景和镜头效果。今天我们再来了解一下ClearShot

一图流

温故知新
Cinemachine的基础概念这里就不再复述了,不清楚的兄弟可以查看我的第一篇文章
今天我们来说说ClearShot。他这有什么用呢?试想一个在3D游戏中,我们常会遇到这样的情况,玩家从室外移动到室内,
这时候室内的观察视野就没有野外宽阔了, 我们能看到的内容也会发生变化。如果使用ClearShot就能很轻松地达到这种效果。

实践
使用ClearShot,我们可以快速地达到如下的效果。
   1. 创建一个移动的Cube,和一个固定的wall,如图,cube有一个动画,会向前移动一段距离,穿过wall后再出来
   2. 通过Cinemachine->Create ClearShot Camera,创建一个ClearShot VirtualCamera,命名为CM ClearShot1。
   3. 通过Cinemachine->Cerate Virtual Camera, 创建一个Virutal Camera,命名为lookTheUp。
   4. 将lookTheUp VCam放到CM ClearShot1下,变成clearshot的子物体,这时候会发现clearshot下已经有一个Vcam了,
将这个Vcam改名为lookTheRight
树形结构如图
  
   5. 设置lookTheRight,在cube移动的时候跟随cube,而且注释这cube前进方向的右侧,
设置lookTheUp,在cube移动的时候跟随cube,注释这cube前进方向的上方。
   6. 选择CM ClearShot1,修改两个Child VirtualCamera的优先级,设置lookTheRight为12, lookTheUp为11。
这个时候我们会看到一个警告,提示lookTheUp没有添加ColliderExtention。
  
   7. 为lookTheUp添加ColliderExtention
Play,Enjoy It。
我们可以看到,barin的初始状态由lookTheRight控制,当VCam lookTheRight无法观察到cube的时候,brain会自动选择lookTheUp来控制摄像机。
ClearShot会他的ChildVirtualCamera中选择最优的一个VirtualCamera来控制摄像机,而别这些ChildVirtualCamera都需要有ColliderExtention。
Randomize Choice
ClearShot里还有一个属性是Randmize Choice,通过查看源码,我们会明白,勾选后我们的ClearShot会从ChildVirtualCamera中随机选择一个VCam来
控制摄像机。当然他的条件也是很严格的,需要所有的ChildVirtualCamera有相同的Priority,还有相同的ShotQuality。


[C#] 纯文本查看 复制代码
private ICinemachineCamera ChooseCurrentCamera(Vector3 worldUp, float deltaTime) 

{

        //not our bussiness this time...



        if (LiveChild != null && !LiveChild.VirtualCameraGameObject.activeSelf)

                LiveChild = null;

        ICinemachineCamera best = LiveChild;

        for (int i = 0; i < childCameras.Length; ++i)

        {

                CinemachineVirtualCameraBase vcam = childCameras[i];[/i]

[i]                if (vcam != null && vcam.VirtualCameraGameObject.activeInHierarchy)[/i]

[i]                {[/i]

[i]                        // Choose the first in the list that is better than the current[/i]

[i]                        if (best == null [/i]

[i]                                || vcam.State.ShotQuality > best.State.ShotQuality[/i]

[i]                                || (vcam.State.ShotQuality == best.State.ShotQuality && vcam.Priority > best.Priority)[/i]

[i]                                || (m_RandomizeChoice && mRandomizeNow && (ICinemachineCamera)vcam != LiveChild [/i]

[i]                                        && vcam.State.ShotQuality == best.State.ShotQuality [/i]

[i]                                        && vcam.Priority == best.Priority))[/i]

[i]                        {[/i]

[i]                                best = vcam;[/i]

[i]                        }[/i]

[i]                }[/i]

[i]        }[/i]

[i]        mRandomizeNow = false;[/i]



[i]        float now = Time.time;[/i]

[i]        if (mActivationTime != 0)[/i]

[i]        {[/i]

[i]                // Is it active now?[/i]

[i]                if (LiveChild == best)[/i]

[i]                {[/i]

[i]                        // Yes, cancel any pending[/i]

[i]                        mPendingActivationTime = 0;[/i]

[i]                        mPendingCamera = null;[/i]

[i]                        return best;[/i]

[i]                }[/i]

[i]        }[/i]



[i]        //not our bussiness this time...[/i]

[i]}[/i]

[i]

而代码中ShotQuality就是ColliderExtention会处理的值。

查看Randmoize Choice效果的步骤:
   1. 隐藏我们的wall
   2. 将lookTheUp和lookTheRight的Priority都修改为11
   3. 勾选Randomize Choice
Play
每次运行,都会随机使用一个VCamera来控制摄像机。
结尾
大家在实践的过程中有遇到什么问题,可以提出来,我很乐意和大家一起分享。
这是Demo的Github地址https://github.com/aaBaO/DemoRepository
欢迎大家Fork过去参考






回复

使用道具 举报

4四处流浪
319/500
排名
12646
昨日变化
5

1

主题

199

帖子

319

积分

Rank: 4

UID
16124
好友
1
蛮牛币
1200
威望
0
注册时间
2014-3-2
在线时间
63 小时
最后登录
2018-8-11
发表于 2018-5-2 14:06:39 | 显示全部楼层
666666666666666666666666

回复 支持 反对

使用道具 举报

5熟悉之中
837/1000
排名
5367
昨日变化
4

0

主题

433

帖子

837

积分

Rank: 5Rank: 5

UID
146677
好友
9
蛮牛币
2720
威望
0
注册时间
2016-4-25
在线时间
164 小时
最后登录
2018-8-9
QQ
发表于 2018-5-3 08:57:28 | 显示全部楼层
学习一下combine,楼主加油
[发帖际遇]: 一个袋子砸在了 LiuBen 头上,LiuBen 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1287/1500
排名
2266
昨日变化
9

0

主题

348

帖子

1287

积分

Rank: 6Rank: 6Rank: 6

UID
136635
好友
0
蛮牛币
1301
威望
0
注册时间
2016-2-15
在线时间
369 小时
最后登录
2018-8-14
发表于 2018-5-3 09:07:39 | 显示全部楼层
学习一下,谢谢

回复

使用道具 举报

7日久生情
1931/5000
排名
2393
昨日变化
7

1

主题

916

帖子

1931

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
216583
好友
2
蛮牛币
3219
威望
0
注册时间
2017-4-7
在线时间
468 小时
最后登录
2018-8-14
发表于 2018-5-3 17:11:50 | 显示全部楼层
谢谢分享,学习

回复

使用道具 举报

6蛮牛粉丝
1479/1500
排名
25282
昨日变化
12

3

主题

736

帖子

1479

积分

Rank: 6Rank: 6Rank: 6

UID
63377
好友
0
蛮牛币
14
威望
0
注册时间
2014-12-24
在线时间
727 小时
最后登录
2018-8-14
发表于 2018-5-5 12:30:01 | 显示全部楼层
很不错ashere五花肉味儿

回复 支持 反对

使用道具 举报

5熟悉之中
603/1000
排名
6529
昨日变化
4

2

主题

250

帖子

603

积分

Rank: 5Rank: 5

UID
229218
好友
1
蛮牛币
753
威望
0
注册时间
2017-6-28
在线时间
165 小时
最后登录
2018-8-7
发表于 2018-5-6 15:29:01 | 显示全部楼层
学习了,支持感谢分享!

回复 支持 反对

使用道具 举报

3偶尔光临
258/300
排名
7540
昨日变化
5

0

主题

57

帖子

258

积分

Rank: 3Rank: 3Rank: 3

UID
270137
好友
2
蛮牛币
585
威望
0
注册时间
2018-3-1
在线时间
49 小时
最后登录
2018-6-25
发表于 2018-5-6 18:55:35 | 显示全部楼层

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表