首页 文章

Unity:将粒子系统更改为池

提问于
浏览
1

我正在尝试将粒子系统功能更改为池,而不是每次都实例化 . 我想重用粒子 . 怎么可能?我不知道如何开始,虽然我看了团结教程,但不知怎的,它仍然不清楚 . 也许是因为我在其他类中调用粒子系统函数,这让我感到困惑 .

public ParticleSystem[] Myeffects;


public void Particle(int particleNum, Vector3 Pos)
{
    if (Myeffects != null && Myeffects[particleNumber] != null )
    {
        if (Myeffects[particleNumber].isPlaying)
            Myeffects[particleNumber].Stop();

        ParticleSystem temp = Instantiate(Myeffects[particleNum], particlePos, new Quaternion()) as ParticleSystem;

        temp.Play();
    }
}
}

1 回答

  • 2

    首先,选择粒子系统预制件/ TNT,然后确保未选中 Play On Awake . 下面的池脚本是专门用来实现它的棘手方法 . 它将创建一个 ParticleSystem 数组,然后重新使用它们 . 请注意 ParticlePoolMonoBehaviour 继承 not ,因此请确保直接复制它 .

    using UnityEngine;
    using System.Collections;
    using System;
    
    public class ParticlePool
    {
        int particleAmount;
        ParticleSystem[] NormalParticle;
        ParticleSystem[] TNTParticle;
    
        public ParticlePool(ParticleSystem normalPartPrefab, ParticleSystem tntPartPrefab, int amount = 10)
        {
            particleAmount = amount;
            NormalParticle = new ParticleSystem[particleAmount];
            TNTParticle = new ParticleSystem[particleAmount];
    
            for (int i = 0; i < particleAmount; i++)
            {
                //Instantiate 10 NormalParticle
                NormalParticle[i] = GameObject.Instantiate(normalPartPrefab, new Vector3(0, 0, 0), new Quaternion()) as ParticleSystem;
    
                //Instantiate 10 TNTParticle
                TNTParticle[i] = GameObject.Instantiate(tntPartPrefab, new Vector3(0, 0, 0), new Quaternion()) as ParticleSystem;
            }
        }
    
        //Returns available GameObject
        public ParticleSystem getAvailabeParticle(int particleType)
        {
            ParticleSystem firstObject = null;
    
            //Normal crate
            if (particleType == 0)
            {
                //Get the first GameObject
                firstObject = NormalParticle[0];
                //Move everything Up by one
                shiftUp(0);
            }
    
            //TNT crate
            else if (particleType == 1)
            {
                //Get the first GameObject
                firstObject = TNTParticle[0];
                //Move everything Up by one
                shiftUp(1);
            }
    
            return firstObject;
        }
    
        //Returns How much GameObject in the Array
        public int getAmount()
        {
            return particleAmount;
        }
    
        //Moves the GameObject Up by 1 and moves the first one to the last one
        private void shiftUp(int particleType)
        {
            //Get first GameObject
            ParticleSystem firstObject;
    
            //Normal crate
            if (particleType == 0)
            {
                firstObject = NormalParticle[0];
                //Shift the GameObjects Up by 1
                Array.Copy(NormalParticle, 1, NormalParticle, 0, NormalParticle.Length - 1);
    
                //(First one is left out)Now Put first GameObject to the Last one
                NormalParticle[NormalParticle.Length - 1] = firstObject;
            }
    
            //TNT crate
            else if (particleType == 1)
            {
                firstObject = TNTParticle[0];
                //Shift the GameObjects Up by 1
                Array.Copy(TNTParticle, 1, TNTParticle, 0, TNTParticle.Length - 1);
    
                //(First one is left out)Now Put first GameObject to the Last one
                TNTParticle[TNTParticle.Length - 1] = firstObject;
            }
        }
    }
    

    然后,您的 ParticleHolder 脚本应使用以下代码进行更新 . 而已 . 没有更多的实例化 .

    public class ParticleHolder : MonoBehaviour
    {
    
        public ParticleSystem[] effects;
        ParticlePool particlePool;
    
        void Start()
        {
            // 0 = Normal crate
            // 1 = TNT crate
            particlePool = new ParticlePool(effects[0], effects[1], 5);
        }
    
        public void playParticle(int particleType, Vector3 particlePos)
        {
            ParticleSystem particleToPlay = particlePool.getAvailabeParticle(particleType);
    
            if (particleToPlay != null)
            {
                if (particleToPlay.isPlaying)
                    particleToPlay.Stop();
    
                particleToPlay.transform.position = particlePos;
                particleToPlay.Play();
            }
    
        }
    }
    

相关问题