【Unity3D赛车游戏优化篇】新【八】汽车实现镜头的流畅跟随,以及不同角度的切换


‍个人主页:@元宇宙-秩沅

‍ hallo 欢迎 点赞 收藏⭐ 留言 加关注✅!

本文由 秩沅 原创

‍ 收录于专栏:Unity游戏demo

️Unity3D赛车游戏



文章目录

    • ️Unity3D赛车游戏
    • 前言
    • (==A==)系统优化——相机升华优化
        • ‍️为什么要优化:
        • ‍️单个场景镜头
        • ‍️多个场景镜头
        • ‍️ 漂移镜头
        • ‍️相机管理脚本CameraContorl


前言


‍️版本: Unity2021
‍️适合人群:Unity初学者
‍️学习目标:3D赛车游戏的基础制作
‍️技能掌握:


A系统优化——相机升华优化


‍️为什么要优化:


代码过于复杂,并且滑轮镜头不适合后续游戏的进行


‍️单个场景镜头


  • 优化如下
  //相机跟随功能
    public void FllowEffect()  
    {  
        //实现从不同的角度切入观看
        transform.position = target.position * (1 - smoothTime) + transform.position * smoothTime;
        transform.LookAt(target.parent );

        smoothTime = (Control.Km_H  >=150 ) ? ( Mathf .Abs(Control.Km_H)/150)  - 0.85f : 0.45f;
    }

在这里插入图片描述

  • 此时代码放入了LateUpdate里面

1.优点:确实是是是跟随
2.缺点:但是会造成镜头的晃动

  • 改成放入了FixedUpdate里面

在这里插入图片描述

原因:FixedUpdate是固定帧执行,精准的实时跟随反而会放大细节


‍️多个场景镜头


  • 设置多个场景的位置
    在这里插入图片描述

  • 输入管理更新
    在这里插入图片描述

  • 演示效果

‍️ 漂移镜头


  • 加上了漂移镜头

  • 未加漂移镜头

可以看出加上漂移镜头后更有感觉

  • 关键代码:

在这里插入图片描述

        //漂移时 平滑参数配置
        speed = Control.Km_H / smoothTime;

        transform.position = Vector3.Lerp(transform.position, target[ChooseIndex].position, Time.deltaTime * speed );

        transform.LookAt(targetOb );

‍️相机管理脚本CameraContorl

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目:       ______________
//___________功能: 相机的管理
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class CameraContorl : MonoBehaviour
{
    //目标物体
    public Transform targetOb;
    public Transform[] target ;
    private CarMoveControl Control;
    public float  speed;
    //相机平滑值
    [Range(0,20)]
    public int  smoothTime = 8;
    //镜头的选择
    public int ChooseIndex ;



    [Header("----------加速时相机属性-------------")]
    //加速时的跟随力度
    [Range(1, 5)]
    public float shiftOff;




    //目标视野 (让其显示可见)
    [SerializeField ]
    private float addFov;

    //当前视野
    private float startView;
    [Range(1,10)]
    public float followLerp = 1;
    [Range(1,10)]
    public float angleLerp = 1;
    //为一些属性初始化

    private void Start()
    {      
        startView = Camera.main.fieldOfView; //将相机的开始属性赋入
        addFov = 30;

        //获取镜头位置
        for (int i = 0; i < 3; i++)
        {
            target[i] = targetOb.GetChild(0).GetChild(i);
        }
    }

    private void Update()
    {
        TabViewChoose();  //选择镜头
    }

    void FixedUpdate()
    {
        CameraAtrribute(); //相机属性显示

        FllowEffect(); //相机跟随功能

        FOXChange();  //加速时相机视野的变化
    }


    //选择场景
    private void TabViewChoose()
    {
        //按下Tab键时
       if(InputManager.InputManagerment.TabView)

            ChooseIndex = ChooseIndex > 1 ? 0 : ChooseIndex+1;
    }

    //相机跟随功能
    private void FllowEffect()  
    {
        //-------1.镜头的跟随方法一---------
        //实现从不同的角度切入观看
        //transform.position = target[ChooseIndex].position * (1 - smoothTime) + transform.position * smoothTime;
        //速度不同跟随的角度不同
        //moothTime = (Control.Km_H >= 150) ? (Mathf.Abs(Control.Km_H) / 150) - 0.85f : 0.45f;

        //-------2.镜头的跟随方法二---------

        //平滑参数配置
        speed = Control.Km_H / smoothTime;

        transform.position = Vector3.Lerp(transform.position, target[ChooseIndex].position, Time.deltaTime * speed );

        transform.LookAt(targetOb );

    } 

    //加速时相机视野的变化
    private  void FOXChange()
    {
        if(Input.GetKey(KeyCode.LeftShift) ) //按下坐标shift键生效
        {
            Camera.main.fieldOfView = Mathf.Lerp(Camera.main.fieldOfView , startView + addFov ,Time .deltaTime * shiftOff );
        }
        else
        {
            Camera.main.fieldOfView = Mathf.Lerp(Camera.main.fieldOfView, startView, Time.deltaTime * shiftOff);
        }

    }

    //相机属性显示
    private void CameraAtrribute()
    {
        //实时速度
        Control = targetOb.GetComponent<CarMoveControl>();

        speed = Mathf.Lerp(speed, Control.Km_H / 4, Time.deltaTime);

        speed = Mathf.Clamp(speed, 0, 55);   //对应最大200公里每小时

    }

}


⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

⭐【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞 收藏⭐ 留言 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


你可能感兴趣的:(#,unity游戏demo制作,游戏,汽车)