unity3d 无法更改Unity TextMeshPro文本

nbysray5  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(377)

我有一个扑克牌预置件,其中包含一个用于显示数字的TextMeshPro对象。我希望示例化该预置件并更改数字。在某些情况下,我可以更改数字,在其他情况下,我不能。
我首先创建了一个示例场景来试验更改文本的代码。这个场景包含一个对象,该对象带有一个更改文本的脚本。在脚本的Start方法中,我示例化了预置并更改了数字。这工作得很好。请参见下面的代码。

Vector3 position = new Vector3(0.0f, 0.0f, 0.0f);
 card = Instantiate(cardPrefab, position, Quaternion.Euler(0.0f, 180f, 0f));
 GameObject.Find("UpperLeftNumber").GetComponentInChildren<TextMeshPro>().text = "88";

当我把代码从示例场景移到我的游戏场景时,它不起作用。在游戏场景中,代码在一个ClientRPC中调用。
我尝试了很多SetActive(true/false)、SetText、ForceMeshUpdate和SetAllDirty的组合。没有任何效果,数字没有改变。如果使用这些方法中的一个或多个有什么技巧,请帮助我。也许我使用它们的顺序不对?
在Start中示例化与在ClientRPC中示例化之间似乎有明显的区别。有人能解释一下这个区别吗?

zphenhs4

zphenhs41#

如果你有一个ClientRPC,这只能从服务器上调用。看起来你正在制作一个多人游戏应用程序/游戏。
您可以在这里找到更多信息https://docs-multiplayer.unity3d.com/netcode/current/advanced-topics/message-system/clientrpc/index.html
如果这不是问题所在,你可以使用你刚刚生成的对象来检索TextMeshPro。这是在你的场景中有多个对象命名为“UpperLeftNumber”的情况下。

Vector3 position = new Vector3(0.0f, 0.0f, 0.0f);
 card = Instantiate(cardPrefab, position, Quaternion.Euler(0.0f, 180f, 0f));

Transform[] transforms = card.GetComponentsInChildren<Transform>()

foreach(Transform t in transform){
  if(t.name.equals("UpperLeftNumber")){
   t.GetComponentInChildren<TextMeshPro>().text = "88";
}

}
kkih6yb8

kkih6yb82#

两个回应者都提到了这个问题:场景中有两个UpperLeftNumber对象。
修复正是朱塞佩提供的:使用card.GetComponentsInChildren()而不是GameObject.Find()...

相关问题