我有一个在UI可滚动面板上实例化的游戏对象(npc)列表。例如,我希望能够点击他们的名字并将他们分配给建筑物。以下是目前为止的内容:
HumanPool playerPool;
[SerializeField] GameObject PlayerInfo;
[SerializeField] TextMeshProUGUI playerName;
[SerializeField] Transform SpawnPoint;
void Start()
{
playerPool = FindObjectOfType<HumanPool>();
}
void updateListOfHumans()
{
SpawnPoint.DetachChildren();
for (var i = 0; i < playerPool.Humans.Count; i++)
{
Vector3 pos = new Vector3(0, 0, SpawnPoint.position.z);
playerName = PlayerInfo.GetComponentInChildren<TextMeshProUGUI>();
playerName.text = playerPool.Humans[i].name;
GameObject SpawnedItem = Instantiate(PlayerInfo, pos, SpawnPoint.rotation);
SpawnedItem.transform.SetParent(SpawnPoint, false);
}
}
void OnMouseDown()
{
updateListOfHumans();
}
我很确定,当我点击一个playerName(一个按钮的孩子)应该有一个onClick()函数会做一些事情。但是我不知道如何获得NPC的特定ID以及如何瞄准他/她。
下面是HumanPool的相关代码:
List<Human> humans = new List<Human>();
public List<Human> Humans { get { return humans; } }
人是在纯c#构造函数类中生成的:
public class Human {
public string name;
public Human(string name)
{
this.name = name;
}}
我是否应该在构造函数类中添加一个ID变量并使用它来点击目标NPC ?
我在这里遇到的最大问题是如何告诉玩家从列表中选择哪个NPC,以及他/她应该去那个建筑中工作。
很抱歉可能是糟糕的解释,但我真的希望它能让我在这里想做的事情有一些意义…非常新的Unity,所以任何帮助将非常感激。
谢谢!
我猜您使用的是UI.Button
组件。
在这种情况下,确实有onClick
事件,你可以简单地添加一个回调,例如
var human = playerPool.Humans[i];
var button = spawnedItem.GetComponentInChildren<Button>();
button.onClick.AddListener(() => OnClickedHuman(human));
// You also want to do this rather on the spawned item, not the prefab btw
var text = spawnedItem.GetComponentInChildren<TextMeshProUGUI>();
text.text = human.name;
,然后是
private void OnClickedHuman (Human human)
{
// Do what you want with human
Debug.Log($"Clicked on {human.name}!", this);
}