【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车


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

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

👨‍💻 本文由 秩沅 原创

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

⭐🅰️Unity3D赛车游戏⭐



文章目录


⭐前言⭐

--
😶‍🌫️版本: 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)车辆模型------相机的跟随


【Unity每日一记】摄像机相关代码API大全


😶‍🌫️效果:

摄像机需要实现跟随。车同步移动,旋转。并且滑动鼠标滑轮可以调节与车辆之间的摄影距离。


关键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)车辆模型------调节阻力


调节车轮碰撞器的阻力__ 若不增大轮胎的阻力,主要当车辆速度过快时。会因为。车辆打滑而失控。也会因为惯性。从而无法。自动停下。


--------------------

⭐🅰️⭐


【Unity3D赛车游戏制作】【一】初步导入,资源很哇塞

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

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

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

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

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

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

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


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



相关推荐
幻狐boke3 小时前
【游戏模组】星际争霸1代模组燃烧之地,泰伦帝国对决UED。特效华丽兵种巨多特别好玩
游戏
IT良5 小时前
c#增删改查 (数据操作的基础)
开发语言·c#
yufei-coder5 小时前
掌握 C# 中的 LINQ(语言集成查询)
windows·vscode·c#·visual studio
科技资讯早知道9 小时前
java计算机毕设课设—坦克大战游戏
java·开发语言·游戏·毕业设计·课程设计·毕设
59678515410 小时前
DotNetty ChannelRead接收数据为null
tcp/ip·c#
weixin_4640780711 小时前
C#串口温度读取
开发语言·c#
明耀13 小时前
WPF RadioButton 绑定boolean值
c#·wpf
海绵波波10715 小时前
Qt操作主/从视图及XML——实例:汽车管理系统
xml·qt·汽车
Death20015 小时前
Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件
c语言·开发语言·c++·qt·c#
Death20016 小时前
Qt 3D、QtQuick、QtQuick 3D 和 QML 的关系
c语言·c++·qt·3d·c#