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


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



相关推荐
阿里巴巴P8资深技术专家11 分钟前
小鹏汽车智慧材料数据库系统项目总成数据同步
汽车
亚远景aspice12 分钟前
ISO 21434标准:汽车网络安全管理的利与弊
网络·web安全·汽车
龙智DevSecOps解决方案15 分钟前
汽车软件开发中的ASPICE合规挑战与Jama Connect解决方案
汽车·需求管理·jamaconnect·汽车aspice·汽车软件开发
虾球xz30 分钟前
游戏引擎学习第20天
前端·学习·游戏引擎
bluefox19791 小时前
使用 Oracle.DataAccess.Client 驱动 和 OleDB 调用Oracle 函数的区别
开发语言·c#
螺旋天光极锐斩空闪壹式!2 小时前
自制游戏:监狱逃亡
c++·游戏
天晟科技3 小时前
GameFi的前景:游戏与金融的未来交汇点
游戏·金融·区块链
鲤籽鲲3 小时前
C# MethodTimer.Fody 使用详解
开发语言·c#·mfc
工业3D_大熊3 小时前
3D可视化引擎HOOPS Luminate场景图详解:形状的创建、销毁与管理
java·c++·3d·docker·c#·制造·数据可视化
yngsqq4 小时前
c#使用高版本8.0步骤
java·前端·c#