Unity3D摄像机高级控制

在游戏场景中,通常摄像机如果需要进行一些不规则的固定运动,比如片头的场景摄像机的移动,此时如果通过代码来控制,虽然可以实现但调试过程并不直观,所以我们可以通过绑定摄像机动作来达到这一效果。
创建动作的过程这里不再赘述,前面的文章中有详细的讲解。

首先将创建好的动作绑定至摄像机,利用关键帧补间动画进行摄像机运动控制,如图

点击播放即可查看摄像机的实时运动效果,这里主要是针对xyz的位置及角度6个参赛进行调整,从而实现电影版的摄像机运动效果,这里我们且将动作命名为Move,并绑定至1号摄像机上

接下来我们创建一个摄像机管理脚本 CameraManger.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using UnityEngine;
using System.Collections;

public class CameraManger : MonoBehaviour {

    public GameObject Camera_1;
    public GameObject Camera_2;
    public GameObject Camera_3;
   

    // Use this for initialization
    void Start () {
   
    }
   
    // Update is called once per frame
    void Update () {


        switch (Main.state)
        {
            case Main.STATE.READY:
                onActiveFalse();
                Camera_1.SetActive(true);
                Camera_1.animation.Play("move");

                break;

            case Main.STATE.START:
                onActiveFalse();
                Camera_2.SetActive(true);                
                break;

            default:
                break;

        }
   
    }

    void onActiveFalse()
    {
        Camera_1.SetActive(false);
        Camera_2.SetActive(false);
        Camera_3.SetActive(false);
    }
}


此时通过主函数main的全局状态机即可控制摄像机的切换,但是这里有一个问题,之前我们设定好的move动作无法播放,其原因是我们在Updata中,每一帧都调用了onActiveFalse()函数,故当move动作一播放摄像机又被关闭,循环往复。
这里我们用一个小的技巧,我且命名为OnceKey,类似一个一次性开关。
修改代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
        private bool onecKey;

    void Update () {

        switch (Main.state)
        {
            case Main.STATE.READY:

                if (!onecKey)
                {
                    onActiveFalse();
                    Camera_1.SetActive(true);
                    Camera_1.animation.Play("move");
                    onecKey = true;
                }

                if (!Camera_1.animation.isPlaying)
                {
                    Main.state = Main.STATE.START;
                    onecKey = false;
                }

                break;

            case Main.STATE.START:

               
                onActiveFalse();
                Camera_2.SetActive(true);
             
           
                break;

            default:

                break;

        }
   
}

此时当1号相机的动作播放完毕后,即可自动进入下一个状态。

关于摄像机的高级控制这里只是冰山一角,写得复杂了你们也不愿看了,此文且作为一个引子吧。更多的控制脚本有待大家去举一反三去发掘。

谢谢关注。

BeiTown
2013.03.11

本文链接:Unity3D摄像机高级控制

转载声明:BeiTown原创,转载请注明来源:BeiTown's Coder 编码之源,谢谢


Tags: , ,

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>