unity3d 游戏对象消失在运行时,而使用设置父,我该如何解决这个问题?[重复]

gcuhipw9  于 2023-03-19  发布在  其他
关注(0)|答案(2)|浏览(143)

此问题在此处已有答案

My code is setting the objects to the wrong parent, how do I fix this?(1个答案)
3天前关闭。
所以我目前正在做一个像书呆子一样的游戏,当试图设置字母作为一个孩子,游戏对象不知何故在运行时消失。
基本上发生的事情是从这个场景编辑器:scene它会变成这样:GameScene
当我检查游戏对象,看看他们是否以某种方式被摧毁,游戏对象仍然存在,所以这不是问题。
下面是我为setparent逻辑编写的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class ParentSetter : MonoBehaviour
{
    public bool IsOnSlot = false;
    public GameObject[] LetterInputTile;
    public GameObject letterInputTileParent;
    // Start is called before the first frame update
    void Start()
    {
        letterInputTileParent = new GameObject("LetterInputTileParent");
    }

    // Update is called once per frame
    void Update()
    {
        if(IsOnSlot)
        {
            for (int i = 0; i < LetterInputTile.Length; i++)
            {
                LetterInputTile[i].transform.SetParent(letterInputTileParent.transform);
            }
        }
        else
        {
            for (int i = 0; i < LetterInputTile.Length; i++)
            {
                LetterInputTile[i].transform.SetParent(null);
            }
        }
    }

    private void OnCollisionEnter2D(Collision2D other)
    {
        if(other.gameObject.CompareTag("MLetterTile"))
        {
            IsOnSlot = true;
        }
    }

    private void OnCollisionExit2D(Collision2D other)
    {
        if (other.gameObject.CompareTag("MLetterTile"))
        {
            IsOnSlot = false;
        }
    }
}

我该怎么解决这个问题?

nwo49xxi

nwo49xxi1#

这是一个很好的做法,张贴屏幕截图的问题是实际看到,在您的情况下,我们错过了层次结构窗口,其中的对象布局可以观察。
我只能在这一点上猜测,但似乎你做错了什么,因为可能删除画布子对象远离非画布父。UI组件,如图像,TMP_TextUGUI和任何衍生自图形类是依赖于画布。如果这样的对象不在画布层次结构,它不会被绘制,即使它的世界位置保留。
旁注:在Update中进行状态切换时,至少没有处理状态检查(只在状态改变时才执行操作)。即使在Update()中调用了这种触发器逻辑,也会为您节省大量的CPU功率,但还有另一种方法:UI组件如Button、Toggle、TextInput正在发出事件,你可以订阅它们,将其他对象设置为目标,选择一个方法,它就会响应。下面是一个good read

11dmarpk

11dmarpk2#

首先,确保这确实是您想要的:

public bool IsOnSlot = false;

如果没有其他逻辑可以将IsOnSlot设置为true,或者如果您通过检查器将布尔值设置为false,则Update()中的if-else语句将始终运行else语句。您可以使用IDE轻松检查是否有其他脚本可以访问布尔值。
接下来,在Start()中执行以下操作:

void Start()
{
    letterInputTileParent = new GameObject("LetterInputTileParent");
}

这不是在Unity中生成一个新对象的正确方法。通常你想通过[SerializeField]保存一个对你想生成的对象的引用,然后使用Instantiate()来生成它。你可以在here中阅读更多关于Instantiate()的信息。
即使您正确地使用了Instantiate(),上面的代码仍然可能无法正确运行,因为您使用的是SetParent(),并将常规的GameObject作为参数。请记住,UI对象只有在它们是Canvas对象的子对象时才会呈现,因此请确保将Canvas对象分配给letterInputTileParent

所以,总结一下:

1.确保“IsOnSlot”设置为正确的值。
1.使用Instantiate()而不是通过new创建对象。
1.确保父对象是Canvas

相关问题