Instantiate an object on the end of another object continuously (C#)

Hi,

I’m trying to get a road to instantiate in blocks on a button click. The road blocks are 1000 units long.

public class StraightRoadSpawn : MonoBehaviour {

    public GameObject StraightRoad;
    public Transform[] spawnpoints;
    public Button StraightRoadButton;
    public GameObject RoadSpawnPoint;

    // Use this for initialization
    void Start()
    {
        Button srbtn = StraightRoadButton.GetComponent<Button>();
        srbtn.onClick.AddListener(Spawn); // just the button for the road, this works
    }

    // Update is called once per frame
    void Spawn()
    {
        Vector3 localOffset = new Vector3(0, 0, 1000); //offset for first road block
        Vector3 spawnPosition = StraightRoad.transform.position + localOffset; 
        Instantiate(StraightRoad, spawnPosition, transform.rotation);  //instantiate first new block, this works fine
        Vector3 newRoadSpawnPosition = RoadSpawnPoint.transform.position;
        newRoadSpawnPosition.z = RoadSpawnPoint.transform.position.z + 1000; //trying to create a new point of instantiation for the road 1000 units along from the previous one
        Debug.Log("Straight Road spawned.");
    }


}

My issue here is that after the first new block, the road instantiates inside itself. I’m sure the solution is pretty obvious but I’d appreciate a push in the right direction.

The reason I’m trying to do it like this is to have different kinds of road blocks to choose from, corners and hills and such, that the user can control while watching someone else drive on them.

The problem is that your new point of instantiation is assigned in a scope that disappears after Spawn() returns. That variable newRoadSpawnPosition is never used. The solution is to store the current offset outside of the Spawn() scope, so that it is not lost when Spawn() finishes.

 public class StraightRoadSpawn: MonoBehaviour {

  public GameObject StraightRoad;
  public Transform[] spawnpoints;
  public Button StraightRoadButton;
  public GameObject RoadSpawnPoint;

  float currentOffset = 1000f;

  // Use this for initialization
  void Start() {
   Button srbtn = StraightRoadButton.GetComponent < Button > ();
   srbtn.onClick.AddListener(Spawn); // just the button for the road, this works
  }

  // Update is called once per frame
  void Spawn() {
   Vector3 localOffset = new Vector3(0, 0, currentOffset); //offset for first road block
   Vector3 spawnPosition = StraightRoad.transform.position + localOffset;
   Instantiate(StraightRoad, spawnPosition, transform.rotation); //instantiate first new block, this works fine

   currentOffset += 1000f;

   Debug.Log("Straight Road spawned.");
  }


 }

Used this concept a game I’m working on and worked out great!!! Thank you so much for this!. I appreciate! :slight_smile: