- Home /
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[i].position;
if(i>0)
{
Vector3 prev = waypoints[i-1].position;
Gizmos.DrawLine(prev,pos);
}
}
}
}
Answer by Nidre · Apr 05, 2013 at 01:32 PM
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 :)
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[i];
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 :)
Answer by $$anonymous$$ · Apr 06, 2013 at 03:58 PM
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 :)
Click the "check" symbol near the answer below the hand symbol ;)
Your answer
![](https://koobas.hobune.stream/wayback/20220613095626im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Need an advise to upgrade my code!!! 1 Answer
Distribute terrain in zones 3 Answers
Multiple Cars not working 1 Answer
How to assign transfrom array in the code? 1 Answer
Assigning variables in inspector 1 Answer