1 using System.Collections.Generic;
10 public enum AirplaneState{
19 [RequireComponent(typeof(AC_Airplane_Characteristics))]
20 [RequireComponent(typeof(AC_BaseAirplane_Input))]
21 [RequireComponent(typeof(AC_XboxAirplane_Input))]
25 [Header(
"Base Airplane Properties")]
26 [Tooltip(
"Drag and drop here the AC_BaseAirplane_Input.cs OR AC_XboxAirplane_Input.cs")]
29 [Header(
"Airplane Characteristics")]
30 [Tooltip(
"Drag and drop here the AC_Airplane_Characteristics.cs")]
33 [Tooltip(
"Weight is in pounds")]
34 private float airplaneWeight;
36 [Tooltip(
"Initialize an empty object and set it in airplane body. That position is Center of Gravity of the Airplane. Hook that object here")]
37 public Transform centerOfGravity;
40 [Tooltip(
"Initialize an empty object and set it in airplane body at the place of Engine. Add AC_Airplane_Engine script to that object. Hook that engine object here")]
41 public List<AC_Airplane_Engine> engines =
new List<AC_Airplane_Engine>();
44 [Tooltip(
"Initialize wheel colliders and set it in airplane body at the place of wheel. Add AC_Airplane_Wheel script to that object. Hook those wheels object here")]
45 public List<AC_Airplane_Wheel> wheels =
new List<AC_Airplane_Wheel>();
47 [Header(
"Control Surfaces")]
48 [Tooltip(
"Initialize empty control surfaces. Add AC_Airplane_ControlSurface script to that object. Hook wheels object here")]
49 public List<AC_Airplane_ControlSurface> controlSurfaces =
new List<AC_Airplane_ControlSurface>();
52 private AirplaneState airplaneState = AirplaneState.Taxiing;
53 [SerializeField]
private bool isGrounded =
true;
54 [SerializeField]
private bool isTaxiing =
true;
55 [SerializeField]
private bool isFlying =
false;
57 [Header(
"Airplane States")]
58 [Tooltip(
"Attach Airplane state gameobject from UI canvas here")]
59 public Toggle IsGroundedObject;
60 public Toggle IsFlyingObject;
61 public Toggle IsTaxiingObject;
65 private float currentMSL;
67 private float currentAGL;
69 private float angularVelocity;
72 private UnityEngine.Vector3 lastAirplanePosition;
73 private UnityEngine.Vector3 currAirplanePosition;
78 private float startPos_x;
79 private float startPos_y;
80 private float startPos_z;
81 private float startRot_x;
82 private float startRot_y;
83 private float startRot_z;
86 private UnityEngine.Vector3 lastLinearVelocity;
87 private UnityEngine.Vector3 lastAngularVelocity;
88 private UnityEngine.Vector3 linearAcceleration;
89 private UnityEngine.Vector3 angularAcceleration;
93 public float CurrentMSL{
94 get{
return currentMSL;}
96 public float CurrentAGL{
97 get{
return currentAGL;}
99 public UnityEngine.Vector3 AngularVelocity{
100 get{
return rb.angularVelocity;}
102 public UnityEngine.Vector3 LinearVelocity{
103 get{
return rb.velocity;}
108 const float poundToKilos = 0.453592f;
109 const float metersToFeets = 3.28084f;
113 #region Builtin Methods
114 public override void Start()
120 airplaneWeight = (float)CommonFunctions.airplanePreset[CommonFunctions.activeAirplane+
"/airplaneWeight"];
122 float finalMass = airplaneWeight * poundToKilos;
123 startPos_x = rb.position.x;
124 startPos_y = rb.position.y;
125 startPos_z = rb.position.z;
126 startRot_x = rb.rotation.eulerAngles.x;
127 startRot_y = rb.rotation.eulerAngles.y;
128 startRot_z = rb.rotation.eulerAngles.z;
129 Debug.LogFormat(
"Starting Position x : {0} y: {1} z: {2} ",startPos_x, startPos_y, startPos_z );
130 Debug.LogFormat(
"Starting Rotation x : {0} y: {1} z: {2} ",startRot_x, startRot_y, startRot_z );
132 lastLinearVelocity = rb.velocity;
133 lastAngularVelocity = rb.angularVelocity;
139 rb.centerOfMass = centerOfGravity.localPosition;
143 characteristics = GetComponent<AC_Airplane_Characteristics>();
158 InvokeRepeating(
"CheckGrounded", 1f, 1f);
174 void broadcastPosition(){
175 UnityEngine.Vector3 absolutePosition = rb.position;
176 StaticOutputSchema.PosXAbs = absolutePosition.x;
177 StaticOutputSchema.PosYAbs = absolutePosition.y;
178 StaticOutputSchema.PosZAbs = absolutePosition.z;
179 UnityEngine.Vector3 relativePosition = rb.position -
new UnityEngine.Vector3(startPos_x, startPos_y, startPos_z);
180 StaticOutputSchema.PosXRel = relativePosition.x;
181 StaticOutputSchema.PosYRel = relativePosition.y;
182 StaticOutputSchema.PosZRel = relativePosition.z;
189 void broadcastRotation(){
190 UnityEngine.Vector3 absoluteRotation = rb.rotation.eulerAngles;
191 StaticOutputSchema.RotXAbs = absoluteRotation.x;
192 StaticOutputSchema.RotYAbs = absoluteRotation.y;
193 StaticOutputSchema.RotZAbs = absoluteRotation.z;
194 UnityEngine.Vector3 relativeRotation = rb.rotation.eulerAngles -
new UnityEngine.Vector3(startRot_x, startRot_y, startRot_z);
195 StaticOutputSchema.RotXRel = relativeRotation.x;
196 StaticOutputSchema.RotYRel = relativeRotation.y;
197 StaticOutputSchema.RotZRel = relativeRotation.z;
204 void broadcastAngulars(){
206 StaticOutputSchema.AngularXVelocity = AngularVelocity.x;
207 StaticOutputSchema.AngularYVelocity = AngularVelocity.y;
208 StaticOutputSchema.AngularZVelocity = AngularVelocity.z;
209 angularAcceleration = (rb.angularVelocity - lastAngularVelocity) / Time.fixedDeltaTime;
210 lastAngularVelocity = rb.angularVelocity;
211 StaticOutputSchema.AngularXAcceleration = angularAcceleration.x;
212 StaticOutputSchema.AngularYAcceleration = angularAcceleration.y;
213 StaticOutputSchema.AngularXAcceleration = angularAcceleration.z;
215 StaticOutputSchema.LinearXVelocity = LinearVelocity.x;
216 StaticOutputSchema.LinearYVelocity = LinearVelocity.y;
217 StaticOutputSchema.LinearZVelocity = LinearVelocity.z;
218 linearAcceleration = (rb.velocity - lastLinearVelocity) / Time.fixedDeltaTime;
219 lastLinearVelocity = rb.velocity;
220 StaticOutputSchema.LinearXAcceleration = linearAcceleration.x;
221 StaticOutputSchema.LinearYAcceleration = linearAcceleration.y;
222 StaticOutputSchema.LinearZAcceleration = linearAcceleration.z;
244 void rewardCalculator(){
251 Debug.DrawLine(rb.transform.forward,rb.velocity);
252 float forward_velocity = UnityEngine.Vector3.Dot(rb.velocity.normalized,rb.transform.forward)*0.1f;
254 float l2_side = Mathf.Pow(UnityEngine.Vector3.Dot(rb.velocity,rb.transform.right),2);
255 float l2_up = -UnityEngine.Vector3.Dot(rb.velocity,rb.transform.up);
257 StaticOutputSchema.Reward = forward_velocity*l2_up-l2_side;
258 if(StaticOutputSchema.CurrentSpeed<45){
260 float dist = Mathf.Abs(transform.position.x - startPos_x);
261 StaticOutputSchema.Reward = forward_velocity*l2_up-l2_side-(dist*0.2);
264 StaticOutputSchema.Reward = forward_velocity*l2_up-l2_side;
268 Debug.DrawLine(rb.transform.forward,rb.velocity);
269 float forward_velocity = UnityEngine.Vector3.Dot(rb.velocity,rb.transform.forward);
271 float l2_side = Mathf.Pow(UnityEngine.Vector3.Dot(rb.velocity,rb.transform.right),2);
272 float l2_up = Mathf.Pow(UnityEngine.Vector3.Dot(rb.velocity,rb.transform.up),2);
276 float rolling = -UnityEngine.Vector3.Dot(transform.up, UnityEngine.Vector3.down);
277 float pitch = UnityEngine.Vector3.Dot(transform.forward, UnityEngine.Vector3.up);
283 if(StaticOutputSchema.CurrentSpeed<45){
285 float dist = Mathf.Abs(transform.position.x - startPos_x);
286 StaticOutputSchema.Reward = pitch*currentMSL*2*rolling-(dist*0.2);
289 StaticOutputSchema.Reward = pitch*currentMSL*2*rolling;
301 #region Custom Methods
310 HandleCharacteristics();
311 HandleControlSurfaces();
327 if(engines.Count > 0 )
340 void HandleCharacteristics( )
351 void HandleControlSurfaces( )
353 if(controlSurfaces.Count > 0)
376 void HandleAltitude(){
377 currentMSL = transform.position.y * metersToFeets;
379 if(Physics.Raycast(transform.position, UnityEngine.Vector3.down, out hit))
381 if(hit.transform.tag ==
"Ground" || hit.transform.tag ==
"Building")
383 currentAGL = (hit.distance) *metersToFeets;
388 StaticOutputSchema.MSL = currentMSL;
389 StaticOutputSchema.AGL = currentAGL;
398 if(wheels.Count > 0){
399 int groundedCount = 0;
407 if(groundedCount == wheels.Count)
409 if(rb.velocity.magnitude > 1f){
414 IsGroundedObject.isOn = StaticOutputSchema.IsGrounded = isGrounded;
415 IsTaxiingObject.isOn = StaticOutputSchema.IsTaxiing = isTaxiing;
416 IsFlyingObject.isOn = StaticOutputSchema.IsFlying = isFlying;
423 IsGroundedObject.isOn = StaticOutputSchema.IsGrounded = isGrounded;
424 IsTaxiingObject.isOn = StaticOutputSchema.IsTaxiing = isTaxiing;
425 IsFlyingObject.isOn = StaticOutputSchema.IsFlying = isFlying;
434 IsGroundedObject.isOn = StaticOutputSchema.IsGrounded = isGrounded;
435 IsTaxiingObject.isOn = StaticOutputSchema.IsTaxiing = isTaxiing;
436 IsFlyingObject.isOn = StaticOutputSchema.IsFlying = isFlying;