此问题在此处已有答案:
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;
}
}
}
我该怎么解决这个问题?
2条答案
按热度按时间nwo49xxi1#
这是一个很好的做法,张贴屏幕截图的问题是实际看到,在您的情况下,我们错过了层次结构窗口,其中的对象布局可以观察。
我只能在这一点上猜测,但似乎你做错了什么,因为可能删除画布子对象远离非画布父。UI组件,如图像,TMP_TextUGUI和任何衍生自图形类是依赖于画布。如果这样的对象不在画布层次结构,它不会被绘制,即使它的世界位置保留。
旁注:在Update中进行状态切换时,至少没有处理状态检查(只在状态改变时才执行操作)。即使在Update()中调用了这种触发器逻辑,也会为您节省大量的CPU功率,但还有另一种方法:UI组件如Button、Toggle、TextInput正在发出事件,你可以订阅它们,将其他对象设置为目标,选择一个方法,它就会响应。下面是一个good read。
11dmarpk2#
首先,确保这确实是您想要的:
如果没有其他逻辑可以将
IsOnSlot
设置为true,或者如果您通过检查器将布尔值设置为false
,则Update()
中的if-else语句将始终运行else语句。您可以使用IDE轻松检查是否有其他脚本可以访问布尔值。接下来,在
Start()
中执行以下操作:这不是在Unity中生成一个新对象的正确方法。通常你想通过
[SerializeField]
保存一个对你想生成的对象的引用,然后使用Instantiate()
来生成它。你可以在here中阅读更多关于Instantiate()
的信息。即使您正确地使用了
Instantiate()
,上面的代码仍然可能无法正确运行,因为您使用的是SetParent()
,并将常规的GameObject
作为参数。请记住,UI对象只有在它们是Canvas
对象的子对象时才会呈现,因此请确保将Canvas
对象分配给letterInputTileParent
。所以,总结一下:
1.确保“IsOnSlot”设置为正确的值。
1.使用
Instantiate()
而不是通过new
创建对象。1.确保父对象是
Canvas
。