unity–期末大作业–3D汽车模拟驾驶


前言

  1. 这个学期马上就要结束,unity要求做个项目,每到考试周,就喜欢上了黑夜。。。。。。。。。。。。。。。。

  2. 我是做了一个汽车模拟,emmmm…勉强算吧

  3. 总共有六个场景
    3.1 登录注册场景
    3.2 加载场景
    3.3 选择场景
    3.4 迷宫地图场景
    3.5 夜晚道路场景
    3.6 科目二模拟场景

  4. 汽车模型和和晚上的场景是store免费找的,迷宫和科目二模拟是搭的,很简陋,没眼看.

  5. 一些功能都是网上零零碎碎学的然后自己去摸索的.

  6. 总的来说开始很想die,到后面慢慢就熟悉了,依然想die

  7. 最后做出来还是挺…不错的.


录屏

Automobile simulation

一登陆注册场景

  • 有密码登录面板,注册账号面板,设置面板
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LoginTest : MonoBehaviour
{
    public InputField user;
    public InputField pass;
    public InputField r_User;
    public InputField r_Pass;
    public InputField r_CPass;
    public Text text;
    public GameObject registerPanel;
    public GameObject settingPanel;
    public Toggle toggle;
    public Slider slider;
    string rUser = "";
    string rPass = "";
    string rCPass = "";
    AudioSource au;
    // Start is called before the first frame update
    void Start()
    {
        user = user.GetComponent<InputField>();
        pass = pass.GetComponent<InputField>();
        text = text.GetComponent<Text>();
        r_User = r_User.GetComponent<InputField>();
        r_CPass = r_CPass.GetComponent<InputField>();
        r_Pass = r_Pass.GetComponent<InputField>();
        toggle = toggle.GetComponent<Toggle>();
        slider = slider.GetComponent<Slider>();
        au = GetComponent<AudioSource>();
        //user:123456
        //pass:888888
    }
    public void ActiveSettingPanel()
    {
        settingPanel.SetActive(true);
    }
    public void CloseSettingPanel()
    {
        settingPanel.SetActive(false);
    }


    public void ActiveRegisterPanel()
    {
        registerPanel.SetActive(true);
        r_User.text = "";
        r_Pass.text = "";
        r_CPass.text = "";
    }
    public void DisActiveRegisterPanel()
    {
        rUser = r_User.text;
        rPass = r_Pass.text;
        rCPass = r_CPass.text;
        if (rUser!=""&&rPass==rCPass&&rPass!=null)
        {
            registerPanel.SetActive(false);
        }
        else
        {
            r_User.text = "";
            r_Pass.text = "";
            r_CPass.text = "";
        }
        
    }
    public void CloseRegisterPanel()
    {
        registerPanel.SetActive(false);
    }
    public void OnLogin()
    {
        if (user.text ==rUser&&pass.text==rPass&&pass.text==rCPass&&rPass!="")
        {
            print("登录成功");
            text.text = "账号密码正确,登录成功";
            Invoke("ClearFailText", 1);
            text.color = Color.green;
            Invoke("GotoLoadingScene",1);
        }
        else
        {
            print("登录失败");
            user.text = "";
            pass.text = "";
            text.text = "账号或密码错误,登录失败";
            Invoke("ClearFailText",1);
            text.color = Color.red;
        }
        
    }
    public void ClearFailText()
    {
        text.text = "";
    }
    public void GotoLoadingScene()
    {
        UnityEngine.SceneManagement.SceneManager.LoadScene(1);//跳转场景
    }
    // Update is called once per frame
    void Update()
    {
        au.mute = toggle.isOn;
        au.volume = slider.value;
    }
}

二加载场景

在这里插入图片描述
代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class EnterLoading : MonoBehaviour
{
    float t = 0;
    Slider slider;
    public Text text;
    // Start is called before the first frame update
    void Start()
    {
        slider = GetComponent<Slider>();
        text = text.GetComponent<Text>();
        text.text = "";
        slider.value = 0;
    }

    // Update is called once per frame
    void Update()
    {
        t += Time.deltaTime;
        slider.value = t * 10;
        text.text = (int)slider.value + "%";
        if (t >= 10)
        {
            slider.value = 100;
            text.text = 100 + "%";
            UnityEngine.SceneManagement.SceneManager.LoadScene(2);
        }
    }
}

三选择场景

在这里插入图片描述
场景转换和转换效果代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class SceneLoad : MonoBehaviour
{
    public Image image_Effect;
    public float speed = 1;
    void Start()
    {
        StartCoroutine(SceneLoadIn());
    }
    public void OnClick_Btn_LoadScene_02(string SceneName)
    {
        StartCoroutine(SceneLoadOut(SceneName));
    }
    //淡出
    IEnumerator SceneLoadOut(string SceneName)
    {
        Color tempColor = image_Effect.color;
        tempColor.a = 0;
        image_Effect.color = tempColor;
        while (image_Effect.color.a < 1)
        {
            //Time.deltaTime 指的是当前这一帧。

            image_Effect.color += new Color(0, 0, 0, speed * Time.deltaTime);
            yield return null;
        }
        SceneManager.LoadScene(SceneName);
    }
    //淡入
    IEnumerator SceneLoadIn()
    {
        Color temColor = image_Effect.color;
        temColor.a = 0;
        image_Effect.color = temColor;
        while (image_Effect.color.a > 0)
        {
            image_Effect.color += new Color(0, 0, 0, -speed * Time.deltaTime);
            yield return null;
        }
    }

}

环岛场景

  1. 摄像机跟着汽车代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    [SerializeField] private Vector3 offset;
    [SerializeField] private Transform target;
    [SerializeField] private float translateSpeed;
    [SerializeField] private float rotationSpeed;

    private void FixedUpdate()
    {
        HandleTranslation();
        HandleRotation();
    }

    private void HandleTranslation()
    {
        var targetPosition = target.TransformPoint(offset);
        transform.position = Vector3.Lerp(transform.position, targetPosition, translateSpeed * Time.deltaTime);
    }

    private void HandleRotation()
    {
        var direction = target.position - transform.position;
        var rotation = Quaternion.LookRotation(direction, Vector3.up);
        transform.rotation = Quaternion.Lerp(transform.rotation, rotation, rotationSpeed * Time.deltaTime);
    }
}

  1. 汽车加速刹车等声音代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AudioManage : MonoBehaviour
{
    AudioSource au;
    public AudioClip[] clip = new AudioClip[4];
    // Start is called before the first frame update
    void Start()
    {
        au = GetComponent<AudioSource>();
    }
    public void PlayAudio(int num)
    {
        au.clip = clip[num];
        au.Play();
    }
    // Update is called once per frame
    void Update()
    {
        
    }
}

  1. 汽车移动控制,车灯效果,加速特效等代码
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CarController1 : MonoBehaviour
{
    AudioManage audioManage;

    [SerializeField] public GameObject text;

    public GameObject lig;
    int li=0;

    [SerializeField] public GameObject effect1;
    [SerializeField] public GameObject effect2;

    private const string HORIZONTAL = "Horizontal";
    private const string VERTICAL = "Vertical";

    private float HorizontalInput;
    private float verticalInput;
    private float currentSteerAngle;
    private float currentbreakForce;
    private bool isBreaking;

    [SerializeField] private float motorForce;
    [SerializeField] private float breakForce;
    [SerializeField] private float maxSteerAngle;

    [SerializeField] private WheelCollider frontLeftWheelCollider;
    [SerializeField] private WheelCollider frontRightWheelCollider;
    [SerializeField] private WheelCollider rearLeftWheelCollider;
    [SerializeField] private WheelCollider rearRightWheelCollider;

    [SerializeField] private Transform frontLeftWheelTransform;
    [SerializeField] private Transform frontRightWheelTransform;
    [SerializeField] private Transform rearLeftWheelTransform;
    [SerializeField] private Transform rearRightWheelTransform;

    void Start()
    {
        audioManage = GameObject.Find("AudioManage").GetComponent<AudioManage>();
    }
    private void FixedUpdate()
    {
        //Time.timeScale = 1.0f;
        //text.SetActive(false);
        GetInput();
        HandleMotor();
        HandleSteering(); 
        UpdateWheels();
    }

    private void GetInput()
    {
        HorizontalInput = Input.GetAxis(HORIZONTAL);
        verticalInput = Input.GetAxis(VERTICAL);
        isBreaking = Input.GetKey(KeyCode.Space);
        //isShift = Input.GetKey(KeyCode.LeftShift);
    }

    private void HandleMotor()
    {
        frontLeftWheelCollider.motorTorque = verticalInput * motorForce;
        frontRightWheelCollider.motorTorque = verticalInput * motorForce;
        
        if (Input.GetKeyDown(KeyCode.LeftShift))
        {
            audioManage.PlayAudio(0);
            effect1.SetActive(true);
            effect2.SetActive(true);
            frontLeftWheelCollider.motorTorque = 20000000.0f;
            frontRightWheelCollider.motorTorque = 20000000.0f;
        }
        if (Input.GetKey(KeyCode.L))
        {
            if (li == 0)
            {
                lig.SetActive(true);
                li = 1;
            }
            else
            {
                lig.SetActive(false);
                li = 0;
            }
        }
        if (Input.GetKeyDown(KeyCode.X))
        {
            audioManage.PlayAudio(1);
            frontLeftWheelCollider.motorTorque = -20000000.0f;
            frontRightWheelCollider.motorTorque = -20000000.0f;
        }
        if (Input.GetKeyDown(KeyCode.W))
            audioManage.PlayAudio(3);
        if (Input.GetKeyDown(KeyCode.S))
        {
            audioManage.PlayAudio(2);
            effect1.SetActive(false);
            effect2.SetActive(false);
        }
        currentbreakForce = isBreaking ? breakForce : 0f;

        if (isBreaking)
        {
            ApplyBreaking();
        }
    }

    private void ApplyBreaking()
    {
        frontRightWheelCollider.brakeTorque = currentbreakForce;
        frontLeftWheelCollider.brakeTorque = currentbreakForce;
        rearRightWheelCollider.brakeTorque = currentbreakForce;
        rearRightWheelCollider.brakeTorque = currentbreakForce;
    }

    private void HandleSteering()
    {
        currentSteerAngle = maxSteerAngle * HorizontalInput;
        frontLeftWheelCollider.steerAngle = currentSteerAngle;
        frontRightWheelCollider.steerAngle = currentSteerAngle;
    }
    private void UpdateWheels()
    {
        UpdateSinglewheel(frontLeftWheelCollider, frontLeftWheelTransform);
        UpdateSinglewheel(frontRightWheelCollider, frontRightWheelTransform);
        UpdateSinglewheel(rearRightWheelCollider, rearRightWheelTransform);
        UpdateSinglewheel(rearLeftWheelCollider, rearLeftWheelTransform );
    }

    private void UpdateSinglewheel(WheelCollider wheelCollider, Transform wheelTransform)
    {
        Vector3 pos;
        Quaternion rot;
        wheelCollider.GetWorldPose(out pos, out rot);
        wheelTransform.rotation = rot;
        wheelTransform.position = pos;
    }

}

  1. 时间代码和计时代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;

public class GetTime1 : MonoBehaviour
{
    public Text TxtCurrentTime;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        DateTime NowTime = DateTime.Now.ToLocalTime();
        TxtCurrentTime.text = NowTime.ToString("时间:yyyy-MM-dd HH:mm:ss");
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class time : MonoBehaviour
{
    private int hour;
    private int minute;
    private int second;
    private int millisecond;

    //已经花费的时间
    float timeSpeed = 0.0f;

    //显示时间区域的文本
    Text text_timeSpeed;
    // Start is called before the first frame update
    void Start()
    {
        text_timeSpeed = GetComponent<Text>();
    }

    // Update is called once per frame
    void Update()
    {
        timeSpeed += Time.deltaTime;
        hour = (int)timeSpeed / 3600;
        minute = ((int)timeSpeed - hour * 3600) / 60;
        second = (int)timeSpeed - hour * 3600 - minute * 60;
        //text_timeSpeed.text = string.Format("{0:D2}:{1:D2}:{2:D2}", hour, minute, second);
        millisecond = (int)((timeSpeed - (int)timeSpeed) * 1000);
        text_timeSpeed.text = string.Format("计时:{0:D2}:{1:D2}:{2:D2}.{3:D3}", hour, minute, second, millisecond);
    }
}

科目二场景

  1. 碰撞检测触碰白线代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class delay : MonoBehaviour
{
    [SerializeField] public GameObject text;
    private void OnCollisionEnter(Collision collision)
    {
        //Time.timeScale = 0;
        
        text.SetActive(true);
    }
}

  1. 进入模拟测试前的白线和结束后的白线代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Tanchuan : MonoBehaviour
{
    int i = 0;
    public GameObject text;
    private void OnCollisionEnter(Collision collision)
    {
        if (i==0)
        {
            i = 1;
            Time.timeScale = 0;
            text.SetActive(true);
        }
        
    }
}


总结

三个场景里有相同的代码脚本,直接复制就行
这是个团队干的活!!一个人干会累死!


https://download.csdn.net/download/weixin_44954896/85583972?spm=1001.2014.3001.5503
工程文件已上传,自取
包括所有素材源代码。打开即可运行。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>