Created
September 13, 2022 13:57
-
-
Save mikedolan03/e7287fb2e6adebb4755e5e56b1dc76b7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
using System.Collections; | |
using System.Collections.Generic; | |
using System; | |
public class ObstacleAvoidance : BTNode | |
{ | |
IBehaviorAI myAI; | |
Transform agentTransform; | |
float avoidDistance; | |
LayerMask avoidlayerMask; | |
event InputEventVector3 TurnEvent; | |
public ObstacleAvoidance(IBehaviorAI _myAI, float _avoidDistance, InputEventVector3 _turnEvent, LayerMask _avoidlayerMask) | |
{ | |
myAI = _myAI; | |
avoidDistance = _avoidDistance; | |
TurnEvent = _turnEvent; | |
avoidlayerMask = _avoidlayerMask; | |
} | |
public override BTNodeStates Evaluate() | |
{ | |
agentTransform = myAI.GetAgentTransform(); | |
Vector3[] rayDirections = | |
{ | |
agentTransform.forward, | |
HelperUtilities.GetDirectionFromAngleInDegrees(10f, agentTransform.forward, agentTransform.right), | |
HelperUtilities.GetDirectionFromAngleInDegrees(-10f, agentTransform.forward, agentTransform.right), | |
HelperUtilities.GetDirectionFromAngleInDegrees(10f, agentTransform.forward, agentTransform.up), | |
HelperUtilities.GetDirectionFromAngleInDegrees(-10f, agentTransform.forward, agentTransform.up), | |
(agentTransform.forward + agentTransform.right).normalized, | |
(agentTransform.forward - agentTransform.right).normalized, | |
(agentTransform.forward + agentTransform.up).normalized, | |
(agentTransform.forward - agentTransform.up).normalized, | |
(agentTransform.right).normalized, | |
(-agentTransform.right).normalized, | |
(agentTransform.up).normalized, | |
(-agentTransform.up).normalized, | |
}; | |
DrawRays(rayDirections); | |
RaycastHit hit; | |
if (Physics.Raycast(agentTransform.position, rayDirections[0], out hit, avoidDistance, avoidlayerMask) || | |
Physics.Raycast(agentTransform.position, rayDirections[1], out hit, avoidDistance, avoidlayerMask) || | |
Physics.Raycast(agentTransform.position, rayDirections[2], out hit, avoidDistance, avoidlayerMask) || | |
Physics.Raycast(agentTransform.position, rayDirections[3], out hit, avoidDistance, avoidlayerMask) || | |
Physics.Raycast(agentTransform.position, rayDirections[4], out hit, avoidDistance, avoidlayerMask) ) | |
{ | |
for(int i = 5; i < rayDirections.Length; i++) | |
{ | |
bool goodTurn = CheckTurn(rayDirections[i]); | |
if (goodTurn) return BTNodeStates.SUCCESS; | |
} | |
return BTNodeStates.SUCCESS; | |
} | |
Vector3 agentPosition = agentTransform.position; | |
Vector3 targetPosition = myAI.GetTargetPosition(); | |
Vector3 desiredHeading = (targetPosition - agentPosition); | |
TurnEvent(desiredHeading.x, desiredHeading.y, desiredHeading.z); | |
return BTNodeStates.SUCCESS; | |
} | |
private bool CheckTurn(Vector3 rayDirection) | |
{ | |
RaycastHit hit; | |
if (!Physics.Raycast(agentTransform.position, rayDirection * (avoidDistance / 4), out hit, avoidDistance, avoidlayerMask)) | |
{ | |
Vector3 newHeading = rayDirection; | |
Vector3 newTarget = agentTransform.position + (newHeading * (avoidDistance / 4)); | |
myAI.SetTempTarget(newTarget); | |
if (TurnEvent != null) TurnEvent(newHeading.x, newHeading.y, newHeading.z); | |
return true; | |
} | |
return false; | |
} | |
private void DrawRays(Vector3[] rayDirections) | |
{ | |
foreach(Vector3 dir in rayDirections) | |
{ | |
Debug.DrawRay(agentTransform.position, dir * avoidDistance, Color.blue); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment