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


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

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

本文由 秩沅 原创

‍ 收录于专栏:Unity游戏demo

️Unity3D赛车游戏



文章目录

    • ️Unity3D赛车游戏
    • 前言
    • (==A==)车辆模型——如何制作一个合格的汽车实现简单的移动
      • ‍️1.导入车辆模拟模型。进行贴图,放置。
      • ‍️2. wheel clider车轮碰撞器的添加
      • ‍️3.尺寸的适应
      • ‍️4,运动测试
    • (==B==)车辆模型——用代码实现车轮的动画
        • 错误示范:
        • 解决措施:
        • 正确示范:
        • 原理:
        • 完整代码
    • (==C==)车辆模型——相机的跟随
        • ‍️效果:
    • (==D==)车辆模型——调节阻力


前言


‍️版本: Unity2021
‍️适合人群:Unity初学者
‍️学习目标:3D赛车游戏的基础制作
‍️技能掌握:


A车辆模型——如何制作一个合格的汽车实现简单的移动


‍️1.导入车辆模拟模型。进行贴图,放置。


【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车_第1张图片



‍️2. wheel clider车轮碰撞器的添加


注意项:车轮碰撞器的添加 和车轮模型必须分开
【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车_第2张图片

【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车_第3张图片

‍️3.尺寸的适应


尺寸的适应
【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车_第4张图片

【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车_第5张图片


问题集结

问题1:放置模型时 为什么有紧贴地面和 随机再空中的两种情况——Mesh colider的存在

问题2:为啥会被弹飞——质量太小被车轮顶飞

问题3:车辆为啥会抖动——未添加BoxColider碰撞器或者四个车轮碰撞器的位置不一致

要加一个车身Bosch leader碰撞器就不会抖动了

【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车_第6张图片


‍️4,运动测试


知识百科:什么是扭矩?
扭矩是指发动机运转时从曲轴端输出的平均力矩,俗称为发动机的“转劲”,是 发动机性能 的一个重要参数,扭矩越大,发动机输出的“劲”越大,曲轴转速的变化也越快,汽车的爬坡能力、起步速度和加速性也越好。

【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车_第7张图片


  • 前后左右的运动
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车辆模型——用代码实现车轮的动画


错误示范:

【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车_第8张图片
【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车_第9张图片

解决措施:

  wheelMesh[i].transform.rotation = wheelRotation * Quaternion .AngleAxis (90,Vector3 .forward  );

正确示范:

  • 关键代码

    //车轮动画相关
    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  );           
        }
        
    }

原理:

将车轮的网格模型他的位置和车轮碰撞器的空间位置和空间旋转角度相同步。达到车轮的滚动和转向动画效果。

————————————【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车_第10张图片

完整代码

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
____________________【Unity3D赛车游戏】【二】如何制作一个真实模拟的汽车_第11张图片


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赛车游戏】【二】如何制作一个真实模拟的汽车_第12张图片


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

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

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

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

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

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

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

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


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


在这里插入图片描述


你可能感兴趣的:(#,unity简单游戏demo制作,游戏,汽车,unity,游戏引擎,游戏开发,c#)