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; } }