Mahou Tsukai Rework (#502)

* fixed not being able to whiff in tap trial

* bored meeting fixes

* more board meeting fix

* ww now uses z axis instead of scale

* Inputs are now reworked in mahou tsukai

* Fixed the particle effect
This commit is contained in:
Rapandrasmus 2023-07-17 17:09:58 +02:00 committed by GitHub
parent c00b6f46c3
commit d85580b14e
13 changed files with 5129 additions and 578 deletions

View file

@ -1598,7 +1598,7 @@ MonoBehaviour:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 175559278565927848}
m_Enabled: 0
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6892e03a2f2994b48a4b076fdfae805d, type: 3}
m_Name:

File diff suppressed because it is too large Load diff

View file

@ -1,132 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!74 &7400000
AnimationClip:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Magic
serializedVersion: 6
m_Legacy: 0
m_Compressed: 0
m_UseHighQualityCurve: 1
m_RotationCurves: []
m_CompressedRotationCurves: []
m_EulerCurves: []
m_PositionCurves: []
m_ScaleCurves: []
m_FloatCurves:
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0.016666668
value: 0
inSlope: Infinity
outSlope: Infinity
tangentMode: 103
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_IsActive
path: Shimmer
classID: 1
script: {fileID: 0}
m_PPtrCurves:
- curve:
- time: 0
value: {fileID: -4394865311163506109, guid: a7ebfee08631d124d9385ba110cd71c0, type: 3}
- time: 0.016666668
value: {fileID: -6165325623540167759, guid: a7ebfee08631d124d9385ba110cd71c0, type: 3}
- time: 0.033333335
value: {fileID: 3955841814209212924, guid: a7ebfee08631d124d9385ba110cd71c0, type: 3}
- time: 0.05
value: {fileID: -6165325623540167759, guid: a7ebfee08631d124d9385ba110cd71c0, type: 3}
- time: 0.06666667
value: {fileID: 3955841814209212924, guid: a7ebfee08631d124d9385ba110cd71c0, type: 3}
attribute: m_Sprite
path:
classID: 212
script: {fileID: 0}
m_SampleRate: 60
m_WrapMode: 0
m_Bounds:
m_Center: {x: 0, y: 0, z: 0}
m_Extent: {x: 0, y: 0, z: 0}
m_ClipBindingConstant:
genericBindings:
- serializedVersion: 2
path: 3491122176
attribute: 2086281974
script: {fileID: 0}
typeID: 1
customType: 0
isPPtrCurve: 0
- serializedVersion: 2
path: 0
attribute: 0
script: {fileID: 0}
typeID: 212
customType: 23
isPPtrCurve: 1
pptrCurveMapping:
- {fileID: -4394865311163506109, guid: a7ebfee08631d124d9385ba110cd71c0, type: 3}
- {fileID: -6165325623540167759, guid: a7ebfee08631d124d9385ba110cd71c0, type: 3}
- {fileID: 3955841814209212924, guid: a7ebfee08631d124d9385ba110cd71c0, type: 3}
- {fileID: -6165325623540167759, guid: a7ebfee08631d124d9385ba110cd71c0, type: 3}
- {fileID: 3955841814209212924, guid: a7ebfee08631d124d9385ba110cd71c0, type: 3}
m_AnimationClipSettings:
serializedVersion: 2
m_AdditiveReferencePoseClip: {fileID: 0}
m_AdditiveReferencePoseTime: 0
m_StartTime: 0
m_StopTime: 0.083333336
m_OrientationOffsetY: 0
m_Level: 0
m_CycleOffset: 0
m_HasAdditiveReferencePose: 0
m_LoopTime: 0
m_LoopBlend: 0
m_LoopBlendOrientation: 0
m_LoopBlendPositionY: 0
m_LoopBlendPositionXZ: 0
m_KeepOriginalOrientation: 0
m_KeepOriginalPositionY: 1
m_KeepOriginalPositionXZ: 0
m_HeightFromFeet: 0
m_Mirror: 0
m_EditorCurves:
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0.016666668
value: 0
inSlope: Infinity
outSlope: Infinity
tangentMode: 103
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_IsActive
path: Shimmer
classID: 1
script: {fileID: 0}
m_EulerEditorCurves: []
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_Events:
- time: 0.083333336
functionName: Kill
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0

View file

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: a129607f5aae4eb49b0ac18493244372
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 7400000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -1,72 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1102 &-6929626609083400027
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Magic
m_Speed: 0.25
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: a129607f5aae4eb49b0ac18493244372, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: MagicAnimator
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: 8758913436755009276}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1107 &8758913436755009276
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: -6929626609083400027}
m_Position: {x: 303, y: 44, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: -6929626609083400027}

View file

@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 39f83b785ae333946a675fe36007f143
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:

View file

@ -68,6 +68,7 @@ namespace HeavenStudio.Games.Scripts_BoardMeeting
rollLoop.KillLoop(0);
rollLoop = null;
}
game.StopChairLoopSoundIfLastToStop();
BeatAction.New(game.gameObject, new List<BeatAction.Action>()
{

View file

@ -77,6 +77,7 @@ namespace HeavenStudio.Games.Loaders
namespace HeavenStudio.Games
{
using Scripts_BoardMeeting;
using System;
public class BoardMeeting : Minigame
{
@ -94,7 +95,7 @@ namespace HeavenStudio.Games
bool assistantCanBop = true;
bool executivesCanBop = true;
public GameEvent bop = new GameEvent();
Sound chairLoopSound = null;
[NonSerialized] public Sound chairLoopSound = null;
int missCounter = 0;
private Tween shakeTween;
@ -106,6 +107,19 @@ namespace HeavenStudio.Games
InitExecutives();
}
private void OnDestroy()
{
foreach(var evt in scheduledInputs)
{
evt.Disable();
}
if (chairLoopSound != null)
{
chairLoopSound.KillLoop(0);
chairLoopSound = null;
}
}
private void Update()
{
var cond = Conductor.instance;
@ -124,6 +138,10 @@ namespace HeavenStudio.Games
SoundByte.PlayOneShotGame("boardMeeting/miss");
SoundByte.PlayOneShot("miss");
ScoreMiss();
foreach (var evt in scheduledInputs)
{
evt.Disable();
}
}
}
}
@ -312,6 +330,16 @@ namespace HeavenStudio.Games
}
}
public void StopChairLoopSoundIfLastToStop()
{
if (executives.FindAll(x => x.spinning).Count > 1) return;
if (chairLoopSound != null)
{
chairLoopSound.KillLoop(0);
chairLoopSound = null;
}
}
public void InitExecutives()
{
float startPos = farLeft.position.x;

View file

@ -1,33 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using HeavenStudio.Util;
using System;
namespace HeavenStudio.Games.Scripts_WizardsWaltz
{
public class MagicFX : MonoBehaviour
{
public Animator animator;
public SpriteRenderer spriteRenderer;
public GameObject shimmer;
public void Awake()
{
int order = (int)Math.Round((transform.position.z - 2) * 1000);
spriteRenderer.sortingOrder = order;
shimmer.GetComponent<SpriteRenderer>().sortingOrder = order;
animator.Play("Magic", 0, 0);
Rigidbody2D rb2d = gameObject.AddComponent<Rigidbody2D>();
rb2d.gravityScale = 2.5f;
}
public void Kill()
{
Destroy(shimmer);
Destroy(gameObject);
}
}
}

View file

@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: b107d57be99ffe34ea2d14c49c15ff80
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View file

@ -12,20 +12,20 @@ namespace HeavenStudio.Games.Scripts_WizardsWaltz
public double createBeat;
private WizardsWaltz game;
private bool hit = false;
private bool passed = false;
public int order = 0;
private void Awake()
public void Init(bool spawnedInactive)
{
game = WizardsWaltz.instance;
spriteRenderer.sortingOrder = order;
animator.Play("Appear", 0, 0);
animator.Play("Appear", 0, spawnedInactive ? 1 : 0);
}
private void Start() {
game.ScheduleInput(createBeat, game.beatInterval, InputType.STANDARD_DOWN | InputType.DIRECTION_DOWN, Just, Miss, Out);
public void StartInput(double beat, float length)
{
game.ScheduleInput(beat, length, InputType.STANDARD_DOWN | InputType.DIRECTION_DOWN, Just, Miss, Out);
}
private void Update()
@ -65,13 +65,11 @@ namespace HeavenStudio.Games.Scripts_WizardsWaltz
public void Ace()
{
game.wizard.Magic(this, true);
hit = true;
}
public void NearMiss()
{
game.wizard.Magic(this, false);
hit = true;
}
private void Just(PlayerActionEvent caller, float state)

View file

@ -10,9 +10,6 @@ namespace HeavenStudio.Games.Scripts_WizardsWaltz
public Animator animator;
public GameObject shadow;
private float newBeat = 0;
private int beats = 0;
private WizardsWaltz game;
private float songPos;
@ -25,17 +22,20 @@ namespace HeavenStudio.Games.Scripts_WizardsWaltz
{
songPos = (float)(Conductor.instance.songPositionInBeatsAsDouble - game.wizardBeatOffset);
var am = game.beatInterval / 2f;
var x = Mathf.Sin(Mathf.PI * songPos / am) * 6;
var y = Mathf.Cos(Mathf.PI * songPos / am);
var scale = 1 - Mathf.Cos(Mathf.PI * songPos / am) * 0.35f;
transform.position = new Vector3(x, 3f - y * 0.5f, 0);
shadow.transform.position = new Vector3(x, -3f + y * 1.5f, 0);
var x = Mathf.Sin(Mathf.PI * songPos / am) * game.xRange;
var y = Mathf.Cos(Mathf.PI * songPos / am) * game.yRange;
var z = Mathf.Cos(Mathf.PI * songPos / am) * game.zRange;
//var scale = 1 - Mathf.Cos(Mathf.PI * songPos / am) * 0.35f;
var xscale = scale;
transform.position = new Vector3(x, 3f - y * 0.5f, z);
shadow.transform.position = new Vector3(x, game.plantYOffset + y * 1.5f, z);
/*var xscale = scale;
if (y > 0) xscale *= -1;
transform.localScale = new Vector3(xscale, scale, 1);
shadow.transform.localScale = new Vector3(scale, scale, 1);
shadow.transform.localScale = new Vector3(scale, scale, 1);*/
transform.localScale = new Vector3((y > 0) ? -1 : 1, 1, 1);
}
private void LateUpdate()

View file

@ -17,16 +17,24 @@ namespace HeavenStudio.Games.Loaders
{
new GameAction("start interval", "Start Interval")
{
function = delegate { WizardsWaltz.instance.SetIntervalStart(eventCaller.currentEntity.beat, eventCaller.currentEntity.length); },
preFunction = delegate { var e = eventCaller.currentEntity; WizardsWaltz.PreInterval(e.beat, e.length, e["auto"]); },
defaultLength = 6f,
resizable = true,
priority = 1
parameters = new List<Param>()
{
new Param("auto", true, "Auto Pass Turn")
},
preFunctionLength = 1
},
new GameAction("plant", "Plant")
{
function = delegate { WizardsWaltz.instance.SpawnFlower(eventCaller.currentEntity.beat); },
defaultLength = 0.5f,
},
new GameAction("passTurn", "Pass Turn")
{
preFunction = delegate { var e = eventCaller.currentEntity; WizardsWaltz.PrePassTurn(e.beat); },
preFunctionLength = 1
}
},
new List<string>() {"agb", "repeat"},
"agbwizard", "en",
@ -38,6 +46,7 @@ namespace HeavenStudio.Games.Loaders
namespace HeavenStudio.Games
{
using Jukebox;
using Scripts_WizardsWaltz;
public class WizardsWaltz : Minigame
@ -47,99 +56,220 @@ namespace HeavenStudio.Games
public Girl girl;
public GameObject plantHolder;
public GameObject plantBase;
public GameObject fxHolder;
public GameObject fxBase;
private int timer = 0;
public float beatInterval = 6f;
double intervalStartBeat;
bool intervalStarted;
[Header("Properties")]
[NonSerialized] public float beatInterval = 6f;
[NonSerialized] public double intervalStartBeat;
public double wizardBeatOffset = 0f;
[NonSerialized] public int plantsLeft = 0; //this variable is unused
public float xRange = 5;
public float zRange = 5;
public float yRange = 0.5f;
public float plantYOffset = -2f;
private List<Plant> currentPlants = new();
public static WizardsWaltz instance;
private static CallAndResponseHandler crHandlerInstance;
private void Awake()
{
instance = this;
wizard.Init();
}
var nextStart = GameManager.instance.Beatmap.Entities.Find(c => c.datamodel == "wizardsWaltz/start interval" && c.beat + c.length >= Conductor.instance.songPositionInBeatsAsDouble);
public override void OnPlay(double beat)
{
SetWizardOffset(beat);
crHandlerInstance = null;
}
if (nextStart != null)
public override void OnGameSwitch(double beat)
{
SetWizardOffset(beat);
if (queuedIntervals.Count > 0)
{
EventCaller.instance.CallEvent(nextStart, true);
foreach (var interval in queuedIntervals)
{
SetIntervalStart(interval.beat, interval.interval, beat, interval.autoPassTurn);
}
queuedIntervals.Clear();
}
if (crHandlerInstance != null && crHandlerInstance.queuedEvents.Count > 0)
{
if (crHandlerInstance.queuedEvents.Find(x => x.beat >= beat) != null)
{
crHandlerInstance = null;
return;
}
foreach (var crEvent in crHandlerInstance.queuedEvents)
{
SpawnFlower(crEvent.beat, true);
}
}
}
private void SetWizardOffset(double beat)
{
var allIntervals = EventCaller.GetAllInGameManagerList("wizardsWaltz", new string[] { "start interval" });
var tempEvents = allIntervals.FindAll(x => x.beat >= beat);
if (tempEvents.Count > 0)
{
wizardBeatOffset = tempEvents[0].beat;
beatInterval = tempEvents[0].length;
}
}
private void Update()
{
if (!Conductor.instance.isPlaying && !Conductor.instance.isPaused && intervalStarted)
if (Conductor.instance.isPlaying && !Conductor.instance.isPaused)
{
intervalStarted = false;
if (passedTurns.Count > 0)
{
foreach (var pass in passedTurns)
{
PassTurnStandalone(pass);
}
passedTurns.Clear();
}
}
}
private void FixedUpdate()
private List<RiqEntity> GetAllPlantsBetweenBeat(double beat, double endBeat)
{
if (timer % 8 == 0 || UnityEngine.Random.Range(0,8) == 0)
{
var songPos = (float)(Conductor.instance.songPositionInBeatsAsDouble - wizardBeatOffset);
var am = beatInterval / 2f;
var x = Mathf.Sin(Mathf.PI * songPos / am) * 6 + UnityEngine.Random.Range(-0.5f, 0.5f);
var y = Mathf.Cos(Mathf.PI * songPos / am) * 0.5f + UnityEngine.Random.Range(-0.5f, 0.5f);
var scale = 1 - Mathf.Cos(Mathf.PI * songPos / am) * 0.35f + UnityEngine.Random.Range(-0.2f, 0.2f);
MagicFX magic = Instantiate(fxBase, fxHolder.transform).GetComponent<MagicFX>();
magic.transform.position = new Vector3(x, 2f + y, 0);
magic.transform.localScale = wizard.gameObject.transform.localScale;
magic.gameObject.SetActive(true);
}
timer++;
return EventCaller.GetAllInGameManagerList("wizardsWaltz", new string[] { "plant" }).FindAll(x => x.beat >= beat && x.beat < endBeat);
}
public void SetIntervalStart(double beat, float interval = 4f)
public void SetIntervalStart(double beat, float interval, double gameSwitchBeat, bool autoPassTurn)
{
// Don't do these things if the interval was already started.
if (!intervalStarted)
{
plantsLeft = 0;
intervalStarted = true;
}
wizardBeatOffset = beat;
intervalStartBeat = beat;
beatInterval = interval;
CallAndResponseHandler newHandler = new();
crHandlerInstance = newHandler;
crHandlerInstance.StartInterval(beat, interval);
var relevantPlantEvents = GetAllPlantsBetweenBeat(beat, beat + interval);
foreach (var plant in relevantPlantEvents)
{
crHandlerInstance.AddEvent(plant.beat);
SpawnFlower(plant.beat, plant.beat < gameSwitchBeat);
}
if (autoPassTurn)
{
PassTurn(beat + interval, newHandler);
}
}
public void SpawnFlower(double beat)
public static void PreInterval(double beat, float interval, bool autoPassTurn)
{
// If interval hasn't started, assume this is the first hair of the interval.
if (!intervalStarted)
SetIntervalStart(beat, beatInterval);
if (GameManager.instance.currentGame == "wizardsWaltz")
{
instance.SetIntervalStart(beat, interval, beat, autoPassTurn);
}
else
{
queuedIntervals.Add(new QueuedInterval()
{
beat = beat,
interval = interval,
autoPassTurn = autoPassTurn
});
}
}
SoundByte.PlayOneShotGame("wizardsWaltz/plant", beat);
private void PassTurnStandalone(double beat)
{
if (crHandlerInstance != null) PassTurn(beat, crHandlerInstance);
}
public static void PrePassTurn(double beat)
{
if (GameManager.instance.currentGame == "wizardsWaltz")
{
instance.PassTurnStandalone(beat);
}
else
{
passedTurns.Add(beat);
}
}
private static List<double> passedTurns = new();
private void PassTurn(double beat, CallAndResponseHandler crHandler)
{
BeatAction.New(gameObject, new List<BeatAction.Action>()
{
new BeatAction.Action(beat - 0.25, delegate
{
beatInterval = crHandler.intervalLength;
wizardBeatOffset = beat;
intervalStartBeat = beat;
foreach (var plant in currentPlants)
{
var songPos = (float)(plant.createBeat - wizardBeatOffset);
var am = (beatInterval / 2f);
var x = Mathf.Sin(Mathf.PI * songPos / am) * xRange;
var y = plantYOffset + Mathf.Cos(Mathf.PI * songPos / am) * (yRange * 1.5f);
var z = Mathf.Cos(Mathf.PI * songPos / am) * zRange;
/*var scale = 1 - Mathf.Cos(Mathf.PI * songPos / am) * 0.35f;
var xscale = scale;
if (y > -3.5f) xscale *= -1;*/
plant.transform.localPosition = new Vector3(x, y, z);
//plant.transform.localScale = new Vector3(xscale, scale, 1);
}
foreach (var crEvent in crHandler.queuedEvents)
{
Plant plantToInput = currentPlants.Find(x => x.createBeat == crEvent.beat);
plantToInput.StartInput(beat - 0.25, (float)crEvent.relativeBeat + 0.25f);
}
crHandler.queuedEvents.Clear();
})
});
}
private static List<QueuedInterval> queuedIntervals = new();
private struct QueuedInterval
{
public double beat;
public float interval;
public bool autoPassTurn;
}
public void SpawnFlower(double beat, bool spawnedInactive)
{
if (!spawnedInactive) SoundByte.PlayOneShotGame("wizardsWaltz/plant", beat);
Plant plant = Instantiate(plantBase, plantHolder.transform).GetComponent<Plant>();
var songPos = (float)(Conductor.instance.songPositionInBeatsAsDouble - wizardBeatOffset);
currentPlants.Add(plant);
var songPos = (float)(beat - wizardBeatOffset);
var am = (beatInterval / 2f);
var x = Mathf.Sin(Mathf.PI * songPos / am) * 6;
var y = -3f + Mathf.Cos(Mathf.PI * songPos / am) * 1.5f;
var scale = 1 - Mathf.Cos(Mathf.PI * songPos / am) * 0.35f;
var x = Mathf.Sin(Mathf.PI * songPos / am) * xRange;
var y = plantYOffset + Mathf.Cos(Mathf.PI * songPos / am) * (yRange * 1.5f);
var z = Mathf.Cos(Mathf.PI * songPos / am) * zRange;
/*var scale = 1 - Mathf.Cos(Mathf.PI * songPos / am) * 0.35f;
var xscale = scale;
if (y > -3.5f) xscale *= -1;
if (y > -3.5f) xscale *= -1;*/
plant.transform.localPosition = new Vector3(x, y, 0);
plant.transform.localScale = new Vector3(xscale, scale, 1);
plant.transform.localPosition = new Vector3(x, y, z);
//plant.transform.localScale = new Vector3(xscale, scale, 1);
plant.order = (int)Math.Round((scale - 1) * 1000);
plant.gameObject.SetActive(true);
//plant.order = (int)Math.Round((scale - 1) * 1000);
plant.order = (int)Math.Round(z * -1);
plant.createBeat = beat;
plantsLeft++;
BeatAction.New(gameObject, new List<BeatAction.Action>()
{
new BeatAction.Action(beat, delegate
{
plant.gameObject.SetActive(true);
plant.Init(spawnedInactive);
})
});
}
}