【问题标题】:Creating and destroying game objects each certain number of frames in Unity在 Unity 中每隔一定数量的帧创建和销毁游戏对象
【发布时间】:2023-03-14 08:34:01
【问题描述】:

我正在尝试创建对象并每 50 帧删除一次。线对象已成功创建,但它们从未被销毁!我什至尝试了 destroyimmediate() 仍然无法正常工作..请帮助...我的代码从来没有像这样工作过 ::

private int _currentInterval = 50;
private int _maxIntervalValue = 50; 
private int i = 0;

// Update is called once per frame
void Update () {
    if (_currentInterval == _maxIntervalValue)
    {
        float x = Random.Range(-10.0f, 10.0f), y = Random.Range(-10.0f, 10.0f);
        DrawRay(i, new Vector3(0, 0, 0), new Vector3(x, 10, y));
        i++;
        _currentInterval--;
    }
    else if (_currentInterval <= 0)
    {
        Destroy(GameObject.Find("Ray_" + i));
        _currentInterval = _maxIntervalValue;
    }
    else
        _currentInterval--;
}

private void DrawRay(int ID, Vector3 StartPoint, Vector3 EndPoint)
{
    #region Create Line
    GameObject Ray = new GameObject();
    Ray.transform.position = StartPoint;
    Ray.AddComponent<LineRenderer>();
    Ray.name = "Ray_" + ID;
    LineRenderer lr = Ray.GetComponent<LineRenderer>();
    lr.material = new Material(Shader.Find("Particles/Alpha Blended Premultiply"));
    lr.SetColors(Color.red, Color.red);
    lr.SetWidth(0.05f, 0.05f);
    lr.SetPosition(0, StartPoint);
    lr.SetPosition(1, EndPoint);
    #endregion
}

【问题讨论】:

  • 每帧 = 每帧?您想在同一帧中创建和销毁对象吗?如果是这种情况,那么您将看不到您创建的对象。请说明为什么需要这样做。也许有更好的方法来做到这一点
  • 每 50 帧 .. 请看一下代码,更像是一个名为 currentInterval 的计数器,每 50 帧重置一次……问题出在破坏函数中。它从来没有工作过它应该是 :: Destroy(GameObject.Find("Ray" + i)); :: 所以我最终创建了很多没有删除功能的对象
  • 您的标题显示每帧,正文显示 50 帧。我会同意你的 50 帧评论。但是现在,你的问题仍然没有意义。您想每 50 帧创建一个对象吗?你想什么时候摧毁它们?不知道什么时候很难提供帮助
  • 对不起,我发布了我的旧代码,正如你所说的那样没有意义。我刚刚编辑它......好吧,一开始计数器将为=50,它将创建一个对象,然后它将一直减少到=0,那时我们刚刚创建的对象应该被删除...但事实并非如此...当计数器变为 0 时,destryiong 对象功能不起作用,并且在下一帧中创建了另一个新对象,而旧对象仍在其位置..我需要删除在创建新的之前的旧的

标签: c# unity3d


【解决方案1】:

只需让您的柜台Destroy(GameObject.Find("Ray_" + (i-1)));。现在它试图找到的GameObject.Find 比您的原始值高一个计数,当时不存在。这应该可以解决您的对象没有被破坏的问题。

【讨论】:

    【解决方案2】:

    一开始计数器为=50,它会创建一个对象 那么它将一直减少到 =0 并且在那一刻 我们刚刚创建的对象应该被删除

    1。当您实例化像GameObject Ray = new GameObject(); 这样的对象时,您需要将GameObject Ray 变量设为全局变量,以便以后可以访问它并销毁它。这比用GameObject.Find找它来销毁它要好。

    2。您的代码中不需要大多数变量。通过检查Time.frameCount % 50 是否为0,您可以使用Time.frameCount 简化您正在做的事情。

    3。不要将您的变量命名为 Ray,因为有一个 Unity API 那个名称。

    您正在尝试执行的代码的简化版本。 DrawRay 已被移除,但您可以添加它。

    GameObject obj = null;
    
    void Start()
    {
        //Create new one
        obj = new GameObject();
    }
    
    void Update()
    {
        //Check if 50 frames has passed
        if (Time.frameCount % 50 == 0)
        {
            //Destroy old one
            if (obj != null)
                DestroyImmediate(obj);
    
            //Create new one again
            obj = new GameObject();
        }
    }
    

    不要在您的 DrawRay 函数中使用该代码。每次创建新的Material 时,代码中都会出现内存泄漏。使用Object Pooling 重复使用对象。

    【讨论】:

      【解决方案3】:

      我是统一的新手,我不知道所有属性,但是是的,如果对象被破坏,它会给你错误。因此,在我的情况下,我复制了预制件并将其从场景中插入,在这种情况下,我总是将复制的预制件作为参考,因此它永远不会被销毁,因为它不会是实例化类的游戏对象。

      也许某人的答案是微不足道的,但是如果该请求对象的所有实例都被破坏,这应该避免任何可能的 NullException。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-06
        相关资源
        最近更新 更多