flash/inputs actually working, create SlotButton.cs

flash now lerps in the SlotButton class, which makes things so. so much easier.
This commit is contained in:
AstrlJelly 2024-02-11 22:17:13 -05:00
parent 7c8dc8603f
commit e2309e014c
5 changed files with 232 additions and 89 deletions

View file

@ -876,6 +876,7 @@ GameObject:
m_Component: m_Component:
- component: {fileID: 6713427547028951939} - component: {fileID: 6713427547028951939}
- component: {fileID: 3765927633667635310} - component: {fileID: 3765927633667635310}
- component: {fileID: 8493640715844712253}
m_Layer: 0 m_Layer: 0
m_Name: Button3 m_Name: Button3
m_TagString: Untagged m_TagString: Untagged
@ -921,6 +922,24 @@ Animator:
m_AllowConstantClipSamplingOptimization: 1 m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0 m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0 m_WriteDefaultValuesOnDisable: 0
--- !u!114 &8493640715844712253
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3468298043875673060}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 824e4674e220b544991c5311c2d90ff1, type: 3}
m_Name:
m_EditorClassIdentifier:
pressed: 0
color: {r: 0.86274517, g: 0, b: 0, a: 0}
anim: {fileID: 3765927633667635310}
srs:
- {fileID: 2877045166871582979}
- {fileID: 4449036682437390073}
--- !u!1 &3502234333494748245 --- !u!1 &3502234333494748245
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -1184,6 +1203,7 @@ GameObject:
m_Component: m_Component:
- component: {fileID: 6816887475717257767} - component: {fileID: 6816887475717257767}
- component: {fileID: 8656164449290761354} - component: {fileID: 8656164449290761354}
- component: {fileID: 7161291887338607999}
m_Layer: 0 m_Layer: 0
m_Name: Button2 m_Name: Button2
m_TagString: Untagged m_TagString: Untagged
@ -1229,6 +1249,24 @@ Animator:
m_AllowConstantClipSamplingOptimization: 1 m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0 m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0 m_WriteDefaultValuesOnDisable: 0
--- !u!114 &7161291887338607999
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4661475570310962003}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 824e4674e220b544991c5311c2d90ff1, type: 3}
m_Name:
m_EditorClassIdentifier:
pressed: 0
color: {r: 0.8000001, g: 0.2784314, b: 0.95294124, a: 0}
anim: {fileID: 8656164449290761354}
srs:
- {fileID: 6069226680631927887}
- {fileID: 2214261874876006399}
--- !u!1 &4687682230392877706 --- !u!1 &4687682230392877706
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -1323,6 +1361,7 @@ GameObject:
m_Component: m_Component:
- component: {fileID: 2864234776698747384} - component: {fileID: 2864234776698747384}
- component: {fileID: 8588887349593004598} - component: {fileID: 8588887349593004598}
- component: {fileID: 5051449585850381948}
m_Layer: 0 m_Layer: 0
m_Name: Button1 m_Name: Button1
m_TagString: Untagged m_TagString: Untagged
@ -1368,6 +1407,24 @@ Animator:
m_AllowConstantClipSamplingOptimization: 1 m_AllowConstantClipSamplingOptimization: 1
m_KeepAnimatorStateOnDisable: 0 m_KeepAnimatorStateOnDisable: 0
m_WriteDefaultValuesOnDisable: 0 m_WriteDefaultValuesOnDisable: 0
--- !u!114 &5051449585850381948
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5076257341597419496}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 824e4674e220b544991c5311c2d90ff1, type: 3}
m_Name:
m_EditorClassIdentifier:
pressed: 0
color: {r: 0.3803922, g: 0.9843138, b: 0.25490198, a: 0}
anim: {fileID: 8588887349593004598}
srs:
- {fileID: 4790761080377207371}
- {fileID: 6479832831682828701}
--- !u!1 &5449113805416087283 --- !u!1 &5449113805416087283
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -1502,29 +1559,15 @@ MonoBehaviour:
SoundSequences: [] SoundSequences: []
scheduledInputs: [] scheduledInputs: []
smAnim: {fileID: 8395666848120559718} smAnim: {fileID: 8395666848120559718}
eyeSprites:
- {fileID: 1032231447, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: 90921217, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: -108380036, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: -1768230940, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: -867298969, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: 1609057261, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: -1628350790, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: 1306426365, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: 811989312, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
- {fileID: -1260976779, guid: 878a62db1eeb38d46a0db8e2b67b9730, type: 3}
eyeAnims: eyeAnims:
- {fileID: 7955005190241873031} - {fileID: 7955005190241873031}
- {fileID: 2460964828755838947} - {fileID: 2460964828755838947}
- {fileID: 5491330272697201237} - {fileID: 5491330272697201237}
eyeSRs: buttons:
- {fileID: 2787758216707421360} - {fileID: 5051449585850381948}
- {fileID: 1775810850113365420} - {fileID: 7161291887338607999}
- {fileID: 8454085075965419430} - {fileID: 8493640715844712253}
buttonAnims: buttonFlashColor: {r: 1, g: 1, b: 0.68235296, a: 0}
- {fileID: 8588887349593004598}
- {fileID: 8656164449290761354}
- {fileID: 3765927633667635310}
--- !u!1 &5849268409563499564 --- !u!1 &5849268409563499564
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -2567,7 +2610,7 @@ Transform:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 9212153283773584803} m_GameObject: {fileID: 9212153283773584803}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0.179, y: 0.2550001, z: 0} m_LocalPosition: {x: 0.17900002, y: 0.2550001, z: 0}
m_LocalScale: {x: 0.8024, y: 1, z: 1} m_LocalScale: {x: 0.8024, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []

View file

@ -127,7 +127,7 @@ AnimationClip:
m_AdditiveReferencePoseClip: {fileID: 0} m_AdditiveReferencePoseClip: {fileID: 0}
m_AdditiveReferencePoseTime: 0 m_AdditiveReferencePoseTime: 0
m_StartTime: 0 m_StartTime: 0
m_StopTime: 0.05 m_StopTime: 0.06666667
m_OrientationOffsetY: 0 m_OrientationOffsetY: 0
m_Level: 0 m_Level: 0
m_CycleOffset: 0 m_CycleOffset: 0
@ -398,4 +398,39 @@ AnimationClip:
m_EulerEditorCurves: [] m_EulerEditorCurves: []
m_HasGenericRootTransform: 0 m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0 m_HasMotionFloatCurves: 0
m_Events: [] m_Events:
- time: 0
functionName: AnimateColor
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 0
messageOptions: 0
- time: 0.016666668
functionName: AnimateColor
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 1
messageOptions: 0
- time: 0.033333335
functionName: AnimateColor
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 2
messageOptions: 0
- time: 0.05
functionName: AnimateColor
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 3
messageOptions: 0
- time: 0.06666667
functionName: AnimateColor
data:
objectReferenceParameter: {fileID: 0}
floatParameter: 0
intParameter: 4
messageOptions: 0

View file

@ -0,0 +1,73 @@
using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
using HeavenStudio.Util;
namespace HeavenStudio.Games.Scripts_SlotMonster
{
public class SlotButton : MonoBehaviour
{
public bool pressed;
public Color color; // used to ease between button colors and button flash colors! wow
public Animator anim;
public SpriteRenderer[] srs;
public bool flashing;
const int FLASH_FRAMES = 4;
public int currentFrame;
private SlotMonster game;
public void Init(SlotMonster instance)
{
color = srs[0].color;
game = instance;
}
private void LateUpdate()
{
if (flashing) {
foreach (var sr in srs) {
// sr.color = Color.Lerp(color, game.buttonFlashColor, currentFrame / FRAMES);
var normalized = currentFrame / FLASH_FRAMES;
float newR = EasingFunction.Linear(game.buttonFlashColor.r, color.r, normalized);
float newG = EasingFunction.Linear(game.buttonFlashColor.g, color.g, normalized);
float newB = EasingFunction.Linear(game.buttonFlashColor.b, color.b, normalized);
sr.color = new Color(newR, newG, newB);
Debug.Log("sr.color : " + sr.color);
Debug.Log("currentFrame : " + currentFrame);
}
} else {
foreach (var sr in srs) {
sr.color = color;
}
}
}
public void Press()
{
anim.DoScaledAnimationAsync("Press", 0.5f);
pressed = true;
}
public void TryFlash()
{
if (!pressed) {
anim.DoScaledAnimationAsync("Flash", 0.5f);
}
}
// animation events
public void AnimateColor(int frame)
{
currentFrame = frame;
flashing = frame < FLASH_FRAMES;
}
}
}

View file

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

View file

@ -20,17 +20,10 @@ namespace HeavenStudio.Games.Loaders
{ {
new GameAction("startInterval", "Start Interval") new GameAction("startInterval", "Start Interval")
{ {
preFunction = delegate {
var e = eventCaller.currentEntity;
SoundByte.PlayOneShotGame("slotMonster/start_touch", e.beat - 1, forcePlay: true);
if (eventCaller.gameManager.minigameObj.TryGetComponent(out SlotMonster instance)) {
instance.PreStartInterval(e.beat);
}
},
function = delegate { function = delegate {
if (eventCaller.gameManager.minigameObj.TryGetComponent(out SlotMonster instance)) { if (eventCaller.gameManager.minigameObj.TryGetComponent(out SlotMonster instance)) {
var e = eventCaller.currentEntity; var e = eventCaller.currentEntity;
instance.StartInterval(e.beat, e.length, e["auto"], e["eyeType"], e, 0); instance.StartInterval(e.beat, e.length, e["auto"], e["eyeType"], 0);
} }
}, },
defaultLength = 3f, defaultLength = 3f,
@ -79,10 +72,18 @@ namespace HeavenStudio.Games.Loaders
priority = 1, priority = 1,
parameters = new List<Param>() parameters = new List<Param>()
{ {
new Param("button1", new Color(), "Button 1 Color", "Set the color of the first button."), new Param("button1", new Color(0.38f, 0.98f, 0.25f), "Button 1 Color", "Set the color of the first button."),
new Param("button2", new Color(), "Button 2 Color", "Set the color of the second button."), new Param("button2", new Color(0.8f, 0.28f, 0.95f), "Button 2 Color", "Set the color of the second button."),
new Param("button3", new Color(), "Button 3 Color", "Set the color of the third button."), new Param("button3", new Color(0.87f, 0f, 0f), "Button 3 Color", "Set the color of the third button."),
new Param("flash", new Color(), "Button Flash Color", "Set the color of the flash of the buttons."), new Param("flash", new Color(1f, 1f, 0.68f), "Button Flash Color", "Set the color of the flash of the buttons."),
},
},
new GameAction("test", "Test")
{
function = delegate {
if (eventCaller.gameManager.minigameObj.TryGetComponent(out SlotMonster instance)) {
instance.ScheduleInput(eventCaller.currentEntity.beat, 1, Games.Minigame.InputAction_BasicPress, null, null, null);
}
}, },
}, },
} }
@ -93,6 +94,7 @@ namespace HeavenStudio.Games.Loaders
namespace HeavenStudio.Games namespace HeavenStudio.Games
{ {
using Scripts_SlotMonster;
public class SlotMonster : Minigame public class SlotMonster : Minigame
{ {
public enum DrumTypes public enum DrumTypes
@ -119,40 +121,31 @@ namespace HeavenStudio.Games
[Header("Animators")] [Header("Animators")]
[SerializeField] Animator smAnim; [SerializeField] Animator smAnim;
[SerializeField] Sprite[] eyeSprites;
[SerializeField] Animator[] eyeAnims; [SerializeField] Animator[] eyeAnims;
[SerializeField] SpriteRenderer[] eyeSRs;
[SerializeField] Animator[] buttonAnims; [SerializeField] SlotButton[] buttons;
private double[] buttonstartBeats; public Color buttonFlashColor;
// used to ease between button colors and button flash colors! wow
private Color[] buttonColors;
private Color buttonFlashColor;
private List<RiqEntity> gameEntities; private List<RiqEntity> gameEntities;
private Sound rollingSound; private Sound rollingSound;
private int currentEyeSprite = 1; private int currentEyeSprite = 1;
private int maxButtons; private int maxButtons;
private int currentButton { get => currentButton %= 3; set => currentButton = value; } private int currentButton;
// private double smPrepareBeat;
private void Awake() private void Awake()
{ {
// eyeSRs = eyeAnims.Where(x => x.GetComponent<SpriteRenderer>()).ToArray(); foreach (var button in buttons) {
button.Init(this);
}
} }
private void Update() private void Update()
{ {
if (PlayerInput.GetIsAction(InputAction_BasicPress) && !IsExpectingInputNow(InputAction_BasicPress) && !buttonAnims[GetCurrentButton()].IsPlayingAnimationNames("Press")) { if (PlayerInput.GetIsAction(InputAction_BasicPress) && !IsExpectingInputNow(InputAction_BasicPress)) {
_ = HitButton(); _ = HitButton();
ScoreMiss(); ScoreMiss();
} }
// if (smPrepareBeat <= conductor.songPositionInBeatsAsDouble) {
// }
} }
public override void OnPlay(double beat) public override void OnPlay(double beat)
@ -163,32 +156,24 @@ namespace HeavenStudio.Games
public override void OnGameSwitch(double beat) public override void OnGameSwitch(double beat)
{ {
gameEntities = GameManager.instance.Beatmap.Entities.FindAll(c => c.datamodel.Split('/')[0] == "slotMonster"); gameEntities = GameManager.instance.Beatmap.Entities.FindAll(c => c.datamodel.Split('/')[0] == "slotMonster");
foreach (RiqEntity e in gameEntities.FindAll(e => e.datamodel == "slotMonster/startInterval" && e.beat - 1 < beat && e.beat + e.length > beat)) foreach (RiqEntity e in gameEntities.FindAll(e => e.datamodel == "slotMonster/startInterval" && e.beat < beat && e.beat + e.length > beat)) {
{ StartInterval(e.beat, e.length, e["auto"], e["eyeType"], beat);
Debug.Log("im gonna explode : " + (e.beat - 0.5 > beat));
if (e.beat - 0.5 > beat) {
PreStartInterval(beat);
}
if (e.beat < beat) {
StartInterval(e.beat, e.length, e["auto"], e["eyeType"], e, beat);
}
// StartInterval(e.beat, e.length, e["auto"], e["eyeType"], e, beat);
} }
} }
// make sure the current button is always between 0 and 2 (buttons 1-3) // make sure the current button is always between 0 and 2 (buttons 1-3)
private int GetCurrentButton() => currentButton %= 3; private int GetCurrentButton() => Array.FindIndex(buttons, button => !button.pressed);
private bool HitButton(bool isHit = false) // returns true if it's the last one private bool HitButton(bool isHit = false) // returns true if it's the last one
{ {
int thisButton = GetCurrentButton(); int thisButton = GetCurrentButton();
// Debug.Log("BUTTON HIT : " + thisButton); if (thisButton == -1) return false;
bool lastButton = thisButton == maxButtons - 1; bool lastButton = thisButton == maxButtons - 1;
string hitSfx = "slotMonster/stop_" + (lastButton && isHit ? "hit" : (thisButton + 1)); string hitSfx = "slotMonster/stop_" + (lastButton && isHit ? "hit" : (thisButton + 1));
SoundByte.PlayOneShotGame(hitSfx, forcePlay: true); SoundByte.PlayOneShotGame(hitSfx, forcePlay: true);
for (int i = thisButton; i < (lastButton ? 3 : thisButton + 1); i++) for (int i = thisButton; i < (lastButton ? 3 : thisButton + 1); i++)
{ {
buttonAnims[thisButton].DoScaledAnimationAsync("Press", 0.5f); buttons[thisButton].Press();
if (eyeAnims[thisButton].IsPlayingAnimationNames("Spin")) { if (eyeAnims[thisButton].IsPlayingAnimationNames("Spin")) {
int eyeSprite = currentEyeSprite; int eyeSprite = currentEyeSprite;
if (!isHit) { if (!isHit) {
@ -200,30 +185,29 @@ namespace HeavenStudio.Games
eyeAnims[thisButton].Play("EyeItem" + eyeSprite, 0, 0); eyeAnims[thisButton].Play("EyeItem" + eyeSprite, 0, 0);
} }
} }
if (lastButton) {
if (rollingSound != null) rollingSound.Stop();
}
currentButton++; currentButton++;
return lastButton && isHit; return lastButton && isHit;
} }
public void PreStartInterval(double beat) public void StartInterval(double beat, float length, bool autoPass, int eyeSprite, double gameSwitchBeat)
{ {
// smPrepareBeat List<RiqEntity> slotActions = gameEntities.FindAll(e => e.datamodel == "slotMonster/slot" && e.beat >= beat && e.beat < beat + length);
smAnim.DoScaledAnimationFromBeatAsync("Prepare", 0.5f, beat - 1);
foreach (var anim in buttonAnims)
{
anim.Play("PopUp", 0, 1);
}
}
public void StartInterval(double beat, float length, bool autoPass, int eyeSprite, RiqEntity startInterval, double gameSwitchBeat) SoundByte.PlayOneShotGame("slotMonster/start_touch", forcePlay: true);
{ smAnim.DoScaledAnimationFromBeatAsync("Prepare", 0.5f, beat);
List<RiqEntity> slotActions = gameEntities.FindAll(e => e.datamodel == "slotMonster/slot" && e.beat >= startInterval.beat && e.beat < startInterval.beat + startInterval.length); foreach (var button in buttons) {
button.anim.Play("PopUp", 0, 1);
}
List<MultiSound.Sound> sounds = new(); List<MultiSound.Sound> sounds = new();
List<BeatAction.Action> actions = new(); List<BeatAction.Action> actions = new();
maxButtons = Mathf.Min(slotActions.Count, 3); maxButtons = Mathf.Min(slotActions.Count, 3);
for (int i = 0; i < maxButtons; i++) // limit to 3 actions for (int i = 0; i < maxButtons; i++) // limit to 3 actions
{ {
buttonAnims[i].Play("PopUp", 0, 0); buttons[i].anim.Play("PopUp", 0, 0);
int whichSlot = i; int whichSlot = i;
RiqEntity slot = slotActions[whichSlot]; RiqEntity slot = slotActions[whichSlot];
if (slot.beat < gameSwitchBeat) continue; if (slot.beat < gameSwitchBeat) continue;
@ -236,9 +220,7 @@ namespace HeavenStudio.Games
// Debug.Log(sfx); // Debug.Log(sfx);
sounds.Add(new(sfx + "DrumNTR", slot.beat)); sounds.Add(new(sfx + "DrumNTR", slot.beat));
actions.Add(new(slot.beat, delegate { actions.Add(new(slot.beat, delegate {
if (buttonAnims[whichSlot].IsAnimationNotPlaying()) { buttons[whichSlot].TryFlash();
buttonAnims[whichSlot].DoScaledAnimationAsync("Flash", 0.5f);
}
})); }));
} }
MultiSound.Play(sounds.ToArray(), false); MultiSound.Play(sounds.ToArray(), false);
@ -255,8 +237,7 @@ namespace HeavenStudio.Games
public void PassTurn(double beat, float length, double startBeat = -1, List<RiqEntity> slotActions = null) public void PassTurn(double beat, float length, double startBeat = -1, List<RiqEntity> slotActions = null)
{ {
smAnim.DoScaledAnimationFromBeatAsync("Release", 0.5f, beat); smAnim.DoScaledAnimationFromBeatAsync("Release", 0.5f, beat);
for (int i = 0; i < eyeAnims.Length; i++) for (int i = 0; i < eyeAnims.Length; i++) {
{
eyeAnims[i].DoScaledAnimationAsync("Spin", 0.5f); eyeAnims[i].DoScaledAnimationAsync("Spin", 0.5f);
} }
SoundByte.PlayOneShotGame("slotMonster/start_rolling", forcePlay: true); SoundByte.PlayOneShotGame("slotMonster/start_rolling", forcePlay: true);
@ -274,17 +255,15 @@ namespace HeavenStudio.Games
double slotBeat = slotActions[i].beat; double slotBeat = slotActions[i].beat;
actions.Add(new(beat + length + slotBeat - startBeat, delegate { actions.Add(new(beat + length + slotBeat - startBeat, delegate {
if (!buttonAnims[whichSlot].IsPlayingAnimationNames("Press")) { buttons[whichSlot].TryFlash();
buttonAnims[whichSlot].DoScaledAnimationAsync("Flash");
}
})); }));
// Debug.Log("input scheduled at : " + (beat + length + slotBeat - startBeat)); // Debug.Log("input scheduled at : " + (beat + length + slotBeat - startBeat));
PlayerActionEvent input = ScheduleInput(beat, slotBeat - startBeat + length, InputAction_BasicPress, ButtonHit, null, null); PlayerActionEvent input = ScheduleInput(beat, slotBeat - startBeat + length, InputAction_BasicPress, ButtonHit, null, null);
input.IsHittable = () => { // input.IsHittable = () => {
int currentButton = GetCurrentButton(); // int currentButton = GetCurrentButton();
return currentButton == whichSlot && !buttonAnims[whichSlot].IsPlayingAnimationNames("Press"); // return currentButton == whichSlot && !buttonsPressed[whichSlot];
}; // };
} }
BeatAction.New(this, actions); BeatAction.New(this, actions);
} }
@ -304,9 +283,11 @@ namespace HeavenStudio.Games
// //
// } // }
public void ButtonColor(Color[] baseColors, Color flashColor) public void ButtonColor(Color[] colors, Color flashColor)
{ {
buttonColors = baseColors; for (int i = 0; i < buttons.Length; i++) {
buttons[i].color = colors[i];
}
buttonFlashColor = flashColor; buttonFlashColor = flashColor;
} }
} }