#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. Вау, как ты это понял? Я никогда не узнаю об этом сам!