👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:Unity游戏demo
⭐🅰️Unity3D赛车游戏⭐
文章目录
- ⭐🅰️Unity3D赛车游戏⭐
- ⭐前言⭐
- ⭐常见问题⭐
- 🎶(==A==)车辆模型——脚本优化特性的添加
- 🎶(==B==)车辆模型——加速优化相机部分
- 😶🌫️ 相机部分——添加shift加速时相机的变化
- 😶🌫️相机部分—— 模块化处理
- 🎶(==C==)车辆模型——加速优化车部分
- 🎶(==D==)车辆模型——导入加速记录器
- 😶🌫️1.新建UI——Image,改为适应屏幕尺寸
- 😶🌫️2.添加node指针和SpeedChange仪表盘的精灵图片
- 😶🌫️3.指针和速度同步
⭐前言⭐
–
😶🌫️版本: Unity2021
😶🌫️适合人群:Unity初学者
😶🌫️学习目标:3D赛车游戏的基础制作
😶🌫️技能掌握:
⭐常见问题⭐
- 轮胎抖动的问题
当相机变成lerp X时跟随移动时。,它是每帧去跟随的,所以当我们的车身如果稍微出现抖动的情况。再加上它是差值跟随的,它就会与我们车身同步进行抖动。但如果说将插值跟随的增量扩大的话。就不会出现镜头抖动的情况。所以一般我们如果没有在保证碰撞器是完全平整的情况下,我们一般不用 Larp进行跟随。
- 下压力的问题
下压力。当我们速度越快,它的下压力就越大。那么此时。车子的身体,它会往下移,导致模型变形的情况产生。此时。我们若想达到你理想的效果,又不想让刚体下移导致变形的情况。我们此时可以适当的增加轮胎的阻力。转向阻力。
- 镜头滑轮的问题
H对于我们滚轮控制镜头远近啊。这个操作可以根据需求去除。如果大家觉得有必要保留,我们可以保留滚轮移动进口。大小,那如果说没什么作用我们可以完全把它给去除。因为当我们。实现shift加速的时候。我们不需要滚轮作用。
🎶(A)车辆模型——脚本优化特性的添加
【unity每日一记】unity中常见的特性大全
- 分组标识的添加【Header(“xx”)】
- 将私有类型和保护类型可视化到面板上【serializeField】
- 滚轮添加 【Range(最小值,最大值)】
🎶(B)车辆模型——加速优化相机部分
CameraFllow ——> cameraContorl
此时按下leftShif镜头会后拉,实现速度增快的效果
😶🌫️ 相机部分——添加shift加速时相机的变化
//加速时相机视野的变化
public 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);
}
}
- 输入管理InpuManager的更新
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: 输入控制管理器
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class InputManager : MonoBehaviour
{
//单例模式管理
static private InputManager inputManagerment;
static public InputManager InputManagerment => inputManagerment;
public float horizontal; //水平方向动力值
public float vertical; //垂直方向动力值
public bool handbanl; //手刹动力值
public bool shiftSpeed; //加速shift键
void Awake()
{
inputManagerment = this;
}
void Update()
{
//与Unity中输入管理器的值相互对应
horizontal = Input.GetAxis("Horizontal");
vertical = Input.GetAxis("Vertical");
handbanl = Input.GetAxis("Jump")!= 0 ? true :false ; //按下空格键时就是1,否则为0
shiftSpeed = Input.GetKey(KeyCode.LeftShift) ? true : false;
}
}
😶🌫️相机部分—— 模块化处理
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: 相机的管理
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class CameraContorl : MonoBehaviour
{
//目标物体
public Transform target;
private CarMoveControl Control;
public float speed;
[Header("----------相机基础属性-------------")]
//鼠标滑轮的速度
public float ScrollSpeed = 45f;
public float Ydictance = 0f;
private float Ymin = 0f;
private float Ymax = 4f;
public float Zdictance = 4f;
private float Zmin = 4f;
private float Zmax = 15f;
//相机看向的角度 和最終位置
public float angle = -25 ;
private Vector3 lastPosition;
private Vector3 lookPosition;
[Header("----------加速时相机属性-------------")]
//加速时的跟随力度
[Range(1, 5)]
public float shiftOff;
//目标视野 (让其显示可见)
[SerializeField ]
private float addFov;
//当前视野
private float startView;
public float off = 20;
//为一些属性初始化
private void Start()
{
startView = Camera.main.fieldOfView; //将相机的开始属性赋入
addFov = 30;
}
void LateUpdate()
{
FllowEffect(); //相机属性显示
CameraAtrribute(); //相机跟随功能
FOXChange(); //加速时相机视野的变化
}
//相机属性显示
public void CameraAtrribute()
{
//实时速度
Control = target.GetComponent<CarMoveControl>();
speed = Mathf .Lerp (speed , Control.Km_H / 4 ,Time.deltaTime ) ;
speed = Mathf.Clamp(speed, 0, 55); //对应最大200公里每小时
}
//相机跟随功能
public void FllowEffect()
{
//Z轴和Y轴的距离和鼠标滑轮联系
Ydictance += Input.GetAxis("Mouse ScrollWheel") * ScrollSpeed * Time.deltaTime;//平滑效果
Zdictance += Input.GetAxis("Mouse ScrollWheel") * ScrollSpeed * Time.deltaTime*2;
//設置Y軸和x轴的滚轮滑动范围
Ydictance = Mathf.Clamp(Ydictance, Ymin, Ymax);
Zdictance = Mathf.Clamp(Zdictance, Zmin, Zmax);
//确定好角度,四元数 * 三维向量 = 三维向量 和最终位置
lookPosition = Quaternion.AngleAxis(angle, target.right) * -target.forward;
lastPosition = target.position + Vector3.up * Ydictance - lookPosition * Zdictance;
差值更新位置,速度越快镜头跟随越快,速度越慢镜头跟随越慢
transform.position = lastPosition;
//更新角度
transform.rotation = Quaternion.LookRotation(lookPosition);
}
//加速时相机视野的变化
public 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);
}
}
}
🎶(C)车辆模型——加速优化车部分
此时按下leftShif速度会暴增
//加速以及动画相关
public void ShiftSpeed()
{
//按下shift加速键时
if (InputManager.InputManagerment.shiftSpeed)
{
//向前增加一个力
rigidbody.AddForce(-transform.forward * shiftSpeed);
}
else
{
rigidbody.AddForce(transform.forward * 0);
}
}
🎶(D)车辆模型——导入加速记录器
此时按下leftShif仪表盘的指针会加速旋转
😶🌫️1.新建UI——Image,改为适应屏幕尺寸
😶🌫️2.添加node指针和SpeedChange仪表盘的精灵图片
😶🌫️3.指针和速度同步
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: UI相关的脚本管理
//___________创建者:_______秩沅________
//_____________________________________
//-------------------------------------
public class UIContorl : MonoBehaviour
{
//------------------仪表盘----------------
//速度指针开始角度和最终角度
private float startAngel = 215, ednAngel = -35;
//速度指针偏差角度
private float offAngel;
//获取速度的对象
public CarMoveControl control;
//速度指针组件
public Transform node;
//----------------------------------------
void Update()
{
//偏差角度 = 每度(速度)旋转的角度 * 速度
offAngel = (startAngel - ednAngel) / 180 * control.Km_H;
//仪表盘的管理,与速度同步
node.eulerAngles = new Vector3 (0, 0, startAngel -offAngel);
}
}
⭐【Unityc#专题篇】之c#进阶篇】
⭐【Unityc#专题篇】之c#核心篇】
⭐【Unityc#专题篇】之c#基础篇】
⭐【Unity-c#专题篇】之c#入门篇】
⭐【Unityc#专题篇】—进阶章题单实践练习
⭐【Unityc#专题篇】—基础章题单实践练习
⭐【Unityc#专题篇】—核心章题单实践练习
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、