【问题标题】:Cannot to delete the GameObject无法删除游戏对象
【发布时间】:2016-04-13 08:42:04
【问题描述】:

我将场景中的所有游戏对象放在一个列表下。以下是shelf.cs中用于删除游戏对象的函数。我将该函数分配给一个按钮,以便它获取输入值并找到哪个游戏对象的值小于输入值。然后删除。问题是每当我单击游戏预览中的按钮时,它都不会删除游戏对象。没有警告。我调试它是否接收到所有输入,它确实接收到了。只是不删除游戏对象。

为什么?

public void Process(){
    int user_apple,user_lemon,user_watermelon;

    user_apple = int.Parse (input_apple.text);
    user_lemon = int.Parse (input_lemon.text);
    user_watermelon = int.Parse (input_watermelon.text);

    Debug.Log (user_apple+" "+user_lemon+" "+user_watermelon);

    for(int i = players.Count - 1; i >= 0; i--)
    {   if(players[i].name == "Lemon")
        {
            if(players[i].GetComponent<Apple>().weight <= user_apple)
            {   Debug.Log ("wat u want");
                Destroy(players[i]);
            }players.RemoveAt(i);

        }
    }
}

如果我这样说的话,

public void Process(){
    int user_apple,user_lemon,user_watermelon;

    user_apple = int.Parse (input_apple.text);
    user_lemon = int.Parse (input_lemon.text);
    user_watermelon = int.Parse (input_watermelon.text);

    Debug.Log (user_apple+" "+user_lemon+" "+user_watermelon);
    if(players[2].GetComponent<Lemon>().weight <= user_apple)
    {   Destroy(players[2]);
        players.RemoveAt(2);
    }
}

会出现如下错误

FormatException: Input string was not in the correct format
System.Int32.Parse (System.String s) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Int32.cs:629)
Basket.Process () (at Assets/scripts/Basket.cs:77)
UnityEngine.Events.InvokableCall.Invoke (System.Object[] args) (at C:/BuildAgent/work/d63dfc6385190b60/Runtime/Export/UnityEvent.cs:110)
UnityEngine.Events.InvokableCallList.Invoke (System.Object[] parameters) (at C:/BuildAgent/work/d63dfc6385190b60/Runtime/Export/UnityEvent.cs:575)
UnityEngine.Events.UnityEventBase.Invoke (System.Object[] parameters) (at C:/BuildAgent/work/d63dfc6385190b60/Runtime/Export/UnityEvent.cs:717)
UnityEngine.Events.UnityEvent.Invoke () (at C:/BuildAgent/work/d63dfc6385190b60/Runtime/Export/UnityEvent_0.cs:53)
UnityEngine.UI.Button.Press () (at C:/BuildAgent/work/d63dfc6385190b60/Extensions/guisystem/guisystem/UI/Core/Button.cs:36)
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/BuildAgent/work/d63dfc6385190b60/Extensions/guisystem/guisystem/UI/Core/Button.cs:45)
UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/BuildAgent/work/d63dfc6385190b60/Extensions/guisystem/guisystem/EventSystem/ExecuteEvents.cs:52)
UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at C:/BuildAgent/work/d63dfc6385190b60/Extensions/guisystem/guisystem/EventSystem/ExecuteEvents.cs:269)
UnityEngine.EventSystems.EventSystem:Update()

【问题讨论】:

  • 通常你不应该在变量中使用下划线。所以,应该是userApple、userLemon等。您需要仔细并正确地格式化您的代码。你可以永远,永远制作软件,除非你对格式化非常狂热。
  • BTW 请注意,将文本解析为整数或浮点数并不容易。本质上,您不能使用“解析”。您必须使用 TryParse。这需要相当多的工作,你需要一个扩展。

标签: list unity3d destroy gameobject


【解决方案1】:

这可能不是正确的解决方案尝试从 Process Function 调用协程并产生循环,以便它运行每一帧。

【讨论】:

  • 所以我必须将此函数调用到另一个类的另一个函数中才能使其工作?有没有如何做到这一点的例子?
  • 不!现在像这样使用 void Process(){ startCourotiune(CProcess) ; } ienumerator CProcess(){ loop with yeild statemnet } 注意语法并了解协程以及它们如何帮助逐帧运行代码
  • 嗨@LumbusterTick - 如果你遇到这样的问题,那是因为你在不考虑框架的情况下错误地破坏了物体或组件。根本没有理由从按钮或其他任何地方循环“不起作用”。
  • 没关系,但要跳过一帧,你应该返回 null,而不是零
  • 嗨@whoami 很遗憾这个答案被勾选了,因为虽然这是一个有用的尝试,但实际上它并不正确。循环在按钮上完美运行。希望这不会让任何未来登陆这里的谷歌员工感到困惑
【解决方案2】:

只是回顾一下 Joe Blow 所说的话:这个 for 循环没有理由不工作,因为它完全独立于帧/时间。

这个小例子工作得很好:
脚本ScriptHolder 被分配给一个空的游戏对象(见下面的屏幕),看起来像这样:

using UnityEngine;
using System.Collections.Generic;

public class ScriptHolder: MonoBehaviour
{
    public List<GameObject> theGameObjects;

    public void TheButtonFunction(int weight)
    {
        for(int i = theGameObjects.Count - 1; i >= 0; i--)
        {
            if(theGameObjects[i].GetComponent<TheObject>().objectWeight <= weight)
            {
                Destroy(theGameObjects[i]);
                theGameObjects.RemoveAt(i);
            }
        }
    }
}

所有游戏对象都被拖入公共列表。

游戏对象的脚本如下所示:

using UnityEngine;
using System.Collections;

public class TheObject : MonoBehaviour
{
    public string objectName = "";
    public int objectWeight = 0;
}

所有GameObject_A 都命名为A,权重为10(在检查器中完成),GameObject_BB,权重为15GameObject_CC 20 的权重。列从左到右是 A 到 C。

按钮从上面调用函数,其值为15

当我单击按钮时,游戏对象的左侧和中间列将从场景和列表中删除 - 没有任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    相关资源
    最近更新 更多