Unity--final homework--3D car simulation driving


foreword

  1. This semester is coming to an end soon, Unity asked to do a project, every exam week, I fell in love with the night. . . . . . . . . . . . . . . .

  2. I did a car simulation, emmmmm...Barely count

  3. There are six scenes in total.
    3.1 Login and registration scene
    3.2 Loading scene
    3.3 Selection scene
    3.4 Maze map scene
    3.5 Night road scene
    3.6 Subject 2 simulation scene

  4. The car model and the scene at night can be found for free in the store. The maze and the simulation of subject 2 are built together. It is very simple and invisible.

  5. Some functions are learned piecemeal online and then explored by myself.

  6. Generally speaking, I really wanted to die at the beginning, but I gradually got used to it later, and I still wanted to die.

  7. In the end, it turned out to be quite... good.


screen recording

Automobile simulation

One login registration scene

  • There are password login panel, account registration panel, setting panel
    insert image description here
    insert image description here
    insert image description here
    code:
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;
    }
}

Two loading scene

insert image description here
code:

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);
        }
    }
}

Three choice scene

insert image description here
Scene transition and transition effect code:

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;
        }
    }

}

roundabout scene

  1. The camera follows the car code
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. Sound codes such as car acceleration and braking:
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. Car movement control, car light effects, acceleration effects and other codes
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. Timecode and Chronocode
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);
    }
}

Subject two scene

  1. Collision detection touch white line code
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. Enter the white line code before the mock test and the white line code after the end
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);
        }
        
    }
}


Summarize

There are the same code scripts in the three scenes, just copy it directly.
This is a team job!! Doing it alone will be exhausting!


https://download.csdn.net/download/weixin_44954896/85583972?spm=1001.2014.3001.5503
The project file has been uploaded,
including the source code of all materials. Open to run.

Guess you like

Origin blog.csdn.net/weixin_44954896/article/details/125138274
Recommended