public override ActionResult Execute( AI ai ) { if (!MoveTargetVariable.IsValid || !MoveTargetVariable.IsVariable) { return ActionResult.FAILURE; } WaypointSet waypointSet = GetWaypointSetFromExpression( ai ); if (waypointSet == null) { return ActionResult.FAILURE; } if (waypointSet != lastWaypointSet) { waypointArrivedAt = -1; lastWaypointSet = waypointSet; } if (waypointArrivedAt == -1) { waypointArrivedAt = waypointSet.GetClosestWaypointIndex( ai.Kinematic.Position ); if (waypointArrivedAt < 0) { return ActionResult.FAILURE; } moveTarget.VectorTarget = waypointSet.Waypoints[ waypointArrivedAt ].position; moveTarget.CloseEnoughDistance = Mathf.Max( waypointSet.Waypoints[ waypointArrivedAt ].range, ai.Motor.CloseEnoughDistance ); if (!ai.Motor.IsAt( moveTarget )) { ai.WorkingMemory.SetItem<MoveLookTarget>( MoveTargetVariable.VariableName, moveTarget ); if (waypointVariable.IsValid && waypointVariable.IsVariable) { ai.WorkingMemory.SetItem<Waypoint>( waypointVariable.VariableName, waypointSet.Waypoints[ waypointArrivedAt ] ); } return ActionResult.SUCCESS; } } NavigationGraphNode tNode = waypointSet.Graph.GetNode( waypointArrivedAt ); if (tNode.OutEdgeCount > 0) { List<int> tConnectedNodes = new List<int>( ); for (int k = 0; k < tNode.OutEdgeCount; k++) { int tIndex = ((VectorPathNode)tNode.EdgeOut( k ).ToNode).NodeIndex; if ((tIndex != previousWaypoint) && (!tConnectedNodes.Contains( tIndex ))) tConnectedNodes.Add( tIndex ); } if (tConnectedNodes.Count == 0) { previousWaypoint = waypointArrivedAt; waypointArrivedAt = ((VectorPathNode)tNode.EdgeOut( 0 ).ToNode).NodeIndex; } else { previousWaypoint = waypointArrivedAt; waypointArrivedAt = tConnectedNodes[ UnityEngine.Random.Range( 0, tConnectedNodes.Count ) ]; } } moveTarget.VectorTarget = waypointSet.Waypoints[ waypointArrivedAt ].position; moveTarget.CloseEnoughDistance = Mathf.Max( waypointSet.Waypoints[ waypointArrivedAt ].range, ai.Motor.CloseEnoughDistance ); ai.WorkingMemory.SetItem<MoveLookTarget>( MoveTargetVariable.VariableName, moveTarget ); if (waypointVariable.IsValid && waypointVariable.IsVariable) { ai.WorkingMemory.SetItem<Waypoint>( waypointVariable.VariableName, waypointSet.Waypoints[ waypointArrivedAt ] ); } return ActionResult.SUCCESS; }
public override ActionResult Execute(AI ai) { count += 0.5f; bool isNear = false; if (ai.Motor.IsAt(moveTarget)){ isNear = true; } if ((moveTarget.VectorTarget == Vector3.zero) || isNear) { isNear = false; if (!MoveTargetVariable.IsValid || !MoveTargetVariable.IsVariable) return ActionResult.FAILURE; WaypointSet waypointSet = GetWaypointSetFromExpression(ai); if (waypointSet == null) return ActionResult.FAILURE; if (waypointSet != lastWaypointSet) { lastWaypoint = -1; lastWaypointSet = waypointSet; } if (lastWaypoint == -1) { lastWaypoint = waypointSet.GetClosestWaypointIndex(ai.Kinematic.Position); if (lastWaypoint < 0) return ActionResult.FAILURE; moveTarget.VectorTarget = waypointSet.Waypoints[lastWaypoint].position; moveTarget.CloseEnoughDistance = Mathf.Max(waypointSet.Waypoints[lastWaypoint].range, ai.Motor.CloseEnoughDistance); // if (!ai.Motor.IsAt(moveTarget)) // { // ai.WorkingMemory.SetItem<MoveLookTarget>(MoveTargetVariable.VariableName, moveTarget); // return ActionResult.SUCCESS; // } } //**REMOVED EXTRA LINE HERE NavigationGraphNode tNode = waypointSet.Graph.GetNode(lastWaypoint); if (tNode.OutEdgeCount > 0) { int tRandomEdge = UnityEngine.Random.Range(0, tNode.OutEdgeCount); //**FIXED THIS LINE lastWaypoint = ((VectorPathNode)tNode.EdgeOut(tRandomEdge).ToNode).NodeIndex; } moveTarget.VectorTarget = waypointSet.Waypoints[lastWaypoint].position; moveTarget.CloseEnoughDistance = Mathf.Max(waypointSet.Waypoints[lastWaypoint].range, ai.Motor.CloseEnoughDistance); } ai.WorkingMemory.SetItem<MoveLookTarget>(MoveTargetVariable.VariableName, moveTarget); if(count > 1000f) { ai.WorkingMemory.SetItem("isSearching", false); count = 0; return ActionResult.FAILURE; } return ActionResult.SUCCESS; }