如何按程序将文本附加到生成的游戏对象?

How to procedurally attach text to generated gameobjects?

我在我的统一程序中创建了一堆像这样的立方体:

foreach (Cube cube in cubeList)
{
   if (cube.canStandOn)
   {
      GameObject block;
      block = GameObject.CreatePrimitive(PrimitiveType.Cube);
      block.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
      block.transform.position = new Vector3(cube._mPos.x + CubeSize.half, cube._mPos.y + CubeSize.half, cube._mPos.z + CubeSize.half);
      block.GetComponent<Renderer>().material.color = Color.blue;
   }
}

现在我想在 each 块上方添加一个文本,详细说明其位置。立方体的数量及其位置每 运行 可能会发生变化,因此这必须以编程方式完成,就像创建方块的方式一样。我在这个 Text Mesh 上找不到任何东西,这似乎是一个不错的方法,但没有找到在没有附加文本网格的先前创建的游戏对象的情况下创建的任何示例。这是在 android 应用程序中完成的,因此我无法使用 OnGizmos() 函数。

OnGUI() 中执行此操作可能没问题,但不会出现在场景 window 中,这也是我想要的。

有什么建议吗?

创建另一个游戏对象并将立方体作为其父对象。使用 addComponentTextMesh 添加到 cube.Assign 立方体的可能性下的新游戏对象 TextMesh 然后设置 yTextMesh 这样它就会在立方体的顶部。您还需要使 textMesh.anchortextMesh.alignment 位于 中间 的中心,以便 TextMesh 与立方体一起定位。根据立方体的大小,您可能需要调整 textOffset 变量。在不缩放立方体的情况下,它对我来说效果很好。如果它对您不起作用,请像缩放立方体一样缩放 TextMesh 的比例。

int textOffset = 2;
foreach (Cube cube in cubeList)
{
   if (cube.canStandOn)
   {
      GameObject block;
      block = GameObject.CreatePrimitive(PrimitiveType.Cube);
      block.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
      block.transform.position = new Vector3(cube._mPos.x + CubeSize.half, cube._mPos.y + CubeSize.half, cube._mPos.z + CubeSize.half);
      block.GetComponent<Renderer>().material.color = Color.blue;

      ////////////////////////TEXT MESH CODE//////////////////////

        //Create new GameObject
        GameObject childObj = new GameObject();

        //Make block to be parent of this gameobject
        childObj.transform.parent = block.transform;
        childObj.name = "Text Holder";

        //Create TextMesh and modify its properties
        TextMesh textMesh = childObj.AddComponent<TextMesh>();
        textMesh.text = "Blah Blah Blah";
        textMesh.characterSize = 1;

        //Set postion of the TextMesh with offset
        textMesh.anchor = TextAnchor.MiddleCenter;
        textMesh.alignment = TextAlignment.Center;
        textMesh.transform.position = new Vector3(block.transform.position.x,  block.transform.position.y + textOffset, block.transform.position.z);

   }
}

创建一个由立方体组成的预制件,立方体的 canvas 为 child(这又包含一个 UI 文本)。将 canvas 渲染模式设置为 World Space。如果全部相同,则调整比例。最好你实际创建一个空的游戏对象并让立方体和 canvas 成为 child。

要放置立方体,请执行以下操作:

using UnityEngine.UI;     // required for the text component

public GameObject prefabCube;

...

Vector3 cubePos = new Vector3(x, y, z);
GameObject cube = (GameObject)Instantiate(prefabCube, cubePos, Quaternion.identity);
cube.GetComponentInChildren<Text>().text = x + " " + y + " " + z;    // not quite sure if this line is correct
cube.GetComponent<Renderer>().material.color = Color.blue;     // if all blocks have the same color, change this for the prefab directly
// if you use an empty the last has to be
cube.GetComponentInChildren<Renderer>().material.color = Color.blue;

这应该是正确的。