如果要创建动态 UI,使 UI 元素根据用户操作或游戏中的其他操作来显示、消失或变化,则可能需要创建基于自定义逻辑来实例化新 UI 元素的脚本。
为了能够轻松地动态实例化 UI 元素,第一步是为希望能够实例化的 UI 元素类型创建预制件。首先设置 UI 元素,使其在场景中具有所需的显示效果,然后将该元素拖动到 Project 视图中以使其成为预制件。
例如,按钮的预制件可以是具有图像组件和按钮组件的游戏对象以及具有文本组件的子游戏对象。根据需求不同,设置可能会有所不同。
您可能想知道为什么我们没有提供 API 方法来创建各种类型的控件(包括视觉效果和所有内容)。原因在于,比如对于按钮而言,有无数种设置方式。该控件使用图像、文本还是两者兼而有之?甚至可能使用多个图像?文本字体、颜色、字体大小和对齐方式是什么?图像应该使用哪个精灵或哪些精灵?通过创建预制件并对其进行实例化,即可完全按照所需的方式进行设置。如果稍后想更改 UI 的外观,只需更改预制件,然后更改就会反映在 UI 中,包括动态创建的 UI。
UI 元素的预制件由 Instantiate 方法进行正常实例化。在设置实例化的 UI 元素的父项时,建议使用 Transform.SetParent 方法并将 worldPositionStays 参数设置为 false。
UI 元素通常借助其矩形变换 (Rect Transform) 定位。如果 UI 元素是布局组的子元素,则会自动定位,因此可跳过定位步骤。
在定位矩形变换时,首先应确定其是否具有或应该具有任何拉伸行为,这种做法很有用。当 anchorMin 和 anchorMax 属性不相同时,便会发生拉伸行为。
对于非拉伸的矩形变换,设置位置最轻松的方法是设置 anchoredPosition 和 sizeDelta 属性。anchoredPosition 指定了轴心相对于锚点的位置。sizeDelta 与没有拉伸时的大小相同。
对于拉伸的矩形变换,使用 offsetMin 和 offsetMax 属性来设置位置可能更简单。offsetMin 属性指定了矩形左下角相对于左下锚点的角点。offsetMax 属性指定了矩形右上角相对于右上锚点的角点。
如果要动态实例化多个 UI 元素,通常不太可能希望它们看起来都相同并执行相同的操作。无论是菜单中的按钮、库存中的商品还是其他元素,可能都希望具体项目具有不同的文本或图像,并在与之交互时执行不同的操作。
实现此目标的方法是获取各种组件并更改其属性。请参阅图像和文本组件的脚本参考,了解如何通过脚本处理 UnityEvent。