This commit is contained in:
xinkl
2025-11-09 18:29:33 +08:00
263 changed files with 14537 additions and 1869 deletions

View File

@@ -1,5 +1,6 @@
using UnityEngine;
using A2W;
using Cysharp.Threading.Tasks;
public class LaunchManager : SceneSingleton<LaunchManager>
{
@@ -8,5 +9,17 @@ public class LaunchManager : SceneSingleton<LaunchManager>
UIManager.instance?.Init();
await UIManager.instance.ShowPanel<LaunchPanel>();
//await UniTask.Delay(2000);
//var panel = await UIManager.instance.ShowPanel<MessagePanel>();
//await UniTask.Delay(2000);
//panel.AddMessage("Test Message Forever");
//await UniTask.Delay(2000);
//panel.AddMessage("Test Message 2s", 2);
}
}

View File

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

View File

@@ -0,0 +1,86 @@
using UnityEngine;
using MonsterLove.StateMachine;
using DG.Tweening;
public enum MessageStates
{
Init,
Add,
Show,
Del
}
public class MessageElement : MonoBehaviour
{
[SerializeField] TMPro.TextMeshProUGUI messageText;
public RectTransform RectTransform
{
get
{
return transform as RectTransform;
}
}
public string Message { get; private set; }
private float remaining;
private MessagePanel panel;
StateMachine<MessageStates> fsm;
public void Init(MessagePanel panel, string message, float duration)
{
this.panel = panel;
Message = message;
remaining = duration;
if (remaining < 0)
{
remaining = float.MaxValue;
}
if (fsm is null)
{
fsm = StateMachine<MessageStates>.Initialize(this);
}
fsm.ChangeState(MessageStates.Init);
}
private void Init_Enter()
{
// 这里初始化,包括位置和消息信息
messageText.text = Message;
messageText.rectTransform.anchoredPosition = new Vector2(messageText.rectTransform.rect.width, 0);
fsm.ChangeState(MessageStates.Add);
}
private void Add_Enter()
{
// 这里播动画
messageText.rectTransform.DOAnchorPosX(0, 0.2f);
fsm.ChangeState(MessageStates.Show);
}
private void Show_Update()
{
remaining -= Time.deltaTime;
if (remaining <= 0)
{
remaining = float.MaxValue;
fsm.ChangeState(MessageStates.Del);
}
}
private void Del_Enter()
{
// 理论上这里也需要做个动画,先不管了
panel.DelMessage(this);
}
}

View File

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

View File

@@ -0,0 +1,79 @@
using UnityEngine;
using A2W;
using Cysharp.Threading.Tasks;
using System.Collections.Generic;
using DG.Tweening;
public class MessagePanel : UIPanel
{
[SerializeField] MessageElement messageElementPrefab;
[SerializeField] RectTransform content;
List<MessageElement> messages;
public override void Init()
{
messages = new List<MessageElement>();
}
public override async UniTask Show()
{
await UniTask.Yield();
gameObject.SetActive(true);
}
public override async UniTask Hide()
{
await UniTask.Yield();
gameObject.SetActive(false);
}
public void AddMessage(string message, float duration = -1)
{
// 默认加到开头
AddMessage(message, duration, 0);
}
public void AddMessage(string message, float duration, int index)
{
var msgEle = Instantiate<MessageElement>(messageElementPrefab, content, false);
msgEle.Init(this, message, duration);
//messages.Add(msgEle);
messages.Insert(index, msgEle);
UpdateMessagesPosY();
}
public void DelMessage(string message)
{
foreach (var msg in messages)
{
if (msg.Message == message)
{
DelMessage(msg);
break;
}
}
}
public async void DelMessage(MessageElement msgEle)
{
messages.Remove(msgEle);
Destroy(msgEle.gameObject);
await UniTask.Yield();
UpdateMessagesPosY();
}
public void UpdateMessagesPosY()
{
// 根据messageElement的index使用Dotween移动PosY到指定位置-index * Height
for (int i = 0; i < messages.Count; i++)
{
messages[i].RectTransform.DOAnchorPosY(-i * messages[i].RectTransform.rect.height, 0.2f);
}
}
}

View File

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