C# 如何检查以避免层次结构中的游戏对象重复?

C# 如何检查以避免层次结构中的游戏对象重复?,c#,unity3d,C#,Unity3d,我只想实例化一次文本。如果运行游戏,不再创建相同的文本 我正在实例化文本gameobjects。关于ExecuteAlways属性的Unity文档向您展示了如何根据处于编辑器模式还是播放模式来区分逻辑 GameObject newText = Instantiate(text); void Start() { if (Application.IsPlaying(gameObject)) { // Play logic } else {

我只想实例化一次文本。如果运行游戏,不再创建相同的文本


我正在实例化文本gameobjects。

关于ExecuteAlways属性的Unity文档向您展示了如何根据处于编辑器模式还是播放模式来区分逻辑

GameObject newText = Instantiate(text);
void Start()
{
    if (Application.IsPlaying(gameObject))
    {
        // Play logic
    }
    else
    {
        // Editor logic
    }
}
摘自此处的片段:


知道这一点,你有两个选择。您可以选择在编辑器模式下不实例化文本,也可以在进入播放模式时检查文本是否存在,如果存在,则销毁它。

关于ExecuteAlways属性的Unity文档向您展示了如何根据您处于编辑模式还是播放模式来区分逻辑

GameObject newText = Instantiate(text);
void Start()
{
    if (Application.IsPlaying(gameObject))
    {
        // Play logic
    }
    else
    {
        // Editor logic
    }
}
摘自此处的片段:

知道这一点,你有两个选择。您可以选择在编辑器模式下不实例化文本,也可以在进入播放模式时检查文本是否存在,如果存在,则销毁它。

使用此选项,以便仅在编辑器中运行的代码永远不会编译为生成。这避免了构建中代码膨胀

然后,使用以确保仅在编辑模式下运行的代码不会在播放模式下运行

GameObject newText = Instantiate(text);
void Start()
{
    if (Application.IsPlaying(gameObject))
    {
        // Play logic
    }
    else
    {
        // Editor logic
    }
}
使用此选项,以便仅在编辑器中运行的代码永远不会编译为生成。这避免了构建中代码膨胀

然后,使用以确保仅在编辑模式下运行的代码不会在播放模式下运行

GameObject newText = Instantiate(text);
void Start()
{
    if (Application.IsPlaying(gameObject))
    {
        // Play logic
    }
    else
    {
        // Editor logic
    }
}

假设
objectsToNumber[i]
下没有其他
TextMesh
对象,您只需首先检查对象是否已经存在,如

#if UNITY_EDITOR //Avoid garbage in the builds
    //Editor logic
    if(!EditorApplication.isPlaying) //If NOT in play mode
        GameObject newText = Instantiate(text);
#endif

我会更改类型以匹配您的目标类型,例如,如果您将类型设置为
text

var child = !objectsToNumber[i].transform.Find(renderer[i].name + " Text");
renderer[i] = child !=null ? child.GetComponnet<TextMesh>() : Instantiate(text).GetComponent<TextMesh>();
然后可以省略
GetComponent
,只需使用

public TextMesh text;
它还确保您只能引用附加了所需组件的预制件/对象


对于性能,我也宁愿使用

renderer[i] = Instantiate(text);
公共枚举文本位置
{
在上面
英弗蒙特,
脸上
}
公共文本位置文本位置;
//把这个列成一个清单
私有列表呈现器=新列表();
然后使用

public enum TextPosition
{
    Above,
    InFront,
    OnFaces
}

public TextPosition textPosition;

// and make this a list
private List<MeshRenderer> renderer = new List<MeshRenderer>();
private void Start()
{
foreach(objectsToNumber中的var父对象)
{
var newText=getComponentChildren();
如果(!newText)newText=实例化(text).GetComponent();
添加(newText);
开关(文本位置)
{
案例文本位置。如上所示:
newPos=parent.transform.position+Vector3.up*(渲染器[i].bounds.extents.y+yPadding);
打破
案例TextPosition.infort:
newPos=parent.transform.position+Vector3.up*(渲染器[i].bounds.extends.x+yPadding);
打破
}
newText.transform.position=newPos;
newText.transform.parent=parent.transform;
newText.name=parent.name+“Text”;
newText.tag=“ObjectToAddText”;
newText.Add(newText);
开关(文本位置)
{
案例文本位置。如上所示:
newText.text=renderer.Count.ToString();
打破
案例TextPosition.infort:
newText.text=parent.name;
打破
}
}
}
和
私有void更新()
{
if(旋转枚举数)
{
foreach(newTexts中的var文本)
{
//我宁愿为旋转速度指定正确的值
//而不是之后再乘以10。。。
text.transform.Rotate(矢量3.up,10*旋转速度*时间.deltaTime);
}
}
}
}

假设
objectsToNumber[i]
下没有其他
TextMesh
对象,您只需首先检查对象是否已经存在

#if UNITY_EDITOR //Avoid garbage in the builds
    //Editor logic
    if(!EditorApplication.isPlaying) //If NOT in play mode
        GameObject newText = Instantiate(text);
#endif

我会更改类型以匹配您的目标类型,例如,如果您将类型设置为
text

var child = !objectsToNumber[i].transform.Find(renderer[i].name + " Text");
renderer[i] = child !=null ? child.GetComponnet<TextMesh>() : Instantiate(text).GetComponent<TextMesh>();
然后可以省略
GetComponent
,只需使用

public TextMesh text;
它还确保您只能引用附加了所需组件的预制件/对象


对于性能,我也宁愿使用

renderer[i] = Instantiate(text);
公共枚举文本位置
{
在上面
英弗蒙特,
脸上
}
公共文本位置文本位置;
//把这个列成一个清单
私有列表呈现器=新列表();
然后使用

public enum TextPosition
{
    Above,
    InFront,
    OnFaces
}

public TextPosition textPosition;

// and make this a list
private List<MeshRenderer> renderer = new List<MeshRenderer>();
private void Start()
{
foreach(objectsToNumber中的var父对象)
{
var newText=getComponentChildren();
如果(!newText)newText=实例化(text).GetComponent();
添加(newText);
开关(文本位置)
{
案例文本位置。如上所示:
newPos=parent.transform.position+Vector3.up*(渲染器[i].bounds.extents.y+yPadding);
打破
案例TextPosition.infort:
newPos=parent.transform.position+Vector3.up*(渲染器[i].bounds.extends.x+yPadding);
打破
}
newText.transform.position=newPos;
newText.transform.parent=parent.transform;
newText.name=parent.name+“Text”;
newText.tag=“ObjectToAddText”;
newText.Add(newText);
开关(文本位置)
{
案例文本位置。如上所示:
newText.text=renderer.Count.ToString();
打破
案例TextPosition.infort:
newText.text=parent.name;
打破
}
}
}
和
私有void更新()
{
if(旋转枚举数)
{
foreach(newTexts中的var文本)
{
//我宁愿为旋转速度指定正确的值
//而不是之后再乘以10。。。
text.transform.Rotate(矢量3.up,10*旋转速度*时间.deltaTime);
}
}
}
}

这将在构建中留下垃圾/膨胀代码。编辑模式检查也可以简化。见f