实例化预制体变形求助:敌人转向后火球拉伸异常
火球转向后拉伸变形的解决方案
问题分析
敌人转向90度时火球出现宽度拉伸,预制体缩放未改动,核心原因是实例化的火球继承了FireballBox的非均匀缩放/层级变换影响,或者旋转逻辑导致模型缩放和运动方向不匹配。
修复方案
1. 实例化时脱离父物体缩放影响
在生成火球时,强制重置其缩放为预制体原始值,并脱离父物体的层级继承,避免FireballBox的变换传递给火球:
修改Fireball脚本,抽出生成火球的方法并添加缩放重置逻辑:
public class Fireball : MonoBehaviour { public int Speed; private GameObject FBPrefab; [SerializeField] private float hitCooldown = 1.5f; public float cooldown = 0; public float attackSpeed = 1f; [SerializeField] private Vector3 originalFireballScale; void Start() { FBPrefab = Resources.Load("Fireball1") as GameObject; if (FBPrefab != null) originalFireballScale = FBPrefab.transform.localScale; } void Update() { if (cooldown > -0.5) cooldown -= Time.deltaTime; if (cooldown <= 0) { SpawnFireball(); cooldown = hitCooldown * attackSpeed; } } public void Shoot() { if (cooldown <= 0) { SpawnFireball(); cooldown = hitCooldown * attackSpeed; } } private void SpawnFireball() { GameObject newArrow = Instantiate(FBPrefab, transform.position, transform.rotation); // 脱离父物体,避免继承缩放/旋转层级 newArrow.transform.SetParent(null); // 强制设置为预制体原始缩放 newArrow.transform.localScale = originalFireballScale; Rigidbody rb = newArrow.GetComponent<Rigidbody>(); if (rb != null) rb.velocity = transform.forward * Speed; Destroy(newArrow, 2); } }
2. 修正火球旋转逻辑,保持缩放稳定
修改FireballRotation脚本,让火球跟随速度方向旋转,同时锁定原始缩放,避免旋转导致的视觉变形:
public class FireballRotation : MonoBehaviour { Rigidbody rb; private Vector3 originalScale; void Start() { rb = GetComponent<Rigidbody>(); // 保存预制体的原始缩放 originalScale = transform.localScale; } void Update() { // 当火球有移动速度时,朝向速度方向 if (rb != null && rb.velocity.magnitude > 0.1f) { transform.rotation = Quaternion.LookRotation(rb.velocity); // 强制重置缩放,防止继承父物体的非均匀缩放 transform.localScale = originalScale; } } }
3. 额外排查步骤
- 检查FireballBox的Inspector面板,确保其
localScale为(1,1,1),非均匀缩放会传递给子物体导致变形; - 确认火球预制体的碰撞体(如CapsuleCollider)与模型缩放匹配,碰撞体缩放异常也会造成视觉拉伸错觉;
- 若火球模型有动画,检查动画是否包含缩放关键帧,避免动画导致的变形。
内容的提问来源于stack exchange,提问作者KitPolosa
相关产品推荐
相关产品推荐

