void Update()
 {
     // Determine whether to emit a new waypoint...
     if (Time.time > lastTimeEmitted + frequency)
     {
         // Enough time has passed since previous waypoint.
         if (Vector3.Distance(transform.position, lastPositionEmitted) > distanceThreshold)
         {
             // Enough distance from previous waypoint.
             GameObject           wp       = (GameObject)Instantiate(wpPrefab, transform.position + wpOffset, transform.rotation);
             DroneDynamicWaypoint wpScript = wp.GetComponent <DroneDynamicWaypoint>();
             Debug.Assert(wpScript != null);
             wpScript.autoDelete    = this.autoDelete;
             wpScript.expiration    = Time.time + this.wpLifetime;
             wpScript.targetEmitter = this;
             MeshRenderer mr = wp.GetComponent <MeshRenderer>();
             Debug.Assert(mr != null);
             mr.enabled = wpVisible;
             wpList.Add(wp);
             AssertSequence();
             //Debug.Log (gameObject.name + " emitted waypoint that expires at " + wpScript.expiration);
             lastTimeEmitted     = Time.time;
             lastPositionEmitted = transform.position;
         }
     }
 }
    /*
     * Traverse the waypoint list as a sanity check that they are in order of expiration time.
     */
    private void AssertSequence()
    {
        float prevExpiration = 0;
        float thisExpiration;

        foreach (GameObject wp in wpList)
        {
            DroneDynamicWaypoint wpScript = wp.GetComponent <DroneDynamicWaypoint>();
            thisExpiration = wpScript.expiration;
            Debug.Assert(thisExpiration > prevExpiration);
            prevExpiration = thisExpiration;
        }
    }