using UnityEngine;
// Sci-Fi Ship Controller. Copyright (c) 2018-2023 SCSM Pty Ltd. All rights reserved.
namespace SciFiShipController
{
///
/// This sample shows how you can:
/// 1. Create HUD gauges at runtime
/// 2. Show ship health on a HUD gauge
/// 3. Show ship shield value on a HUD gauge
/// 4. Shows how to get a weapon by its name
/// 5. Show beam weapon charge on a HUD gauge
/// 6. Show how to display health of local damage region on a HUD gauge
/// 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. Configure a beam weapon on the player ship
/// 8. Optionally configure one or two local damage regions on the ship Combat tab.
///
[AddComponentMenu("Sci-Fi Ship Controller/Samples/Show Ship Metrics")]
[HelpURL("http://scsmmedia.com/ssc-documentation")]
public class SampleShowShipMetrics : 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 healthGaugeSprite;
[Tooltip("Add the SSCUIFilled sprite from the Textures/HUD folder")]
public Sprite shieldGaugeSprite;
[Tooltip("The name of the beam weapon from the player ship - see Combat tab")]
public string beamWeaponName;
[Tooltip("(Optional) show health of a local damage region e.g. Engines")]
public string localDamageRegionName1;
[Tooltip("(Optional) show health of a local damage region e.g. Cockpit")]
public string localDamageRegionName2;
[Header("Shared Health Colours")]
public Color lowColour = Color.red;
public Color mediumColour = new Color(1f, 0.5f, 0f, 1f);
public Color highColour = Color.green;
#endregion
#region Private Variables
private bool isInitialised = false;
private bool isWeaponSetup = false;
private ShipControlModule playerShip = null;
private DisplayGauge healthGauge = null;
private DisplayGauge shieldGauge = null;
private DisplayGauge weaponPowerGauge = null;
private DisplayGauge damageRegion1Gauge = null;
private DisplayGauge damageRegion2Gauge = null;
private Weapon beamWeapon = null;
private DamageRegion localDamageRegion1 = null;
private DamageRegion localDamageRegion2 = null;
#endregion
#region Initialisation Methods
// Start is called before the first frame update
void Start()
{
#region Initialise Player Ship
playerShip = GetComponent();
bool isShipInitialised = false;
if (playerShip != null)
{
// If Initialise On Awake is not ticking on the ship, initialise the ship now.
if (!playerShip.IsInitialised) { playerShip.InitialiseShip(); }
// Ship must be initialised before accessing the shipInstance.
if (playerShip.IsInitialised)
{
isShipInitialised = true;
// Get the beam weapon
int wpIdx = playerShip.shipInstance.GetWeaponIndexByName(beamWeaponName);
beamWeapon = playerShip.shipInstance.GetWeaponByIndex(wpIdx);
if (beamWeapon == null)
{
#if UNITY_EDITOR
Debug.LogWarning("[ERROR] SampleShowShipMetrics.Start() could not find the weapon by the name supplied: " + (string.IsNullOrEmpty(beamWeaponName) ? "(weapon name not given)" : beamWeaponName));
#endif
}
else if (beamWeapon.weaponTypeInt != Weapon.FixedBeamInt)
{
#if UNITY_EDITOR
Debug.LogWarning("[ERROR] SampleShowShipMetrics.Start() the weapon (" + beamWeaponName + " is not a FixedBeam weapon.");
#endif
beamWeapon = null;
}
else
{
isWeaponSetup = true;
}
}
}
#if UNITY_EDITOR
else
{
Debug.LogWarning("[ERROR] SampleShowShipMetrics.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 (healthGaugeSprite == null)
{
Debug.LogWarning("[ERROR] SampleShowShipMetrics.Start() the healthGaugeSprite is not set. Add SSCUIFilled from the Textures/HUD folder.");
}
#endif
healthGauge = shipDisplayModule.AddGauge("Health", "Health");
if (healthGauge != null)
{
// Set some of the Health gauge attributes
shipDisplayModule.SetDisplayGaugeForegroundSprite(healthGauge,healthGaugeSprite);
shipDisplayModule.SetDisplayGaugeSize(healthGauge, 0.1f, 0.03f);
shipDisplayModule.SetDisplayGaugeOffset(healthGauge, -0.89f, 0.75f);
shipDisplayModule.SetDisplayGaugeValueAffectsColourOn(healthGauge, lowColour, mediumColour, highColour);
shipDisplayModule.ShowDisplayGauge(healthGauge);
if (shieldGaugeSprite != null)
{
shieldGauge = shipDisplayModule.CopyDisplayGauge(healthGauge, "Shield");
shieldGauge.gaugeString = "Shields";
shipDisplayModule.AddGauge(shieldGauge);
shipDisplayModule.SetDisplayGaugeOffset(shieldGauge, -0.89f, 0.65f);
shipDisplayModule.ShowDisplayGauge(shieldGauge);
}
if (isWeaponSetup)
{
// Copy the Health gauge and update some attributes for the weapon power gauge
weaponPowerGauge = shipDisplayModule.CopyDisplayGauge(healthGauge, "weaponPower");
weaponPowerGauge.gaugeString = "Charge";
shipDisplayModule.AddGauge(weaponPowerGauge);
shipDisplayModule.SetDisplayGaugeOffset(weaponPowerGauge, -0.89f, shieldGauge == null ? 0.65f : 0.55f);
shipDisplayModule.SetDisplayGaugeForegroundColour(weaponPowerGauge, Color.red);
shipDisplayModule.ShowDisplayGauge(weaponPowerGauge);
}
if (isShipInitialised)
{
// If there is a matching local damage region, create a health gauge for it
if (!string.IsNullOrEmpty(localDamageRegionName1))
{
int drIdx = playerShip.shipInstance.GetDamageRegionIndexByName(localDamageRegionName1);
localDamageRegion1 = playerShip.shipInstance.GetDamageRegionByIndex(drIdx);
damageRegion1Gauge = shipDisplayModule.AddGauge("DM1", localDamageRegionName1);
if (damageRegion1Gauge != null)
{
shipDisplayModule.SetDisplayGaugeForegroundSprite(damageRegion1Gauge, healthGaugeSprite);
shipDisplayModule.SetDisplayGaugeSize(damageRegion1Gauge, 0.1f, 0.03f);
shipDisplayModule.SetDisplayGaugeOffset(damageRegion1Gauge, -0.89f, shieldGauge == null ? 0.55f : 0.45f);
shipDisplayModule.SetDisplayGaugeValueAffectsColourOn(damageRegion1Gauge, lowColour, mediumColour, highColour);
shipDisplayModule.ShowDisplayGauge(damageRegion1Gauge);
}
}
// If there is a matching local damage region, create a health gauge for it
if (!string.IsNullOrEmpty(localDamageRegionName2))
{
int drIdx = playerShip.shipInstance.GetDamageRegionIndexByName(localDamageRegionName2);
localDamageRegion2 = playerShip.shipInstance.GetDamageRegionByIndex(drIdx);
damageRegion2Gauge = shipDisplayModule.AddGauge("DM2", localDamageRegionName2);
if (damageRegion2Gauge != null)
{
shipDisplayModule.SetDisplayGaugeForegroundSprite(damageRegion2Gauge, healthGaugeSprite);
shipDisplayModule.SetDisplayGaugeSize(damageRegion2Gauge, 0.1f, 0.03f);
shipDisplayModule.SetDisplayGaugeOffset(damageRegion2Gauge, -0.89f, shieldGauge == null ? 0.45f : 0.35f);
shipDisplayModule.SetDisplayGaugeValueAffectsColourOn(damageRegion2Gauge, lowColour, mediumColour, highColour);
shipDisplayModule.ShowDisplayGauge(damageRegion2Gauge);
}
}
}
isHUDSetup = true;
}
}
}
#if UNITY_EDITOR
else
{
Debug.LogWarning("[ERROR] SampleShowShipMetrics.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)
{
// Update Health on the HUD
shipDisplayModule.SetDisplayGaugeValue(healthGauge, playerShip.shipInstance.HealthNormalised);
if (shieldGauge != null) { shipDisplayModule.SetDisplayGaugeValue(shieldGauge, playerShip.shipInstance.mainDamageRegion.ShieldNormalised); }
// Update Weapon Charge on HUD
if (isWeaponSetup) { shipDisplayModule.SetDisplayGaugeValue(weaponPowerGauge, beamWeapon.chargeAmount); }
// Update the health of the damage regions on the HUD
if (damageRegion1Gauge != null && localDamageRegion1 != null)
{
shipDisplayModule.SetDisplayGaugeValue(damageRegion1Gauge, localDamageRegion1.HealthNormalised);
}
// Update the health of the damage regions on the HUD
if (damageRegion2Gauge != null && localDamageRegion2 != null)
{
shipDisplayModule.SetDisplayGaugeValue(damageRegion2Gauge, localDamageRegion2.HealthNormalised);
}
}
}
#endregion
}
}