public void UpdateBufferData(int index, ProjectileType projectileType, ProjectileData data)
        {
            if (projectileType.Index != LastAccessedProjectileTypeIndex)
            {
                LastAccessedProjectileTypeIndex = projectileType.Index;
                LastAccessedRenderer            = IndirectRenderers[LastAccessedProjectileTypeIndex];
            }

            LastAccessedRenderer.UpdateBufferData(projectileType.BufferIndex, data);
            projectileType.BufferIndex++;
        }
        public virtual void Start()
        {
            Interval = INTERVAL;

            // If projectile type is not set, use default
            if (ProjectileType == null)
            {
                ProjectileType = ProjectileManager.Instance.GetProjectileType(0);
            }

            m_speedSlowPercent = GameplayParameters.instance.SlowDownPercent;

            CustomEvents.EventUtil.AddListener(CustomEventList.PARAMETER_CHANGE, OnParameterChange);
            CustomEvents.EventUtil.AddListener(CustomEventList.SLOW_TIME, OnSlowTime);
        }
        void Initialize()
        {
            if (!Initialized)
            {
                // Grab a list of Projectile Types founds in assets folder "ProjectileTypes"
                GameObject[] projectileTypes = Resources.LoadAll <GameObject>("ProjectileTypes");
                ProjectileTypes        = new List <ProjectileType>();
                IndirectRenderers      = new Dictionary <int, IndirectRenderer>();
                ProjectileTypeCounters = new Dictionary <int, ProjectileTypeCounters>();

                // Process projectile types
                for (int n = 0; n < projectileTypes.Length; n++)
                {
                    ProjectileType type = projectileTypes[n].GetComponent <ProjectileType>();
                    type.SetIndex(n);
                    ProjectileTypes.Add(type);

                    // If material is set to be a static color ensure we do not send color data to shader
                    float isStaticFloat = type.Material.GetFloat("_StaticColor");
                    bool  isStatic      = false;
                    if (isStaticFloat == 1)
                    {
                        isStatic = true;
                    }

                    IndirectRenderers.Add(n, new IndirectRenderer(type.MaxProjectileCount, type.Material, type.Mesh, isStatic));
                    ProjectileTypeCounters.Add(n, new ProjectileTypeCounters());
                }


                EmittersArray = new ProjectileEmitterBase[MaxEmitters];

                // Get a list of all emitters in the scene
                RegisterEmitters();

                CustomEvents.EventUtil.AddListener(CustomEventList.GAME_PAUSED, OnGamePause);

                Initialized = true;
            }
        }