C# 实例化创建两个对象,而不是一个

C# 实例化创建两个对象,而不是一个,c#,unity3d,C#,Unity3d,我是Unity的新手,几天内我都解决不了一个问题。我在我的道路预制件中创建了触发器对象,它包含了一个以上的触发器和道路本身。当汽车与此对象进行OnTiggerEnter时,我会生成新的道路预制件,使其在z坐标上更进一步。我有一个道路预制件作为起始件,当我的车碰到第一个道路触发事件时,它会创建一个对象,当车碰到创建的预制件道路的触发件时,它会创建两个对象。总之,实例化对象触发器创建两个对象而不是一个 我可以通过脊梁骨,但我想知道为什么会这样 public class CreateNextRoad

我是Unity的新手,几天内我都解决不了一个问题。我在我的道路预制件中创建了触发器对象,它包含了一个以上的触发器和道路本身。当汽车与此对象进行OnTiggerEnter时,我会生成新的道路预制件,使其在z坐标上更进一步。我有一个道路预制件作为起始件,当我的车碰到第一个道路触发事件时,它会创建一个对象,当车碰到创建的预制件道路的触发件时,它会创建两个对象。总之,实例化对象触发器创建两个对象而不是一个

我可以通过脊梁骨,但我想知道为什么会这样

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);
        }
    }
}


这是因为OnTiggerEnter。它计算两次。您可以使用以下选项:

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;
    }
}

好的。。。。3个论坛帮不了我

我发现了如何使每件事都恰到好处。 其思想是从触发器子对象调用父对象内的spawn next object方法

父对象脚本:

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();
        }
    }
}


公共类触发器:单行为
{
专用空对撞机(对撞机其他)
{
如果(其他比较标记(“玩家”))
{
transform.parent.GetComponent().road();
}
}
}


好的,这就是方法的本机行为?我知道有人叫过两次,但为什么?为什么静态对象执行一次,实例化两次?实际上这不起作用,它是相同的结果,创建了两个对象。我不知道为什么会发生这种情况,但我有同样的问题。我就这样把它修好了。但我认为这是因为团结的速度不够快。