riversong code showcase
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
using System.Text;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using PrimeTween;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
namespace DanieleMarotta.RiversongCodeShowcase
|
||||
{
|
||||
[UIView("onboarding-panel")]
|
||||
public class OnboardingPanelUIView : UIView
|
||||
{
|
||||
private VisualElement _messages;
|
||||
|
||||
public override UniTask InitializeAsync(UIService uiService, VisualElement rootElement)
|
||||
{
|
||||
base.InitializeAsync(uiService, rootElement);
|
||||
|
||||
_messages = rootElement.Q<VisualElement>(className: "onboarding-panel__messages");
|
||||
|
||||
return UniTask.CompletedTask;
|
||||
}
|
||||
|
||||
public bool IsShowingAnyMessage()
|
||||
{
|
||||
return _messages.childCount > 0;
|
||||
}
|
||||
|
||||
public void ShowMessage(string message)
|
||||
{
|
||||
var element = UIService.TemplateLibrary.OnboardingPanel.Message.CloneTree();
|
||||
element.Q<Button>().RegisterCallbackOnce<ClickEvent>(_ => CloseCurrentMessage());
|
||||
|
||||
_messages.Add(element);
|
||||
|
||||
ShowMessageAsync(element, message).Forget();
|
||||
}
|
||||
|
||||
private async UniTask ShowMessageAsync(VisualElement element, string message)
|
||||
{
|
||||
UIVisibilityAnimation.PlayShowTween(element).ToUniTask().Forget();
|
||||
await AnimateTextAsync(element, message);
|
||||
PlayReminderAnimationAsync(element).Forget();
|
||||
}
|
||||
|
||||
private async UniTask AnimateTextAsync(VisualElement element, string message)
|
||||
{
|
||||
var label = element.Q<Label>(className: "onboarding-message__body");
|
||||
label.text = string.Empty;
|
||||
|
||||
var visibleText = new StringBuilder(message.Length);
|
||||
|
||||
for (var i = 0; i < message.Length; i++)
|
||||
{
|
||||
if (message[i] == '<')
|
||||
{
|
||||
var tagEnd = message.IndexOf('>', i + 1);
|
||||
if (tagEnd >= 0)
|
||||
{
|
||||
visibleText.Append(message, i, tagEnd - i + 1);
|
||||
label.text = visibleText.ToString();
|
||||
i = tagEnd;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
visibleText.Append(message[i]);
|
||||
label.text = visibleText.ToString();
|
||||
await UniTask.WaitForSeconds(0.03f, true);
|
||||
}
|
||||
}
|
||||
|
||||
private async UniTask PlayReminderAnimationAsync(VisualElement message)
|
||||
{
|
||||
while (message.panel != null)
|
||||
{
|
||||
await UniTask.WaitForSeconds(5, true);
|
||||
|
||||
await Sequence.Create(useUnscaledTime: true)
|
||||
.Chain(Tween.Custom(0, 3, 0.1f, value => message.style.translate = new Translate(value, 0), Ease.OutQuad))
|
||||
.Chain(Tween.Custom(3, -2.5f, 0.14f, value => message.style.translate = new Translate(value, 0), Ease.InOutQuad))
|
||||
.Chain(Tween.Custom(-2.5f, 1.5f, 0.12f, value => message.style.translate = new Translate(value, 0), Ease.InOutQuad))
|
||||
.Chain(Tween.Custom(1.5f, 0, 0.1f, value => message.style.translate = new Translate(value, 0), Ease.OutQuad));
|
||||
}
|
||||
}
|
||||
|
||||
public void CloseCurrentMessage()
|
||||
{
|
||||
if (_messages.childCount == 0) return;
|
||||
|
||||
_messages[0].RemoveFromHierarchy();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user