前言
-
这个学期马上就要结束,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://download.csdn.net/download/weixin_44954896/85583972?spm=1001.2014.3001.5503
工程文件已上传,自取
包括所有素材源代码。打开即可运行。