Newer
Older
Dreamsturbia-Project-IADE-Unity3D / Assets / Scripts / AI / Navmesh / Conditions / CameraViewCondition.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(menuName = "Finite State Machine/Condition/Camera View")]
public class CameraViewCondition : Condition
{
    Camera cam;
    [SerializeField] float viewAngle;
    [SerializeField] float viewDistance;
    protected override bool Test(FiniteStateMachine fsm)
    {
        cam = Camera.main;
        Debug.Log(cam);
        Vector3 viewportPoint = cam.WorldToViewportPoint(fsm.transform.position);
        
        if (viewportPoint.x > 0 && viewportPoint.x < 1 && viewportPoint.y > 0 && viewportPoint.y < 1) {
            //Vector3 direction = new Vector3( fsm.target.position.x - cam.transform.position.x, 0, fsm.target.position.z - cam.transform.position.z);
            
            Vector3 newVector = new Vector3(fsm.target.position.x - cam.transform.position.x,0, fsm.target.position.z - cam.transform.position.z);
            Debug.DrawRay(fsm.target.transform.position, newVector, Color.green);
            float distance = newVector.magnitude;
            float angle = Vector3.Angle(Vector3.Normalize(fsm.transform.position - fsm.target.position), newVector.normalized);
            Debug.Log(angle);
            if (angle < viewAngle && distance < viewDistance)
            {
                Debug.Log("Entered Raycast");
                return Raycast(newVector, fsm);
            } else
            {
                return false;
            }

        } else
        {
            return false;
        }
    }


    private bool Raycast(Vector3 direction, FiniteStateMachine fsm)
    {
        RaycastHit hit;
        if (Physics.Raycast(new Ray(fsm.target.position, fsm.transform.position), out hit, direction.magnitude)) {
            if (hit.collider.CompareTag("Stalker"))
                return true;
            else return false;
        } else
        {
            return true;
        }
    }
}