gpt4 book ai didi

c# - 动态创建的游戏对象与数据(作为类实例)之间的关系

转载 作者:太空宇宙 更新时间:2023-11-03 12:49:58 24 4
gpt4 key购买 nike

标题可能晦涩难懂;但没有找到更好的解释方式。

场景是这样的:我在运行时创建了一个“狗”类实例的列表。每个狗实例都有一个名称和几个参数(简化问题的抽象示例)。

现在,当应用程序运行时,我有一个预制件,它基本上是一个面板,带有一个按钮,就像标准 iOS 控件中的单元格一样。当预制件加载到场景中时,它会为狗实例列表中的每个条目创建单元格,因此每个单元格都会显示该实例的名称和参数。

到目前为止没有问题,但现在我想单击单元格以获取该类的相关数据。要做到这一点,Unity 中是否有一种简单的方法可以做到这一点,或者我是否必须向单元格预制件添加一个类型为“dog”的变量,因此当我循环遍历“dog”实例列表时,我分配每个每个单元格的实例?

我做了一些搜索,看看是否有某种标准方法可以将数据关联到 UI 控件;就像您在另一种视觉语言的控件中处理数据源一样,但没有发现与 Unity 有太多关系。

欢迎任何建议;我应该使用描述的方法还是有更好的方法?

最佳答案

包含狗数据的面板应该是按钮,以便您可以进行交互。

假设您创建了一个 Dog 集合,您将同时创建一个按钮集合:

void PopulatePanel(IEnumerable<Dog> dogs){
foreach (Dog dog in dogs){
// Unity requires that the object is stored in a local reference
// Otherwise, all buttons will link to last item
Dog tempDog = dog;
GameObject button = (GameObject) Instantiate(buttonPrefab);
// Name button with dog name
button.name = tempDog.Name;
// Get the Button component on the new button object
Button btn = button.GetComponent<Button>();
// On press of that newly created button, call the following method
btn.onClick.AddListener(()=>
{ Debug.Log(tempDog.Name+ " "+ tempDog.Race); });
//Different way passing a dog instance
btn.onClick.AddListener(()=> { UseDog(tempDog); });
}
}
void UseDog(Dog dog){
// Do stuff with dog object
}

确保在销毁狗或按钮时取消注册监听器。实际上,Unity 在调用死对象时不会抛出异常,而是让它保持事件状态(??!!)并以某种方式造成内存泄漏。因此,请确保您手动删除所有内容。这可能需要更多代码。

代码假定您有一个用于实例化的按钮预制件。如果您通过编辑器创建按钮,那么最好将它们放在一个集合中,您在循环中迭代并跳过实例化行。

编辑:当您遍历狗集合时,您创建了一个新按钮,带有一个 Button 组件,onClick 方法接收一个创建的新方法(lambda 表达式),该方法获取分配给它的 tempDog。因此,您通过该方法在当前按钮和当前狗之间创建了关系。我展示的两个 AddListener 做同样的工作,第二个可能更合适,因为您可以调试该方法。

关于c# - 动态创建的游戏对象与数据(作为类实例)之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35908421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com