unity3d - 使用碰撞在生成后销毁预制对象

标签 unity3d objectinstantiation object-destruction

我目前有一些从预制件中生成的对象,我正试图只销毁该预制件中生成的一个项目。我在网上搜索,发现了很多不同的例子,但我无法让其中任何一个发挥作用。我尝试设置 Instantiate 的一个实例并销毁该实例,但我无法让它工作。如果重要的话,生成/碰撞脚本会附加到主摄像机。与我的游戏工作中的其他项目发生碰撞,并且预制件确实有一个设置为 isTrigger 的盒子碰撞器。同样,我知道有很多示例可以解释这一点等,但我无法让它发挥作用,也许我不明白我实际上应该做什么。

生成器代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class bloodVialSpawner : MonoBehaviour
{
    public GameObject vialOfBlood;
    private GameObject vialss;
    private int hunger =10;
    public int numOfVials;
    public int minSpawnRange, maxSpawnRange;
    public int minSpawnRange2, maxSpawnRange2;
    // Start is called before the first frame update
    float timeSpawns = 2;
    List<GameObject> vialsInstantiated = new List<GameObject>();
    void Start()
    {
        StartCoroutine(becomeHungry());
        InvokeRepeating("SpawnVials", timeSpawns, timeSpawns);
    }
    private void Update()
    {
        if (hunger == -1)
        {
            Debug.Log("sigh");
        }
    }
    void SpawnVials()
    {
        for (int i = 0; i < numOfVials; i++)
        {
            vialsInstantiated.Add(Instantiate(vialOfBlood, SpawnPosition(), Quaternion.identity) as GameObject);
        }
    }
    Vector3 SpawnPosition()
    {
        int x, y, z;
        y = 59;
        x= UnityEngine.Random.Range(minSpawnRange, maxSpawnRange);
        z = UnityEngine.Random.Range(minSpawnRange2, maxSpawnRange2);
        return new Vector3(x, y, z);
    }

    IEnumerator becomeHungry()
    {
        while (true)
        {
            hunger -= 1;
            yield return new WaitForSeconds(1);
            Debug.Log(hunger);
        }
    }
}

enter image description here

Spawner 脚本在主摄像机上。使用的Player是Unity提供的First Person Player。

销毁衍生对象的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class destroyVial : MonoBehaviour
{
    void OnTriggerEnter(Collider col)
    {
        if (col.gameObject.tag == "vials")
        {
            Destroy(col.gameObject);
            Debug.Log("yell");
        }
    }
}

enter image description here

销毁代码在预制件上。注意预制件不在层次结构中,因为它不应该在层次结构中。

最佳答案

首先,

我看到您在 for 循环中生成内容并每次都覆盖 vialss 变量:

for (int i = 0; i < numOfVials; i++)
{
   vialss = Instantiate(vialOfBlood, 
                        SpawnPosition(),
                        Quaternion.identity) as GameObject;
}

然后,在发生碰撞时,您将销毁 vialss,在本例中将是最新生成的对象。如果你在 1 次碰撞后与任何东西发生碰撞,vialss 将已经被删除并且可能会抛出异常。也许这在您的游戏中很好,但逻辑看起来有点缺陷。

此外,我假设您想摧毁与您相撞的物体?这样的事情行不通吗?

void OnTriggerEnter(Collider col)
{
    if (col.gameObject.tag == "vials")
    {
        Destroy(col.gameObject); // <== Remove colliding object
        Debug.Log("yell");
    }
}

如果出于一些不相关的原因,您需要一份包含所有生成的小瓶的列表,也许您想将其转换为列表:

List<GameObject> spawnedVials = new List<GameObject>();

void SpawnVials()
{
    for (int i = 0; i < numOfVials; i++)
    {
        var vial = Instantiate<GameObject>(vialOfBlood,
                                         SpawnPosition(),
                                         Quaternion.identity)
        spawnedVials.Add(vial);
    }
}

最后,

确保碰撞检测正常工作。您是说脚本已附加到您的相机上。请确保您的相机上有对撞机。但是你是说其他对撞机正在工作,所以我猜你已经控制住了它。

我猜你的问题出在我最初描述的有缺陷的逻辑上。

关于unity3d - 使用碰撞在生成后销毁预制对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55223339/

相关文章:

java - 创建字符串对象的最佳方法

visual-c++ - 静态 CComPtr 变量

java - finalize() 方法的良好用途

c# - unity navmesh ai卡住了

c# - 如何为 UIImage 添加渐变阴影

c++ - 用参数初始化

c# - 对象文字实例化比设置属性快吗?

c++ - C++ 中的智能指针

unity3d - 如何使用 Unity 使用 ARCore 录制视频?

c# - Unity 输入管理器访问细节