Объединенный игровой объект в Unity уничтожает себя после SetActive, если применяется сила

#unity3d #destroy #object-pooling

#unity3d #уничтожить #объединение объектов

Вопрос:

Когда я извлекаю объект из списка созданных объектов и повторно активирую его, он уничтожает себя, но только если я применил силу, чтобы начать его перемещение. Если я никогда не применяю силу, все работает так, как задумано, и я могу продолжать активировать объект снова и снова.

  • Я попытался выполнить отладку.войдите в 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);
    }
}
  

Любые мысли приветствуются. Заранее спасибо!

Комментарии:

1. Это единственный сценарий? Нет других, которые могли бы что-нибудь уничтожить?

2. Правильно. Я выполнил поиск в Destroy.object на всякий случай, и ничто другое в коде не уничтожает его.

3. Можете ли вы опубликовать минимальный проект на github, чтобы мы могли увидеть его полностью?

4. Я только что понял, что это «своего рода». В этом случае это компонент TrailRender. Если я сниму его с объекта, скрипт и все будет работать. Включите его… бум. Если я помещаю след в дочерний объект, я не получаю сообщение об ошибке, но у новых снарядов нет следа. Я немного повозлюсь с этим, и если я не смогу разобраться с этим завтра, я создам минимальную версию, чтобы показать проблему напрямую.

Ответ №1:

На случай, если кто-нибудь еще наткнется на это, вот что произошло и почему причиной проблемы стало присвоение скорости перемещения объекту.

На моих снарядах был ‘trailrenderer’.

По умолчанию значение ‘Autodestruct’ равно true.

Автоматическое уничтожение уничтожает не след, а игровой объект, когда след исчезает. Поэтому, если вы отключите все, что имело след, и активируете его с помощью движения, когда объект перестанет двигаться (скажем, для перемещения в пуле объектов), он уничтожит родительский объект.

Если объект никогда не перемещается, он никогда не создает след и его никогда не нужно уничтожать.

Чтобы исправить, просто снимите флажок автоуничтожение.

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

Комментарии:

1. Вау, как ты это понял? Я никогда не узнаю об этом сам!