92 lines
3.2 KiB
C#
92 lines
3.2 KiB
C#
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();
|
|
}
|
|
}
|
|
} |