Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- public class FOV : MonoBehaviour
- {
- public float viewRadius;
- [Range(0, 360)]
- public float viewAngle;
- public LayerMask targetMask;
- public LayerMask walls;
- public GameObject visibleTarget;
- public bool canSee { get; private set; }
- public Soldier soldier;
- public Vector2 DirFromAngle(float angleInDegrees, bool angleIsGlobal)
- {
- if (!angleIsGlobal)
- {
- angleInDegrees += transform.eulerAngles.y;
- }
- return new Vector2(Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), Mathf.Cos(angleInDegrees * Mathf.Deg2Rad));
- }
- public Transform bj;
- void FindVisibleTarget()
- {
- Collider2D[] targetInViewRadius = Physics2D.OverlapCircleAll(transform.position, viewRadius, targetMask);
- if ( targetInViewRadius.Length > 0)
- {
- Transform target = targetInViewRadius[0].transform;
- Vector2 dirToTarget = (target.position - transform.position).normalized;
- if (Vector2.Angle(transform.up, dirToTarget) < viewAngle / 2)
- {
- float distToTarget = Vector2.Distance(transform.position, target.position);
- if (!Physics2D.Raycast(transform.position, dirToTarget, distToTarget, walls))
- {
- canSee = true;
- }
- else
- {
- canSee = false;
- }
- }
- else
- {
- canSee = false;
- }
- }
- else if (canSee)
- {
- canSee = false;
- }
- }
- // Start is called before the first frame update
- void Start()
- {
- visibleTarget = GameObject.FindGameObjectWithTag("BJ");
- StartCoroutine(FOVCheck());
- bj = GameObject.FindWithTag("BJ").transform;
- }
- private IEnumerator FOVCheck()
- {
- WaitForSeconds wait = new WaitForSeconds(0.2f);
- while (true)
- {
- yield return wait;
- FindVisibleTarget();
- }
- }
- private void OnDrawGizmos()
- {
- Gizmos.color = Color.white;
- UnityEditor.Handles.DrawWireDisc(transform.position, Vector3.forward, viewRadius);
- Vector3 angle01 = DirectionFromAngle(-transform.eulerAngles.z, -viewAngle / 2);
- Vector3 angle02 = DirectionFromAngle(-transform.eulerAngles.z, viewAngle / 2);
- Gizmos.color = Color.yellow;
- Gizmos.DrawLine(transform.position, transform.position + angle01 * viewRadius);
- Gizmos.DrawLine(transform.position, transform.position + angle02 * viewRadius);
- if(canSee)
- {
- Gizmos.color = Color.green;
- Gizmos.DrawLine(transform.position, visibleTarget.transform.position);
- }
- }
- private Vector2 DirectionFromAngle(float eulerY, float angleInDegrees)
- {
- angleInDegrees += eulerY;
- return new Vector2(Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), Mathf.Cos(angleInDegrees * Mathf.Deg2Rad));
- }
- // Update is called once per frame
- void Update()
- {
- if(canSee == true)
- {
- Debug.Log("Enemy Spotted!");
- soldier.patrol = false;
- soldier.rb.velocity = Vector2.zero;
- soldier.enemySighted = true;
- }
- else
- {
- soldier.patrol = true;
- soldier.enemySighted = false;
- }
- if(soldier.dead)
- {
- Destroy(this);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement