Unity游戏商店:如何检测列表中被点击的GameObject并引用?
游戏商店物品点击检测与属性获取实现方案
核心逻辑
不管使用哪种游戏引擎,核心思路都是将显示元素与对应物品数据绑定,点击时直接读取绑定的数据属性:
- 给每个商店物品的显示单元(UI按钮、3D模型、2D精灵等)关联对应的物品数据对象
- 为显示单元绑定点击事件,触发时从绑定的数据中提取属性并展示到屏幕上
Unity 实现示例
1. 定义物品数据类
[System.Serializable] public class ShopItem { public string itemName; public int price; public string description; // 可按需扩展属性,如图标、物品类型等 }
2. 编写物品UI绑定脚本
给每个商店物品的UI项(带Button组件的节点)挂载该脚本:
using UnityEngine; using UnityEngine.UI; public class ShopItemUI : MonoBehaviour { // 绑定对应的物品数据 public ShopItem itemData; // 引用详情展示UI控件 public Text detailNameText; public Text detailPriceText; public Text detailDescText; void Start() { // 初始化显示物品基础信息 GetComponentInChildren<Text>().text = $"{itemData.itemName} - ${itemData.price}"; // 绑定点击事件 GetComponent<Button>().onClick.AddListener(OnItemClicked); } void OnItemClicked() { // 点击后展示完整属性 detailNameText.text = itemData.itemName; detailPriceText.text = $"价格: ${itemData.price}"; detailDescText.text = itemData.description; } }
3. 列表生成与数据绑定
在商店列表的生成逻辑中,给每个实例化的UI项的itemData赋值列表中的对应元素即可。
Godot 实现示例
1. 定义物品数据类
创建ShopItem.gd脚本:
class_name ShopItem var item_name: String var price: int var description: String
2. 编写物品UI按钮脚本
给每个商店物品的Button节点挂载该脚本:
extends Button # 绑定对应的物品数据 @export var item_data: ShopItem # 引用详情面板的控件 @onready var detail_name = $"/root/ShopUI/DetailPanel/NameLabel" @onready var detail_price = $"/root/ShopUI/DetailPanel/PriceLabel" @onready var detail_desc = $"/root/ShopUI/DetailPanel/DescLabel" func _ready(): # 初始化显示基础信息 text = $"{item_data.item_name} - ${item_data.price}" # 绑定点击信号 pressed.connect(_on_item_clicked) func _on_item_clicked(): # 展示物品属性 detail_name.text = item_data.item_name detail_price.text = $"价格: ${item_data.price}" detail_desc.text = item_data.description
自定义渲染场景(非UI组件)的射线检测方案
如果商店物品是3D模型或自定义2D精灵,可通过射线检测判断点击目标:
以Unity 3D为例:
void Update() { if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hit)) { // 获取点击物体上的物品数据绑定脚本 ShopItemUI itemBinder = hit.collider.GetComponent<ShopItemUI>(); if (itemBinder != null) { ShowItemDetails(itemBinder.itemData); } } } } void ShowItemDetails(ShopItem item) { // 实现详情展示逻辑,如更新UI文本、显示图标等 }
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

