1
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using Lightbug.CharacterControllerPro.Core;
|
||||
using Lightbug.CharacterControllerPro.Implementation;
|
||||
using Lightbug.Utilities;
|
||||
|
||||
namespace Lightbug.CharacterControllerPro.Demo
|
||||
{
|
||||
|
||||
[AddComponentMenu("Character Controller Pro/Demo/Character/AI/Sequence Behaviour")]
|
||||
public class AISequenceBehaviour : CharacterAIBehaviour
|
||||
{
|
||||
const float DefaultDelayTime = 0.5f;
|
||||
|
||||
[SerializeField]
|
||||
List<CharacterAIAction> actionSequence = new List<CharacterAIAction>();
|
||||
|
||||
// float timer = 0f;
|
||||
float durationWaitTime = 0f;
|
||||
float wallHitWaitTime = 0f;
|
||||
|
||||
int currentActionIndex = 0;
|
||||
|
||||
void OnEnable()
|
||||
{
|
||||
CharacterActor.OnWallHit += OnWallHit;
|
||||
}
|
||||
|
||||
void OnDisable()
|
||||
{
|
||||
CharacterActor.OnWallHit -= OnWallHit;
|
||||
}
|
||||
|
||||
public override void EnterBehaviour(float dt)
|
||||
{
|
||||
|
||||
currentActionIndex = 0;
|
||||
characterActions = actionSequence[currentActionIndex].action;
|
||||
|
||||
|
||||
if (actionSequence[currentActionIndex].sequenceType == SequenceType.Duration)
|
||||
{
|
||||
durationWaitTime = actionSequence[currentActionIndex].duration;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public override void UpdateBehaviour(float dt)
|
||||
{
|
||||
// Process the timers
|
||||
if (wallHitWaitTime > 0)
|
||||
wallHitWaitTime = Mathf.Max(0f, wallHitWaitTime - dt);
|
||||
|
||||
if (durationWaitTime > 0)
|
||||
durationWaitTime = Mathf.Max(0f, durationWaitTime - dt);
|
||||
|
||||
|
||||
switch (actionSequence[currentActionIndex].sequenceType)
|
||||
{
|
||||
case SequenceType.Duration:
|
||||
|
||||
if (durationWaitTime == 0f)
|
||||
SelectNextSequenceElement();
|
||||
|
||||
|
||||
break;
|
||||
case SequenceType.OnWallHit:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void SelectNextSequenceElement()
|
||||
{
|
||||
|
||||
if (currentActionIndex == (actionSequence.Count - 1))
|
||||
currentActionIndex = 0;
|
||||
else
|
||||
currentActionIndex++;
|
||||
|
||||
|
||||
characterActions = actionSequence[currentActionIndex].action;
|
||||
durationWaitTime = actionSequence[currentActionIndex].duration;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
void OnWallHit(Contact contact)
|
||||
{
|
||||
if (actionSequence[currentActionIndex].sequenceType != SequenceType.OnWallHit)
|
||||
return;
|
||||
|
||||
if (wallHitWaitTime > 0f)
|
||||
return;
|
||||
|
||||
bool characterCollision = contact.gameObject.GetComponent<CharacterActor>() != null;
|
||||
if (characterCollision)
|
||||
return;
|
||||
|
||||
SelectNextSequenceElement();
|
||||
wallHitWaitTime = DefaultDelayTime;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user