using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class omFOV : MonoBehaviour
{
private static omFOV inst = null;
public static omFOV Inst { get { return inst; } }
public float viewRadius;
[Range(0, 360)]
public float viewAngle;
// 인식할 LayerMask
public LayerMask targetMask;
// 제외할 LayerMask
public LayerMask obstacleMask;
// 바라본 타겟이 담기는 리스트
public List<Transform> visibleTargets = new List<Transform>();
// 타겟이 들어왔는지 확인용 bool 값
public bool LookOn = false;
public void Start()
{
//플레이 시 FindTargetsDelay 코루틴을 실행한다. 0.5초 간격으로
// StartCoroutine("FindTargetsDelay", 0.5f);
//StartCoroutine(FindTargetsDelay(0.5f));
}
IEnumerator FindTargetsDelay(float delay)
{
while (true)
{
yield return new WaitForSeconds(delay);
// 안보는 동안 false 값
LookOn = false;
FindTargets();
}
}
public void FindTargets()
{
Collider[] targetInViewRadius = Physics.OverlapSphere(transform.position, viewRadius, targetMask);
//ViewRadius 안에 있는 타겟의 개수 = 배열의 개수보다 i가 작을 때 for 실행
for (int i = 0; i < targetInViewRadius.Length; i++)
{
// 타겟 [i] 의 위치
Transform target = targetInViewRadius[i].transform;
//vector3타입의 타겟의 방향 변수 선언 = 타겟의 방향벡터, 타겟의 position - 이 게임오브젝트의 position) normalized
//= 벡터 크기 정규화 = 단위벡터화
Vector3 dirToTarget = (target.position - transform.position).normalized;
// 전방 벡터와 타겟방향벡터의 크기가 시야각의 1/2이면 = 시야각 안에 타겟 존재
if (Vector3.Angle(transform.forward, dirToTarget) < viewAngle / 2)
{
// 타겟과의 거리 계산
float dstToTarget = Vector3.Distance(transform.position, target.position);
//레이캐스트를 쐈는데 obstacleMask가 아닐 때 참이고 아래를 실행함
if (!Physics.Raycast(transform.position, dirToTarget, dstToTarget, obstacleMask))
{
visibleTargets.Add(target);
// 보면 true 값
LookOn = true;
// Debug.Log($"'{target.gameObject.name}' 들어옴");
// Debug.DrawRay(transform.position, dirToTarget * 10f, Color.red, 5f);
}
}
else
{
// 타겟이 안보면 리스트안에서 제거
visibleTargets.Remove(target);
// 이 부분에 교육생을 쳐다보라고 ui 추가
}
}
}
}