RiftMayhem/Assets/Scripts/NPC/NPCControllers_v2/NPCSightControllerBase.cs
2025-02-21 18:35:51 +00:00

80 lines
2.3 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NPCSightControllerBase : MonoBehaviour
{
[Header("Settings:")]
[SerializeField] protected float sightRangeAfterFirstVisualContact;
[SerializeField] protected float initialSightRange;
protected SphereCollider sight;
protected Taggable myTag;
protected Taggable possibleTarget;
protected NPCControllerBase npcController;
private void Awake()
{
npcController = GetComponentInParent<NPCControllerBase>();
myTag = GetComponentInParent<Taggable>();
}
protected void Start()
{
sight = this.gameObject.AddComponent<SphereCollider>();
sight.radius = initialSightRange;
sight.isTrigger = true;
}
protected virtual void OnTriggerEnter(Collider other)
{
possibleTarget = other.GetComponentInParent<Taggable>();
if (possibleTarget == null) return;
if (possibleTarget == myTag) return;
//if (possibleTarget.targetTag == myTag.targetTag || myTag.targetTag.AlliedTags.Contains(possibleTarget.targetTag)) return;
if (possibleTarget.HasSameTag(myTag.targetTag) || myTag.AlliedTagsContains(possibleTarget.targetTag)) return;
if (npcController.possibleTargets.Contains(possibleTarget)) return;
npcController.possibleTargets.Add(possibleTarget);
npcController.onPossibleTargetEnteredSight.Invoke();
sight.radius = sightRangeAfterFirstVisualContact;
}
protected virtual void OnTriggerExit(Collider other)
{
possibleTarget = other.GetComponentInParent<Taggable>();
if (possibleTarget == null) return;
if (possibleTarget == myTag) return;
if (possibleTarget.targetTag == myTag.targetTag) return;
if (!npcController.possibleTargets.Contains(possibleTarget)) return;
npcController.possibleTargets.Remove(possibleTarget);
npcController.onPossibleTargetExitedSight.Invoke();
}
protected virtual void OnDrawGizmosSelected()
{
Gizmos.DrawWireSphere(this.transform.position, sightRangeAfterFirstVisualContact);
}
public virtual void SetSightRange(float radius)
{
sightRangeAfterFirstVisualContact = radius;
sight.radius = radius;
}
}