我刚刚开始学习Unity 2d,我手头有一个任务,我想从资产文件夹中实例化一个预制,然后在预制启动后禁用其中的一些子元素。下面是我的代码:
void createPuzzleGame()
{
Puz = Resources.Load("Dog") as GameObject;
Instantiate(Puz, PuzArea.transform);
for (int i = 0; i < Puz.transform.childCount; ++i)
{
Transform currentItem = Puz.transform.GetChild(i);
if (currentItem.name.StartsWith("a") || currentItem.name.StartsWith("og"))
{
currentItem.gameObject.SetActive(false); //this line doesn't work
}
else
{
Debug.Log(currentItem.name);
}
}
}
我想禁用以字母"a"或"og"开头的预制Puz的所有子图像。预制狗(克隆)是在运行代码时创建的。然而,子元素似乎并没有被禁用。我哪里做错了?请帮助。
您正在尝试遍历原始预制的子节点Puz
.
您需要遍历新创建的实例
var instance = Instantiate(Puz, PuzArea.transform);
foreach(Transform child in instance.transform)
{
if (child.name.StartsWith("a") || child.name.StartsWith("og"))
{
child.gameObject.SetActive(false);
}
else
{
Debug.Log(child.name);
}
}
Puz
是预制构件的参考。Instantiate
返回您从Puz
创建的实际实例。您需要更改实例:
Transform dog = Instantiate(Puz, PuzArea.transform).transform;
for (int i = 0; i < dog.childCount; ++i) { /* ... */ }
或者,你可以添加一个脚本到你的预制,并移动这个逻辑,像这样(在这种情况下,你必须添加你对_images的引用预制,但你也可以使用你的搜索名称逻辑):
public class Puzzle : MonoBehaviour
{
[SerializeField] private GameObject[] _images;
public void SetImagesVisibility(bool visible)
{
for (int i = 0; i < _images.Length; i++) _images[i].SetActive(visible);
}
}
,你可以在实例化时使用它:
Puzzle puz = Instantiate(Puz, PuzArea.transform).GetComponent<Puzzle>();
puz.SetImagesVisibility(false);