유 니 티 플랫폼 시 뮬 레이 션 오토 매 틱 자동차
16912 단어 Unity자동 차 를 운전 하 다
(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 = " ";
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
photonnetwork.instantiate에서 gamepobject 유형을 생성 한 다음 상태 및 값을 참조하는 방법주로 마지막 기사에서 일어난 일의 수정입니다. 지난번↓ 그럼 주제입니다. (타이틀이 정리되어 없어서 죄송합니다) 우선 전회의 Illegal view ID:0입니다만 photonnetwork.instantiate를 사...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.