using System.Linq; using UnityEngine; using System.Collections; public class AiCanHitEnemy : AiBehavior { private GameObject obj; private Inventory inventory; private HumanController selfController; public LayerMask skipRaycast; protected override BehaviorStatus OnExecute(AiBlackboard blackboard) { if (obj == null) { blackboard.GetValue("gameobject", out obj); inventory = obj.GetComponent(); selfController = obj.GetComponent(); } PlayerController enemy; blackboard.GetValue("enemy", out enemy); if (enemy == null) { return BehaviorStatus.Fail; } Vector3 right = obj.transform.localToWorldMatrix.MultiplyVector(Vector3.right).normalized; var raycastDir = Mathf.Abs(enemy.transform.position.x - obj.transform.position.x) * right; var p0 = obj.transform.position + Vector3.up * selfController.ArmsStandOffset; var p1 = obj.transform.position + Vector3.up * selfController.ArmsCrouchOffset; string crouchingName = "crouchToShoot"; if ( RaycastEnemy(p0, raycastDir, enemy)) { blackboard.SetValue(crouchingName, false); Debug.Log("WTF1"); return BehaviorStatus.Success; } else if (RaycastEnemy(p1, raycastDir, enemy)) { Debug.Log("WTF2"); blackboard.SetValue(crouchingName, true); return BehaviorStatus.Success; } return BehaviorStatus.Fail; } private bool RaycastEnemy(Vector3 from, Vector3 d, PlayerController enemy) { var hits = Physics2D.RaycastAll(from, d, 100, Physics2D.DefaultRaycastLayers & ~skipRaycast.value); Debug.Log("Hits: " + hits.Length); //find first collision which is not inside player head int firstOutsideId = -1; for (int i = 0; i < hits.Length; ++i) { if (hits[i].fraction > 0.0f) { firstOutsideId = i; break; } } Debug.Log("Hits name: " + hits[firstOutsideId].transform.name); if (firstOutsideId >= 0) { var hit = hits[firstOutsideId]; var g = hit.collider.GetComponent(); if (g != null && g == enemy) { return true; } } return false; } }