【问题标题】:Instantiate creates two objects instead of one实例化创建两个对象而不是一个
【发布时间】:2020-04-09 23:24:25
【问题描述】:

我是 Unity 的新手,我已经有几天无法解决一个问题了。我在道路预制件中创建了触发器对象,其中包含一个触发器和道路本身。当汽车用这个对象触发时,我会在 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);
        }
    }
}

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    这是因为 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;
        }
    }
    

    【讨论】:

    • 好的,这是该方法的本机行为吗?我知道它被调用了两次,但是为什么呢?为什么静态对象执行一次,实例化两次?
    • 其实这样不行,结果一样,创建了两个对象。
    • 我不知道为什么会这样,但我遇到了同样的问题。我就这样修好了。但我认为这是因为团结不够快。
    【解决方案2】:

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

    parent obj

    trigger child obj

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-02
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      • 2012-02-18
      • 2014-10-24
      相关资源
      最近更新 更多