Unity攻击时碰撞器翻转异常问题求助
问题分析与解决方案
你的核心问题是误用全局坐标(transform.position)调整子物体位置,碰撞器作为玩家的子物体,必须用局部坐标(transform.localPosition)控制,才能保证所有偏移都是相对于玩家自身的,不会出现绕全局轴翻转的异常。另外当前代码里判断attackOffset.y正负的逻辑完全错误——attackOffset存储的是全局位置,和玩家自身的朝向、偏移毫无关联。
修正思路
- 放弃全局坐标,改用**局部坐标(
localPosition)**管理碰撞器相对于玩家的位置 - 预先存储碰撞器的初始局部偏移,避免每次读取全局位置
- 直接根据攻击方向设置对应的局部偏移,不需要判断全局位置的正负
修改后的代码
using UnityEngine; public class VerticalSword : MonoBehaviour { Collider2D AttackColliderVertical; // 存储碰撞器相对于玩家的初始局部偏移 Vector2 initialLocalOffset; private void Start() { AttackColliderVertical = GetComponent<Collider2D>(); // 记录初始局部位置(相对于父物体玩家的偏移) initialLocalOffset = transform.localPosition; AttackColliderVertical.enabled = false; } public void AttackUp() { AttackColliderVertical.enabled = true; // 设置向上攻击的局部位置:保持x偏移,y偏移用初始值的正方向 transform.localPosition = new Vector2(initialLocalOffset.x, Mathf.Abs(initialLocalOffset.y)); print("Attack up successful"); } public void AttackDown() { AttackColliderVertical.enabled = true; // 设置向下攻击的局部位置:保持x偏移,y偏移用初始值的负方向 transform.localPosition = new Vector2(initialLocalOffset.x, -Mathf.Abs(initialLocalOffset.y)); print("Attack down successful"); } public void StopAttack() { AttackColliderVertical.enabled = false; // 攻击结束后重置回初始位置(可选) transform.localPosition = initialLocalOffset; } }
额外优化建议
- 如果攻击需要的是碰撞器镜像翻转而非位置偏移,可以直接修改
transform.localScale的y值,比如transform.localScale = new Vector3(1, -1, 1),这种方式更高效 - 可以把攻击偏移值做成可序列化变量(添加
[SerializeField]),直接在Unity编辑器里调整,不用硬编码
内容的提问来源于stack exchange,提问作者Wizard Gamireal
相关产品推荐
相关产品推荐

