提问人:Princess A 提问时间:11/8/2023 更新时间:11/8/2023 访问量:50
如何在Unity中销毁特定的实例化预制件?
How to destroy a specific instantiated prefab in Unity?
问:
我正在开发一个加扰文字游戏。有一个脚本主要处理实例化预制件的函数。该预制件由鱼的 2d 方形精灵和作为其子项的 TMP 文本组成。TMP 文本包含实例化预制件时从 txt 文件加载的未加扰字。
还有另一个脚本处理此预制件的移动。因此,给定速度和速度,带有附加单词的鱼将在屏幕上移动,并在实例化的预制件出界时破坏它(即用户无法按时猜到它)。
另一个脚本处理用户输入。
我遇到的问题是,当用户输入返回键或提交他们的单词时,我无法弄清楚如何“破坏”用户试图猜测的正确实例化预制件,因为屏幕上通常同时有多条鱼。
我尝试保留这些游戏对象的列表,但我不确定如何动态更新它。
答:
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 的当前现有/活动实例。Fish
Fish.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
用键(你的单词)和你的 .只要同一个单词没有多个实例,代码就非常简单。String
GameObject
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);
}
评论
Dictionary<string, GameObject>