From c1bcf2151ed9bb837ce19671a9036ce30b95b428 Mon Sep 17 00:00:00 2001 From: Rapandrasmus <78219215+Rapandrasmus@users.noreply.github.com> Date: Fri, 24 Nov 2023 23:49:59 +0100 Subject: [PATCH] Screen Tiling Split into two events + Some tweaks and new vfx! (#585) * toss boys fixed * see saw tweaks * fixed quiz show bug * splashdown spawn tweaked * split screen tiling into two different events * screen fit added --- .../Prefabs/GameView/CamerasEditor.prefab | 3 + Assets/Scripts/Games/AirRally/AirRally.cs | 4 +- Assets/Scripts/Games/QuizShow/QuizShow.cs | 19 +++---- Assets/Scripts/Games/SeeSaw/SeeSaw.cs | 37 ++++++++---- .../Scripts/Games/Splashdown/NtrSynchrette.cs | 4 +- Assets/Scripts/Games/Splashdown/Splashdown.cs | 26 ++++++++- Assets/Scripts/Games/TossBoys/TossBoys.cs | 44 +-------------- Assets/Scripts/Games/TossBoys/TossKid.cs | 2 +- Assets/Scripts/Minigames.cs | 27 +++++++-- Assets/Scripts/ScreenTiling.cs | 56 ++++++++++++++++--- Assets/Scripts/StaticCamera.cs | 29 ++++++++++ 11 files changed, 167 insertions(+), 84 deletions(-) diff --git a/Assets/Resources/Prefabs/GameView/CamerasEditor.prefab b/Assets/Resources/Prefabs/GameView/CamerasEditor.prefab index 6bcb60d8..17e960aa 100644 --- a/Assets/Resources/Prefabs/GameView/CamerasEditor.prefab +++ b/Assets/Resources/Prefabs/GameView/CamerasEditor.prefab @@ -93,6 +93,9 @@ MonoBehaviour: ambientBg: {fileID: 5129120947114944961} ambientBgGO: {fileID: 269805006432045765} letterboxBgGO: {fileID: 3741076794236313655} + overlayCanvas: {fileID: 8512930684284350359} + letterboxMask: {fileID: 8925473620302868482} + parentView: {fileID: 2077856143944097172} camera: {fileID: 378821074852065722} --- !u!1 &269805006432045765 GameObject: diff --git a/Assets/Scripts/Games/AirRally/AirRally.cs b/Assets/Scripts/Games/AirRally/AirRally.cs index ee387894..dcc8cbea 100644 --- a/Assets/Scripts/Games/AirRally/AirRally.cs +++ b/Assets/Scripts/Games/AirRally/AirRally.cs @@ -1049,11 +1049,11 @@ namespace HeavenStudio.Games SetDistance(distanceEvent.beat, distanceEvent["type"], distanceEvent["ease"]); } - if (wantStartRally >= beat && IsRallyBeat(wantStartRally)) + if (wantStartRally >= beat && IsRallyBeat(wantStartRally) && wantStartRally < nextGameSwitchBeatGlobal) { StartRally(wantStartRally); } - else if (wantStartBaBum >= beat && IsBaBumBeat(wantStartBaBum)) + else if (wantStartBaBum >= beat && IsBaBumBeat(wantStartBaBum) && wantStartBaBum < nextGameSwitchBeatGlobal) { StartBaBumBumBum(wantStartBaBum, wantCount, wantAlt); } diff --git a/Assets/Scripts/Games/QuizShow/QuizShow.cs b/Assets/Scripts/Games/QuizShow/QuizShow.cs index 82ed3231..cf71c09f 100644 --- a/Assets/Scripts/Games/QuizShow/QuizShow.cs +++ b/Assets/Scripts/Games/QuizShow/QuizShow.cs @@ -573,16 +573,7 @@ namespace HeavenStudio.Games ScheduleAutoplayInput(beat, length + inputBeat, InputAction_Right, AutoplayAButton, Nothing, Nothing); } } - - if (doingConsectiveIntervals) - { - countToMatch += relevantInputs.Count; - } - else - { - countToMatch = relevantInputs.Count; - } - int hundredLoops = Mathf.FloorToInt(countToMatch / 100); + int hundredLoops = Mathf.FloorToInt((float)countToMatch / 100f); countToMatch -= hundredLoops * 100; doingConsectiveIntervals = consecutive; float timeUpBeat = 0f; @@ -598,6 +589,14 @@ namespace HeavenStudio.Games { new BeatAction.Action(beat, delegate { + if (doingConsectiveIntervals) + { + countToMatch += relevantInputs.Count; + } + else + { + countToMatch = relevantInputs.Count; + } if (shouldPrepareArms) { contesteeLeftArmAnim.DoScaledAnimationAsync("LeftPrepare", 0.5f); diff --git a/Assets/Scripts/Games/SeeSaw/SeeSaw.cs b/Assets/Scripts/Games/SeeSaw/SeeSaw.cs index 8e8113bf..16c995de 100644 --- a/Assets/Scripts/Games/SeeSaw/SeeSaw.cs +++ b/Assets/Scripts/Games/SeeSaw/SeeSaw.cs @@ -204,6 +204,9 @@ namespace HeavenStudio.Games public static SeeSaw instance; + private Sound _landSoundEnd; + private double _gameSwitchBeat; + private void Awake() { instance = this; @@ -218,6 +221,7 @@ namespace HeavenStudio.Games GrabJumpEvents(beat); PersistColor(beat); PersistColors(beat); + _gameSwitchBeat = beat; } public override void OnGameSwitch(double beat) @@ -225,6 +229,16 @@ namespace HeavenStudio.Games GrabJumpEvents(beat); PersistColor(beat); PersistColors(beat); + _gameSwitchBeat = beat; + } + + private void OnDestroy() + { + foreach (var evt in scheduledInputs) + { + evt.Disable(); + } + if (_landSoundEnd != null) _landSoundEnd.Stop(); } private void PersistColors(double beat) @@ -353,9 +367,8 @@ namespace HeavenStudio.Games { if (canPrepare && cond.songPositionInBeatsAsDouble < allJumpEvents[currentJumpIndex].beat) { - float beatToJump = (float)allJumpEvents[currentJumpIndex].beat - (inJump ? 1 : 2); - SoundByte.PlayOneShotGame("seeSaw/prepareHigh", beatToJump); + if (beatToJump >= _gameSwitchBeat) SoundByte.PlayOneShotGame("seeSaw/prepareHigh", beatToJump); BeatAction.New(instance, new List() { new BeatAction.Action(beatToJump, delegate { see.SetState(inJump ? SeeSawGuy.JumpState.StartJumpIn : SeeSawGuy.JumpState.StartJump, beatToJump); see.canBop = false; }) @@ -495,7 +508,7 @@ namespace HeavenStudio.Games if (currentJumpIndex >= allJumpEvents.Count || allJumpEvents[currentJumpIndex].beat != beat + 4) { saw.canBop = true; - SoundByte.PlayOneShotGame("seeSaw/otherLand", beat + 4); + _landSoundEnd = SoundByte.PlayOneShotGame("seeSaw/otherLand", beat + 4); BeatAction.New(instance, new List() { new BeatAction.Action(beat + 3.75f, delegate { see.canBop = true; }), @@ -555,7 +568,7 @@ namespace HeavenStudio.Games { saw.canBop = true; float beatLength = see.ShouldEndJumpOut() ? 4 : 3; - SoundByte.PlayOneShotGame("seeSaw/otherLand", beat + beatLength); + _landSoundEnd = SoundByte.PlayOneShotGame("seeSaw/otherLand", beat + beatLength); BeatAction.New(instance, new List() { new BeatAction.Action(beat + beatLength - 0.25f, delegate { see.canBop = true; }), @@ -615,7 +628,7 @@ namespace HeavenStudio.Games { saw.canBop = true; float beatLength = see.ShouldEndJumpOut() ? 3 : 2; - SoundByte.PlayOneShotGame("seeSaw/otherLand", beat + beatLength); + _landSoundEnd = SoundByte.PlayOneShotGame("seeSaw/otherLand", beat + beatLength); BeatAction.New(instance, new List() { new BeatAction.Action(beat + beatLength - 0.25f, delegate { see.canBop = true; }), @@ -674,7 +687,7 @@ namespace HeavenStudio.Games if (currentJumpIndex >= allJumpEvents.Count || allJumpEvents[currentJumpIndex].beat != beat + 2) { saw.canBop = true; - SoundByte.PlayOneShotGame("seeSaw/otherLand", beat + 2); + _landSoundEnd = SoundByte.PlayOneShotGame("seeSaw/otherLand", beat + 2); BeatAction.New(instance, new List() { new BeatAction.Action(beat + 1.75f, delegate { see.canBop = true; }), @@ -718,18 +731,19 @@ namespace HeavenStudio.Games void DetermineSeeJump(double beat, bool miss = false, bool high = false, float height = 0) { - if (currentJumpIndex >= 0 - && (allJumpEvents[currentJumpIndex - 1].datamodel == "seeSaw/longLong" || allJumpEvents[currentJumpIndex - 1].datamodel == "seeSaw/shortLong")) + if (currentJumpIndex < 0) return; + if (allJumpEvents[currentJumpIndex - 1].datamodel == "seeSaw/longLong" || allJumpEvents[currentJumpIndex - 1].datamodel == "seeSaw/shortLong") { if (NextJumpEventIsOnBeat()) { + bool shouldHighJump = allJumpEvents[currentJumpIndex]["high"] || high; if (allJumpEvents[currentJumpIndex].datamodel is "seeSaw/longLong" or "seeSaw/shortLong") { - see.SetState(high ? SeeSawGuy.JumpState.HighOutOut : SeeSawGuy.JumpState.OutOut, beat, miss, height); + see.SetState(shouldHighJump ? SeeSawGuy.JumpState.HighOutOut : SeeSawGuy.JumpState.OutOut, beat, miss, height); } else if (allJumpEvents[currentJumpIndex].datamodel is "seeSaw/longShort" or "seeSaw/shortShort") { - see.SetState(high ? SeeSawGuy.JumpState.HighOutIn : SeeSawGuy.JumpState.OutIn, beat, miss, height); + see.SetState(shouldHighJump ? SeeSawGuy.JumpState.HighOutIn : SeeSawGuy.JumpState.OutIn, beat, miss, height); } } else @@ -745,8 +759,7 @@ namespace HeavenStudio.Games } } - else if (currentJumpIndex >= 0 - && (allJumpEvents[currentJumpIndex - 1].datamodel == "seeSaw/longShort" || allJumpEvents[currentJumpIndex - 1].datamodel == "seeSaw/shortShort")) + else if (allJumpEvents[currentJumpIndex - 1].datamodel == "seeSaw/longShort" || allJumpEvents[currentJumpIndex - 1].datamodel == "seeSaw/shortShort") { if (NextJumpEventIsOnBeat()) { diff --git a/Assets/Scripts/Games/Splashdown/NtrSynchrette.cs b/Assets/Scripts/Games/Splashdown/NtrSynchrette.cs index bccc661a..484a049a 100644 --- a/Assets/Scripts/Games/Splashdown/NtrSynchrette.cs +++ b/Assets/Scripts/Games/Splashdown/NtrSynchrette.cs @@ -124,10 +124,10 @@ namespace HeavenStudio.Games.Scripts_Splashdown Instantiate(splashPrefab, splashHolder).Init("Appearsplash"); } - public void GoDown() + public void GoDown(bool splash = true) { SetState(MovementState.Dive, startBeat); - Instantiate(splashPrefab, splashHolder).Init("GodownSplash"); + if (splash) Instantiate(splashPrefab, splashHolder).Init("GodownSplash"); } public void Bop() diff --git a/Assets/Scripts/Games/Splashdown/Splashdown.cs b/Assets/Scripts/Games/Splashdown/Splashdown.cs index 70f33da7..5cac9177 100644 --- a/Assets/Scripts/Games/Splashdown/Splashdown.cs +++ b/Assets/Scripts/Games/Splashdown/Splashdown.cs @@ -65,7 +65,7 @@ namespace HeavenStudio.Games.Loaders }, new GameAction("amount", "Synchrette Amount") { - function = delegate { Splashdown.instance.SpawnSynchrettes(eventCaller.currentEntity["amount"]); }, + function = delegate { Splashdown.instance.SpawnSynchrettes(eventCaller.currentEntity["amount"], eventCaller.currentEntity.beat); }, defaultLength = 0.5f, parameters = new List() { @@ -93,6 +93,7 @@ namespace HeavenStudio.Games private List currentSynchrettes = new List(); private NtrSynchrette player; + private double _gameSwitchBeat = -1; private void Awake() { @@ -100,6 +101,18 @@ namespace HeavenStudio.Games SpawnSynchrettes(3); } + public override void OnGameSwitch(double beat) + { + _gameSwitchBeat = beat; + } + + public override void OnPlay(double beat) + { + var events = EventCaller.GetAllInGameManagerList("gameManager", new string[] { "switchGame" }).FindAll(x => x.beat < beat); + if (events.Count == 0) return; + _gameSwitchBeat = events[^1].beat; + } + private void Update() { var cond = Conductor.instance; @@ -125,7 +138,7 @@ namespace HeavenStudio.Games } } - public void SpawnSynchrettes(int amount) + public void SpawnSynchrettes(int amount, double beat = -1) { if (currentSynchrettes.Count > 0) { @@ -137,13 +150,20 @@ namespace HeavenStudio.Games } if (player != null) Destroy(player.gameObject); float startPos = -((amount / 2) * synchretteDistance) + ((amount % 2 == 0) ? synchretteDistance / 2 : 0); - + bool shouldGoDown = false; + if (beat >= 0) + { + var inputEvents = EventCaller.GetAllInGameManagerList("splashdown", new string[] { "dive", "appear", "jump", "together", "togetherR9" }).FindAll(x => x.beat < beat && x.beat >= _gameSwitchBeat); + if (inputEvents.Count > 0) shouldGoDown = inputEvents[^1].datamodel == "splashdown/dive"; + } for (int i = 0; i < amount; i++) { NtrSynchrette spawnedSynchrette = Instantiate(synchrettePrefab, synchretteHolder); spawnedSynchrette.transform.localPosition = new Vector3(startPos + (synchretteDistance * i), spawnedSynchrette.transform.localPosition.y, 0); if (i < amount - 1) currentSynchrettes.Add(spawnedSynchrette); else player = spawnedSynchrette; + + if (shouldGoDown) spawnedSynchrette.GoDown(false); } } diff --git a/Assets/Scripts/Games/TossBoys/TossBoys.cs b/Assets/Scripts/Games/TossBoys/TossBoys.cs index 31c46cd3..752d7b84 100644 --- a/Assets/Scripts/Games/TossBoys/TossBoys.cs +++ b/Assets/Scripts/Games/TossBoys/TossBoys.cs @@ -169,7 +169,7 @@ namespace HeavenStudio.Games protected static bool IA_TouchNrm(out double dt) { - return PlayerInput.GetFlick(out dt) + return PlayerInput.GetTouchDown(InputController.ActionsTouch.Tap, out dt) && (instance.currentReceiver is WhichTossKid.Akachan || (instance.lastReceiver is WhichTossKid.Akachan or WhichTossKid.None && instance.currentReceiver is WhichTossKid.None) @@ -178,7 +178,7 @@ namespace HeavenStudio.Games } protected static bool IA_TouchDir(out double dt) { - return PlayerInput.GetFlick(out dt) + return PlayerInput.GetTouchDown(InputController.ActionsTouch.Tap, out dt) && (instance.currentReceiver is WhichTossKid.Kiiyan || (instance.lastReceiver is WhichTossKid.Kiiyan && instance.currentReceiver is WhichTossKid.None) @@ -187,7 +187,7 @@ namespace HeavenStudio.Games } protected static bool IA_TouchAlt(out double dt) { - return PlayerInput.GetFlick(out dt) + return PlayerInput.GetTouchDown(InputController.ActionsTouch.Tap, out dt) && (instance.currentReceiver is WhichTossKid.Aokun || (instance.lastReceiver is WhichTossKid.Aokun && instance.currentReceiver is WhichTossKid.None) @@ -276,44 +276,6 @@ namespace HeavenStudio.Games BackgroundColorUpdate(); if (cond.isPlaying && !cond.isPaused) { - if (PlayerInput.CurrentControlStyle == InputController.ControlStyles.Touch) - { - TossKid next = GetCurrentReceiver(); - if (currentReceiver == WhichTossKid.None && lastReceiver != WhichTossKid.None) - { - next = GetReceiver(lastReceiver); - } - else if (currentReceiver == WhichTossKid.None && lastReceiver == WhichTossKid.None) - { - next = akachan; - } - if (PlayerInput.GetIsAction(InputAction_BasicPress)) - { - if (currentBall != null && next != null) - { - if (currentBall.willBePopped) - { - next.PopBallPrepare(); - } - else - { - next.Crouch(); - } - } - else if (next != null) - { - next.Crouch(); - } - } - else if (PlayerInput.GetIsAction(InputAction_BasicRelease)) - { - if (next != null) - { - next.UnCrouch(); - } - } - } - if (PlayerInput.GetIsAction(InputAction_Aka) && !IsExpectingInputNow(InputAction_Aka)) { akachan.HitBall(false); diff --git a/Assets/Scripts/Games/TossBoys/TossKid.cs b/Assets/Scripts/Games/TossBoys/TossKid.cs index d7d6a4f7..851f68a9 100644 --- a/Assets/Scripts/Games/TossBoys/TossKid.cs +++ b/Assets/Scripts/Games/TossBoys/TossKid.cs @@ -41,7 +41,7 @@ namespace HeavenStudio.Games.Scripts_TossBoys public void Bop() { - if (crouch || preparing) return; + if (crouch || preparing || (!anim.IsAnimationNotPlaying() && !anim.IsPlayingAnimationName(prefix + "Idle"))) return; DoAnimationScaledAsync("Bop", 0.5f); } diff --git a/Assets/Scripts/Minigames.cs b/Assets/Scripts/Minigames.cs index c15345f5..7fb7006c 100644 --- a/Assets/Scripts/Minigames.cs +++ b/Assets/Scripts/Minigames.cs @@ -1025,7 +1025,15 @@ namespace HeavenStudio }), } }, - new GameAction("screenTiling", "Screen Tiling") + new GameAction("fitScreen", "Fit Game To Screen") + { + defaultLength = 0.5f, + parameters = new() + { + new("enable", true, "Enabled") + } + }, + new GameAction("screenTiling", "Tile Screen") { resizable = true, parameters = new() @@ -1034,15 +1042,26 @@ namespace HeavenStudio new("yStart", new EntityTypes.Float(1, 100, 1), "Start Vertical Tiles"), new("xEnd", new EntityTypes.Float(1, 100, 1), "End Horizontal Tiles"), new("yEnd", new EntityTypes.Float(1, 100, 1), "End Vertical Tiles"), - + new Param("axis", StaticCamera.ViewAxis.All, "Axis"), + new("ease", Util.EasingFunction.Ease.Linear, "Ease", "", new() + { + new((x, y) => (Util.EasingFunction.Ease)x != Util.EasingFunction.Ease.Instant, new string[] { "xStart", "yStart" }) + }), + } + }, + new GameAction("scrollTiles", "Scroll Tiles") + { + resizable = true, + parameters = new() + { new("xScrollStart", new EntityTypes.Float(-100, 100, 0), "Start Horizontal Scroll"), new("yScrollStart", new EntityTypes.Float(-100, 100, 0), "Start Vertical Scroll"), new("xScrollEnd", new EntityTypes.Float(-100, 100, 0), "End Horizontal Scroll"), new("yScrollEnd", new EntityTypes.Float(-100, 100, 0), "End Vertical Scroll"), - + new Param("axis", StaticCamera.ViewAxis.All, "Axis"), new("ease", Util.EasingFunction.Ease.Linear, "Ease", "", new() { - new((x, y) => (Util.EasingFunction.Ease)x != Util.EasingFunction.Ease.Instant, new string[] { "xStart", "yStart", "xScrollStart", "yScrollStart" }) + new((x, y) => (Util.EasingFunction.Ease)x != Util.EasingFunction.Ease.Instant, new string[] { "xScrollStart", "yScrollStart" }) }), } } diff --git a/Assets/Scripts/ScreenTiling.cs b/Assets/Scripts/ScreenTiling.cs index b08181c0..3de2794f 100644 --- a/Assets/Scripts/ScreenTiling.cs +++ b/Assets/Scripts/ScreenTiling.cs @@ -10,7 +10,8 @@ namespace HeavenStudio { private RawImage _image; - private List _events = new(); + private List _tileEvents = new(); + private List _scrollEvents = new(); private void Awake() { @@ -24,14 +25,19 @@ namespace HeavenStudio public void OnBeatChanged(double beat) { - _events = EventCaller.GetAllInGameManagerList("vfx", new string[] { "screenTiling" }); + _tileEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "screenTiling" }); + _scrollEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "scrollTiles" }); ResetUVRect(); Update(); } private void Update() { - foreach (var e in _events) + float newXTiles = 1; + float newYTiles = 1; + float newXScroll = 0; + float newYScroll = 0; + foreach (var e in _tileEvents) { float normalized = Conductor.instance.GetPositionFromBeat(e.beat, e.length); if (normalized < 0) break; @@ -40,13 +46,45 @@ namespace HeavenStudio var func = Util.EasingFunction.GetEasingFunction((Util.EasingFunction.Ease)e["ease"]); - float newXTiles = func(e["xStart"], e["xEnd"], clampNormal); - float newYTiles = func(e["yStart"], e["yEnd"], clampNormal); - float newXScroll = func(e["xScrollStart"], e["xScrollEnd"], clampNormal); - float newYScroll = func(e["yScrollStart"], e["yScrollEnd"], clampNormal); - - _image.uvRect = new Rect(newXScroll, newYScroll, newXTiles, newYTiles); + switch ((StaticCamera.ViewAxis)e["axis"]) + { + case StaticCamera.ViewAxis.All: + newXTiles = func(e["xStart"], e["xEnd"], clampNormal); + newYTiles = func(e["yStart"], e["yEnd"], clampNormal); + break; + case StaticCamera.ViewAxis.X: + newXTiles = func(e["xStart"], e["xEnd"], clampNormal); + break; + case StaticCamera.ViewAxis.Y: + newYTiles = func(e["yStart"], e["yEnd"], clampNormal); + break; + } } + + foreach (var e in _scrollEvents) + { + float normalized = Conductor.instance.GetPositionFromBeat(e.beat, e.length); + if (normalized < 0) break; + + float clampNormal = Mathf.Clamp01(normalized); + + var func = Util.EasingFunction.GetEasingFunction((Util.EasingFunction.Ease)e["ease"]); + + switch ((StaticCamera.ViewAxis)e["axis"]) + { + case StaticCamera.ViewAxis.All: + newXScroll = func(e["xScrollStart"], e["xScrollEnd"], clampNormal); + newYScroll = func(e["yScrollStart"], e["yScrollEnd"], clampNormal); + break; + case StaticCamera.ViewAxis.X: + newXScroll = func(e["xScrollStart"], e["xScrollEnd"], clampNormal); + break; + case StaticCamera.ViewAxis.Y: + newYScroll = func(e["yScrollStart"], e["yScrollEnd"], clampNormal); + break; + } + } + _image.uvRect = new Rect(newXScroll, newYScroll, newXTiles, newYTiles); } public void ResetUVRect() diff --git a/Assets/Scripts/StaticCamera.cs b/Assets/Scripts/StaticCamera.cs index c92a1bc9..09708bc4 100644 --- a/Assets/Scripts/StaticCamera.cs +++ b/Assets/Scripts/StaticCamera.cs @@ -21,6 +21,10 @@ namespace HeavenStudio [SerializeField] GameObject ambientBgGO; [SerializeField] GameObject letterboxBgGO; + [SerializeField] RectTransform overlayCanvas; + [SerializeField] RectTransform letterboxMask; + [SerializeField] RectTransform parentView; + public static StaticCamera instance { get; private set; } public new Camera camera; @@ -37,6 +41,7 @@ namespace HeavenStudio private List panEvents = new(); private List scaleEvents = new(); private List rotationEvents = new(); + private List fitScreenEvents = new(); static Vector3 defaultPan = new Vector3(0, 0, 0); static Vector3 defaultScale = new Vector3(1, 1, 1); @@ -78,6 +83,7 @@ namespace HeavenStudio panEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "pan view" }); scaleEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "scale view" }); rotationEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "rotate view" }); + fitScreenEvents = EventCaller.GetAllInGameManagerList("vfx", new string[] { "fitScreen" }); panLast = defaultPan; scaleLast = defaultScale; @@ -86,6 +92,7 @@ namespace HeavenStudio UpdatePan(); UpdateRotation(); UpdateScale(); + UpdateGameScreenFit(); canvas.localPosition = pan; canvas.eulerAngles = new Vector3(0, 0, rotation); @@ -98,12 +105,34 @@ namespace HeavenStudio UpdatePan(); UpdateRotation(); UpdateScale(); + UpdateGameScreenFit(); canvas.localPosition = pan; canvas.eulerAngles = new Vector3(0, 0, rotation); canvas.localScale = scale; } + private void UpdateGameScreenFit() + { + var curBeat = Conductor.instance.songPositionInBeatsAsDouble; + letterboxMask.localScale = new Vector3(1, 1, 1); + overlayCanvas.localScale = new Vector3(1, 1, 1); + foreach (var e in fitScreenEvents) + { + if (curBeat < e.beat) break; + if (e["enable"]) + { + letterboxMask.localScale = new Vector3(parentView.sizeDelta.x / 16, parentView.sizeDelta.y / 9, 1); + overlayCanvas.localScale = new Vector3(parentView.sizeDelta.x / 16, parentView.sizeDelta.y / 9, 1); + } + else + { + letterboxMask.localScale = new Vector3(1, 1, 1); + overlayCanvas.localScale = new Vector3(1, 1, 1); + } + } + } + private void UpdatePan() { foreach (var e in panEvents)