ignore
This commit is contained in:
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 69d4557372f902f448f5acb3b8e3cbeb
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0e5e02a6b9f322a4d893b3e45a3a2967
|
||||
@@ -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
@@ -1,2 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6cc101d67503b4fc09ebcac4fecbcea9
|
||||
Reference in New Issue
Block a user