Home > OS >  Unity Instantiate objects appear in hierarchy but not visible
Unity Instantiate objects appear in hierarchy but not visible

Time:07-30

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MakePipe : MonoBehaviour
{

    public GameObject pipe;
    float timer = 0;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        timer  = Time.deltaTime;
        if (timer > 1)
        {
            Instantiate(pipe);
            timer = 0;
        }
    }
}

I am trying to instantiate pipes using prefab, and with the code, a new set of pipes should spawn and move left from the original position where the first set of pipes spawned, but they are not visible.
They are generated as clones in the hierarchy, but when I double-click them to check the position, it points towards the first pipe position. My guess is that new clones are generated and overlapped in the first pipe as they move together. Please help


Thanks for your reply. Sorry I didn't add a separate cs code 'move', I should have added gif.. The following code is to move the pipe left with certain speed. There is no problem there. However from the 'MakePipe' code that I originally posted, I used instantiate to keep reproducing the pipe. Maybe I should add some lines to 'Start()' part to set original spawn location?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Move : MonoBehaviour
{

    public float speed;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        transform.position  = Vector3.left * speed * Time.deltaTime;
        // Debug.Log(transform.position);
    }
}

I had to delete photos because error message tells me I should have more than 10 reps to edit :(

CodePudding user response:

I don't have enough rep to comment, I'll attempt to give you a answer and update it for what you need. The Object.Instantiate method has some parameters that you can use to get your pipes into place.

public static Object Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent); 

And without the overloads it will use the original prefab's parameters. So they will spawn in the same location. You have to calculate the next position and pass it in the Instantiate method (Vector3 position).

I misunderstood what you are trying to do at first. @Geeky Quentin gave the right answer in the first comment.

[SerializeField] private GameObject pipe;
float timer = 0;
float offset = 1.5f;

void Start()
{

}

void Update()
{
    timer  = Time.deltaTime;
    transform.position  = new Vector3(-Time.deltaTime/offset, 0, 0);
    if (timer > 1)
    {
        GameObject lastPipe = Instantiate(pipe);
        lastPipe.transform.SetParent(transform);
        timer = 0;
    }
}

example

I still don't have enough rep to comment. Regarding your last changes. I tested your code out. Are you parenting the instantiated pipe to the PipeMaker in another script? If not this is the effect it spawns but it does not move: spawner1

To make it work you need to parent the instantiated pipe and change it's position MakePipe.cs:

public GameObject pipe;
float timer = 0;
private GameObject _newPipe;

void Update()
{
    timer  = Time.deltaTime;
    if (timer > 1)
    {
        //instatiate with parent on transform
        _newPipe = Instantiate(pipe, transform);
        //Set positiion to orginal prefab position
        _newPipe.transform.position = pipe.transform.position;
        timer = 0;
    }
}

This is the effect: effect1

My PipeSpawner has the Move and MakePipe scripts attached to it. And the prefab is in a hidden PipePrefab object that's unrelated to the rest of the system.

You could also set the position of the original spawn location in your Start() method as you said, it's up to you.

  • Related