首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一致地删除派生列表对象

一致地删除派生列表对象
EN

Stack Overflow用户
提问于 2018-04-15 17:16:35
回答 3查看 84关注 0票数 0

已经2天了,我试图解决这个问题,但我做不到。我正在尝试删除无限的产卵障碍,当它们发生冲突时,boundary.The障碍是由5个cubes.Any想法构成的吗?

代码语言:javascript
复制
public List<GameObject> spawning=new List<GameObject>();
public Vector3[] positions = new Vector3[5];

public GameObject barrier;
public GameObject boundary;


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

void Update()
{
if(true)
{
    foreach (GameObject move in spawning) 
        move.transform.Translate (0f, 0f, -0.1f);
}

}


IEnumerator SpawnBarrier(){

yield return new WaitForSeconds (3f);

while (true) {


    for(int i=0;i<=4;i++)
    {

        spawning.Add (Instantiate (barrier, positions [i],   Quaternion.identity)as GameObject);



    }
    yield return new WaitForSeconds (3f);

}
}
EN

回答 3

Stack Overflow用户

发布于 2018-04-15 21:13:34

您的障碍物在其对撞器上被标记为isTrigger,因此您可以使用OnTriggerEnter来检测任何障碍物何时与边界发生碰撞。

您需要创建新的脚本,让我们调用该BoundaryDetector并将其附加到屏障预制件,以便屏障的每个实例都将此脚本附加到它。

当调用OnTriggerEnter时,检查触发器是否由边界触发。这可以通过检查" Player“标签来完成,因为边界在你的屏幕截图中被标记为Player。如果检测到的触发器标签是"Player",请先从派生列表中删除该派生,然后对其执行Destroy操作。

BoundaryDetector脚本如下所示(必须附加到屏障预制件上):

代码语言:javascript
复制
ScriptFromYourQuestion yourInstancingSript;

void Start()
{
    GameObject obj = GameObject.Find("NameOfObjectScriptInYourQuestionIsAttachedTo");
    yourInstancingSript = obj.GetComponent<ScriptFromYourQuestion>();
}


void OnTriggerEnter(Collider other)
{
    //Detect if we collided with the boundary
    if (other.CompareTag("Player"))
    {
        //Remove Self/barrier from the List
        yourInstancingSript.spawning.Remove(this.gameObject);


        //Delete Self/barrier 
        Destroy(this.gameObject);
    }
}

注意:问题中的ScriptFromYourQuestion应该替换为脚本的名称。

必须执行

要使上面的代码正常工作,必须在您的问题中脚本的Update函数中进行以下更改:

1.You必须将Rigidbody附加到至少一个对象(边界或屏障)。在这种情况下,我建议你这样做的屏障预制件。

2.You必须删除move.transform.Translate (0f, 0f, -0.1f);并用Rigidbody.MovePosition替换它,并使用它来移动屏障,因为您现在已经将Rigidbody附加到屏障上,这是移动Rigidbody对象的正确方法。

可能是这样的:

代码形式的队列中的Update函数应该如下所示:

代码语言:javascript
复制
public float speed = 100.0f;

void Update()
{
    if (true)
    {
        foreach (GameObject move in spawning)
        {
            //Get Rigidbody component 
            Rigidbody rb = move.GetComponent<Rigidbody>();
            //Calculate Z-axis pos to move to
            Vector3 pos = new Vector3(0, 0, 1);
            pos = pos.normalized * speed * Time.deltaTime;
            //Move with Rigidbody
            rb.MovePosition(rb.transform.position + pos);
        }
    }
}
票数 1
EN

Stack Overflow用户

发布于 2018-04-15 18:51:25

您的问题是您有一个无法跳出的无限循环while true。相反,您应该添加一个计数器。你还没有解释你想要做什么,但我的例子是,一旦它完成了5个块的10个实例化,它就会突破。

代码语言:javascript
复制
IEnumerator SpawnBarrier(){
    spawnCount=0
    yield return new WaitForSeconds (3f);
    while (true) {
        for(int i=0;i<=4;i++)
        {
            spawning.Add (Instantiate (barrier, positions [i],   Quaternion.identity)as GameObject);
        }
        if (++spawnCount==10)
        {
            break;
        }
        yield return new WaitForSeconds (3f);
    }
}
票数 0
EN

Stack Overflow用户

发布于 2018-04-15 21:10:16

如果我理解正确的话,你想摧毁与某种边界相撞的屏障?

如果边界是可见的屏幕空间

在这种情况下,我们可以假设,一旦对象对MainCamera不可见,就可以将其计为边界外。记住这一点,我们可以使用OnBecameInvisible()方法,它是由MonoBehaviour类调用的方法(或消息,如Unity Scripting API中所述):

代码语言:javascript
复制
// A piece of barrier that gets destroyed once out of screen
public sealed class BarrierPiece : MonoBehaviour
{
    // Called once the object is no longer visible to any (scene editor included) camera
    private void OnBecameInvisible()
    {
        Destroy(gameObject);
    }
}

注释:如果场景中有多个Camera,则对象必须对所有摄影机不可见,才能调用OnBecameInvisible()

如果“边界”是其他对象

在这种情况下,有许多基于您的游戏的方法:

  • 使用Rigidbody组件创建GameObject,并添加一个脚本,其中包含OnTriggerEnter(...)方法和销毁it.
  • (Inefficient)中的碰撞障碍物具有两个静态Vector2变量,一个用于pivotPosition,另一个用于maximumOffset (为了加快计算速度,应对此变量进行平方处理)。然后,在每个障碍物上编写脚本,并在Update()中检查对象到pivotPosition的平方距离是否大于maximumOffset,如果条件为true.
  • (others),则调用Destroy(gameObject) ...

这是我脑海中迅速浮现的两个问题。

希望这能有所帮助!

编辑

没有看过这些图片。

因此,对于您的解决方案,您需要将Rigidbody组件分配给Boundary,并在所有屏障上添加BoxCollider组件。现在,创建一个名为Barrier的标记,并用它标记所有屏障。创建脚本:

代码语言:javascript
复制
// Destroys barriers on collision
public sealed class BarrierBoundary : MonoBehaviour
{
    // Called once the script is created
    // Checks if the object has Rigidbody component attached
    private void Awake()
    {
        Debug.Assert(GetComponent<Rigidbody>() != null);
    }

    private void OnCollisionEnter(Collision collision)
    {
        if(collision.collider.tag == "Barrier")
            Destroy(collision.collider.gameObject);
    }
}

(代码没有经过测试,所以可能会有一些拼写错误。)

现在,将脚本分配给Boundary。瞧!屏障一旦命中边界就会被摧毁。

希望(再次)这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49840340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档