230 lines
5.6 KiB
C#
230 lines
5.6 KiB
C#
|
|
using System.Collections;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using UnityEditor;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
public class AIWalkToPosition : MonoBehaviour
|
|||
|
|
{
|
|||
|
|
[Header ("Main Settings")]
|
|||
|
|
[Space]
|
|||
|
|
|
|||
|
|
public bool walkToPositionEnabled = true;
|
|||
|
|
|
|||
|
|
public float maxWalkSpeed = 1;
|
|||
|
|
|
|||
|
|
public Transform walkPositionTransform;
|
|||
|
|
|
|||
|
|
public bool activateDynamicObstacleDetection;
|
|||
|
|
|
|||
|
|
public bool assignPartnerIfFoundOnPositionReached;
|
|||
|
|
|
|||
|
|
public bool removePartnerIfFoundOnPositionReached;
|
|||
|
|
|
|||
|
|
[Space]
|
|||
|
|
[Header ("Debug")]
|
|||
|
|
[Space]
|
|||
|
|
|
|||
|
|
public bool showDebugPrint;
|
|||
|
|
public bool walkToPositionInProcess;
|
|||
|
|
|
|||
|
|
[Space]
|
|||
|
|
[Header ("Components")]
|
|||
|
|
[Space]
|
|||
|
|
|
|||
|
|
public Transform characterTransform;
|
|||
|
|
|
|||
|
|
public AINavMesh mainAINavmesh;
|
|||
|
|
|
|||
|
|
public findObjectivesSystem mainFindObjectivesSystem;
|
|||
|
|
public playerController mainPlayerController;
|
|||
|
|
|
|||
|
|
Coroutine updateCoroutine;
|
|||
|
|
|
|||
|
|
bool dynamicObstacleDetectionChecked = false;
|
|||
|
|
bool dynamicObstacleActiveChecked = false;
|
|||
|
|
|
|||
|
|
float lastTimeWalkToPositionActive;
|
|||
|
|
|
|||
|
|
public void activateWalkToPosition ()
|
|||
|
|
{
|
|||
|
|
if (!walkToPositionEnabled) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (showDebugPrint) {
|
|||
|
|
print ("start walk");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
stopUpdateCoroutine ();
|
|||
|
|
|
|||
|
|
pauseAIState ();
|
|||
|
|
|
|||
|
|
dynamicObstacleDetectionChecked = false;
|
|||
|
|
dynamicObstacleActiveChecked = false;
|
|||
|
|
|
|||
|
|
lastTimeWalkToPositionActive = Time.time;
|
|||
|
|
|
|||
|
|
updateCoroutine = StartCoroutine (updateSystemCoroutine ());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void stopActivateWalkPosition ()
|
|||
|
|
{
|
|||
|
|
if (walkToPositionInProcess) {
|
|||
|
|
stopUpdateCoroutine ();
|
|||
|
|
|
|||
|
|
resumeAIState ();
|
|||
|
|
|
|||
|
|
walkToPositionInProcess = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void stopUpdateCoroutine ()
|
|||
|
|
{
|
|||
|
|
if (updateCoroutine != null) {
|
|||
|
|
StopCoroutine (updateCoroutine);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
IEnumerator updateSystemCoroutine ()
|
|||
|
|
{
|
|||
|
|
var waitTime = new WaitForFixedUpdate ();
|
|||
|
|
|
|||
|
|
while (true) {
|
|||
|
|
updateSystem ();
|
|||
|
|
|
|||
|
|
yield return waitTime;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void updateSystem ()
|
|||
|
|
{
|
|||
|
|
float currentDistanceToTarget = GKC_Utils.distance (walkPositionTransform.position, characterTransform.position);
|
|||
|
|
|
|||
|
|
if (currentDistanceToTarget < 2) {
|
|||
|
|
if (!dynamicObstacleDetectionChecked) {
|
|||
|
|
if (activateDynamicObstacleDetection) {
|
|||
|
|
mainAINavmesh.setUseDynamicObstacleDetectionState (false);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
dynamicObstacleDetectionChecked = true;
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
if (!dynamicObstacleActiveChecked) {
|
|||
|
|
if (activateDynamicObstacleDetection) {
|
|||
|
|
mainAINavmesh.setUseDynamicObstacleDetectionState (true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
dynamicObstacleActiveChecked = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool targetReached = false;
|
|||
|
|
|
|||
|
|
if (Time.time > lastTimeWalkToPositionActive + 0.2f) {
|
|||
|
|
if (!mainAINavmesh.isFollowingTarget ()) {
|
|||
|
|
targetReached = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (currentDistanceToTarget < 0.2f) {
|
|||
|
|
targetReached = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (mainPlayerController.isPlayerDead ()) {
|
|||
|
|
stopUpdateCoroutine ();
|
|||
|
|
|
|||
|
|
walkToPositionInProcess = false;
|
|||
|
|
|
|||
|
|
resetStatesOnDeadAI ();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (targetReached) {
|
|||
|
|
|
|||
|
|
resumeAIState ();
|
|||
|
|
|
|||
|
|
stopUpdateCoroutine ();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void pauseAIState ()
|
|||
|
|
{
|
|||
|
|
walkToPositionInProcess = true;
|
|||
|
|
|
|||
|
|
mainPlayerController.setActionActiveState (true);
|
|||
|
|
|
|||
|
|
mainAINavmesh.pauseAI (true);
|
|||
|
|
|
|||
|
|
mainAINavmesh.pauseAI (false);
|
|||
|
|
|
|||
|
|
mainFindObjectivesSystem.checkPauseOrResumePatrolStateDuringActionActive (true);
|
|||
|
|
|
|||
|
|
mainAINavmesh.enableCustomNavMeshSpeed (maxWalkSpeed);
|
|||
|
|
|
|||
|
|
mainAINavmesh.setTarget (walkPositionTransform);
|
|||
|
|
mainAINavmesh.setTargetType (false, true);
|
|||
|
|
|
|||
|
|
mainAINavmesh.enableCustomMinDistance (0.22f);
|
|||
|
|
|
|||
|
|
mainFindObjectivesSystem.setSearchingObjectState (true);
|
|||
|
|
|
|||
|
|
mainFindObjectivesSystem.disableStrafeModeIfActive ();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void resumeAIState ()
|
|||
|
|
{
|
|||
|
|
mainAINavmesh.removeTarget ();
|
|||
|
|
|
|||
|
|
mainAINavmesh.disableCustomNavMeshSpeed ();
|
|||
|
|
|
|||
|
|
mainAINavmesh.disableCustomMinDistance ();
|
|||
|
|
|
|||
|
|
mainAINavmesh.pauseAI (true);
|
|||
|
|
|
|||
|
|
mainAINavmesh.pauseAI (false);
|
|||
|
|
|
|||
|
|
mainPlayerController.setActionActiveState (false);
|
|||
|
|
|
|||
|
|
if (assignPartnerIfFoundOnPositionReached && mainAINavmesh.isPartnerLocated ()) {
|
|||
|
|
mainAINavmesh.setTarget (mainAINavmesh.getCurrentPartner ());
|
|||
|
|
|
|||
|
|
mainAINavmesh.setTargetType (true, false);
|
|||
|
|
} else {
|
|||
|
|
if (removePartnerIfFoundOnPositionReached) {
|
|||
|
|
if (mainAINavmesh.isPartnerLocated ()) {
|
|||
|
|
mainFindObjectivesSystem.removePartner ();
|
|||
|
|
|
|||
|
|
mainFindObjectivesSystem.checkIfResumeAfterRemovingPartner ();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
mainFindObjectivesSystem.checkPauseOrResumePatrolStateDuringActionActive (false);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (activateDynamicObstacleDetection) {
|
|||
|
|
mainAINavmesh.setOriginalUseDynamicObstacleDetection ();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
mainFindObjectivesSystem.setSearchingObjectState (false);
|
|||
|
|
|
|||
|
|
walkToPositionInProcess = false;
|
|||
|
|
|
|||
|
|
if (showDebugPrint) {
|
|||
|
|
print ("end walk");
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void resetStatesOnDeadAI ()
|
|||
|
|
{
|
|||
|
|
mainAINavmesh.disableCustomNavMeshSpeed ();
|
|||
|
|
|
|||
|
|
mainAINavmesh.disableCustomMinDistance ();
|
|||
|
|
|
|||
|
|
mainPlayerController.setActionActiveState (false);
|
|||
|
|
|
|||
|
|
if (activateDynamicObstacleDetection) {
|
|||
|
|
mainAINavmesh.setOriginalUseDynamicObstacleDetection ();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
mainFindObjectivesSystem.setSearchingObjectState (false);
|
|||
|
|
}
|
|||
|
|
}
|