前言
这个学期马上就要结束,unity要求做个项目,每到考试周,就喜欢上了黑夜。。。。。。。。。。。。。。。。
我是做了一个汽车模拟,emmmm…勉强算吧
总共有六个场景
3.1 登录注册场景
3.2 加载场景
3.3 选择场景
3.4 迷宫地图场景
3.5 夜晚道路场景
3.6 科目二模拟场景汽车模型和和晚上的场景是store免费找的,迷宫和科目二模拟是搭的,很简陋,没眼看.
一些功能都是网上零零碎碎学的然后自己去摸索的.
总的来说开始很想die,到后面慢慢就熟悉了,依然想die
最后做出来还是挺…不错的.
录屏
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; } }}
环岛场景
摄像机跟着汽车代码
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); }}
汽车加速刹车等声音代码:
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() { }}
汽车移动控制,车灯效果,加速特效等代码
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; }}
时间代码和计时代码
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); }}
科目二场景
碰撞检测触碰白线代码
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); }}
进入模拟测试前的白线和结束后的白线代码
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://www.toymoban.com/news/detail-401000.html
https://download.csdn.net/download/weixin_44954896/85583972?spm=1001.2014.3001.5503
工程文件已上传,自取
包括所有素材源代码。打开即可运行。文章来源地址https://www.toymoban.com/news/detail-401000.html
到了这里,关于Unity 3D汽车模拟驾驶期末大作业的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!