c# – 当与物体碰撞时,预制件不会激活

我正在制作一个项目,我遇到了一个问题.

我有两个带有2D碰撞器的游戏对象(来自预制件),它从右向左移动.当他们互相接触时,他们会停用.

我还有一个空的游戏对象,我在其中添加一个随机生成障碍的脚本Respawner.

问题是当他们互相接触一次时,他们再也不会重新激活了.

Respawner Empty GameObject:

《c# – 当与物体碰撞时,预制件不会激活》

边界 :

《c# – 当与物体碰撞时,预制件不会激活》

预制件:
《c# – 当与物体碰撞时,预制件不会激活》
重生脚本:

public class Respawn : MonoBehaviour {
    [SerializeField]
    private GameObject[] obstacles;
    private List<GameObject> listname = new List<GameObject>();

    void Awake(){
        InitilizeObstacle();
    }

    void Start() {
        StartCoroutine(RandomObstacleSpawn());
    }

    void InitilizeObstacle(){
        int index = 0;
        for (int i=0; i<obstacles.Length * 3 ; i++) {
            GameObject obj  = Instantiate(obstacles[index],new Vector3(transform.position.x,transform.position.y,-2f),Quaternion.identity) as GameObject;
            listname.Add(obj);

            listname[i].SetActive(false);
            index++;

            if(index==obstacles.Length){
                index =0;
            }
        }
    }

    void shuffle(){
        for (int i=0; i<listname.Count; i++) {
            GameObject temp = listname [i];
            int random = Random.Range (i, listname.Count);
            listname [i] = listname [random];
            listname [random] = temp;
        }
    }

    IEnumerator RandomObstacleSpawn(){
        yield return new WaitForSeconds(Random.Range(1.5f,2.5f));

        int index = Random.Range (0, listname.Count);
        while (true) {
            if(!listname[index].activeInHierarchy){
                listname[index].SetActive(true);
                listname[index].transform.position = new Vector3(transform.position.x,transform.position.y,-2f);

                break;
            } else {
                index = Random.Range(0,listname.Count);
            }

            StartCoroutine(RandomObstacleSpawn());
        }
    }
}

脚本附加到预制移动:

public class ObstacleMove : MonoBehaviour {
    private float speed = -1.25f;

    void Start() { }

    void Update() {
        Vector3 pos = transform.position;
        pos.x += speed * Time.deltaTime;
        transform.position = pos;   
    }
}

脚本附加到触摸边框的预制件:

public class BorderTouch : MonoBehaviour {
    void OnTriggerEnter2D(Collider2D target){
            if(target.tag=="Border"){
            gameObject.SetActive(false);
        }
    }
}

最佳答案 基于新问题的新答案:

如果你想在碰撞后让事情发生.在边框上放一个脚本:

using UnityEngine;
using System.Collections;

public class borderListener : MonoBehaviour {
        public Respawn rS;

        void OnTriggerEnter2D(Collider2D target){
                rS.spawnIt ();

        }

}

在Unity Editor上,将Respawn对象拖到层次结构上的Border Script.
不要跳过这一步或事情不起作用!

在Respawn脚本上,删除最后一个StartCoroutine(RandomObstacleSpawn()); IEnumerator上的一行RandomObstacleSpawn()方法.并在Respawn脚本中的任何位置创建一个公共方法(从其他脚本访问):

public void spawnIt(){
                StartCoroutine(RandomObstacleSpawn());
        }

基于旧代码的旧答案:

从我在你的包装上看到的:

    while (true) { //A
                if(!listname[index].activeInHierarchy){
                       //B
                    listname[index].SetActive(true);
                    listname[index].transform.position = new Vector3(transform.position.x,transform.position.y,-2f);

                    break; //C
                } else {
                    index = Random.Range(0,listname.Count);
                }

                StartCoroutine(RandomObstacleSpawn()); //D
            }

我是一个小菜鸟,我会尽力帮助.但这段代码让我想知道:
而(真)什么?什么是真的? (编辑:发现一些观察下面)

代码似乎是这样做的:
进入while循环(A)

转到if语句中的第一个选项(B)

去换行; (C)

永远不会到达StartCoroutine(D)>这就是为什么它不再激活.

如果你尝试放一个StartCoroutine(RandomObstacleSpawn());休息之前;你可能会遇到Unity崩溃.如果你取消while语句怎么办?你需要调整产量的时间.

这是我要使用的代码:

IEnumerator RandomObstacleSpawn(){

            yield return new WaitForSeconds(Random.Range(3.5f,4.5f));
            int index = Random.Range (0, listname.Count);


            if(!listname[index].activeInHierarchy){
                listname[index].SetActive(true);
                listname[index].transform.position = new Vector3(transform.position.x,transform.position.y,-2f);

            }else{

                index = Random.Range(0,listname.Count);

            }

             StartCoroutine(RandomObstacleSpawn());
        }

编辑:关于while(true)我已经设法在这里找到关于这个概念的更多信息:R, How does while (TRUE) work?
但仍然……休息;在代码上实际上是访问StartCoroutine(RandomObstacleSpawn());无法到达.

点赞