using UnityEngine;
using System.Collections;
namespace Pathfinding.Examples {
/// Small sample script for placing obstacles
[HelpURL("http://arongranberg.com/astar/docs/class_pathfinding_1_1_examples_1_1_object_placer.php")]
public class ObjectPlacer : MonoBehaviour {
///
/// GameObject to place.
/// When using a Grid Graph you need to make sure the object's layer is included in the collision mask in the GridGraph settings.
///
public GameObject go;
/// Flush Graph Updates directly after placing. Slower, but updates are applied immidiately
public bool direct = false;
/// Issue a graph update object after placement
public bool issueGUOs = true;
/// Update is called once per frame
void Update () {
if (Input.GetKeyDown("p")) {
PlaceObject();
}
if (Input.GetKeyDown("r")) {
StartCoroutine(RemoveObject());
}
}
public void PlaceObject () {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
// Figure out where the ground is
if (Physics.Raycast(ray, out hit, Mathf.Infinity)) {
Vector3 p = hit.point;
GameObject obj = GameObject.Instantiate(go, p, Quaternion.identity) as GameObject;
if (issueGUOs) {
Bounds b = obj.GetComponent().bounds;
GraphUpdateObject guo = new GraphUpdateObject(b);
AstarPath.active.UpdateGraphs(guo);
if (direct) {
AstarPath.active.FlushGraphUpdates();
}
}
}
}
public IEnumerator RemoveObject () {
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
// Check what object is under the mouse cursor
if (Physics.Raycast(ray, out hit, Mathf.Infinity)) {
// Ignore ground and triggers
if (hit.collider.isTrigger || hit.transform.gameObject.name == "Ground") yield break;
Bounds b = hit.collider.bounds;
Destroy(hit.collider);
Destroy(hit.collider.gameObject);
if (issueGUOs) {
// In Unity, object destruction is actually delayed until the end of the Update loop.
// This means that we need to wait until the end of the frame (or until the next frame) before
// we update the graph. Otherwise the graph would still think that the objects are there.
yield return new WaitForEndOfFrame();
GraphUpdateObject guo = new GraphUpdateObject(b);
AstarPath.active.UpdateGraphs(guo);
if (direct) {
AstarPath.active.FlushGraphUpdates();
}
}
}
}
}
}