rabidus-test/Assets/SCSM/SciFiShipController/Scripts/Physics/Classes/Wing.cs

171 lines
6.5 KiB
C#

using UnityEngine;
// Sci-Fi Ship Controller. Copyright (c) 2018-2023 SCSM Pty Ltd. All rights reserved.
namespace SciFiShipController
{
/// <summary>
/// Class containing data for a wing.
/// </summary>
[System.Serializable]
public class Wing
{
#region Public variables and properties
// IMPORTANT - when changing this section also update SetClassDefault()
// Also update ClassName(ClassName className) Clone Constructor (if there is one)
/// <summary>
/// The name of the wing
/// </summary>
public string name;
/// <summary>
/// Angle of attack (in degrees) of the wing relative to the local forwards direction. This is purely achieved by the camber of the wing.
/// </summary>
[Range(-5f, 15f)] public float angleOfAttack;
/// <summary>
/// The length of the wing (measured along the local x-axis).
/// </summary>
public float span;
/// <summary>
/// The width of the wing (measured along the local z-axis).
/// </summary>
public float chord;
/// <summary>
/// Position of the centre of the wing in local space relative to the pivot point of the ship. This is the position where the lift force will be applied at.
/// </summary>
public Vector3 relativePosition;
/// <summary>
/// The local space direction of lift provided by the wing. If you modify this, call Initialise().
/// </summary>
public Vector3 liftDirection;
/// <summary>
/// The normalised local space direction of lift provided by the wing.
/// </summary>
public Vector3 liftDirectionNormalised { get; private set; }
/// <summary>
/// The index of the damage region this wing is associated with. When the damage model of the ship is set to simple, this
/// is irrelevant. A negative value means it is associated with no damage region (so the wing's performance will not be
/// affected by damage). When the damage model of the ship is set to progressive, a value of zero means it is
/// associated with the main damage region. When the damage model of the ship is set to localised, a zero or positive value
/// indicates which damage region it is associated with (using a zero-based indexing system).
/// </summary>
public int damageRegionIndex;
/// <summary>
/// The minimum (i.e. when its health reaches zero) performance level of this wing. The performance level affects how much
/// lift is produced by this wing. At a performance level of one it produces the usual value. At a performance level of
/// zero it produces no lift.
/// </summary>
[Range(0f, 1f)] public float minPerformance;
/// <summary>
/// The current performance level of this wing (determined by the Health value). The performance level affects how much
/// lift is produced by this wing. At a performance level of one it produces the usual value. At a performance level of
/// zero it produces no lift.
/// </summary>
public float CurrentPerformance { get; private set; }
/// <summary>
/// The starting health value of this wing.
/// </summary>
public float startingHealth;
private float health;
/// <summary>
/// The current health value of this wing.
/// </summary>
public float Health
{
get { return health; }
set
{
// Update the health value
health = value;
// Update the current performance value
CurrentPerformance = value / startingHealth;
CurrentPerformance = CurrentPerformance > minPerformance ? CurrentPerformance : minPerformance;
CurrentPerformance = CurrentPerformance < 1f ? CurrentPerformance : 1f;
}
}
/// <summary>
/// Whether the wing is shown as expanded in the inspector window of the editor.
/// </summary>
public bool showInEditor;
/// <summary>
/// Whether the wing node is shown as selected in the scene view of the editor.
/// </summary>
public bool selectedInSceneView;
/// <summary>
/// Whether the gizmos for this wing node are shown in the scene view of the editor
/// </summary>
public bool showGizmosInSceneView;
#endregion
#region Class constructors
public Wing()
{
SetClassDefaults();
}
// Copy constructor
public Wing (Wing wing)
{
if (wing == null) { SetClassDefaults(); }
else
{
this.name = wing.name;
this.angleOfAttack = wing.angleOfAttack;
this.span = wing.span;
this.chord = wing.chord;
this.relativePosition = wing.relativePosition;
this.liftDirection = wing.liftDirection;
this.damageRegionIndex = wing.damageRegionIndex;
this.minPerformance = wing.minPerformance;
this.startingHealth = wing.startingHealth;
this.Health = wing.Health;
this.showInEditor = wing.showInEditor;
this.selectedInSceneView = wing.selectedInSceneView;
this.showGizmosInSceneView = wing.showGizmosInSceneView;
this.Initialise();
}
}
#endregion
#region Public Non-Static Methods
public void SetClassDefaults()
{
this.name = "Wing";
this.angleOfAttack = 5f;
this.span = 10f;
this.chord = 1f;
this.relativePosition = Vector3.zero;
this.liftDirection = Vector3.up;
this.damageRegionIndex = -1;
this.minPerformance = 0.25f;
this.startingHealth = 100f;
this.Health = 100f;
this.showInEditor = true;
this.selectedInSceneView = false;
this.showGizmosInSceneView = true;
this.Initialise();
}
/// <summary>
/// Initialises data for the wing. This does some precalculation to allow for performance improvements.
/// Call after modifying liftDirection.
/// </summary>
public void Initialise ()
{
// Calculate normalised vectors
liftDirectionNormalised = liftDirection.normalized;
}
#endregion
}
}