gpt4 book ai didi

c# - 与物体碰撞时预制件不会激活

转载 作者:行者123 更新时间:2023-11-30 12:24:26 30 4
gpt4 key购买 nike

我正在做一个项目,但遇到了一个问题。

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

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

问题是当它们相互接触一次时,它们就再也不会被重新激活了。

Respawner 空游戏对象:

enter image description here

边框:

enter image description here

预制件: enter image description here重生脚本:

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

最佳答案

基于新问题的新答案:

如果你想让事情发生在碰撞之后。在 Border 上放一个脚本:

using UnityEngine;
using System.Collections;

public class borderListener : MonoBehaviour {
public Respawn rS;

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

}

}

在 Unity Editor 上,将 Respawn 对象拖到 Border Script on hierarchy。不要跳过这一步,否则将无法正常工作!

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

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(true) 什么?什么是真的? (编辑:在下面发现了一些观察结果)

代码似乎是按照这条路径进行的:进入 while 循环 (A)

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

转到换行符; (三)

永远不会到达 StartCoroutine (D) > 这就是它不会再次激活的原因。

如果您尝试在 break; 之前放置一个 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?但是仍然...代码中的 break; 确实使访问 StartCoroutine(RandomObstacleSpawn()); 无法访问。

关于c# - 与物体碰撞时预制件不会激活,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34249370/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com