Files
MetalGear2D.Unity/Assets/Scripts/AI/Jobs/AiCanHitEnemy.cs
T
2025-05-13 05:19:58 +03:00

73 lines
2.4 KiB
C#

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>("gameobject", out obj);
inventory = obj.GetComponent<Inventory>();
selfController = obj.GetComponent<HumanController>();
}
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<PlayerController>();
if (g != null && g == enemy) {
return true;
}
}
return false;
}
}