
👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:Unity游戏demo
⭐🅰️Unity3D赛车游戏⭐
文章目录
⭐前言⭐
–
 😶🌫️版本: 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里面
 
- 改成放入了FixedUpdate里面
 

 
 原因:FixedUpdate是固定帧执行,精准的实时跟随反而会放大细节
多个场景镜头
-  
设置多个场景的位置

 -  
输入管理更新

 -  
演示效果
 

脚本
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;
    //相机平滑值
    public float smoothTime;
    //镜头的选择
    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.镜头的跟随方法二---------
        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#专题篇】—核心章题单实践练习
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、










