一致地删除产卵列表对象

时间:2018-04-15 09:16:35

标签: c# unity3d

我已经有2天试图解决这个问题,但我不能。我试图在它们与边界碰撞时一致地删除无限的产卵障碍。障碍是由5个立方体制成的。任何想法?

enter image description here

enter image description here

enter image description here

.as-console-wrapper { max-height: 100% !important; top: 0; }

3 个答案:

答案 0 :(得分:1)

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

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

调用OnTriggerEnter时,检查边界是否触发。这可以通过检查“播放器”标签来完成,因为边界在屏幕截图中被标记为播放器。如果检测到的触发器标签是“播放器”,则首先从产卵列表中移除产卵,然后移除Destroy它。

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

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 。您必须将Rigidbody附加到至少一个对象(边界或障碍物)。在这种情况下,我建议您对屏障预制件这样做。

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

也许是这样的:

代码表单中的更新功能你的问题看起来应该是这样的:

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 :(得分:0)

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

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

答案 2 :(得分:0)

如果我理解的话,你想破坏与某种边界相撞的障碍吗?

如果&#39;边界&#39;是可见的屏幕空间

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

// 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()

如果&#39;边界&#39;是其他对象

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

  • 使用GameObject组件创建Rigidbody并添加一个脚本,该脚本具有OnTriggerEnter(...)方法并消除其中的碰撞障碍。
  • 低效)有两个静态Vector2变量,一个用于pivotPosition,另一个用于maximumOffset(为了更快的计算,这个应该是平方的)。然后,在每个障碍上设置脚本并在Update()中检查对象与pivotPosition的平方距离是否大于maximumOffset并调用Destroy(gameObject)条件是true
  • (其他)......

在我的脑海中迅速出现了两个。

希望这有帮助!

修改

没看过图片......

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

// 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。瞧!一旦撞到边界,障碍就会被摧毁 希望(再次)这有帮助!