You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实例化预制体变形求助:敌人转向后火球拉伸异常

火球转向后拉伸变形的解决方案

问题分析

敌人转向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 03:25:06