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

news2024/11/26 14:46:24

在这里插入图片描述


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

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

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏:Unity游戏demo

🅰️Unity3D赛车游戏



文章目录

    • 🅰️Unity3D赛车游戏
    • 前言
    • 🎶(==A==)系统优化——相机的跟随
        • 为什么要优化:
        • 单个场景镜头
        • 多个场景镜头
        • 脚本
    • 🅰️


前言


😶‍🌫️版本: 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是固定帧执行,精准的实时跟随反而会放大细节


多个场景镜头


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

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

  • 演示效果

在这里插入图片描述

脚本

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#专题篇】—核心章题单实践练习


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


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/969505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

索引简单概述(SQL)

一、什么是索引&#xff1f; 索引是一种特殊的文件&#xff08;InnoDB数据表上的索引是表空间的一个组成部分&#xff09;&#xff0c;他们包含着对数据表里所有记录的引用指针。 索引是一种数据结构。数据库索引&#xff0c;是数据库管理系统中一个排序的数据结构&#xff0…

智慧公厕是智慧城市公共厕所形态的新一代技术支撑

在现代城市发展中&#xff0c;智慧城市正逐渐成为名副其实的未来趋势。作为城市基础设施的一部分&#xff0c;公共厕所的发展也与智慧城市息息相关。通过提升城市设施治理效率、实现数据开放与融合以及提升业务协同效率&#xff0c;智慧城市为公共厕所形态带来了全新的变革。本…

Python中的Numpy向量计算(R与Python系列第三篇)

目录 一、什么是Numpy? 二、如何导入NumPy? 三、生成NumPy数组 3.1利用序列生成 3.2使用特定函数生成NumPy数组 &#xff08;1&#xff09;使用np.arange() &#xff08;2&#xff09;使用np.linspace() 四、NumPy数组的其他常用函数 &#xff08;1&#xff09;np.z…

【论文解读】斯坦福小镇Generative Agents

git开源地址&#xff1a;GitHub - joonspk-research/generative_agents: Generative Agents: Interactive Simulacra of Human Behavior 论文地址&#xff1a;https://arxiv.org/abs/2304.03442 前言 最近很火的方向&#xff0c;利用GhatGPT的规划、对话、总结能力&#xff…

电商类面试问题--01Elasticsearch与Mysql数据同步问题

在实现基于关键字的搜索时&#xff0c;首先需要确保MySQL数据库和ES库中的数据是同步的。为了解决这个问题&#xff0c;可以考虑两层方案。 全量同步&#xff1a;全量同步是在服务初始化阶段将MySQL中的数据与ES库中的数据进行全量同步。可以在服务启动时&#xff0c;对ES库进…

Flink提交jar出现错误RestHandlerException: No jobs included in application.

今天打包一个flink的maven工程为jar&#xff0c;通过flink webUI提交&#xff0c;发现居然报错。 如上图所示&#xff0c;提示错误为&#xff1a; Server Response Message: org.apache.flink.runtime.rest.handler.RestHandlerException: No jobs included in application. …

6.网络编程套接字(上)

文章目录 1.网络编程基础1.1为什么需要网络编程&#xff1f;——丰富的网络资源1.2什么是网络编程1.3网络编程中的基本概念1.3.1发送端和接收端1.3.2请求和响应1.3.3客户端和服务端1.3.4常见的客户端服务端模型 2.Socket套接字2.1概念2.2分类2.3Java数据报套接字通信模型2.4Jav…

HTTPS协议详解:基本概念与工作原理

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、HTTPS协议的基本概念 二、为什么需要HTTP…

三相PMSM的坐标变换

三相PMSM的坐标变换 三相PMSM的数学模型具有复杂性和耦合性的多变量系统。因此需要对其进行降阶和解耦变换。 Vα&#xff0c;Vb&#xff0c;Vc是自然坐标系。 Vα&#xff0c;Vβ是静止坐标系。 Vd&#xff0c;Vq是同步旋转坐标系。 自然坐标系 三相永磁同步电机的驱动电路…

PixelSNAIL论文代码学习(1)——总体框架和平移实现因果卷积

文章目录 引言正文目录解析README.md阅读Setup配置Training the model训练模型Pretrained Model Check Point预训练的模型训练方法 train.py文件的阅读model.py文件阅读h12_noup_smallkey_spec模型定义_base_noup_smallkey_spec模型实现一、定义因果卷积过程通过平移实现因果卷…

PCIe DL_Feature详解

DL_Feature的引入 Data Link Control and Management State Machine在PCIe Gen4引入了DL_Feature这个状态&#xff0c;该状态主要用来协商PCIe link 两端是否支持新的DL Feature&#xff0c;目前为止DL Feature只引入了Scaled Flow Control 来提高Gen4及以上的效率。   DL_Fe…

Qt 简单闹钟

//wiget.h#ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTime> //时间类 #include <QTimer> //定时器类 #include <QTextToSpeech> #include <QDebug> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPA…

YoloV8改进策略:轻量级Slim Neck打造极致的YoloV8

文章目录 摘要Yolov8官方结果源码改进方法测试结果总结摘要 论文链接:https://arxiv.org/ftp/arxiv/papers/2206/2206.02424.pdf 作者研究了增强 CNN 学习能力的通用方法,例如 DensNet、VoVNet 和 CSPNet,然后根据这些方法的理论设计了 Slim-Neck 结构。 使用轻量级卷积…

机械制图(CAD)

目录 第一课&#xff08;80分钟&#xff09; 第二课&#xff08;80分钟&#xff09; 力啥学机械制图&#xff1f;我们的工厂要加工机械&#xff0c;而加工机械零件前&#xff0c;我们要先给工人图纸来看,工人才知道该怎样加工&#xff0c;所以我们今天就来学习下怎样画出符何…

任意文件读取和漏洞复现

任意文件读取 1. 概述 一些网站的需求&#xff0c;可能会提供文件查看与下载的功能。如果对用户查看或下载的文件没有限制或者限制绕过&#xff0c;就可以查看或下载任意文件。这些文件可以是漂代码文件&#xff0c;配置文件&#xff0c;敏感文件等等。 任意文件读取会造成&…

电脑开机操作系统引导过程

电脑开机时操作系统引导&#xff1a; CPU首先执行主存中ROM中的引导程序。 将磁盘的第一块——主引导记录(MBR)读入到内存中&#xff0c;执行磁盘引导程序&#xff0c;扫描分区表。 在主分区(C盘)执行分区引导程序。 在C盘根目录下找到完整的操作系统初始化程序并执行。

系统虚拟机(VM)

系统虚拟机&#xff1a;将一台物理机器虚拟化为多台虚拟机&#xff0c;每个虚拟机上都可以运行一个独立的操作系统&#xff0c;由虚拟机管理程序(VMM)来管理。 第一种直接运行在硬件上&#xff0c;可以直接分配物理资源&#xff0c;性能更好&#xff0c;可支持更多的虚拟机&am…

ModaHub魔搭社区专访百度智能云李莅:企业需要的是一款企业级向量数据库还是向量引擎?

ModaHub魔搭社区&#xff1a;虽然您认为它是刚需&#xff0c;但也有人认为我可能不是需要一款企业级的向量数据库&#xff0c;而是需要一个向量引擎。我可以在传统的数据库上加一个向量引擎&#xff0c;然后它就变成了一款向量数据库&#xff0c;您觉得他们这样的想法是可行的吗…

布隆过滤器Moudule安装

Redis帮我们实现了布隆过滤器算法&#xff0c;可以通过module方式安装&#xff0c;直接使用&#xff0c;其实可以自己实现这样的算法。 安装遇到的问题&#xff0c;通过官网下载的zip或者git下载的源码&#xff0c;都是master版本&#xff0c;make会出问题&#xff0c;报错文件…

springboot初试elasticsearch

引入依赖 elasticsearch的依赖版本与你elasticsearch要一致 <dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId> </dependency> 索引库的操作 创建索引库 impo…