如何在Unity与C#中实现2D物体下蹲效果?
2D物体下蹲(Y轴缩小)实现方案
核心逻辑
别硬套冲刺代码的逻辑,下蹲本质就是修改物体Transform组件的**本地缩放(localScale)**的Y值,直接针对Transform操作就行。
基础可用代码
直接把这个脚本挂到你的2D物体上,调整参数就能用:
using UnityEngine; public class PlayerCrouch : MonoBehaviour { [Header("下蹲参数")] public float defaultYScale = 1f; // 站立时的Y轴缩放 public float crouchYScale = 0.5f; // 下蹲时的Y轴缩放 public KeyCode crouchKey = KeyCode.LeftControl; // 触发下蹲的按键 private Transform playerTrans; void Start() { // 提前获取Transform,避免每帧调用GetComponent浪费性能 playerTrans = GetComponent<Transform>(); } void Update() { // 按住按键时下蹲,松开恢复 if (Input.GetKey(crouchKey)) { // 只修改Y轴,保持X、Z轴缩放不变 playerTrans.localScale = new Vector3(playerTrans.localScale.x, crouchYScale, playerTrans.localScale.z); } else { playerTrans.localScale = new Vector3(playerTrans.localScale.x, defaultYScale, playerTrans.localScale.z); } } }
你之前大概率踩的坑
- 找错了修改对象:如果之前拿
SpriteRenderer或者其他组件改缩放,肯定没用——缩放属性属于Transform,不是渲染组件。 - 用错了缩放属性:误改
transform.scale(世界空间缩放)而不是localScale(本地空间缩放),如果物体有父物体,世界缩放会受父物体影响导致效果异常。 - 输入逻辑错了:用
GetKeyDown(只触发一次)代替GetKey(持续检测按住),导致缩放只跳一下就停了。 - 平滑过渡搞砸了:如果想做渐变下蹲,直接赋值改成插值就行,比如把Update里的替换成:
if (Input.GetKey(crouchKey)) { float targetY = crouchYScale; playerTrans.localScale = Vector3.Lerp(playerTrans.localScale, new Vector3(playerTrans.localScale.x, targetY, playerTrans.localScale.z), Time.deltaTime * 5f); } else { float targetY = defaultYScale; playerTrans.localScale = Vector3.Lerp(playerTrans.localScale, new Vector3(playerTrans.localScale.x, targetY, playerTrans.localScale.z), Time.deltaTime * 5f); }
无报错但没效果的排查点
- 确认脚本已经挂到目标2D物体上。
- 检查
defaultYScale和crouchYScale是不是设了不同的值(别都是1)。 - 看下蹲按键是不是和代码里的设置一致(比如你按的是右Ctrl,但代码里设的左Ctrl)。
- 如果物体有父物体,暂时把父物体缩放改成(1,1,1)试试,避免父缩放干扰本地缩放。
内容的提问来源于stack exchange,提问作者stab
相关产品推荐
相关产品推荐

