👨💻个人主页 :@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏 :Unity游戏demo
⭐🅰️Unity3D赛车游戏⭐
文章目录
-
- ⭐🅰️Unity3D赛车游戏⭐
- ⭐前言⭐
- 🎶(==A==)车辆模型------如何制作一个合格的汽车实现简单的移动
-
- [😶🌫️<font color=red>1.导入车辆模拟模型。进行贴图,放置。](#😶🌫️1.导入车辆模拟模型。进行贴图,放置。)
- [<font color=red>😶🌫️2. wheel clider车轮碰撞器的添加](#😶🌫️2. wheel clider车轮碰撞器的添加)
- [<font color=red>😶🌫️3.尺寸的适应](#😶🌫️3.尺寸的适应)
- [😶🌫️<font color=red>4,运动测试](#😶🌫️4,运动测试)
- 🎶(==B==)车辆模型------用代码实现车轮的动画
- 🎶(==C==)车辆模型------相机的跟随
- 🎶(==D==)车辆模型------调节阻力
- ⭐🅰️⭐
⭐前言⭐
--
😶🌫️版本: Unity2021
😶🌫️适合人群:Unity初学者
😶🌫️学习目标:3D赛车游戏的基础制作
😶🌫️技能掌握:
🎶(A)车辆模型------如何制作一个合格的汽车实现简单的移动
😶🌫️1.导入车辆模拟模型。进行贴图,放置。
😶🌫️2. wheel clider车轮碰撞器的添加
注意项:车轮碰撞器的添加 和车轮模型必须分开
😶🌫️3.尺寸的适应
尺寸的适应
🪶问题集结
问题1:放置模型时 为什么有紧贴地面和 随机再空中的两种情况 ------Mesh colider的存在
问题2:为啥会被弹飞 ------质量太小被车轮顶飞
问题3:车辆为啥会抖动 ------未添加BoxColider碰撞器或者四个车轮碰撞器的位置不一致
要加一个车身Bosch leader碰撞器就不会抖动了
😶🌫️4,运动测试
知识百科:什么是扭矩?
扭矩是指发动机运转时从曲轴端输出的平均力矩,俗称为发动机的"转劲",是 发动机性能 的一个重要参数,扭矩越大,发动机输出的"劲"越大,曲轴转速的变化也越快,汽车的爬坡能力、起步速度和加速性也越好。
- 前后左右的运动
csharp
public class WheelMove : MonoBehaviour
{
//四个轮子的碰撞器
public WheelCollider[] wheels ;
//扭矩力度
public float motorflaot = 200f;
//转向力度
public float steerflaot = 20f;
//初始化三维向量和四元数
private Vector3 wheelPosition = Vector3.zero;
private Quaternion wheelRotation = Quaternion.identity;
private void FixedUpdate()
{
wheelsAnimation();
//垂直轴不为0时
if (Input.GetAxis("Vertical") != 0) //当按下WS键时生效
{
for (int i = 0; i < wheels.Length; i++)
{
wheels[i].motorTorque = Input.GetAxis("Vertical") *motorflaot;
}
}
else //否则归0
{
for (int i = 0; i < wheels.Length; i++)
{
wheels[i].motorTorque = 0;
}
}
//水平轴不为0时
if (Input.GetAxis("Horizontal") != 0) //当按下AD键时生效
{
for (int i = 0; i < wheels.Length - 2 ; i++) //只针对前轮
{
wheels[i].steerAngle = Input.GetAxis("Horizontal") * steerflaot;
}
}
else //否则归0
{
for (int i = 0; i < wheels.Length - 2; i++) //只针对前轮
{
wheels[i].steerAngle = 0;
}
}
}
}
🎶(B)车辆模型------用代码实现车轮的动画
错误示范:
解决措施:
csharp
wheelMesh[i].transform.rotation = wheelRotation * Quaternion .AngleAxis (90,Vector3 .forward );
正确示范:
- 关键代码
csharp
//车轮动画相关
public void wheelsAnimation()
{
for (int i = 0; i < wheels.Length ; i++)
{
//获取当前空间的车轮位置 和 角度
wheels[i].GetWorldPose(out wheelPosition, out wheelRotation);
//赋值给
wheelMesh[i].transform.position = wheelPosition;
print(wheelRotation);
wheelMesh[i].transform.rotation = wheelRotation * Quaternion .AngleAxis (90,Vector3 .forward );
}
}
原理:
将车轮的网格模型他的位置和车轮碰撞器的空间位置和空间旋转角度相同步。达到车轮的滚动和转向动画效果。
------------------------------------
完整代码
csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//---------------------------------------------------------------------------------------------------------------
//___________项目: ______________
//___________功能: 车轮的运动和动画相关
//___________创建者:_______秩沅________
//_____________________________________
//-------------------------------------
public class WheelMove : MonoBehaviour
{
//四个轮子的碰撞器
public WheelCollider[] wheels ;
//网格的获取
public GameObject[] wheelMesh;
//扭矩力度
public float motorflaot = 200f;
//转向力度
public float steerflaot = 20f;
//初始化三维向量和四元数
private Vector3 wheelPosition = Vector3.zero;
private Quaternion wheelRotation = Quaternion.identity;
//辅助变量
private Vector3 off;
private void FixedUpdate()
{
wheelsAnimation();
//垂直轴不为0时
if (Input.GetAxis("Vertical") != 0) //当按下WS键时生效
{
for (int i = 0; i < wheels.Length; i++)
{
//扭矩力度
wheels[i].motorTorque = Input.GetAxis("Vertical") *motorflaot;
}
}
else //否则归0
{
for (int i = 0; i < wheels.Length; i++)
{
wheels[i].motorTorque = 0;
}
}
//水平轴不为0时
if (Input.GetAxis("Horizontal") != 0) //当按下AD键时生效
{
for (int i = 0; i < wheels.Length - 2 ; i++) //只针对前轮
{
//转向角度
wheels[i].steerAngle = Input.GetAxis("Horizontal") * steerflaot;
}
}
else //否则归0
{
for (int i = 0; i < wheels.Length - 2; i++) //只针对前轮
{
wheels[i].steerAngle = 0;
}
}
}
//车轮动画相关
public void wheelsAnimation()
{
for (int i = 0; i < wheels.Length ; i++)
{
//获取当前空间的车轮位置 和 角度
wheels[i].GetWorldPose(out wheelPosition, out wheelRotation);
//赋值给
wheelMesh[i].transform.position = wheelPosition;
print(wheelRotation);
wheelMesh[i].transform.rotation = wheelRotation * Quaternion .AngleAxis (90,Vector3 .forward );
}
}
}
🎶(C)车辆模型------相机的跟随
😶🌫️效果:
摄像机需要实现跟随。车同步移动,旋转。并且滑动鼠标滑轮可以调节与车辆之间的摄影距离。
关键API:
Quaternion.AngleAxis
Quaternion.LookRotation
Mathf.Clamp
____________________
csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//---------------------------------------------------------------------------------------------------------------
//___________项目: ______________
//___________功能: 相机的跟随
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class CameraFllow : MonoBehaviour
{
//目标物体
public Transform target;
//鼠标滑轮的速度
public float ScrollSpeed = 4f;
//Y轴差距参数
public float Ydictance = 0f;
public float Ymin = 0f;
public float Ymax = 4f;
//Z轴差距参数
public float Zdictance = 4f;
public float Zmin = 4f;
public float Zmax = 8f;
//相机看向的角度 和最終位置
public float angle = -25 ;
public Vector3 lookPosition;
void LateUpdate()
{
//Z轴和Y轴的距离和鼠标滑轮联系
Ydictance += Input.GetAxis("Mouse ScrollWheel") * ScrollSpeed;
Zdictance += Input.GetAxis("Mouse ScrollWheel") * ScrollSpeed;
//設置Y軸和x轴的滚轮滑动范围
Ydictance = Mathf.Clamp(Ydictance , Ymin ,Ymax );
Zdictance = Mathf.Clamp(Zdictance , Zmin, Zmax );
//确定好角度,四元数 * 三维向量 = 三维向量
lookPosition = Quaternion.AngleAxis(angle, target .right) * -target.forward ;
//更新位置
transform.position = target.position + Vector3.up * Ydictance - lookPosition * Zdictance ;
//更新角度
transform.rotation = Quaternion.LookRotation(lookPosition);
}
}
🎶(D)车辆模型------调节阻力
调节车轮碰撞器的阻力__ 若不增大轮胎的阻力,主要当车辆速度过快时。会因为。车辆打滑而失控。也会因为惯性。从而无法。自动停下。
--------------------
⭐🅰️⭐
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、