rabidus-test/Assets/SCSM/SciFiShipController/Demos/Scripts/SampleShowThrusterMetrics.cs

213 lines
9.3 KiB
C#
Raw Permalink Normal View History

2023-07-24 16:38:13 +03:00
using UnityEngine;
// Sci-Fi Ship Controller. Copyright (c) 2018-2023 SCSM Pty Ltd. All rights reserved.
namespace SciFiShipController
{
/// <summary>
/// Sample script to show how thruster metrics can be added to a Ship Display Module (HUD) at runtime.
/// This sample shows how you can:
/// 1. Create HUD gauges at runtime
/// 2. Show ship fuel level for the central fuel level or the first thruster on a HUD gauge
/// 3. Show ship heat level for the first thruster on a HUD gauge
/// 4. Show an alert message when the first thruster is overheating.
/// WARNING: This is only sample to demonstrate how API calls could be used in
/// your own code. You should write your own version of this in your own
/// namespace.
/// SETUP:
/// 1. Add Prefabs\Visuals\HUD1 prefab to the scene
/// 2. Add player ship from Prefabs\Ships to the scene (ones that don't have NPC in the name)
/// 3. Remove or disable the default Main Camera
/// 4. Add Prefabs\Environment\PlayerCamera prefab to the scene
/// 5. Hook up the player ship to the PlayerCamera
/// 6. Add this script to the player ship
/// 7. Hook up the HUD1 prefab to the slot on this component
/// 8. Hook up the SSCUIFilled sprite from the Textures/HUD folder to the slot on this component
/// </summary>
[AddComponentMenu("Sci-Fi Ship Controller/Samples/Show Thruster Metrics")]
[HelpURL("http://scsmmedia.com/ssc-documentation")]
public class SampleShowThrusterMetrics : MonoBehaviour
{
#region Public Variables and Properties
[Tooltip("Add the HUD from the scene")]
public ShipDisplayModule shipDisplayModule;
[Tooltip("Add the SSCUIFilled sprite from the Textures/HUD folder")]
public Sprite levelGaugeSprite;
public bool updateMetrics = true;
[Header("Shared Level Colours")]
public Color lowColour = Color.green;
public Color mediumColour = new Color(1f, 0.5f, 0f, 1f);
public Color highColour = Color.red;
#endregion
#region Private Variables
private bool isInitialised = false;
private ShipControlModule playerShipControlModule = null;
private Ship playerShipInstance = null;
private DisplayMessage thrusterCriticalMsg = null;
private DisplayGauge fuelGauge = null;
private DisplayGauge heatGauge = null;
#endregion
#region Initialisation Methods
// Start is called before the first frame update
void Start()
{
#region Initialise Player Ship
playerShipControlModule = GetComponent<ShipControlModule>();
bool isShipInitialised = false;
if (playerShipControlModule != null)
{
// If Initialise On Awake is not ticking on the ship, initialise the ship now.
if (!playerShipControlModule.IsInitialised) { playerShipControlModule.InitialiseShip(); }
// Ship must be initialised before accessing the shipInstance.
if (playerShipControlModule.IsInitialised)
{
playerShipInstance = playerShipControlModule.shipInstance;
isShipInitialised = true;
}
}
#if UNITY_EDITOR
else
{
Debug.LogWarning("[ERROR] SampleShowThrusterMetrics.Start() could not find the ship! Did you attach this script to you Player ship (ShipControlModule)?");
}
#endif
#endregion
#region Initialise HUD
bool isHUDSetup = false;
if (shipDisplayModule != null)
{
// If Initialise on Start is not ticked on the HUD, do it now.
if (!shipDisplayModule.IsInitialised) { shipDisplayModule.Initialise(); }
if (shipDisplayModule.IsInitialised)
{
#if UNITY_EDITOR
if (levelGaugeSprite == null)
{
Debug.LogWarning("[ERROR] SampleShowThrusterMetrics.Start() the levelGaugeSprite is not set. Add SSCUIFilled from the Textures/HUD folder.");
}
#endif
heatGauge = shipDisplayModule.AddGauge("HeatLevel", "Temp");
if (heatGauge != null)
{
// Set some of the Health gauge attributes
shipDisplayModule.SetDisplayGaugeForegroundSprite(heatGauge, levelGaugeSprite);
shipDisplayModule.SetDisplayGaugeSize(heatGauge, 0.1f, 0.025f);
shipDisplayModule.SetDisplayGaugeOffset(heatGauge, -0.55f, 0.82f);
if (isShipInitialised)
{
// Use the overheating value of the thruster to set the medium colour value point on the gauge.
shipDisplayModule.SetDisplayGaugeMediumColourValue(heatGauge, playerShipInstance.GetOverheatingThreshold(1) / 100f);
// Get the current heat level of our first thruster.
shipDisplayModule.SetDisplayGaugeValue(heatGauge, playerShipInstance.GetHeatLevel(1) / 100f);
}
shipDisplayModule.SetDisplayGaugeValueAffectsColourOn(heatGauge, lowColour, mediumColour, highColour);
shipDisplayModule.ShowDisplayGauge(heatGauge);
// Create a fuel gauge using a copy of the heat gauge created above
fuelGauge = shipDisplayModule.CopyDisplayGauge(heatGauge, "FuelLevel");
if (fuelGauge != null)
{
fuelGauge.gaugeString = "Fuel";
shipDisplayModule.AddGauge(fuelGauge);
shipDisplayModule.SetDisplayGaugeOffset(fuelGauge, 0.55f, 0.82f);
// Reverse the gauge colours as we want critical to be when fuel is low.
shipDisplayModule.SetDisplayGaugeValueAffectsColourOn(fuelGauge, highColour, mediumColour, lowColour);
shipDisplayModule.SetDisplayGaugeMediumColourValue(fuelGauge, 0.25f);
shipDisplayModule.ShowDisplayGauge(fuelGauge);
}
// Create a critical warning message for the thruster overheating
thrusterCriticalMsg = shipDisplayModule.AddMessage("CriticalMessage", "ALERT: Engines Critical");
if (thrusterCriticalMsg != null)
{
shipDisplayModule.SetDisplayMessageOffset(thrusterCriticalMsg, 0f, 0.93f);
shipDisplayModule.SetDisplayMessageSize(thrusterCriticalMsg, 1f, 0.03f);
shipDisplayModule.SetDisplayMessageTextColour(thrusterCriticalMsg, Color.red);
}
isHUDSetup = fuelGauge != null && thrusterCriticalMsg != null;
}
}
}
#if UNITY_EDITOR
else
{
Debug.LogWarning("[ERROR] SampleShowThrusterMetrics.Start() the ShipDisplayModule is not set. Add the Prefabs/Visuals/HUD1 prefab to the scene, then drag it on to this script which should be attached to your player ship.");
}
#endif
#endregion
isInitialised = isHUDSetup && isShipInitialised;
}
#endregion
#region Update Methods
// Update is called once per frame
void Update()
{
if (isInitialised && updateMetrics && shipDisplayModule.IsHUDShown)
{
// Update Thruster temperature on the HUD
shipDisplayModule.SetDisplayGaugeValue(heatGauge, playerShipInstance.GetHeatLevel(1) / 100f);
// Update fuel level
// Check to see if "Central Fuel" is enabled on the Thruster tab
if (playerShipInstance.useCentralFuel)
{
// Use the Central fuel level for the whole ship
shipDisplayModule.SetDisplayGaugeValue(fuelGauge, playerShipInstance.GetFuelLevel() / 100f);
}
else
{
// Use the fuel level for the first thruster
shipDisplayModule.SetDisplayGaugeValue(fuelGauge, playerShipInstance.GetFuelLevel(1) / 100f);
}
// Check to see if we need to show or hide the overheating alert message.
if (playerShipInstance.IsThrusterOverheating(1))
{
if (!thrusterCriticalMsg.showMessage) { shipDisplayModule.ShowDisplayMessage(thrusterCriticalMsg); }
}
else
{
if (thrusterCriticalMsg.showMessage) { shipDisplayModule.HideDisplayMessage(thrusterCriticalMsg); }
}
}
}
#endregion
#region Public Methods
public void StartMetrics()
{
updateMetrics = true;
}
public void StopMetrics()
{
updateMetrics = false;
}
#endregion
}
}