Unity3D摄像机高级控制

本文介绍如何在Unity中使用关键帧补间动画控制摄像机的运动,通过绑定特定动作实现流畅的镜头移动效果,并通过一个摄像机管理脚本来控制不同状态下的摄像机切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


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


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


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

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,类似一个一次性开关。
修改代码如下:

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号相机的动作播放完毕后,即可自动进入下一个状态。


转载自:http://coder.beitown.com/archives/579








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值