如果应用了力,则Unity中的合并GameObject在SetActive之后会自行销毁

问题描述

当我从创建的对象列表中检索一个对象并重新激活它时,它会自我毁灭,但前提是我施加了力量使其开始移动。如果我从不施加压力,一切都会按预期进行,并且我可以不断地反复激活该对象。

  • 我尝试将debug.log放到OnCollision中,它不会与任何东西发生碰撞。
  • 如上所述,如果我从不提速,其余的都可以。
  • 施加速度时,第一个弹丸起作用,第二个弹丸自我毁灭。
  • 我尝试手动激活它们,而不是通过代码激活它们。结果相同。
  • 例外:如果我自己通过检查器手动激活/停用对象,那么如果我在池中只有1张照片,则它们会起作用。
  • 如果我通过代码做到这一点,那么一枪不行。即使我只有一枪,它也会中断。
  • 当我不使用缓冲池时,所有代码都能正常工作。

生成代码

    void CreateBullet(int GunID)
{
    GameObject ShotFired = Guns[GunID].GetComponent<Weapon>().FireWeapon();

    if (ShotFired == null)
    {
        ShotFired = Instantiate(Guns[GunID].GetComponent<Weapon>().Projectile,Guns[GunID].gameObject.transform);
        Physics.IgnoreCollision(ShotFired.GetComponent<SphereCollider>(),Guns[GunID].GetComponentInParent<CapsuleCollider>());
        Guns[GunID].GetComponent<Weapon>().AmmoPool.Add(ShotFired);
    }


    ShotFired.transform.position = Guns[GunID].transform.position; 
    ShotFired.transform.rotation = Guns[GunID].transform.rotation;

    ShotFired.SetActive(true);
}

弹道代码

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mirror;

public class Projectile : NetworkBehavIoUr
{
    public float Speed;
    public float LifeTime;
    public float damagePower;

    public GameObject ExplosionFX;

    // Start is called before the first frame update
    void Start()
    {
        GetComponent<Rigidbody>().AddRelativeForce(Vector3.up * Speed,ForceMode.VeLocityChange);
        StartCoroutine(DeactivateSelf(5.0f));
    }

    private void OnDestroy()
    {
        Debug.Log("WHY!");
    }

    IEnumerator DeactivateSelf(float Sec)
    {
        yield return new WaitForSeconds(Sec);
        Explode();
    }

    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.GetComponentInChildren<Vehicle>())
        {
            collision.gameObject.GetComponentInChildren<Vehicle>().CmdTakedamage(damagePower);
        }

        Explode();
    }

    void Explode()
    {
        GameObject ExplosionEvent = Instantiate(ExplosionFX,this.transform.position,Quaternion.identity);
        NetworkServer.Spawn(ExplosionEvent);
        GetComponent<Rigidbody>().AddRelativeForce(Vector3.zero);

        gameObject.SetActive(false);
    }
}

欢迎任何想法。预先感谢!

解决方法

万一其他人偶然发现,这就是发生了什么,为什么给物体分配移动速度才是导致问题的原因。

我的投射物上面有个“尾标”。

默认情况下,“自动销毁”为true。

自动销毁不会销毁轨迹,但会破坏轨迹消失时的游戏对象。因此,如果您禁用所有具有轨迹的东西,并通过移动将其激活,则当对象停止移动(例如重新放置在对象池中)时,它将破坏父对象。

如果该对象永不移动,则它永远不会生成轨迹,也不需要销毁。

要修复,只需取消选中自动销毁即可。

https://docs.unity3d.com/ScriptReference/TrailRenderer-autodestruct.html