Unity:Surface Effector 2D(表面效应器 2D)
目录
什么是表面效应器 2D?
🎯 它是做什么的?
🧪 从第一性原理解释它是怎么工作的
📦 重要参数解释
为什么不直接用 Rigidbody(刚体)来控制运动 ?
所以什么时候该用哪个?
一个小例子(滑雪坡)
⚠️ 使用技巧和注意事项
什么是表面效应器 2D?
Surface Effector 2D 是一个会沿着表面施加力的组件,用来让物体在上面自动滑动或运动。
换句话说,它就像是一个会主动“推动”在它上面的东西向某个方向滑动的表面。
🎯 它是做什么的?
Surface Effector 2D 主要用在下面这些地方:
-
制作 传送带(物体放上去自己动)
-
制作 滑雪坡 或 水滑道(滑板、人物会自动沿地面滑动)
-
做 流水 或 风力效果(模拟表面流体推动作用)
它是 基于物理的力作用器,不会直接改物体位置,而是通过 施加力或速度 来影响物体运动。
🧪 从第一性原理解释它是怎么工作的
我们要先明白:Unity 中所有基于 2D 物理的交互,底层其实都归结为「力(force)与摩擦(friction)」的系统。
⚙️ Surface Effector 2D 具体做了什么?
-
它依附于一个 Collider 2D(通常是 Box Collider 2D 或 Edge Collider 2D),表示一个“表面”。
-
在这个表面上的刚体(Rigidbody 2D)接触到它之后:
-
它会对接触体施加一个 沿着表面切线方向的速度(不是力)
-
可以让物体沿表面自动滑动或被传送
-
-
表面本身也可以设定摩擦力,这决定了物体在滑动时会不会很容易停下来。
📦 重要参数解释
参数 | 中文解释 | 类比 |
---|---|---|
Speed | 施加在接触刚体上的滑动速度(单位是单位/秒) | 像传送带的移动速度 |
Force Scale | 控制速度施加的强度(0 到 1) | 越小越容易被摩擦抵消 |
Use Contact Force | 是否仅对正在接触的物体施加速度 | 打开 = 必须贴着它才滑动;关闭 = 离它近也可能受影响 |
Collider | 通常你需要用一个 Collider(Box/Edge)挂上这个 Effector 才能起效 | 像地面或者传送带的形状 |
为什么不直接用 Rigidbody(刚体)来控制运动 ?
Rigidbody 是“谁要动”;Surface Effector 是“环境让你动”。
Rigidbody 2D(刚体):
-
是“运动的物体自身”;
-
它自己根据外力(力、速度、碰撞等)来决定运动方式;
-
如果你用脚本或输入控制它,比如
AddForce()
、velocity = ...
,你是在主动让它动。
举例:
rb.velocity = new Vector2(10f, 0f); // 主动让物体向右跑
这就像是你在操控一个滑板车:你踩一下滑板车,它就动了。它的运动完全取决于你输入的命令或外力。
Surface Effector 2D:
-
是“作用在地面或表面上的运动影响器”;
-
它不会直接控制物体,而是对接触到它的物体施加表面速度;
-
被影响的物体必须要有 Rigidbody,才能接收这个“滑动影响”。
📦 举例:
你做了一个斜坡(Edge Collider),挂上 Surface Effector 2D,速度设置为 5。任何带 Rigidbody2D 的物体只要碰到这个坡,就像站在传送带上,自动往下滑。你不需要写任何代码控制物体本身!
所以什么时候该用哪个?
用 Rigidbody:
-
玩家控制角色的输入(跳、跑)
-
敌人 AI 自主运动
-
飞行、跳跃、被弹起、加速等复杂运动逻辑
用 Surface Effector 2D:
-
自动传送带
-
滑雪道或滑梯(角色自动滑动)
-
模拟流体(比如水流、冰面、风吹)
一个小例子(滑雪坡)
你做一个滑雪游戏,角色是一块带有 Rigidbody2D 的滑板。
你画了一条山坡轨迹(比如用 Edge Collider 2D),然后加一个 Surface Effector 2D:
-
设置
Speed = 10
-
设置
Force Scale = 1
-
确保角色的 Collider 是和山坡发生接触
👉 效果:滑板放上去,不需要控制,它就会自动“顺着坡”滑下来!
⚠️ 使用技巧和注意事项
-
Collider 必须启用
Used By Effector
否则挂了 Surface Effector 也不会生效。
-
刚体必须有摩擦或贴近接触
如果 Rigidbody2D 与表面没有实际“贴上”,就不会被施加速度。
-
Effector 不会自动旋转速度方向
它的滑动方向是 沿着 Collider 局部坐标系的 X 轴方向,所以如果你的地面是倾斜的,就会根据局部 X 向施加速度。