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