父子节点:建立两个不同的坐标中心

PlayerRoot 表示角色在游戏规则中的位置;Visual 表示角色图片相对这个位置怎样摆放。
用父子节点“移动轴点”的本质不是改变 Sprite 原本的 Pivot,而是建立第二层坐标系:
  • PlayerRoot 的原点作为稳定的逻辑和物理中心。
  • Visual.localPosition 保存画面相对逻辑中心的偏移。
  • 父节点移动时 Visual 跟随;Visual 自己偏移时不会改变父节点的位置。
因此动画帧中的刀光、透明留白或人物姿势即使变化,角色的移动基准和碰撞中心仍可保持稳定。

Transform:对象及其坐标系

Transform 保存 Position、Rotation、Scale 和父子关系。
  • position:相对世界原点的位置。
  • localPosition:相对父节点的位置。
  • rotation:世界空间旋转。
  • localRotation:相对父节点旋转。
  • localScale:相对父节点缩放。
父子结构的核心是坐标变换会逐层组合。Visual 的局部变换最终会和 PlayerRoot 的世界变换组合成画面实际位置。

SpriteRenderer:把 Sprite 变成画面

SpriteRenderer 从 Sprite 取得纹理区域、Pivot 和网格,再用 Transform 与 Material 把它绘制到场景中。
  • Sprite:当前绘制的 Sprite。
  • Color:与原图颜色相乘,也控制整体透明度。
  • Flip X / Flip Y:只镜像 Renderer 的画面。
  • Material:决定 Shader 和渲染方式。
  • Sorting Layer:所属的渲染分组。
  • Order in Layer:同一分组内的前后顺序。
Draw Mode:
  • Simple:直接绘制 Sprite 原始区域。
  • Sliced:依据 Border 进行九宫格拉伸。
  • Tiled:依据 Border 重复铺设。
SpriteRenderer 只负责渲染,不决定角色的物理位置和碰撞范围。

Animator:按照时间修改组件属性

Animator 播放 Animation Clip。Clip 的本质是一组“属性随时间变化”的记录。
角色逐帧动画通常让 SpriteRenderer.Sprite 随时间切换。Animator 并不移动图片文件,而是在不同时间给 SpriteRenderer 指定不同的 Sprite 子资源。
如果 Clip 记录了 PlayerRoot.position,播放动画就会同时修改角色真实位置。视觉上的微小偏移应记录到 Visual.localPosition,使动画只影响画面层。

Rigidbody2D:物理系统中的角色状态

Rigidbody2D 让 GameObject 进入 2D 物理模拟,保存速度、角速度、质量和重力等物理状态。
  • Dynamic:由物理系统模拟,受到重力、力和碰撞响应影响。
  • Kinematic:主要由脚本控制运动,不按普通 Dynamic 方式响应外力。
  • Static:固定不动,作为地面或墙壁等静态碰撞对象。
Gravity Scale 控制重力影响;Constraints 中的 Freeze Rotation Z 可以阻止角色在屏幕平面内被撞倒。
Rigidbody2D 应放在 PlayerRoot,因为物理位置应当对应稳定的角色逻辑中心,而不是不断变化的角色画面。

Collider2D:定义可发生接触的空间范围

Collider2D 描述物理系统用来检测接触的形状,本身不负责显示。
  • BoxCollider2D:矩形。
  • CapsuleCollider2D:胶囊形,更接近站立人物。
  • CircleCollider2D:圆形。
  • PolygonCollider2D:自定义多边形轮廓。
角色 Collider 的本质是游戏规则中的身体范围,不是对每一帧图片轮廓的精确复制。Collider 放在 PlayerRoot 后,Visual 换帧和偏移不会让身体碰撞范围跟着抖动。

组件分工的本质

PlayerController 产生控制意图;Rigidbody2D 保存和更新物理运动;Collider2D 定义接触范围;Animator 按时间修改动画属性;SpriteRenderer 绘制当前帧;Transform 把这些结果组合到场景坐标中。
把这些职责放在正确层级,是为了让视觉变化不会意外改动物理状态。