유 니 티 플랫폼 시 뮬 레이 션 오토 매 틱 자동차

자동 기어 자동차 기능 분석:
(1)브레이크 수 치 는 연 속 량 0-255 로 표시 하고 연 속 량 은 키보드 버튼 을 눌 렀 을 때 증가 하 며 1 초 후에 최고치 에 이 르 렀 다.차량 이 전진 기어 에 있 든 후진 기어 에 있 든 브레이크 를 밟 은 후에 차량 은 점점 속 도 를 0 으로 줄 였 다.
(2)자동 차 는 네 개의 기어,주차 기어 P,후진 기어 R,빈 기어 N,전진 기어 D 로 나 뉜 다.
(3)자동차 시동 후 브레이크 를 풀 고 차량 이 과속 모드 에 들 어가 속도 가 0 에서 12KM/H 로 점차적으로 향상 된다.
(4)브레이크 수 치 는 연속 량 0-255 로 표시 한다.차량 속 도 는 1 단 0-10,2 단 11-20,3 단 21-40,4 단 41-60,5 단 61-80,6 단 81-최대 치 에 대응 하고 피크 속도 150 KM/H 에 대응 합 니 다.
(5)P 기 어 를 걸 고 브레이크 를 당 겨 차량 을 멈춘다.
(6)R 기 어 를 걸 면 차량 이 후진 작업 을 할 수 있다.
(7)키보드 A 와 D 를 통 해 차량 의 좌우 방향 을 제어 할 수 있다.
실행 결과 그림:
차량 을 시동 하고 브레이크 를 당 기 며 전진 기 어 를 걸 고 차량 은 과속 모드 에 들 어가 천천히 속 도 를 낸다.

속 도 를 12km/h 까지 올 린 후 등 속 으로 달리 고 계속 속 도 를 내 려 면 액셀러레이터 를 밟 아야 한다.

액셀러레이터 를 밟 은 후 차량 이 빠르게 속 도 를 내 어 스스로 기어 위 치 를 전환 합 니 다.

전진 할 때 브레이크 를 밟 은 후 차 는 점점 속 도 를 0 으로 줄 였 다.

후진 기어 로 전환 하고 액셀러레이터 를 밟 으 며 차량 이 뒤로 물 러 나 브레이크 를 밟 으 면 차 가 점점 속 도 를 0 까지 줄 입 니 다.

전진 시 좌우 회전:

후진 시 좌우 전환:

원본 코드:
manager of manager 방식 으로 단일 모드 를 사용 하 였 습 니 다.
1.Car_Mng 류 는 차량 의 물리 적 시 뮬 레이 션 을 관리 합 니 다.
2.Input_Mng 클래스 는 사용자 의 키보드 입력 정 보 를 받 아들 이 는 것 을 책임 집 니 다.
3.UI_Mng 클래스 는 UI 인터페이스의 디 스 플레이 를 업데이트 합 니 다.
Car_Mng

using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.Tracing;
using UnityEngine;

public class Car_Mng : MonoBehaviour
{ 
 static public Car_Mng Instance;
 public SpeedGear speedGear;

 public float maxMotorTorque; //       
 public float maxSpeed; //        

 public float maxReversMotorTorque; //       

 public float maxBrakeToeque; //       

 public float maxSteeringAngle; //          

 public Rigidbody car; //     
 public WheelCollider[] coliders; //     
 public GameObject[] wheelMesh; //    


 public CarState carState=CarState.Off; //      
 public GearState gearState = GearState.ParkingGear; //     
 public bool isHandBrakeON; //          

 public float currentSpeed=0; //         

 private bool currentHandBrakeState=true;

 private void Awake()
 {
 Instance = this;
 }
 void Start()
 {
 /* coliders[0].steerAngle = 30;
 coliders[1].steerAngle = 30;
 for (int i = 0; i < 4; i++)
 {
  Quaternion quat;
  Vector3 position;
  coliders[i].GetWorldPose(out position, out quat);
  Debug.Log(position);
  Debug.Log(quat.eulerAngles);
  wheelMesh[i].transform.position = position;
  wheelMesh[i].transform.rotation = 
  coliders[i].transform.rotation * Quaternion.Euler(0, coliders[i].steerAngle, 0); 
  
 }*/
 }

 private void Update()
 {
 UpdateHandBrokeState(); //      
 }
 private void FixedUpdate()
 {
 if (gearState == GearState.ForwardGear || gearState == GearState.ReversGear)
 {
  BrakeCalculate(); //        
  AccCalculate(); //       
 }
 SteerCalculate();
 UpdateCarSpeed(); //       
 AutoChangeGear(); //           
 SynchronousWheelMesh(); //             
 
 
 }
 void SynchronousWheelMesh()
 {
 for (int i = 0; i < 6; i++)
 {
  Quaternion quat;
  Vector3 position;
  coliders[i].GetWorldPose(out position, out quat);

  wheelMesh[i].transform.position = position;
  wheelMesh[i].transform.rotation = quat;
 }
 }


 void UpdateHandBrokeState()
 {
 if (currentHandBrakeState != isHandBrakeON)
 {
  currentHandBrakeState = isHandBrakeON;
  if (currentHandBrakeState)
  {
  PullupHandbrake();
  }
  else
  {
  PullDownHandbrake();
  }
 }
 } //      

 public void StartCar() //    
 {
 carState = CarState.On;
 }
 public void StopCar() //  
 {
 carState = CarState.Off; //      、   、    
 gearState = GearState.ParkingGear; //     
 PullupHandbrake(); //    
 }
 void PullupHandbrake() //    ,        ,  Freeze       
 {
 isHandBrakeON = true; //     
 //   y     
 car.constraints = RigidbodyConstraints.FreezeRotation 
  | RigidbodyConstraints.FreezePositionX | RigidbodyConstraints.FreezePositionZ;
 }

 void PullDownHandbrake() //    ,    
 {
 isHandBrakeON = false;
 //      
 car.constraints = RigidbodyConstraints.None;
 }

 
 void BrakeCalculate() //       
 {
 
 var value = Input_Mng.Instance.GetBrakeValue(); //      
 var brakeToequePerWheel = maxBrakeToeque / 2 * value / 255; //         
 coliders[0].motorTorque = 0;
 coliders[1].motorTorque = 0;
 for (int i = 0; i < 6; i++)
 {
  coliders[i].brakeTorque = brakeToequePerWheel;
 }
 
 // Debug.Log("    :"+ brakeToequePerWheel);
 }

 void AccCalculate() //      
 { 
 if (gearState == GearState.ForwardGear) //  
 {  
  var value = Input_Mng.Instance.GetAcceleratorValue();
  if (value != 0) //    
  {
  
  if(MeterPerSeconds2KmPerHour(currentSpeed) <= 150)
  {
   var accToequePerWheel = maxMotorTorque * value / 255; //         
   coliders[0].motorTorque = accToequePerWheel;
   coliders[1].motorTorque = accToequePerWheel;
  }
  else //        
  {
   coliders[0].motorTorque = 0;
   coliders[1].motorTorque = 0;
  }
  }
  else //    
  {
  if (MeterPerSeconds2KmPerHour(currentSpeed) < 12)
  {
   coliders[0].motorTorque = 100;
   coliders[1].motorTorque = 100;
  }
  else
  {
   Debug.Log("   ");
   for (int i = 0; i < 6; i++)
   {
   coliders[i].motorTorque = 0;
   }
  }
  
  }
  
 }
 else //  
 {  
  var value = Input_Mng.Instance.GetAcceleratorValue();
  var accToequePerWheel = maxReversMotorTorque / 2 * value / 255; //         
  coliders[0].motorTorque = -accToequePerWheel;
  coliders[1].motorTorque = -accToequePerWheel;
 }
  
 }


 void SteerCalculate() //    
 {
 var value= Input_Mng.Instance.GetSteerValue();
 var steerAngle = (value - 128) / 128 * maxSteeringAngle; //      
 coliders[0].steerAngle = steerAngle;
 coliders[1].steerAngle = steerAngle;

 }


 void AutoChangeGear() //   ,                
 {
 if (gearState == GearState.ForwardGear)
 {
  var speed = MeterPerSeconds2KmPerHour(currentSpeed);
  if (speed <= 10 && speed > 0)
  {
  speedGear = SpeedGear.Speed01;
  }
  if (speed <= 20 && speed > 10)
  {
  speedGear = SpeedGear.Speed02;
  }
  if (speed <= 40 && speed > 20)
  {
  speedGear = SpeedGear.Speed03;
  }
  if (speed <= 60 && speed > 40)
  {
  speedGear = SpeedGear.Speed04;
  }
  if (speed <= 80 && speed > 60)
  {
  speedGear = SpeedGear.Speed05;
  }
  if (speed <= 155 && speed > 80)
  {
  speedGear = SpeedGear.Speed06;
  }
 }
 else
 {
  speedGear = SpeedGear.none;
 }
 
 }

 void UpdateCarSpeed()
 {
 currentSpeed = car.velocity.magnitude;
 }
 static public float MeterPerSeconds2KmPerHour(float speed) //     m/s    km/h
 {
 return speed*3.6f;
 }
 static float KmPerHour2MeterPerSeconds(float speed) //     km/h   m/s
 {
 return speed/3.6f;
 }

}
public enum CarState
{
 Off = 0, //    
 On = 1, //    

}
public enum GearState
{
 ParkingGear = 1, //   
 ReversGear = 2, //  
 NeutralGear = 3, //  
 ForwardGear = 4,  //   
}

public enum SpeedGear
{
 none,
 Speed01,
 Speed02,
 Speed03,
 Speed04,
 Speed05,
 Speed06
}
Input_Mng

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

public class Input_Mng : MonoBehaviour
{
 static public Input_Mng Instance; //    

 private KeyCode braKeyCode=KeyCode.M; //         
 public float brakeValue = 0; //   
 public bool isBra = false;


 private KeyCode accKeyCode=KeyCode.W; //         
 public float acceleratorValue = 0; //   
 public bool isAcc = false;

 private KeyCode leftSteerKeyCode = KeyCode.A;
 private KeyCode rightSteerKeyCode = KeyCode.D;
 public float steerValue = 128;

 private KeyCode parkingKeyCode = KeyCode.Alpha1; //       
 private KeyCode reversKeyCode = KeyCode.Alpha2; //       
 private KeyCode neutralKeyCode = KeyCode.Alpha3; //       
 private KeyCode forwardKeyCode = KeyCode.Alpha4; //        

 private KeyCode handBrakeKeyCode = KeyCode.H; //       

 public float GetBrakeValue() //     
 {
 return brakeValue;
 }
 public float GetAcceleratorValue() //     
 {
 return acceleratorValue;
 }
 public float GetSteerValue()
 {
 return steerValue;
 } //     

 private void Awake()
 {
 Instance = this;
 }

 private void Update()
 {
 if (Car_Mng.Instance.carState == CarState.On) //      ,           
 {
  
  UpdateGeerState();
  
 }
 UpdateSteerValue();
 UpdateHandBrakeState();
 UpdateAcceleratorValue(accKeyCode);
 UpdateBrakeValue(braKeyCode);
 }
 void UpdateHandBrakeState()
 {
 if (Input.GetKeyDown(handBrakeKeyCode))
 {
  if (Car_Mng.Instance.isHandBrakeON)
  {
  Car_Mng.Instance.isHandBrakeON = false;
  }
  else
  {
  Car_Mng.Instance.isHandBrakeON = true;
  }
 }
 }

 void UpdateAcceleratorValue(KeyCode AccCode)
 {
 if (Input.GetKey(AccCode))
 {
  acceleratorValue += 255 * Time.deltaTime;
  acceleratorValue = Mathf.Clamp(acceleratorValue, 0, 255);
  isAcc = true;
 }
 else
 {
  acceleratorValue = 0;
  isAcc = false;
 }
 } //      

 void UpdateBrakeValue(KeyCode BraCode) //      
 {
 if (Input.GetKey(BraCode))
 {
  brakeValue += 255 * Time.deltaTime;
  brakeValue = Mathf.Clamp(brakeValue, 0, 255);
  isBra = true;
 }
 else
 {
  brakeValue = 0;
  isBra = false;
 }
 }

 void UpdateSteerValue() //       
 {
 if (Input.GetKey(leftSteerKeyCode))
 {
  steerValue -= 255 * Time.deltaTime; //0.5     
  steerValue = Mathf.Clamp(steerValue, 0, 255);
 }else if(Input.GetKey(rightSteerKeyCode))
 {
  steerValue += 255 * Time.deltaTime; //0.5     
  steerValue = Mathf.Clamp(steerValue, 0, 255);
 }
 else
 {
  steerValue = 128;
 }
 }
 void UpdateGeerState() //      
 {
 if (Input.GetKeyDown(parkingKeyCode)) //      
 {
  Car_Mng.Instance.gearState = GearState.ParkingGear;
 }
 if (Input.GetKeyDown(reversKeyCode)) //   
 {
  Car_Mng.Instance.gearState = GearState.ReversGear;
 }
 if (Input.GetKeyDown(neutralKeyCode)) //  
 {
  Car_Mng.Instance.gearState = GearState.NeutralGear;
 }
 if (Input.GetKeyDown(forwardKeyCode)) //   
 {
  Car_Mng.Instance.gearState = GearState.ForwardGear;
 }

 }
}
UI_Mng

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

public class UI_Mng : MonoBehaviour
{
 static public UI_Mng Instance;

 public Image ParkingBg; //   
 public Image ForwardBg; //   
 public Image NeutralBg; //  
 public Image ReversBg; //   
 public Image HandBrakeBg; //  
 public Text speedText; //    
 public Text speedGearText; //    

 public Image SwitchBg; //    
 public Text Switchtext; //      

 public Image AccBg; //  
 public Image BraBg; //  

 private GearState currentGearState;
 private bool currentBrakeState;

 private void Awake()
 {
 Instance = this;
 }
 private void Update()
 {
 UpdateGearUI();
 UpdateHandBrakeUI();
 UpdateAccBra();
 UpdateSpeed();
 }

 void UpdateSpeed()
 {
 speedText.text = Car_Mng.MeterPerSeconds2KmPerHour(Car_Mng.Instance.currentSpeed).ToString("F2")
  + " Km/h";
 SpeedGear speedGear = Car_Mng.Instance.speedGear;
 switch (speedGear)
 {
  case SpeedGear.none:
  speedGearText.text = "   ";
  break;
  case SpeedGear.Speed01:
  speedGearText.text = "1 ";
  break;
  case SpeedGear.Speed02:
  speedGearText.text = "2 ";
  break;
  case SpeedGear.Speed03:
  speedGearText.text = "3 ";
  break;
  case SpeedGear.Speed04:
  speedGearText.text = "4 ";
  break;
  case SpeedGear.Speed05:
  speedGearText.text = "5 ";
  break;
  case SpeedGear.Speed06:
  speedGearText.text = "6 ";
  break;
  default:
  break;
 }
 }
 void UpdateAccBra()
 {
 if (Input_Mng.Instance.isAcc)
 {
  AccBg.color = UnityEngine.Color.green;
 }
 else
 {
  AccBg.color = UnityEngine.Color.white;
 }
 if (Input_Mng.Instance.isBra)
 {
  BraBg.color = UnityEngine.Color.green;
 }
 else
 {
  BraBg.color = UnityEngine.Color.white;
 }
 }

 void UpdateHandBrakeUI()
 {
 if (currentBrakeState != Car_Mng.Instance.isHandBrakeON)
 {
  currentBrakeState = Car_Mng.Instance.isHandBrakeON;
  if (currentBrakeState)
  {
  HandBrakeBg.color = UnityEngine.Color.red;
  }
  else
  {
  HandBrakeBg.color = UnityEngine.Color.white;

  }
 }
 }

 private void Start()
 {
 Car_Mng.Instance.StopCar(); //    
 OnCarShutDown();//  UI 
 }

 void UpdateGearUI()
 {
 if (currentGearState != Car_Mng.Instance.gearState)
 {
  currentGearState = Car_Mng.Instance.gearState;
  ClearGearUI();
  SetGearUI(currentGearState);
 }
 }
 void ClearGearUI()
 {
 ParkingBg.color = UnityEngine.Color.white;
 ForwardBg.color = UnityEngine.Color.white;
 NeutralBg.color = UnityEngine.Color.white;
 ReversBg.color = UnityEngine.Color.white;
 }
 void SetGearUI(GearState state)
 {
 switch (state)
 {
  case GearState.ForwardGear:
  ForwardBg.color = UnityEngine.Color.red;
  break;
  case GearState.ReversGear:
  ReversBg.color = UnityEngine.Color.red;
  break;
  case GearState.NeutralGear:
  NeutralBg.color = UnityEngine.Color.red;
  break;
  case GearState.ParkingGear:
  ParkingBg.color = UnityEngine.Color.red;
  break;

 }
 }


 public void ChangeCarState()
 {
 if (Car_Mng.Instance.carState == CarState.On) //        ,   
 {
  Car_Mng.Instance.StopCar(); //    
  OnCarShutDown();//  UI  

 }else 
 {
  Car_Mng.Instance.StartCar(); //    
  OnCarStart();//  UI
 }
 }
 private void OnCarStart() //       ui
 {
 SwitchBg.color = UnityEngine.Color.red;
 Switchtext.text = "    ";
 
 }
 private void OnCarShutDown() //          
 {

 SwitchBg.color = UnityEngine.Color.green;
 Switchtext.text = "    ";
 }
 

}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기