## ManagedBehaviour System Refactor - **Sealed `Awake()`** to prevent override mistakes that break singleton registration - **Added `OnManagedAwake()`** for early initialization (fires during registration) - **Renamed lifecycle hook:** `OnManagedAwake()` → `OnManagedStart()` (fires after boot, mirrors Unity's Awake→Start) - **40 files migrated** to new pattern (2 core, 38 components) - Eliminated all fragile `private new void Awake()` patterns - Zero breaking changes - backward compatible ## Centralized Logging System - **Automatic tagging** via `CallerMemberName` and `CallerFilePath` - logs auto-tagged as `[ClassName][MethodName] message` - **Unified API:** Single `Logging.Debug/Info/Warning/Error()` replaces custom `LogDebugMessage()` implementations - **~90 logging call sites** migrated across 10 files - **10 redundant helper methods** removed - All logs broadcast via `Logging.OnLogEntryAdded` event for real-time monitoring ## Custom Log Console (Editor Window) - **Persistent filter popups** for multi-selection (classes, methods, log levels) - windows stay open during selection - **Search** across class names, methods, and message content - **Time range filter** with MinMaxSlider - **Export** filtered logs to timestamped `.txt` files - **Right-click context menu** for quick filtering and copy actions - **Visual improvements:** White text, alternating row backgrounds, color-coded log levels - **Multiple instances** supported for simultaneous system monitoring - Open via `AppleHills > Custom Log Console` Co-authored-by: Michal Pikulski <michal@foolhardyhorizons.com> Co-authored-by: Michal Pikulski <michal.a.pikulski@gmail.com> Reviewed-on: #56
123 lines
3.4 KiB
C#
123 lines
3.4 KiB
C#
using System;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using SkiaSharp.Unity;
|
|
using Input;
|
|
using AppleHills.Core;
|
|
using UI.Core;
|
|
using Pixelplacement;
|
|
using Pixelplacement.TweenSystem;
|
|
using UI;
|
|
|
|
public class AppSwitcher : UIPage
|
|
{
|
|
public GameObject rainbowIn;
|
|
public GameObject rainbowOut;
|
|
public GameObject gameLayoutContainer;
|
|
public GameObject exitButton;
|
|
public RectMask2D rectMask;
|
|
|
|
[Header("Slide Animation Settings")]
|
|
public float slideDuration = 0.5f;
|
|
|
|
private SkottiePlayerV2 rainbowInPlayer;
|
|
private SkottiePlayerV2 rainbowOutPlayer;
|
|
private TweenBase slideInTween;
|
|
private TweenBase slideOutTween;
|
|
|
|
internal override void OnManagedAwake()
|
|
{
|
|
base.OnManagedAwake();
|
|
|
|
PageName = "AppSwitcher";
|
|
rainbowInPlayer = rainbowIn.GetComponent<SkottiePlayerV2>();
|
|
rainbowOutPlayer = rainbowOut.GetComponent<SkottiePlayerV2>();
|
|
|
|
if (rectMask == null)
|
|
{
|
|
rectMask = GetComponent<RectMask2D>();
|
|
}
|
|
|
|
// Initially hide both
|
|
rainbowIn.SetActive(true);
|
|
exitButton.SetActive(false);
|
|
}
|
|
|
|
protected override void DoTransitionIn(Action onComplete)
|
|
{
|
|
InputManager.Instance.SetInputMode(InputMode.UI);
|
|
|
|
gameLayoutContainer.SetActive(true);
|
|
|
|
// Hide rainbow out, show rainbow in
|
|
rainbowOut.SetActive(false);
|
|
|
|
// Play animation on rainbow in without resetting state
|
|
rainbowInPlayer.PlayAnimation(true);
|
|
|
|
// Slide in animation - tween padding.left from 1700 to 0
|
|
slideInTween = TweenPaddingLeft(1700f, 0f, Tween.EaseOut, () =>
|
|
{
|
|
onComplete?.Invoke();
|
|
rainbowOut.SetActive(true);
|
|
exitButton.SetActive(true);
|
|
});
|
|
}
|
|
|
|
protected override void DoTransitionOut(Action onComplete)
|
|
{
|
|
rainbowIn.SetActive(false);
|
|
|
|
// Play animation on rainbow out with resetting state
|
|
rainbowOutPlayer.PlayAnimation(true);
|
|
|
|
// Hide the exit button
|
|
exitButton.SetActive(false);
|
|
|
|
// Slide out animation - tween padding.left from 0 to 1700
|
|
slideOutTween = TweenPaddingLeft(0f, 1700f, Tween.EaseIn, () => {
|
|
gameLayoutContainer.SetActive(false);
|
|
rainbowIn.SetActive(true);
|
|
onComplete?.Invoke();
|
|
InputManager.Instance.SetInputMode(InputMode.GameAndUI);
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// Tweens the left padding of the rectMask from startValue to endValue.
|
|
/// </summary>
|
|
private TweenBase TweenPaddingLeft(float startValue, float endValue, AnimationCurve easeCurve, Action onComplete)
|
|
{
|
|
// Set starting position
|
|
Vector4 startPadding = rectMask.padding;
|
|
startPadding.x = startValue;
|
|
rectMask.padding = startPadding;
|
|
|
|
return Tween.Value(
|
|
startValue,
|
|
endValue,
|
|
(value) => {
|
|
Vector4 padding = rectMask.padding;
|
|
padding.x = value;
|
|
rectMask.padding = padding;
|
|
},
|
|
slideDuration,
|
|
0f, // no delay
|
|
easeCurve,
|
|
Tween.LoopType.None,
|
|
null, // onStart
|
|
onComplete
|
|
);
|
|
}
|
|
|
|
protected override void OnDestroy()
|
|
{
|
|
base.OnDestroy();
|
|
|
|
// Clean up tweens
|
|
slideInTween?.Stop();
|
|
slideOutTween?.Stop();
|
|
}
|
|
|
|
}
|