/// <summary> /// Used to create new VFX. Place sprites inside of Mods/YourModFolder/sprites/VFX Collection, inside the EtG directory. Each parameter that is a list must have an entry for each sprite of the animation /// </summary> /// <param name="name">The name of the VFX</param> /// <param name="spriteNames">The name of the sprites for the VFX, like VFX_001, VFX_002, etc.</param> /// <param name="fps">The frame rate the animation will play at</param> /// <param name="spriteSizes">The size of each sprite in the animation. Must have an IntVector2 entry for each sprite in the animation</param> /// <param name="anchors">I don't know what exactly this does</param> /// <param name="manualOffsets">I don't know what exactly this does</param> /// <param name="orphaned">I don't know what exactly this does</param> /// <param name="attached">I don't know what exactly this does</param> /// <param name="persistsOnDeath">Best left false</param> /// <param name="usesZHeight">Change if needed</param> /// <param name="zHeight">Change if needed, but usually left at 0</param> /// <param name="alignment">Leave at Fixed</param> /// <param name="destructible">Always set to true</param> /// <param name="emissivePowers">Doesn't seem to work, set all entries at 0. Might cause bugs if tinkered with</param> /// <param name="emissiveColors">Does't seem to work, set all entries to VFXLibrary.emptyColor. Might cause bugs if tinkered with</param> /// <returns></returns> public static VFXPool CreateMuzzleflash(string name, List <string> spriteNames, int fps, List <IntVector2> spriteSizes, List <tk2dBaseSprite.Anchor> anchors, List <Vector2> manualOffsets, bool orphaned, bool attached, bool persistsOnDeath, bool usesZHeight, float zHeight, VFXAlignment alignment, bool destructible, List <float> emissivePowers, List <Color> emissiveColors) { VFXPool pool = new VFXPool(); pool.type = VFXPoolType.All; VFXComplex complex = new VFXComplex(); VFXObject vfObj = new VFXObject(); GameObject obj = new GameObject(name); obj.SetActive(false); FakePrefab.MarkAsFakePrefab(obj); UnityEngine.Object.DontDestroyOnLoad(obj); tk2dSprite sprite = obj.AddComponent <tk2dSprite>(); tk2dSpriteAnimator animator = obj.AddComponent <tk2dSpriteAnimator>(); tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip(); clip.fps = fps; clip.frames = new tk2dSpriteAnimationFrame[0]; for (int i = 0; i < spriteNames.Count; i++) { string spriteName = spriteNames[i]; IntVector2 spriteSize = spriteSizes[i]; tk2dBaseSprite.Anchor anchor = anchors[i]; Vector2 manualOffset = manualOffsets[i]; float emissivePower = emissivePowers[i]; Color emissiveColor = emissiveColors[i]; tk2dSpriteAnimationFrame frame = new tk2dSpriteAnimationFrame(); frame.spriteId = VFXCollection.GetSpriteIdByName(spriteName); tk2dSpriteDefinition def = SetupDefinitionForShellSprite(spriteName, frame.spriteId, spriteSize.x, spriteSize.y); def.ConstructOffsetsFromAnchor(anchor, def.position3); def.MakeOffset(manualOffset); def.material.shader = ShaderCache.Acquire("Brave/LitTk2dCustomFalloffTintableTiltedCutoutEmissive"); def.material.SetFloat("_EmissiveColorPower", emissivePower); def.material.SetColor("_EmissiveColor", emissiveColor); def.material.SetTexture("_MainTex", def.material.GetTexture("_MainTex")); def.materialInst.shader = ShaderCache.Acquire("Brave/LitTk2dCustomFalloffTintableTiltedCutoutEmissive"); def.materialInst.SetFloat("_EmissiveColorPower", emissivePower); def.materialInst.SetColor("_EmissiveColor", emissiveColor); def.materialInst.SetTexture("_MainTex", def.materialInst.GetTexture("_MainTex")); frame.spriteCollection = VFXCollection; clip.frames = clip.frames.Concat(new tk2dSpriteAnimationFrame[] { frame }).ToArray(); } sprite.renderer.material.shader = ShaderCache.Acquire("Brave/LitTk2dCustomFalloffTintableTiltedCutoutEmissive"); sprite.renderer.material.SetFloat("_EmissiveColorPower", emissivePowers[0]); sprite.renderer.material.SetColor("_EmissiveColor", emissiveColors[0]); sprite.renderer.material.SetTexture("_MainTex", sprite.renderer.material.GetTexture("_MainTex")); clip.wrapMode = tk2dSpriteAnimationClip.WrapMode.Once; clip.name = "start"; animator.spriteAnimator.Library = animator.gameObject.AddComponent <tk2dSpriteAnimation>(); animator.spriteAnimator.Library.clips = new tk2dSpriteAnimationClip[] { clip }; animator.spriteAnimator.Library.enabled = true; SpriteAnimatorKiller kill = animator.gameObject.AddComponent <SpriteAnimatorKiller>(); kill.fadeTime = -1f; kill.animator = animator; kill.delayDestructionTime = -1f; vfObj.orphaned = orphaned; vfObj.attached = attached; vfObj.persistsOnDeath = persistsOnDeath; vfObj.usesZHeight = usesZHeight; vfObj.zHeight = zHeight; vfObj.alignment = alignment; vfObj.destructible = destructible; vfObj.effect = obj; complex.effects = new VFXObject[] { vfObj }; pool.effects = new VFXComplex[] { complex }; animator.playAutomatically = true; animator.DefaultClipId = animator.GetClipIdByName("start"); return(pool); }
public static VFXPool CreateVFXPool(string name, List <string> spritePaths, int fps, IntVector2 Dimensions, tk2dBaseSprite.Anchor anchor, bool usesZHeight, float zHeightOffset, bool persist = false, VFXAlignment alignment = VFXAlignment.NormalAligned, float emissivePower = -1, Color?emissiveColour = null) { GameObject Obj = new GameObject(name); VFXPool pool = new VFXPool(); pool.type = VFXPoolType.All; VFXComplex complex = new VFXComplex(); VFXObject vfObj = new VFXObject(); Obj.SetActive(false); FakePrefab.MarkAsFakePrefab(Obj); UnityEngine.Object.DontDestroyOnLoad(Obj); tk2dSpriteCollectionData VFXSpriteCollection = SpriteBuilder.ConstructCollection(Obj, (name + "_Collection")); int spriteID = SpriteBuilder.AddSpriteToCollection(spritePaths[0], VFXSpriteCollection); tk2dSprite sprite = Obj.GetOrAddComponent <tk2dSprite>(); sprite.SetSprite(VFXSpriteCollection, spriteID); tk2dSpriteDefinition defaultDef = sprite.GetCurrentSpriteDef(); defaultDef.colliderVertices = new Vector3[] { new Vector3(0f, 0f, 0f), new Vector3((Dimensions.x / 16), (Dimensions.y / 16), 0f) }; tk2dSpriteAnimator animator = Obj.GetOrAddComponent <tk2dSpriteAnimator>(); tk2dSpriteAnimation animation = Obj.GetOrAddComponent <tk2dSpriteAnimation>(); animation.clips = new tk2dSpriteAnimationClip[0]; animator.Library = animation; tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip() { name = "start", frames = new tk2dSpriteAnimationFrame[0], fps = fps }; List <tk2dSpriteAnimationFrame> frames = new List <tk2dSpriteAnimationFrame>(); for (int i = 0; i < spritePaths.Count; i++) { tk2dSpriteCollectionData collection = VFXSpriteCollection; int frameSpriteId = SpriteBuilder.AddSpriteToCollection(spritePaths[i], collection); tk2dSpriteDefinition frameDef = collection.spriteDefinitions[frameSpriteId]; frameDef.ConstructOffsetsFromAnchor(anchor); frameDef.colliderVertices = defaultDef.colliderVertices; if (emissivePower > 0) { frameDef.material.shader = ShaderCache.Acquire("Brave/LitTk2dCustomFalloffTintableTiltedCutoutEmissive"); } if (emissivePower > 0) { frameDef.material.SetFloat("_EmissiveColorPower", emissivePower); } if (emissiveColour != null) { frameDef.material.SetColor("_EmissiveColor", (Color)emissiveColour); } if (emissivePower > 0) { frameDef.materialInst.shader = ShaderCache.Acquire("Brave/LitTk2dCustomFalloffTintableTiltedCutoutEmissive"); } if (emissivePower > 0) { frameDef.materialInst.SetFloat("_EmissiveColorPower", emissivePower); } if (emissiveColour != null) { frameDef.materialInst.SetColor("_EmissiveColor", (Color)emissiveColour); } frames.Add(new tk2dSpriteAnimationFrame { spriteId = frameSpriteId, spriteCollection = collection }); } if (emissivePower > 0) { sprite.renderer.material.shader = ShaderCache.Acquire("Brave/LitTk2dCustomFalloffTintableTiltedCutoutEmissive"); } if (emissivePower > 0) { sprite.renderer.material.SetFloat("_EmissiveColorPower", emissivePower); } if (emissiveColour != null) { sprite.renderer.material.SetColor("_EmissiveColor", (Color)emissiveColour); } clip.frames = frames.ToArray(); clip.wrapMode = tk2dSpriteAnimationClip.WrapMode.Once; animation.clips = animation.clips.Concat(new tk2dSpriteAnimationClip[] { clip }).ToArray(); if (!persist) { SpriteAnimatorKiller kill = animator.gameObject.AddComponent <SpriteAnimatorKiller>(); kill.fadeTime = -1f; kill.animator = animator; kill.delayDestructionTime = -1f; } animator.playAutomatically = true; animator.DefaultClipId = animator.GetClipIdByName("start"); vfObj.attached = true; vfObj.persistsOnDeath = persist; vfObj.usesZHeight = usesZHeight; vfObj.zHeight = zHeightOffset; vfObj.alignment = alignment; vfObj.destructible = false; vfObj.effect = Obj; complex.effects = new VFXObject[] { vfObj }; pool.effects = new VFXComplex[] { complex }; return(pool); }