如何在Unity中销毁特定的实例化预制件?

How to destroy a specific instantiated prefab in Unity?

提问人:Princess A 提问时间:11/8/2023 更新时间:11/8/2023 访问量:50

问:

我正在开发一个加扰文字游戏。有一个脚本主要处理实例化预制件的函数。该预制件由鱼的 2d 方形精灵和作为其子项的 TMP 文本组成。TMP 文本包含实例化预制件时从 txt 文件加载的未加扰字。

还有另一个脚本处理此预制件的移动。因此,给定速度和速度,带有附加单词的鱼将在屏幕上移动,并在实例化的预制件出界时破坏它(即用户无法按时猜到它)。

另一个脚本处理用户输入。

我遇到的问题是,当用户输入返回键或提交他们的单词时,我无法弄清楚如何“破坏”用户试图猜测的正确实例化预制件,因为屏幕上通常同时有多条鱼。

我尝试保留这些游戏对象的列表,但我不确定如何动态更新它。

unity-game-engine 游戏开发 实例化

评论

0赞 Nikaas 11/8/2023
您可以尝试维护 .当一条鱼被创建/实例化时,你把它添加到字典中,它的单词作为键。然后,当提交一个单词时,您可以在字典中查找它,销毁关联的 gameObject 并从字典中删除该条目。Dictionary<string, GameObject>
0赞 TheNomad 11/8/2023
因此,屏幕上一次有多个乱码单词,用户可以通过输入猜测的单词随机猜出其中一个?

答:

0赞 derHugo 11/8/2023 #1

这个问题有点宽泛,但这是我想要的:

有一个列表来跟踪您的实例,例如

// Assuming this is the class you have attached to your prefab
public class Fish : MonoBehavior
{
    public static IReadOnlyList<Fish> Instances => _instances;
    private static readonly List<Fish> _instances = new();

    public string assignedWord;

    private void Awake()
    {
        _instances.Add(this);
    }

    private void OnDestroy()
    {
        _instances.Remove(this);
    }
}

这样,在应用程序中的任何时候,您都可以简单地访问和迭代 via 的当前现有/活动实例。FishFish.Instances

然后你可以得到特定的实例,比如

//using System.Linq;

var instance = Fish.Instances.FirstOrDefault(fish => fish.assignedWord.Equals(userInput));

if(instance != null)
{
    // Valid guess => handle and destroy instance 
}
else
{
    // Invalid guess
}

如果这些词确实是独一无二的,你甚至可以选择一个。Dictionary<string, Fish>

0赞 Voidsay 11/8/2023 #2

用键(你的单词)和你的 .只要同一个单词没有多个实例,代码就非常简单。StringGameObject

using System.Collections.Generic;
using UnityEngine;

/*Global variable*/
public Dictionary<string, GameObject> FishLookup = new Dictionary<string, GameObject>();

/*When you instantiate your fish*/
GameObject fish = Instantiate(/*your code here*/);
string word = /*your code here*/;
FishLookup.Add(word, fish);

/*When checking*/
string guess = /*your code here*/
if (FishLookup.TryGetValue(guess, out GameObject foundFish))
{
    Destroy(foundFish);
    FishLookup.Remove(guess);
}