UnityGameProjectsCode / InTheDarkGame / Level / Lights / WallLight.cs
WallLight.cs
Raw
using UnityEngine;
using UnityEngine.Experimental.Rendering.Universal;

public class WallLight : MonoBehaviour
{
    //draw a ray out from the center of the light to check if the player is in view of the light
    //if the player is in view of the light, get the players distance from the center of the light
    //based on the players distance and the intensity of the light source, drain the players stamina
    //once stamina is depleted, drain health at the same rate

    public float damageStartRange, damageBaseValue;
    private float halfDamageCutoff, halfDamageAmt;
    private float fullDamageCutoff, fullDamageAmt;
    private bool playerInSight = false;
    GameObject playerObject;
    PlayerMove playerMove;
    BarrierTool barrierT;

    private Light2D lightSource;
    private AudioSource ambientSound;
    public Material offMat;
    private Material startingMat;
    private SpriteRenderer lightSprite;
    private PolygonCollider2D coll;

    private void Start()
    {
        LightStart();
    }

    public void LightStart()
    {
        ambientSound = GetComponent<AudioSource>();
        lightSource = GetComponent<Light2D>();
        playerObject = GameObject.Find("Player Object");
        playerMove = playerObject.GetComponent<PlayerMove>();
        barrierT = playerObject.GetComponent<BarrierTool>();

        coll = GetComponent<PolygonCollider2D>();
        lightSprite = GetComponentInChildren<SpriteRenderer>();
        startingMat = lightSprite.material;

        float rangeChange = damageStartRange / 3;
        float damageChange = damageBaseValue / 3;

        halfDamageCutoff = damageStartRange - rangeChange;
        halfDamageAmt = damageBaseValue + damageChange;
        fullDamageCutoff = damageStartRange - (rangeChange * 2);
        fullDamageAmt = damageBaseValue + (damageChange * 2);
    }

    private void FixedUpdate()
    {
        LightUpdate();
    }

    public void LightUpdate()
    {
        if(playerInSight)
        {
            float distanceToPlayer = Vector2.Distance(transform.position, playerObject.transform.position);

            if (distanceToPlayer < damageStartRange)
            {
                RaycastHit2D hit;
                int layerMask = 1 << 9;
                layerMask = ~layerMask;

                hit = Physics2D.Raycast(transform.position, playerObject.transform.position - transform.position, damageStartRange, layerMask);
                Debug.DrawRay(transform.position, (playerObject.transform.position - transform.position), Color.green);

                if (hit.collider != null)
                {
                    if (hit.collider.gameObject.CompareTag("Player"))
                    {
                        if (barrierT != null)
                        {
                            if (barrierT.isActiveAndEnabled && barrierT.GetCurrentBarrierCharge() > 0.0f && (barrierT.barrierPrefab.activeSelf || barrierT.barrierPrefabUpgraded.activeSelf))
                            {
                                DamagePlayer(false);
                            }
                            else
                            {
                                DamagePlayer(true);
                            }
                        }
                        else
                            DamagePlayer(true);
                    }
                }
            }
        }
    }

    public void DamagePlayer(bool barrierOrHealth)
    {
        float distanceToPlayer = Vector2.Distance(transform.position, playerObject.transform.position);

        if (barrierOrHealth == false)
        {
            if (distanceToPlayer <= fullDamageCutoff)
                barrierT.ModifyBarrierCharge((fullDamageAmt / 2) * lightSource.intensity);
            else if (distanceToPlayer <= halfDamageCutoff)
                barrierT.ModifyBarrierCharge((halfDamageAmt / 2) * lightSource.intensity);
            else if (distanceToPlayer <= damageStartRange)
                barrierT.ModifyBarrierCharge((damageBaseValue / 2) * lightSource.intensity);
        }
        else
        {
            if (distanceToPlayer <= fullDamageCutoff)
            {
                playerMove.ModifyStamina(fullDamageAmt * lightSource.intensity);
                playerMove.SetTimeSinceSprinting(0.0f);
            }
            else if (distanceToPlayer <= halfDamageCutoff)
            {
                playerMove.ModifyStamina(halfDamageAmt * lightSource.intensity);
                playerMove.SetTimeSinceSprinting(0.0f);
            }
            else if (distanceToPlayer <= damageStartRange)
            {
                playerMove.ModifyStamina(damageBaseValue * lightSource.intensity);
                playerMove.SetTimeSinceSprinting(0.0f);
            }
        }
    }

    public void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Player"))
            playerInSight = true;
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Player"))
            playerInSight = false;
    }

    public Light2D GetLight()
    {
        return lightSource;
    }

    public GameObject GetPlayerObject()
    {
        return playerObject;
    }

    public bool GetPlayerInSight()
    {
        return playerInSight;
    }

    public void ChangeLightState()
    {
        lightSource.enabled = !lightSource.enabled;
        coll.enabled = !coll.enabled;

        if (lightSprite.material == startingMat)
            lightSprite.material = offMat;
        else
            lightSprite.material = startingMat;

        ambientSound.enabled = !ambientSound.enabled;
    }
}