This commit is contained in:
Mausham
2026-05-27 19:39:26 +05:45
parent efb6cdb3e6
commit c1118b3271
10 changed files with 19778 additions and 1729 deletions

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 69d4557372f902f448f5acb3b8e3cbeb
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,126 +0,0 @@
using System;
using System.Threading;
using Cysharp.Threading.Tasks;
using PrimeTween;
using UnityEngine;
using UnityEngine.UI;
namespace Darkmatter.Features.Mainmenu.Buttons
{
public enum ButtonEffectType
{
None,
Scale,
PunchScale,
ShakePosition,
ShakeRotation,
Bounce,
Pulse,
Wobble,
Flip,
Spin
}
[RequireComponent(typeof(Button))]
[DisallowMultipleComponent]
public class ButtonEffect : MonoBehaviour
{
[SerializeField] private ButtonEffectType effect = ButtonEffectType.Scale;
[SerializeField] private RectTransform target;
[Header("Shared")]
[SerializeField, Min(0.01f)] private float duration = 0.3f;
[SerializeField] private Ease ease = Ease.OutBack;
[SerializeField, Min(0f)] private float loopInterval = 0.5f;
[Header("Effect Tuning")]
[SerializeField] private float scaleAmount = 1.15f;
[SerializeField] private float shakeStrength = 10f;
[SerializeField] private float rotationStrength = 15f;
private Vector3 baseScale;
private Vector3 baseEuler;
private Vector3 baseLocalPosition;
private Tween currentTween;
private CancellationTokenSource loopCts;
private void Awake()
{
if (target == null) target = transform as RectTransform;
baseScale = target.localScale;
baseEuler = target.localEulerAngles;
baseLocalPosition = target.localPosition;
}
private void OnEnable()
{
loopCts = CancellationTokenSource.CreateLinkedTokenSource(this.GetCancellationTokenOnDestroy());
PlayLoopAsync(loopCts.Token).Forget();
}
private void OnDisable()
{
loopCts?.Cancel();
loopCts?.Dispose();
loopCts = null;
currentTween.Stop();
}
private async UniTaskVoid PlayLoopAsync(CancellationToken token)
{
while (!token.IsCancellationRequested)
{
Play();
if (currentTween.isAlive)
{
await UniTask.WaitWhile(() => currentTween.isAlive, cancellationToken: token);
}
if (loopInterval > 0f)
{
await UniTask.Delay(TimeSpan.FromSeconds(loopInterval), cancellationToken: token);
}
}
}
public void Play()
{
currentTween.Stop();
target.localScale = baseScale;
target.localEulerAngles = baseEuler;
target.localPosition = baseLocalPosition;
switch (effect)
{
case ButtonEffectType.None:
break;
case ButtonEffectType.Scale:
currentTween = Tween.Scale(target, baseScale * scaleAmount, duration, ease, 2, CycleMode.Yoyo);
break;
case ButtonEffectType.PunchScale:
currentTween = Tween.PunchScale(target, Vector3.one * (scaleAmount - 1f), duration);
break;
case ButtonEffectType.ShakePosition:
currentTween = Tween.ShakeLocalPosition(target, Vector3.one * shakeStrength, duration);
break;
case ButtonEffectType.ShakeRotation:
currentTween = Tween.ShakeLocalRotation(target, new Vector3(0f, 0f, rotationStrength), duration);
break;
case ButtonEffectType.Bounce:
currentTween = Tween.Scale(target, baseScale * scaleAmount, duration, Ease.OutBounce, 2, CycleMode.Yoyo);
break;
case ButtonEffectType.Pulse:
currentTween = Tween.Scale(target, baseScale * scaleAmount, duration * 0.5f, Ease.InOutSine, 4, CycleMode.Yoyo);
break;
case ButtonEffectType.Wobble:
currentTween = Tween.LocalEulerAngles(target, baseEuler, baseEuler + new Vector3(0f, 0f, rotationStrength), duration * 0.25f, Ease.InOutSine, 4, CycleMode.Yoyo);
break;
case ButtonEffectType.Flip:
currentTween = Tween.LocalEulerAngles(target, baseEuler, baseEuler + new Vector3(0f, 360f, 0f), duration, ease);
break;
case ButtonEffectType.Spin:
currentTween = Tween.LocalEulerAngles(target, baseEuler, baseEuler + new Vector3(0f, 0f, 360f), duration, ease);
break;
}
}
}
}

View File

@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 0e5e02a6b9f322a4d893b3e45a3a2967

View File

@@ -9,7 +9,10 @@ namespace Darkmatter.Features.Mainmenu
{
public class MainmenuView : MonoBehaviour
{
[Header("UI Elements")]
[SerializeField] private Button playBtn;
[SerializeField] private ParticleSystem playBtnParticle;
[SerializeField] private SkeletonGraphic mascotSkeletonGraphic;
[Header("Mascot Animations")]
@@ -58,6 +61,14 @@ namespace Darkmatter.Features.Mainmenu
private void OnPlayBtnClicked()
{
playBtn.interactable = false;
PlayBtnSequenceAsync(this.GetCancellationTokenOnDestroy()).Forget();
}
private async UniTaskVoid PlayBtnSequenceAsync(CancellationToken token)
{
playBtnParticle.Play();
await UniTask.WaitUntil(() => !playBtnParticle.IsAlive(true), cancellationToken: token);
OnPlayBtnClickedEvent?.Invoke();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 6cc101d67503b4fc09ebcac4fecbcea9