跳到主要内容

对象与组件:一件物品怎样拥有能力

想象棋盘上有一个苹果。它有位置、图片、被点击的范围,以及“这是一级物品”的信息。Unity 通常把这些能力拆成组件,放到同一个 GameObject 上。

GameObject 是场景对象,组件赋予它具体能力。 这更像组合,而不是建立一个越来越大的继承树。

物品 GameObject 组合 Transform、SpriteRenderer、Collider2D 与业务脚本的示意

每个组件负责什么​

组件责任不应顺带负责的事
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 为唯一来源;缺少必要引用时给出明确日志。

验收时,不仅看“画面出现了”,还要把必要引用清空一次,确认错误能够被定位。参考:组件模型。