public ChangeWeaponMaterialLogic(VfxAction.ChangeWeaponMaterialVfx config, float timeToLive, Character caster, Environment environment)
        {
            this.config      = config;
            this.timeToLive  = timeToLive;
            this.caster      = caster;
            this.environment = environment;
            Entity entity = caster.GameObject().GetComponent <EntityReference>().Entity;
            CustomizeVisualComponent cvc = entity.GetComponent <CustomizeVisualComponent>();
            EquipmentCollectData     equipmentCollectData = cvc.EquipmentCollectData;

            if (equipmentCollectData == null)
            {
                material = environment.FindDefaultMaterialById(
                    caster.CharacterId(), config.id
                    );
            }
            else
            {
                material = environment.FindMaterialById(
                    caster.CharacterId(), equipmentCollectData.EquipmentConfigId.VisualId, config.id
                    );
            }

            if (material == null)
            {
                Interrupt();
                return;
            }

            EntityGameObjectComponent egoc = entity
                                             .GetComponent <EntityGameObjectComponent>();

            affectedRenderer = ((GameObjectComponent)egoc).WeaponRenderer;
            if (material != null)
            {
                originalMaterials         = new SsarTuple <Material, Material[]>(affectedRenderer.material, affectedRenderer.materials);
                affectedRenderer.material = material;
                List <Material> materials = new List <Material>();
                materials.Add(material);

                for (int kIndex = 0; kIndex < config.valueModifiers.Count; kIndex++)
                {
                    VfxAction.MaterialValueModifier mvm = config.valueModifiers[kIndex];
                    valueModifiers.Add(new ValueModifier(mvm, materials));
                }

                for (int kIndex = 0; kIndex < config.colorModifiers.Count; kIndex++)
                {
                    VfxAction.MaterialColorModifier mcm = config.colorModifiers[kIndex];
                    colorModifiers.Add(new ColorModifier(mcm, materials));
                }
            }
        }
        public AddMaterialLogic(VfxAction.AddMaterialVfx config, float timeToLive, Character caster)
        {
            this.config     = config;
            this.timeToLive = timeToLive;

            material = config.ShowMaterial();
            // DLog.Log("debug AddMaterialLogic material from config " + material.GetHashCode());

            EntityGameObjectComponent gameObjectComponent = caster.GameObject().GetComponent <EntityReference>().Entity.GetComponent <EntityGameObjectComponent>();
            IEnumerable <Renderer>    allRenderers        = ((GameObjectComponent)gameObjectComponent).RendererComponents;

            foreach (Renderer renderer in allRenderers)
            {
                if (!config.parent.Equals(ALL))
                {
                    if (!renderer.gameObject.name.Equals(config.parent))
                    {
                        continue;
                    }
                }

                affectedRenderers.Add(renderer);
                Material[] materials = new Material[renderer.sharedMaterials.Length + 1];
                materials[renderer.sharedMaterials.Length] = material;
                for (int i = 0; i < renderer.sharedMaterials.Length; i++)
                {
                    materials[i] = renderer.sharedMaterials[i];
                    // DLog.Log("debug AddMaterialLogic new sharedMaterial " + materials[i].GetHashCode());
                }

                renderer.sharedMaterials = materials;
            }

            valueModifiers = new List <ValueModifier>();
            for (int kIndex = 0; kIndex < config.valueModifiers.Count; kIndex++)
            {
                VfxAction.MaterialValueModifier mvm = config.valueModifiers[kIndex];
                valueModifiers.Add(new ValueModifier(mvm, new List <Material>(new [] { material })));
            }

            colorModifiers = new List <ColorModifier>();
            for (int kIndex = 0; kIndex < config.colorModifiers.Count; kIndex++)
            {
                VfxAction.MaterialColorModifier mcm = config.colorModifiers[kIndex];
                colorModifiers.Add(new ColorModifier(mcm, new List <Material>(new [] { material })));
            }

            // DLog.Log("debug AddMaterialLogic");
        }