Instantiate создает два объекта вместо одного - PullRequest
0 голосов
/ 09 апреля 2020

Я новичок в Unity и уже несколько дней не могу решить одну проблему. Я создал триггерный объект внутри моего дорожного префаба, который содержит еще один триггер и саму дорогу. Когда автомобиль столкнется с этим объектом, я создаю новый префаб дороги, далее координата z. У меня есть один дорожный префаб в качестве стартера, когда моя машина сталкивается с первым событием триггера дороги, он создает один объект, когда автомобиль нажимает на триггер созданной заранее дороги, он создает два объекта. Таким образом, сводка заключается в том, что триггеры Instantiated object создают два объекта вместо одного.

Я мог бы сделать это через магистраль, но я хочу знать, почему это происходит.

public class CreateNextRoad : MonoBehaviour
{
    public GameObject Road;
    static float nextSpawnPoint = 149f;

    private void OnTriggerEnter(Collider other)
    {
        if(other.CompareTag("Player"))
        {
            float parentPos = transform.parent.transform.position.z;

            Instantiate(Road, new Vector3(0f, 0f, nextSpawnPoint), Quaternion.Euler(0, 90, 0));

            nextSpawnPoint = parentPos + 109f;

            Debug.Log(nextSpawnPoint);
        }
    }
}

enter image description here

enter image description here

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Хорошо ... 3 форума не могли мне помочь ....

Я узнал, как все сделать правильно. Идея состоит в том, чтобы вызывать метод вызова следующего объекта внутри родительского объекта из дочернего объекта триггера.

Родительский сценарий Obj:

public class SpawnNextRoad : MonoBehaviour
{
    public GameObject Road;
    static int roadCounter = 0;
    public void SpawnFurtherRoad()
    {
        float nextSpawnPoint = transform.position.z + 109f;
        Instantiate(Road, new Vector3(0f, -1f, nextSpawnPoint), Quaternion.Euler(0, 90, 0)).name = "Road" + roadCounter.ToString();
        roadCounter++;
    }
}

Дочерний сценарий триггера:

public class triggerSpawnRoad : MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if(other.CompareTag("Player"))
        {
            transform.parent.GetComponent<SpawnNextRoad>().SpawnFurtherRoad();
        }
    }
}


родительский объект

триггерный дочерний объект

0 голосов
/ 09 апреля 2020

Это из-за OnTriggerEnter. Он рассчитывает два раза. Вы можете использовать это:

public GameObject Road;
static float nextSpawnPoint = 149f;
public bool touched;

private void OnTriggerEnter(Collider other)
{
    if(other.CompareTag("Player")&&!touched)
    {
        float parentPos = transform.parent.transform.position.z;

        Instantiate(Road, new Vector3(0f, 0f, nextSpawnPoint), Quaternion.Euler(0, 90, 0));

        nextSpawnPoint = parentPos + 109f;

        Debug.Log(nextSpawnPoint);
        touched=true;
    }
}

private void OnTriggerExit(Collider other)
{
    if(other.CompareTag("Player")&&touched)
    {
        touched=false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...