对象与组件:一件物品怎样拥有能力
想象棋盘上有一个苹果。它有位置、图片、被点击的范围,以及“这是一级物品”的信息。Unity 通常把这些能力拆成组件,放到同一个 GameObject 上。
GameObject 是场景对象,组件赋予它具体能力。 这更像组合,而不是建立一个越来越大的继承树。
每个组件负责什么
| 组件 | 责任 | 不应顺带负责的事 |
|---|---|---|
| Transform | 位置、旋转、缩放和父子关系 | 合成是否合法 |
| SpriteRenderer | 在世界空间显示 2D 图片 | 发广告奖励 |
| Collider2D | 提供 2D 检测形状 | 自动完成所有点击逻辑 |
| 自定义物品视图脚本 | 显示等级、响应交互 | 直接决定服务器资产结算 |
UI 中经常用 Image 显示图片,而不是 SpriteRenderer;对应变换通常是 RectTransform。选用哪一套,要看物品存在于世界场景还是 Canvas 界面中。本手册的网格合成案例优先使用 Canvas 内的物品视图。
一个可看懂的组件
下面是独立教学组件。依赖 Unity 的 2D Sprite 系统;把它挂到带 SpriteRenderer 的物体上,在 Inspector 填好引用。它只负责改变可见颜色,不包含完整合成规则。
using UnityEngine;
public sealed class ItemView : MonoBehaviour
{
[SerializeField] private SpriteRenderer spriteRenderer;
[SerializeField] private Color selectedColor = Color.yellow;
private Color initialColor;
private void Awake()
{
if (spriteRenderer == null)
{
Debug.LogError("ItemView 缺少 SpriteRenderer 引用", this);
enabled = false;
return;
}
initialColor = spriteRenderer.color;
}
public void SetSelected(bool selected)
{
if (spriteRenderer == null) return;
spriteRenderer.color = selected ? selectedColor : initialColor;
}
}
MonoBehaviour 让该类可以作为 Unity 组件。[SerializeField] 让私有字段参与 Unity 序列化并在 Inspector 配置。它不是自动注入;引用仍需你设置。
这里缓存初始颜色,避免取消选中时一律改成白色,破坏美术配置。如果其他系统也会改颜色,应进一步明确哪一方拥有最终显示状态。
对象之间怎样找到彼此
已知且稳定的依赖,优先通过 Inspector 引用;同对象上的必要组件可以在初始化时用 GetComponent 获取。需要动态创建时,由创建者把数据或依赖传进去。
不要在每帧遍历全场景寻找按钮或物品。它不仅浪费,还让对象重命名、场景切换和加载顺序变成隐含依赖。调试时能在 Inspector 看见的连接,通常比“某处自动找到了”更容易解释。
激活、禁用和销毁不是一回事
GameObject 的 SetActive(false) 会让该对象及其有效子层级失活;禁用一个组件只影响该组件对应的行为。Destroy 则安排对象销毁。失活不意味着资产和业务状态已清空。
所以物品进入对象池时,除隐藏外,还要重置选择态、动画、数据绑定和事件。详见性能与对象池。
给 AI 的任务方式
请列出该对象的组件清单,分别解释职责、序列化引用和生命周期。规则数据不以图片或 Transform 为唯一来源;缺少必要引用时给出明确日志。
验收时,不仅看“画面出现了”,还要把必要引用清空一次,确认错误能够被定位。参考:组件模型。