- Home /
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.
Answer by Chikari · Feb 09, 2017 at 10:06 AM
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.");
}
}
That fixed it! $$anonymous$$new it would be something really small like that, thank you so much.
Answer by Echaminya · Jun 25, 2019 at 11:15 PM
Used this concept a game I'm working on and worked out great!!! Thank you so much for this!. I appreciate! :)
Your answer
Follow this Question
Related Questions
Distribute terrain in zones 3 Answers
Multiple Cars not working 1 Answer
Set the same value to a new Game object as the old one? 2 Answers
Unity reading decimals 1 Answer
Classes, MonoBehaviours C# 2 Answers