using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace Pathfinding.Examples {
/// Helper script in the example scene 'Turn Based'
[RequireComponent(typeof(Animator))]
[RequireComponent(typeof(SingleNodeBlocker))]
[HelpURL("http://arongranberg.com/astar/documentation/stable/class_pathfinding_1_1_examples_1_1_turn_based_door.php")]
public class TurnBasedDoor : MonoBehaviour {
Animator animator;
SingleNodeBlocker blocker;
bool open;
void Awake () {
animator = GetComponent();
blocker = GetComponent();
}
void Start () {
// Make sure the door starts out blocked
blocker.BlockAtCurrentPosition();
animator.CrossFade("close", 0.2f);
}
public void Close () {
StartCoroutine(WaitAndClose());
}
IEnumerator WaitAndClose () {
var selector = new List() { blocker };
var node = AstarPath.active.GetNearest(transform.position).node;
// Wait while there is another SingleNodeBlocker occupying the same node as the door
// this is likely another unit which is standing on the door node, and then we cannot
// close the door
if (blocker.manager.NodeContainsAnyExcept(node, selector)) {
// Door is blocked
animator.CrossFade("blocked", 0.2f);
}
while (blocker.manager.NodeContainsAnyExcept(node, selector)) {
yield return null;
}
open = false;
animator.CrossFade("close", 0.2f);
blocker.BlockAtCurrentPosition();
}
public void Open () {
// Stop WaitAndClose if it is running
StopAllCoroutines();
// Play the open door animation
animator.CrossFade("open", 0.2f);
open = true;
// Unblock the door node so that units can traverse it again
blocker.Unblock();
}
public void Toggle () {
if (open) {
Close();
} else {
Open();
}
}
}
}