I keep encountering a SIGBUS error when working with a simple pathfinding script. I've found the function giving me the problem but I'm not sure where to begin troubleshooting within.
The Unity Editor does not give me an error when I press Play. It returns the correct result in the Inspector.
But everytime I try to Build and Run the project, I get this error in Xcode:
NullReferenceException: Object reference not set to an instance of an object UnityScript.Lang.Array..ctor (IEnumerable collection) DijkstraPath.DijkstraPath (UnityEngine.GameObject source, UnityEngine.GameObject target, UnityEngine.GameObject[] nodes) [0x00000] DijkstraPath.Update ()
Here's the scripts to illustrate the problem.
a) The NavPoint.js script (modified version of AutoWayPoint from FPS Tutorial):
Make several empty object in your scene and tag them "Waypoint." Attach this script to them:
var tagName: String = "Waypoint"; // tag name for all nav points
static var navpoints : GameObject[]; // all nav points
static var kLineOfSightCapsuleRadius = 0.1; //radius of line of sight capsule used to check neighboring status
//var layerMask : LayerMask;
//public var hitinfo: RaycastHit;
//var allWaypoints: GameObject[];
var neighborNodes: GameObject[]; //define neighbor array for each navpoint
var neighborDistance: float[];
var previousNode: GameObject;
var previousDist: float = Mathf.Infinity;
function Start()
{
navpoints = GameObject.FindGameObjectsWithTag(tagName);
RebuildNavPointList();
}
function Awake () {
navpoints = GameObject.FindGameObjectsWithTag(tagName);
RebuildNavPointList();
}
@ContextMenu ("Update NavPoints")
function UpdateNavPoints () {
RebuildNavPointList();
}
// Draw the navpoint lines only when you select one of the navpoints
function OnDrawGizmosSelected () {
RebuildNavPointList();
for (var p : GameObject in neighborNodes)
{
Gizmos.color = Color.green;
Gizmos.DrawLine (transform.position, p.transform.position);
}
}
function RebuildNavPointList () {
navpoints = GameObject.FindGameObjectsWithTag(tagName);
for (var point : GameObject in navpoints) {
(point.GetComponent(NavPoint) as NavPoint).RecalculateConnectedNavPoints();
}
}
function OnDrawGizmos() {
Gizmos.DrawIcon (transform.position, "waypoint.tif");
}
function RecalculateConnectedNavPoints ()
{
var connected = new Array();
for (var other : GameObject in navpoints) {
// Don't connect to ourselves
if (transform.position == other.transform.position)
continue;
// Do we have a clear line of sight?
if (!Physics.CheckCapsule(transform.position, other.transform.position, kLineOfSightCapsuleRadius)) {
connected.Add(other);
}
}
// neighborNodes = connected.ToBuiltin(GameObject);
// neighborDistance = new float[neighborNodes.length];
for (i = 0; i < neighborNodes.length; i++)
{
neighborDistance _= Vector3.Distance(transform.position,neighborNodes*.transform.position);*_
_*}*_
_*}*_
_*```*_
_*<p>b) Then make another empty object and attach this script. Choose one NavPoint as the source node another NavPoint as the target node:</p>*_
_*```*_
_*var tagName: String = "Waypoint"; // String used to tag all way points*_
_*var myWaypoints: GameObject[]; //all nodes*_
_*var myPath: GameObject[];*_
_*var shortestPath: Array;*_
_*var nodes: Array;*_
_*var mySource: GameObject;*_
_*var myTarget: GameObject;*_
_*function Start()*_
_*{*_
_*myWaypoints = GameObject.FindGameObjectsWithTag(tagName);*_
_*}*_
_*// All waypoints need to have the neighbors script attached, which stores neighborNodes/neighborDistance, and previousNode/previousDistance*_
_*function DijkstraPath(source: GameObject, target: GameObject, nodes: GameObject[])*_
_*{*_
_*//initialize previousNode and previousDist values for each neighbor game object*_
_*for (i = 0; i < nodes.length; i++)*_
_*{*_
<em>_(nodes*.GetComponent(NavPoint) as NavPoint).previousDist = Mathf.Infinity;*_</em>
<em><em>_(nodes*.GetComponent(NavPoint) as NavPoint).previousNode = null;*_</em></em>
<em><em>_*}*_</em></em>
<em><em>_*//if the node is a source node it will get a previousDistance of 0*_</em></em>
<em><em>_*(source.GetComponent(NavPoint) as NavPoint).previousDist = 0;*_</em></em>
<em><em>_*//repeat until we visit every node in the graph and it is empty*_</em></em>
<em><em>_*while (nodes != null)*_</em></em>
<em><em>_*{*_</em></em>
<em><em>_*var bestNode: GameObject;*_</em></em>
<em><em>_*var bestDistance: float = Mathf.Infinity;*_</em></em>
<em><em>_*var bestIndex: int;*_</em></em>
<em><em>_*for (i = 0; i < nodes.length; i++)*_</em></em>
<em><em>_*{*_</em></em>
<em><em><em>_previousDistance = (nodes*.GetComponent(NavPoint) as NavPoint).previousDist;*_</em></em></em>
<em><em><em>_*//find node with smallest distance*_</em></em></em>
<em><em><em>_*if (previousDistance < bestDistance)*_</em></em></em>
<em><em><em>_*{*_</em></em></em>
<em><em><em>_*bestDistance = previousDistance;*_</em></em></em>
<em><em><em><em>_bestNode = nodes*;*_</em></em></em></em>
<em><em><em><em>_*bestIndex = i;*_</em></em></em></em>
<em><em><em><em>_*}*_</em></em></em></em>
<em><em><em><em>_*}*_</em></em></em></em>
<em><em><em><em>_*if (bestDistance == Mathf.Infinity) //only happens if there is no path to the source*_</em></em></em></em>
<em><em><em><em>_*{*_</em></em></em></em>
<em><em><em><em>_*break;*_</em></em></em></em>
<em><em><em><em>_*}*_</em></em></em></em>
<em><em><em><em>_*//remove this node from our list*_</em></em></em></em>
<em><em><em><em>_*var nodeArray = new Array(nodes);*_</em></em></em></em>
<em><em><em><em>_*nodeArray.RemoveAt(bestIndex);*_</em></em></em></em>
<em><em><em><em>_*nodes = nodeArray.ToBuiltin(GameObject);*_</em></em></em></em>
<em><em><em><em>_*var nlist = (bestNode.GetComponent(NavPoint) as NavPoint).neighborNodes;*_</em></em></em></em>
<em><em><em><em>_*for (i = 0; i < nlist.length; i++)*_</em></em></em></em>
<em><em><em><em>_*{*_</em></em></em></em>
<em><em><em><em><em>_var neighborDist = (bestNode.GetComponent(NavPoint) as NavPoint).neighborDistance*;*_</em></em></em></em></em>
<em><em><em><em><em>_*var totalDistance = neighborDist + bestDistance;*_</em></em></em></em></em>
<em><em><em><em><em><em>_if (totalDistance < (nlist*.GetComponent(NavPoint) as NavPoint).previousDist)*_</em></em></em></em></em></em>
<em><em><em><em><em><em>_*{*_</em></em></em></em></em></em>
<em><em><em><em><em><em><em>_(nlist*.GetComponent(NavPoint) as NavPoint).previousDist = totalDistance;*_</em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_(nlist*.GetComponent(NavPoint) as NavPoint).previousNode = bestNode;*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*}*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*}*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*}*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*if (target)*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*var curNode: GameObject = target;*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*var shortestPath = new Array();*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*while ((curNode.GetComponent(NavPoint) as NavPoint).previousNode != null)*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*{*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*shortestPath.Add(curNode);*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*curNode = (curNode.GetComponent(NavPoint) as NavPoint).previousNode;*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*}*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*shortestPath.Add(source);*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*shortestPath.Reverse();*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*var testPath = shortestPath.ToBuiltin(GameObject);*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*return testPath;*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*}*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*function Update()*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*{*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*myPath = DijkstraPath(mySource,myTarget,myWaypoints);*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*}*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*```*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*<p>If you press Play in the Unity Editor, the empty with the DijkstraPath script should build the path in the Inspector correctly. But trying to build the XCode project fails with the SIGBUS error.</p>*_</em></em></em></em></em></em></em></em>
<em><em><em><em><em><em><em><em>_*<p>Any ideas?</p>*_</em></em></em></em></em></em></em></em>