Unity中翻转Sprite时出现尺寸自动变化问题的技术求助
问题修复方案
根因定位
你的代码存在逻辑覆盖问题:
- 你预先定义了角色基准尺寸
scale = new Vector3(3, 3, 1f),但在翻转朝向时,直接将localScale赋值为Vector3.one(即尺寸1,1,1)和(-1,1,1),和你的基准尺寸不匹配 - Update方法最后一行的
transform.localScale = scale;会强制覆盖前面所有对localScale的修改,你前面写的翻转逻辑完全不生效,只会在每次输入变化的那一帧短暂生效,下一帧就被重置回固定尺寸,所以会出现尺寸突变的现象。
修复步骤
- 调整翻转时的尺寸赋值逻辑,基于你预设的基准scale变量修改X轴符号,不要写死固定值
- 删除Update方法末尾多余的
transform.localScale = scale;语句,避免覆盖翻转逻辑
修正后完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayeMoveLol : MonoBehaviour { [SerializeField] private float speed; private Rigidbody2D body; // 这里可以直接在Inspector面板调整角色整体大小,无需改代码 Vector3 scale = new Vector3( 3, 3, 1f ); private Animator anim; private void Awake() { body = GetComponent<Rigidbody2D>(); anim = GetComponent<Animator>(); // 初始化时先设置一次基准尺寸 transform.localScale = scale; } private void Update() { float horizontalinput = Input.GetAxis("Horizontal"); body.velocity = new Vector2(horizontalinput * speed, body.velocity.y); if (Input.GetKey(KeyCode.Space)) { body.velocity = new Vector2(body.velocity.x, speed / 3); } // 翻转逻辑适配基准尺寸 if (horizontalinput > 0.01f) { transform.localScale = new Vector3(scale.x, scale.y, scale.z); } if (horizontalinput < -0.01f) { transform.localScale = new Vector3(-scale.x, scale.y, scale.z); } anim.SetBool("running", horizontalinput != 0); // 删掉了原来覆盖翻转逻辑的赋值语句 } }
额外优化建议
如果不希望通过修改Scale翻转(避免后续影响子物体尺寸、碰撞体判定等问题),可以改用SpriteRenderer的flipX属性实现翻转,逻辑更安全:
- 先声明
private SpriteRenderer sr; - Awake里添加
sr = GetComponent<SpriteRenderer>(); - 翻转部分的逻辑替换为:
if (horizontalinput > 0.01f) { sr.flipX = false; } if (horizontalinput < -0.01f) { sr.flipX = true; }
这种方式完全不会修改transform的scale属性,不会触发尺寸变化问题,也不会影响子物体的缩放。
内容的提问来源于stack exchange,提问作者BrokeLol
相关产品推荐
相关产品推荐

