604 lines
20 KiB
C#
604 lines
20 KiB
C#
/*
|
||
* @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);
|
||
}
|
||
}
|
||
}
|