2026-05-12 14:39:10 +08:00

604 lines
20 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @Author: 白哉
* @Description:
* @Date: 2026年01月26日 星期一 16:01:52
* @Modify:
*/
using MemoryPack;
using UnityEngine;
namespace TH1_Logic.Comic
{
// 淡入 淡出 左滑入 左滑出 右滑入 右滑出 上滑入 上滑出 下滑入 下滑出 字体浮现 整体上移入 整体上移出 整体淡出
public enum ComicActionType
{
None = 0,
FadeIn = 1,
FadeOut = 2,
SlideInLeft = 3,
SlideOutLeft = 4,
SlideInRight = 5,
SlideOutRight = 6,
SlideInUp = 7,
SlideOutUp = 8,
SlideInDown = 9,
SlideOutDown = 10,
TextAppear = 11,
AllSlideInUp = 12,
AllSlideOutUp = 13,
AllFadeOut = 14,
}
[MemoryPackable]
public partial class ComicAction
{
public int TargetId;
public ComicActionType ActionType;
public float Duration;
public string Desc;
[MemoryPackIgnore]
public int Index;
[MemoryPackConstructor]
public ComicAction()
{
TargetId = 0;
ActionType = ComicActionType.None;
Duration = 1f;
}
}
public class ComicActionLogicFactory
{
public static ComicActionLogic GetActionLogic(ComicActionType actionType)
{
return actionType switch
{
ComicActionType.FadeIn => new FadeInComicActionLogic(),
ComicActionType.FadeOut => new FadeOutComicActionLogic(),
ComicActionType.SlideInLeft => new SlideInLeftComicActionLogic(),
ComicActionType.SlideOutLeft => new SlideOutLeftComicActionLogic(),
ComicActionType.SlideInRight => new SlideInRightComicActionLogic(),
ComicActionType.SlideOutRight => new SlideOutRightComicActionLogic(),
ComicActionType.SlideInUp => new SlideInUpComicActionLogic(),
ComicActionType.SlideOutUp => new SlideOutUpComicActionLogic(),
ComicActionType.SlideInDown => new SlideInDownComicActionLogic(),
ComicActionType.SlideOutDown => new SlideOutDownComicActionLogic(),
ComicActionType.TextAppear => new TextAppearComicActionLogic(),
ComicActionType.AllSlideInUp => new AllSlideInUpComicActionLogic(),
ComicActionType.AllSlideOutUp => new AllSlideOutUpComicActionLogic(),
ComicActionType.AllFadeOut => new AllFadeOutComicActionLogic(),
_ => null
};
}
}
public abstract class ComicActionLogic
{
public abstract void SetStartState(ComicData data, ComicSubItem item, ComicAction action);
public abstract void SetEndState(ComicData data, ComicSubItem item, ComicAction action);
public abstract void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio);
}
// 淡入 Action
public class FadeInComicActionLogic : ComicActionLogic
{
public override void SetStartState(ComicData data, ComicSubItem item, ComicAction action)
{
if (item != null && item.ItemType == ComicSubItemType.Image && item.Mono)
{
var color = item.Mono.ItemImage.color;
color.a = 0;
item.Mono.ItemImage.color = color;
return;
}
if (item != null && item.ItemType == ComicSubItemType.Dialog && item.Mono)
{
var color = item.Mono.DialogImage.color;
color.a = 0;
item.Mono.DialogImage.color = color;
color = item.Mono.TextMono.color;
color.a = 0;
item.Mono.TextMono.color = color;
return;
}
var blackColor = data.Mono.BlackImage.color;
blackColor.a = 1;
data.Mono.BlackImage.color = blackColor;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
if (item != null && item.ItemType == ComicSubItemType.Image && item.Mono)
{
var color = item.Mono.ItemImage.color;
color.a = 1;
item.Mono.ItemImage.color = color;
return;
}
if (item != null && item.ItemType == ComicSubItemType.Dialog && item.Mono)
{
var color = item.Mono.DialogImage.color;
color.a = 1;
item.Mono.DialogImage.color = color;
color = item.Mono.TextMono.color;
color.a = 1;
item.Mono.TextMono.color = color;
return;
}
var blackColor = data.Mono.BlackImage.color;
blackColor.a = 0;
data.Mono.BlackImage.color = blackColor;
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
if (item != null && item.ItemType == ComicSubItemType.Image && item.Mono)
{
var color = item.Mono.ItemImage.color;
color.a = ratio;
item.Mono.ItemImage.color = color;
return;
}
if (item != null && item.ItemType == ComicSubItemType.Dialog && item.Mono)
{
var color = item.Mono.DialogImage.color;
color.a = ratio;
item.Mono.DialogImage.color = color;
color = item.Mono.TextMono.color;
color.a = ratio;
item.Mono.TextMono.color = color;
return;
}
var blackColor = data.Mono.BlackImage.color;
blackColor.a = 1 - ratio;
data.Mono.BlackImage.color = blackColor;
}
}
// 淡出 Action
public class FadeOutComicActionLogic : ComicActionLogic
{
public override void SetStartState(ComicData data, ComicSubItem item, ComicAction action)
{
if (item != null && item.ItemType == ComicSubItemType.Image && item.Mono)
{
var color = item.Mono.ItemImage.color;
color.a = 1;
item.Mono.ItemImage.color = color;
return;
}
if (item != null && item.ItemType == ComicSubItemType.Dialog && item.Mono)
{
var color = item.Mono.DialogImage.color;
color.a = 1;
item.Mono.DialogImage.color = color;
color = item.Mono.TextMono.color;
color.a = 1;
item.Mono.TextMono.color = color;
return;
}
var blackColor = data.Mono.BlackImage.color;
blackColor.a = 0;
data.Mono.BlackImage.color = blackColor;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
if (item != null && item.ItemType == ComicSubItemType.Image && item.Mono)
{
var color = item.Mono.ItemImage.color;
color.a = 0;
item.Mono.ItemImage.color = color;
return;
}
if (item != null && item.ItemType == ComicSubItemType.Dialog && item.Mono)
{
var color = item.Mono.DialogImage.color;
color.a = 0;
item.Mono.DialogImage.color = color;
color = item.Mono.TextMono.color;
color.a = 0;
item.Mono.TextMono.color = color;
return;
}
var blackColor = data.Mono.BlackImage.color;
blackColor.a = 1;
data.Mono.BlackImage.color = blackColor;
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
if (item != null && item.ItemType == ComicSubItemType.Image && item.Mono)
{
var color = item.Mono.ItemImage.color;
color.a = 1 - ratio;
item.Mono.ItemImage.color = color;
return;
}
if (item != null && item.ItemType == ComicSubItemType.Dialog && item.Mono)
{
var color = item.Mono.DialogImage.color;
color.a = 1 - ratio;
item.Mono.DialogImage.color = color;
color = item.Mono.TextMono.color;
color.a = 1 - ratio;
item.Mono.TextMono.color = color;
return;
}
var blackColor = data.Mono.BlackImage.color;
blackColor.a = ratio;
data.Mono.BlackImage.color = blackColor;
}
}
// 左滑入 Action
public class SlideInLeftComicActionLogic : ComicActionLogic
{
private Vector2 _pos = new Vector2();
public override void SetStartState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = -1400;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = item.PositionX;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
_pos.x = -1400 + (item.PositionX + 1400) * ratio;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
}
// 左滑出 Action
public class SlideOutLeftComicActionLogic : ComicActionLogic
{
private Vector2 _pos = new Vector2();
public override void SetStartState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = item.PositionX;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = -1400;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
_pos.x = item.PositionX - (item.PositionX + 1400) * ratio;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
}
// 右滑入 Action
public class SlideInRightComicActionLogic : ComicActionLogic
{
private Vector2 _pos = new Vector2();
public override void SetStartState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = 1400;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = item.PositionX;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
_pos.x = 1400 - (1400 - item.PositionX) * ratio;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
}
// 右滑出 Action
public class SlideOutRightComicActionLogic : ComicActionLogic
{
private Vector2 _pos = new Vector2();
public override void SetStartState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = item.PositionX;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = 1400;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
_pos.x = item.PositionX + (1400 - item.PositionX) * ratio;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
}
// 上滑入 Action从上方进入
public class SlideInUpComicActionLogic : ComicActionLogic
{
private Vector2 _pos = new Vector2();
public override void SetStartState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = item.PositionX;
_pos.y = 700;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = item.PositionX;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
_pos.x = item.PositionX;
_pos.y = 700 - (700 - item.PositionY) * ratio;
item.Mono.ItemRect.anchoredPosition = _pos;
}
}
// 上滑出 Action向上方离开
public class SlideOutUpComicActionLogic : ComicActionLogic
{
private Vector2 _pos = new Vector2();
public override void SetStartState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = item.PositionX;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = item.PositionX;
_pos.y = 700;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
_pos.x = item.PositionX;
_pos.y = item.PositionY + (700 - item.PositionY) * ratio;
item.Mono.ItemRect.anchoredPosition = _pos;
}
}
// 下滑入 Action从下方进入
public class SlideInDownComicActionLogic : ComicActionLogic
{
private Vector2 _pos = new Vector2();
public override void SetStartState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = item.PositionX;
_pos.y = -700;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = item.PositionX;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
_pos.x = item.PositionX;
_pos.y = -700 + (item.PositionY + 700) * ratio;
item.Mono.ItemRect.anchoredPosition = _pos;
}
}
// 下滑出 Action向下方离开
public class SlideOutDownComicActionLogic : ComicActionLogic
{
private Vector2 _pos = new Vector2();
public override void SetStartState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = item.PositionX;
_pos.y = item.PositionY;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = item.PositionX;
_pos.y = -700;
item.Mono.ItemRect.anchoredPosition = _pos;
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
_pos.x = item.PositionX;
_pos.y = item.PositionY - (item.PositionY + 700) * ratio;
item.Mono.ItemRect.anchoredPosition = _pos;
}
}
// 字体浮现 Action
public class TextAppearComicActionLogic : ComicActionLogic
{
public override void SetStartState(ComicData data, ComicSubItem item, ComicAction action)
{
if (item.Mono.TextMono != null)
{
item.Mono.TextMono.ForceMeshUpdate();
item.Mono.TextMono.maxVisibleCharacters = 0;
}
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
if (item.Mono.TextMono != null)
{
item.Mono.TextMono.maxVisibleCharacters = item.Mono.TextMono.textInfo.characterCount;
}
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
if (item.Mono.TextMono != null)
{
int visibleCount = (int)(item.Mono.TextMono.textInfo.characterCount * ratio);
item.Mono.TextMono.maxVisibleCharacters = visibleCount;
}
}
}
// 整体上移入 Action
public class AllSlideInUpComicActionLogic : ComicActionLogic
{
private Vector2 _pos;
public override void SetStartState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = 0;
_pos.y = -data.Mono.Rect.rect.height;
data.Mono.Rect.anchoredPosition = _pos;
action.Duration = 0.2f;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = 0;
_pos.y = 0;
data.Mono.Rect.anchoredPosition = _pos;
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
_pos.x = 0;
_pos.y = -data.Mono.Rect.rect.height * (1 - ratio);
data.Mono.Rect.anchoredPosition = _pos;
}
}
// 整体上移出 Action
public class AllSlideOutUpComicActionLogic : ComicActionLogic
{
private Vector2 _pos;
public override void SetStartState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = 0;
_pos.y = 0;
data.Mono.Rect.anchoredPosition = _pos;
action.Duration = 0.2f;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
_pos.x = 0;
_pos.y = data.Mono.Rect.rect.height;
data.Mono.Rect.anchoredPosition = _pos;
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
_pos.x = 0;
_pos.y = data.Mono.Rect.rect.height * ratio;
data.Mono.Rect.anchoredPosition = _pos;
}
}
// 整体淡出 Action
public class AllFadeOutComicActionLogic : ComicActionLogic
{
private CanvasGroup GetOrAddCanvasGroup(ComicData data)
{
if (!data?.Mono) return null;
var canvasGroup = data.Mono.GetComponent<CanvasGroup>();
if (!canvasGroup) canvasGroup = data.Mono.gameObject.AddComponent<CanvasGroup>();
return canvasGroup;
}
private void SetAlpha(ComicData data, float alpha)
{
var canvasGroup = GetOrAddCanvasGroup(data);
if (!canvasGroup) return;
canvasGroup.alpha = Mathf.Clamp01(alpha);
}
public override void SetStartState(ComicData data, ComicSubItem item, ComicAction action)
{
SetAlpha(data, 1f);
action.Duration = 0.2f;
}
public override void SetEndState(ComicData data, ComicSubItem item, ComicAction action)
{
SetAlpha(data, 0f);
}
public override void SetUpdateAction(ComicData data, ComicSubItem item, ComicAction action, float ratio)
{
SetAlpha(data, 1f - ratio);
}
}
}