I have problem, i cant spawn enemies with script Waypoints.

When i make and object with this script and setting waypoints in unity editor everything works fine, but when im spawning an object with this script, it doesnt works because the variable waypoints isnt assigned,so how can i assign waypoint in the script?

using UnityEngine;
using System.Collections;

public class SeekSteer : MonoBehaviour
{

public Transform[] waypoints = new Transform[1];
public float waypointRadius = 1.5f;
public float damping = 0.1f;
public bool loop = false;
public float speed = 2.0f;
public bool faceHeading = true;

private Vector3 currentHeading,targetHeading;
private int targetwaypoint;
private Transform xform;
private bool useRigidbody;
private Rigidbody rigidmember;

void OnTriggerEnter(Collider collision)
{
Destroy(gameObject);	
}


// Use this for initialization
protected void Start ()
{
	
	
    xform = transform;
    currentHeading = xform.forward;
    if(waypoints.Length<=0)
    {
        Debug.Log("No waypoints on "+name);
        enabled = false;
    }
    targetwaypoint = 0;
    if(rigidbody!=null)
    {
    	useRigidbody = true;
    	rigidmember = rigidbody;
    }
    else
    {
    	useRigidbody = false;
    }
}


// calculates a new heading
protected void FixedUpdate ()
{
    targetHeading = waypoints[targetwaypoint].position - xform.position;

    currentHeading = Vector3.Lerp(currentHeading,targetHeading,damping*Time.deltaTime);
}

// moves us along current heading
protected void Update()
{
	
	
	if(useRigidbody)
		rigidmember.velocity = currentHeading * speed;
	else
        xform.position +=currentHeading * Time.deltaTime * speed;
    if(faceHeading)
        xform.LookAt(xform.position+currentHeading);

    if(Vector3.Distance(xform.position,waypoints[targetwaypoint].position)<=waypointRadius)
    {
        targetwaypoint++;
        if(targetwaypoint>=waypoints.Length)
        {
            targetwaypoint = 0;
            if(!loop)
                enabled = false;
        }
    }
}


// draws red line from waypoint to waypoint
public void OnDrawGizmos()
{
    Gizmos.color = Color.red;
    if(waypoints==null)
        return;
    for(int i=0;i< waypoints.Length;i++)
    {
        Vector3 pos = waypoints*.position;*

if(i>0)
{
Vector3 prev = waypoints[i-1].position;
Gizmos.DrawLine(prev,pos);
}
}
}

}

2 Answers

2

Because you are only creating the Transform[1] array but you are not adding new transforms to it.

My advice is:

Since you are only using position you can create a Vector3 array instead of a transform array.

But if you need transform array you should find the related object from the scene(or spawn them) and assign their Transform to your array.

Havent tested the below code but i simply changed Trannsform array to Vector3 array and changed its referances in code.It should work or at least put you in the correct path :slight_smile:

    public Vector3[] waypoints = new Vector3[1];
    public float waypointRadius = 1.5f;
    public float damping = 0.1f;
    public bool loop = false;
    public float speed = 2.0f;
    public bool faceHeading = true;
     
    private Vector3 currentHeading,targetHeading;
    private int targetwaypoint;
    private Transform xform;
    private bool useRigidbody;
    private Rigidbody rigidmember;
     
    void OnTriggerEnter(Collider collision)
    {
    Destroy(gameObject);
    }
     
     
    // Use this for initialization
    protected void Start ()
    {
     
     
    xform = transform;
    currentHeading = xform.forward;
    if(waypoints.Length<=0)
    {
    Debug.Log("No waypoints on "+name);
    enabled = false;
    }
    targetwaypoint = 0;
    if(rigidbody!=null)
    {
    useRigidbody = true;
    rigidmember = rigidbody;
    }
    else
    {
    useRigidbody = false;
    }
    }
     
     
    // calculates a new heading
    protected void FixedUpdate ()
    {
    targetHeading = waypoints[targetwaypoint] - xform.position;
     
    currentHeading = Vector3.Lerp(currentHeading,targetHeading,damping*Time.deltaTime);
    }
     
    // moves us along current heading
    protected void Update()
    {
     
     
    if(useRigidbody)
    rigidmember.velocity = currentHeading * speed;
    else
    xform.position +=currentHeading * Time.deltaTime * speed;
    if(faceHeading)
    xform.LookAt(xform.position+currentHeading);
     
    if(Vector3.Distance(xform.position,waypoints[targetwaypoint])<=waypointRadius)
    {
    targetwaypoint++;
    if(targetwaypoint>=waypoints.Length)
    {
    targetwaypoint = 0;
    if(!loop)
    enabled = false;
    }
    }
    }
     
     
    // draws red line from waypoint to waypoint
    public void OnDrawGizmos()
    {
    Gizmos.color = Color.red;
    if(waypoints==null)
    return;
    for(int i=0;i< waypoints.Length;i++)
    {
    Vector3 pos = waypoints*;*

if(i>0)
{
Vector3 prev = waypoints[i-1];
Gizmos.DrawLine(prev,pos);
}
}
}

Btw i have used notepad++ so i ddnt had intellisense/autocomplete i could have made some mistakes but the logic should be ok :)

Thank you very much,everything works fine) Im new to programming and it was a trouble for me. Thank you again!

Can you accept the answer if it worked for you :) I am glad to be help btw :)

Still no accept for me :(:)

Click the "check" symbol near the answer below the hand symbol ;)