using System; using System.Collections.Generic; using UnityEngine; using System.Collections; public class AIJob { public Action OnEnter; public Action OnExit; public Action OnUpdate; public Action OnFixedUpdate; public bool done; } public class HumanoidAI : MonoBehaviour { public HumanController human; public float viewFov = 60; public float viewDistance = 2; public PlayerSensor viewSensor; private Queue _actionQueue = new Queue(); // Use this for initialization void Start () { } // Update is called once per frame void Update () { } void OnValidate() { var pc = human.eyes.GetComponent(); if (pc == null) { pc = human.eyes.AddComponent(); } pc.isTrigger = true; int circleSegments = 5; var points = new Vector2[1 + (circleSegments + 1)]; points[0] = new Vector2(0, 0); for (int i = 0; i <= circleSegments; ++i) { float angle = viewFov/circleSegments*i; points[i + 1] = Quaternion.AngleAxis(-0.5f * viewFov + angle, Vector3.forward) * new Vector3(1, 0, 0) * viewDistance; } pc.points = points; } void OnDrawGizmos() { var pos = human.eyes.transform.position; var eyesTf = human.eyes.transform.localToWorldMatrix; var right = eyesTf.MultiplyVector(Vector3.right).normalized; var d0 = Quaternion.AngleAxis(viewFov * 0.5f, Vector3.forward) * right; var d1 = Quaternion.AngleAxis(viewFov * -0.5f, Vector3.forward) * right; Gizmos.color = Color.blue; Gizmos.DrawLine(pos, pos + d0 * viewDistance); Gizmos.DrawLine(pos, pos + d1 * viewDistance); int sections = 15; int innerSections = 5; for (int i = 0; i < sections; ++i) { float angle0 = (viewFov / (float)sections * i) - (viewFov / 2); float angle1 = (viewFov / (float)sections * (i + 1)) - (viewFov / 2); var p0 = Quaternion.AngleAxis(angle0, Vector3.forward) * right; var p1 = Quaternion.AngleAxis(angle1, Vector3.forward) * right; Gizmos.DrawLine(pos + p0 * viewDistance, pos + p1 * viewDistance); } Gizmos.color = new Color(0,0,1,0.4f); for (int i = 0; i < sections; ++i) { for (int j = 0; j < innerSections; ++j) { float dist = (viewDistance / (innerSections + 1)) * (j + 1); float angle0 = (viewFov / (float)sections * i) - (viewFov / 2); float angle1 = (viewFov / (float)sections * (i + 1)) - (viewFov / 2); var p0 = Quaternion.AngleAxis(angle0, Vector3.forward) * right; var p1 = Quaternion.AngleAxis(angle1, Vector3.forward) * right; Gizmos.DrawLine(pos + p0 * dist, pos + p1 * dist); } } } }