12.10 进度 基本完成

This commit is contained in:
SoulliesOfficial
2025-12-10 18:22:26 -05:00
parent 8d6267e1a2
commit f7cab3e784
224 changed files with 11116 additions and 6240 deletions

View File

@@ -33,7 +33,7 @@ namespace Continentis.MainGame
[Header("GeneralUI")] public GameObject customImage;
public GameObject informationBox;
public SerializableDictionary<Fraction, List<Sprite>> fractionFrames;
public SerializableDictionary<Fraction, Color> fractionColors;
public SerializableDictionary<Rarity, Color> rarityColors;
[Header("CombatUI")]

View File

@@ -182,15 +182,21 @@ namespace Continentis.MainGame.Card
{
GameObject intentionCardObjectPrefab = MainGameManager.Instance.basePrefabs.intentionCardObject;
HUD_Intention intention = user.characterView.hudContainer.enablingHUDs["Intention"] as HUD_Intention;
IntentionCardView intentionCardView = LeanPool.Spawn(intentionCardObjectPrefab, intention.hudTransform).GetComponent<IntentionCardView>();
IntentionCardView intentionCardView = LeanPool.Spawn(intentionCardObjectPrefab, intention.hudTransform)
.GetComponent<IntentionCardView>();
intention.AddCard(intentionCardView);
intentionCardView.card = this;
this.intentionCardView = intentionCardView;
intentionCardView.transform.localScale = Vector3.one;
intentionCardView.Setup(this);
Sprite iconSprite = MainGameManager.Instance.basePrefabs.intentionMarkIcons["Unknown"];
if (cardData.intentionIconKeys.Count > 0)
{
string iconMarkKey = cardData.intentionIconKeys[0];
iconSprite = MainGameManager.Instance.basePrefabs.intentionMarkIcons[iconMarkKey];
}
string iconMarkKey = cardData.intentionIconKeys[0];
Sprite iconSprite = MainGameManager.Instance.basePrefabs.intentionMarkIcons[iconMarkKey];
if (string.IsNullOrEmpty(cardData.intentionTextOverride))
{
if (cardData.intentionValueNames.Count > 0)

View File

@@ -43,10 +43,18 @@ namespace Continentis.MainGame.Card
if(user == null) return;
attributeSubmodule.RefreshAllAttributes();
if ((handCardView == null && intentionCardView == null) || !handCardView.isSelecting)
Untargeting();
/*if ((handCardView == null && intentionCardView == null))
{
eventSubmodule.onUntargeting();
Untargeting();
}
else
{
if (handCardView != null && !handCardView.isSelecting)
{
Untargeting();
}
}*/
contentSubmodule.dirtyMark = true;
}

View File

@@ -116,8 +116,8 @@ namespace Continentis.MainGame.Card
card.contentSubmodule.dirtyMark = true;
}
Vector3 startPosition = cardTransform.position + new Vector3(0, cardTransform.rect.height * cardTransform.lossyScale.y / 2, 0);
Vector3 startPosition = cardTransform.position; //+ new Vector3(0, cardTransform.rect.height * cardTransform.lossyScale.y / 2, 0);
Vector3 endPosition = SpaceConverter.ScreenPointToUIPoint(arrowCanvasRect, eventData.position, uiCamera);
PointerArrow mainPointerArrow = CombatUIManager.Instance.arrowsPage.mainPointerArrow;
@@ -145,7 +145,7 @@ namespace Continentis.MainGame.Card
}
else
{
mainPointerArrow.SetColor(Color.white);
mainPointerArrow.SetColor(Color.clear);
}
}
else if (card.attributeSubmodule.targetCount == -1)
@@ -156,7 +156,7 @@ namespace Continentis.MainGame.Card
{
if (hoveringCharacter != null)
{
mainPointerArrow.SetColor(Color.white);
mainPointerArrow.SetColor(Color.clear);
}
if (validTargets.Contains(hoveringCharacter))

View File

@@ -127,8 +127,7 @@ namespace Continentis.MainGame.Character
{
GameObject prefab = data.combatCharacterView;
CombatCharacterViewBase characterView = Object.Instantiate(prefab, position, Quaternion.identity).GetComponent<CombatCharacterViewBase>();
characterView.InitializeAnimations();
characterView.character = this;
characterView.Initialize(this);
this.characterView = characterView;
return characterView;
}

View File

@@ -46,6 +46,7 @@ namespace Continentis.MainGame.Character
[Header("View")]
public int combatPositionOrder;
public GameObject combatCharacterView;
public SerializableDictionary<string, AnimationClip> animations;
[Header("References")]
public List<string> prefabRefs = new List<string>();

View File

@@ -115,7 +115,7 @@ namespace Continentis.MainGame.Character
eventSubmodule.onFinishAttack.Invoke(target, attackResult);
combatBuffSubmodule.buffList.For(buff =>
{
buff?.eventSubmodule.onDealAttack.Invoke(attackResult);
buff.eventSubmodule?.onDealAttack.Invoke(attackResult);
});
}

View File

@@ -1,17 +1,20 @@
using System;
using System.Collections.Generic;
using AnimatorPlus;
using Continentis.MainGame.UI;
using SLSFramework.General;
using UnityEngine;
namespace Continentis.MainGame.Character
{
public class CombatCharacterViewBase : MonoBehaviour
public partial class CombatCharacterViewBase : MonoBehaviour
{
public CharacterBase character;
public GameObject mainView;
public Animator animator;
public Dictionary<string, AnimationClip> animationClips;
public AnimatorPlus2D animatorPlus2D;
public SerializableDictionary<string, AnimationClip> animations;
public Collider selector;
@@ -21,19 +24,54 @@ namespace Continentis.MainGame.Character
public Transform centerPoint => hudPivot;
public HUDContainer hudContainer;
public void InitializeAnimations()
public List<SpriteRenderer> spriteRenderers;
public List<Material> materials;
public void Initialize(CharacterBase character)
{
animationClips = new Dictionary<string, AnimationClip>();
this.character = character;
if (animator == null || animator.runtimeAnimatorController == null)
spriteRenderers = new List<SpriteRenderer>(mainView.GetComponentsInChildren<SpriteRenderer>());
materials = new List<Material>();
foreach (SpriteRenderer sr in spriteRenderers)
{
Debug.LogWarning("Animator or RuntimeAnimatorController is null.");
return;
materials.Add(sr.material);
}
SetOutline(false);
animations = new SerializableDictionary<string, AnimationClip>();
foreach (KeyValuePair<string, AnimationClip> anim in character.data.animations)
{
animations.Add(anim.Key, anim.Value);
}
foreach (AnimationClip clip in animator.runtimeAnimatorController.animationClips)
if (animations.TryGetValue("Idle", out AnimationClip idle))
{
animationClips.TryAdd(clip.name, clip);
animatorPlus2D.defaultIdleClip = idle;
animatorPlus2D.Initialize();
}
else
{
throw new Exception($"No Idle animation found for character {character.data.displayName}");
}
}
}
public partial class CombatCharacterViewBase
{
public void SetOutline(bool isEnabled)
{
if (isEnabled)
{
Color fractionColor = MainGameManager.Instance.basePrefabs.fractionColors[character.fraction];
materials.ForEach(material => material.SetFloat("_InnerOutlineFade", 1));
materials.ForEach(material => material.SetColor("_InnerOutlineColor", fractionColor * 2));
}
else
{
materials.ForEach(material => material.SetFloat("_InnerOutlineFade", 0));
materials.ForEach(material => material.SetColor("_InnerOutlineColor", Color.white));
}
}
}

View File

@@ -30,6 +30,7 @@ namespace Continentis.MainGame.Character
// View
private SerializedProperty _combatPositionOrderProp;
private SerializedProperty _combatCharacterViewProp;
private SerializedProperty _animationsProp;
// Deck & References
private SerializedProperty _initialDeckRefsProp;
@@ -58,6 +59,7 @@ namespace Continentis.MainGame.Character
_combatPositionOrderProp = serializedObject.FindProperty("combatPositionOrder");
_combatCharacterViewProp = serializedObject.FindProperty("combatCharacterView");
_animationsProp = serializedObject.FindProperty("animations");
_initialDeckRefsProp = serializedObject.FindProperty("initialDeckRef");
_prefabRefsProp = serializedObject.FindProperty("prefabRefs");
@@ -100,6 +102,7 @@ namespace Continentis.MainGame.Character
EditorGUILayout.Space();
EditorGUILayout.PropertyField(_combatPositionOrderProp);
EditorGUILayout.PropertyField(_combatCharacterViewProp);
EditorGUILayout.PropertyField(_animationsProp, true);
EditorGUILayout.Space();
EditorGUILayout.LabelField("References", EditorStyles.boldLabel);

View File

@@ -66,7 +66,7 @@ namespace Continentis.MainGame.Combat
SetViewPositions();
SetViewHUDs();
ModManager.CreateInstance<CharacterCombatBuffBase>("Basic.Buffs.Weak", 2).Apply(enemies[0]);
//ModManager.CreateInstance<CharacterCombatBuffBase>("Basic.Buffs.Weak", 2).Apply(enemies[0]);
}
public void AddCombatNPC(params (CharacterData, Fraction)[] dataList)

View File

@@ -51,8 +51,7 @@ namespace Continentis.MainGame.Combat
public partial class CombatMainManager
{
public CardData testCardData;
public EquipmentData testEquipmentData;
//public EquipmentData testEquipmentData;
public void StartCombat()
{
@@ -61,8 +60,8 @@ namespace Continentis.MainGame.Combat
character.InitializeCards();
}
testEquipmentData = ModManager.GetAsset<EquipmentData>("EquipmentData_Basic_SteelBracer");
EquipmentBase.GenerateEquipment(testEquipmentData, characterController.characters[0]);
//testEquipmentData = ModManager.GetAsset<EquipmentData>("EquipmentData_Basic_SteelBracer");
//EquipmentBase.GenerateEquipment(testEquipmentData, characterController.characters[0]);
currentRound = 0;
@@ -196,6 +195,7 @@ namespace Continentis.MainGame.Combat
}
currentCharacter.characterView.hudContainer.UpdateAllHUD();
CombatUIManager.Instance.combatMainPage.actionOrderDisplayer.avatars.Find(avatar => avatar.character == currentCharacter)?.Highlight(true);
currentCharacter.actionCountThisRound++;
}

View File

@@ -15,7 +15,7 @@ namespace Continentis.MainGame.Commands
private readonly Animator animator;
private bool waitForFinish;
private float overrideDuration;
private string stateName;
private string animationName;
private int layer;
//在动画的normalizedTime执行函数
@@ -23,13 +23,14 @@ namespace Continentis.MainGame.Commands
private float clipScaledLength => clip.length / animator.speed;
private Dictionary<float, Action> animationActions;
public Cmd_PlayAnimation(CombatCharacterViewBase characterView, string stateName,
bool waitForFinish = false, float overrideDuration = -1, int layer = 0) : base(null)
public Cmd_PlayAnimation(CombatCharacterViewBase characterView, string animationName,
bool waitForFinish = true, float overrideDuration = -1, int layer = 0) : base(null)
{
this.characterView = characterView;
this.animator = characterView.animator;
this.stateName = stateName;
this.clip = characterView.animationClips[stateName];
this.animationName = animationName;
this.clip = null;
characterView.animations.TryGetValue(animationName, out clip);
this.waitForFinish = waitForFinish;
this.overrideDuration = overrideDuration;
this.layer = layer;
@@ -63,25 +64,27 @@ namespace Continentis.MainGame.Commands
protected override IObservable<Unit> OnExecute(CommandContext outerContext)
{
if (animator == null)
if (animator == null || clip == null || string.IsNullOrEmpty(animationName))
{
Debug.LogWarning("Animator or stateName is null or empty.");
return Observable.Return(Unit.Default);
}
if (!animator.HasState(layer, Animator.StringToHash(stateName)))
string finalAnimationName = animationName;
if (!characterView.animations.ContainsKey(animationName))
{
if (!animator.HasState(layer, Animator.StringToHash("Default")))
{
Debug.LogWarning($"Animator does not have state: {stateName}, and Default state is also missing.");
return Observable.Return(Unit.Default);
}
stateName = "Default"; // Fallback to Default state
Debug.Log($"Animator does not have state: {stateName}. Falling back to Default state.");
finalAnimationName = "Action";
}
animator.CrossFade(stateName, 0f, layer, 0f);
if (characterView.animations.TryGetValue(finalAnimationName, out clip))
{
characterView.animatorPlus2D.Play(clip);
}
else
{
Debug.LogWarning($"Animation clip not found for state: {finalAnimationName}");
return Observable.Return(Unit.Default);
}
//监听动画进度以执行函数独立Observable
if (animationActions.Count > 0)
@@ -102,7 +105,7 @@ namespace Continentis.MainGame.Commands
if (waitForFinish)
{
float animationDuration = overrideDuration >= 0 ? overrideDuration : characterView.animationClips[stateName].length;
float animationDuration = overrideDuration >= 0 ? overrideDuration / animator.speed : clipScaledLength;
return Observable.Timer(TimeSpan.FromSeconds(animationDuration)).AsUnitObservable();
}
else

View File

@@ -47,6 +47,11 @@ namespace Continentis.MainGame.Commands
return Observable.Return(Unit.Default);
}
return base.OnExecute(outerContext);
}
protected override IObservable<Unit> CoreExecute(CommandContext outerContext)
{
if (useTargetPosition)
{
if (selfContext.context["Target"] is CharacterBase character)

View File

@@ -68,6 +68,11 @@ namespace Continentis.MainGame.Commands
return Observable.Return(Unit.Default);
}
return base.OnExecute(outerContext);
}
protected override IObservable<Unit> CoreExecute(CommandContext outerContext)
{
if (useTargetPosition)
{
if (selfContext.context["Target"] is CharacterBase character)

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic;
using SLSFramework.General;
using UI_Spline_Renderer;
@@ -29,6 +30,11 @@ namespace Continentis.MainGame.UI
[Range(1, 100)]
public int lineSegments = 50;
private void Awake()
{
GetComponent<Canvas>().sortingLayerName = "UI";
}
public void SetArrow(Vector3 start, Vector3 end)
{
startPoint.position = start;
@@ -47,6 +53,8 @@ namespace Continentis.MainGame.UI
Vector2 direction = (uiEnd - uiStart).normalized;
Vector2 perpendicular = new Vector2(-direction.y, direction.x); // 计算垂直向量
Vector2 controlPoint = midPoint + perpendicular * (isEndOnLeftSide ? -curveOffset : curveOffset);
controlPoint += new Vector2(0, Mathf.Abs(uiEnd.y - uiStart.y)); //增加一些垂直偏移
//controlPoint += new Vector2(0f, 500f);
splineContainer.Spline.Clear();
// 2. 计算贝塞尔曲线上所有的点
@@ -66,8 +74,21 @@ namespace Continentis.MainGame.UI
public void SetColor(Color color)
{
endImage.color = color;
arrowBody.color = color;
if (color == Color.clear)
{
endImage.material.SetFloat("_SineGlowFade", 0);
arrowBody.material.SetFloat("_SineGlowFade", 0);
endImage.material.SetColor("_SineGlowColor", Color.white);
arrowBody.material.SetColor("_SineGlowColor", Color.white);
}
else
{
float emissionIntensity = 1.5f;
endImage.material.SetFloat("_SineGlowFade", 1);
arrowBody.material.SetFloat("_SineGlowFade", 1);
endImage.material.SetColor("_SineGlowColor", color * Mathf.Pow(2, emissionIntensity));
arrowBody.material.SetColor("_SineGlowColor", color * Mathf.Pow(2, emissionIntensity));
}
}
}
}

View File

@@ -1,4 +1,5 @@
using System;
using Continentis.MainGame.UI;
using UnityEngine;
namespace Continentis
@@ -6,6 +7,7 @@ namespace Continentis
public abstract class UIElementBase : MonoBehaviour
{
public RectTransform rectTransform;
public InformationBox infoBox;
protected virtual void Awake()
{

View File

@@ -5,6 +5,7 @@ using Continentis.MainGame.Combat;
using DG.Tweening;
using Lean.Pool;
using UnityEngine;
using UnityEngine.Serialization;
using UnityEngine.UI;
namespace Continentis.MainGame.UI
@@ -13,15 +14,16 @@ namespace Continentis.MainGame.UI
{
[Header("UI References")]
[SerializeField] private GameObject portraitPrefab;
[SerializeField] private Transform portraitsContainer;
[SerializeField] private RectTransform currentTurnPointer;
[FormerlySerializedAs("portraitsContainer")] public Transform avatarContainer;
[Header("Animation Settings")]
[SerializeField] private float rearrangeAnimDuration = 0.4f; // 头像重新排列的动画时长
[FormerlySerializedAs("portraitWidth")]
[Header("Layout Settings")]
[SerializeField] private float portraitWidth = 133f; // 单个头像的宽度
[SerializeField] private float portraitSpacing = 0f; // 头像之间的间距
[SerializeField] private float avatarWidth = 133f; // 单个头像的宽度
[FormerlySerializedAs("portraitSpacing")] [SerializeField] private float avatarSpacing = 0f; // 头像之间的间距
private List<CharacterBase> actionOrder => CombatMainManager.Instance.characterController.actionOrderList;
public List<CharacterAvatar> avatars = new List<CharacterAvatar>();
@@ -57,7 +59,7 @@ namespace Continentis.MainGame.UI
{
LeanPool.Despawn(currentAvatar.gameObject);
}).Play();
// 播放重新排列动画
RearrangePortraitsWithAnimation();
}
@@ -69,7 +71,7 @@ namespace Continentis.MainGame.UI
// 核心函数创建单个头像UI
private CharacterAvatar CreatePortraitUI(CharacterBase character, int index)
{
CharacterAvatar avatar = LeanPool.Spawn(portraitPrefab, portraitsContainer).GetComponent<CharacterAvatar>();
CharacterAvatar avatar = LeanPool.Spawn(portraitPrefab, avatarContainer).GetComponent<CharacterAvatar>();
avatar.Initialize(character);
avatar.GetComponent<RectTransform>().anchoredPosition = new Vector2(-900, 0);
if (index >= 0 && index < avatars.Count)
@@ -81,6 +83,7 @@ namespace Continentis.MainGame.UI
{
avatars.Add(avatar);
}
return avatar;
}
@@ -89,7 +92,7 @@ namespace Continentis.MainGame.UI
{
for (int i = 0; i < avatars.Count; i++)
{
float targetX = -110 - i * (portraitWidth + portraitSpacing);
float targetX = -110 - i * (avatarWidth + avatarSpacing);
avatars[i].GetComponent<RectTransform>().anchoredPosition = new Vector2(targetX, 0);
}
}
@@ -102,7 +105,7 @@ namespace Continentis.MainGame.UI
for (int i = 0; i < avatars.Count; i++)
{
// 计算每个头像的目标X坐标
float targetX = -110 - i * (portraitWidth + portraitSpacing);
float targetX = -110 - i * (avatarWidth + avatarSpacing);
RectTransform rt = avatars[i].GetComponent<RectTransform>();
// 将移动动画加入到序列中

View File

@@ -1,10 +1,24 @@
using Continentis.MainGame.Card;
using UnityEngine;
using UnityEngine.EventSystems;
namespace Continentis.MainGame.UI
{
public class DiscardPile : PileBase
public class DiscardPile : PileBase, IPointerEnterHandler, IPointerExitHandler
{
public void OnPointerEnter(PointerEventData eventData)
{
string title = "Discard Pile";
string description = $"When you discard cards, they go here. Currently, it has {cardViews.Count} cards.\n" +
$"If the draw pile is empty, the discard pile will be shuffled to form a new draw pile.";
RectTransform canvasTransform = CombatUIManager.Instance.combatMainPage.rectTransform;
Vector2 basePosition = canvasTransform.InverseTransformPoint(rectTransform.position);
InformationBox.Create(canvasTransform, ref infoBox).Initialize(title, description, basePosition);
}
public void OnPointerExit(PointerEventData eventData)
{
InformationBox.Despawn(ref infoBox);
}
}
}

View File

@@ -1,10 +1,24 @@
using Continentis.MainGame.Card;
using Lean.Pool;
using UnityEngine;
using UnityEngine.EventSystems;
namespace Continentis.MainGame.UI
{
public class DrawPile : PileBase
public class DrawPile : PileBase, IPointerEnterHandler, IPointerExitHandler
{
public void OnPointerEnter(PointerEventData eventData)
{
string title = "Draw Pile";
string description = $"Contains the cards you can draw during your turn, now it have {cardViews.Count} cards.";
RectTransform canvasTransform = CombatUIManager.Instance.combatMainPage.rectTransform;
Vector2 basePosition = canvasTransform.InverseTransformPoint(rectTransform.position);
InformationBox.Create(canvasTransform, ref infoBox).Initialize(title, description, basePosition);
}
public void OnPointerExit(PointerEventData eventData)
{
InformationBox.Despawn(ref infoBox);
}
}
}

View File

@@ -1,9 +1,23 @@
using UnityEngine;
using UnityEngine.EventSystems;
namespace Continentis.MainGame.UI
{
public class ExhaustPile : PileBase
public class ExhaustPile : PileBase, IPointerEnterHandler, IPointerExitHandler
{
public void OnPointerEnter(PointerEventData eventData)
{
string title = "Exhaust Pile";
string description = $"When you exhaust cards, they go here. Currently, it has {cardViews.Count} cards.\n" +
$"Exhausted cards are usually removed from play for the rest of the combat.";
RectTransform canvasTransform = CombatUIManager.Instance.combatMainPage.rectTransform;
Vector2 basePosition = canvasTransform.InverseTransformPoint(rectTransform.position);
InformationBox.Create(canvasTransform, ref infoBox).Initialize(title, description, basePosition);
}
public void OnPointerExit(PointerEventData eventData)
{
InformationBox.Despawn(ref infoBox);
}
}
}

View File

@@ -83,11 +83,11 @@ namespace Continentis.MainGame.UI
targetPos.y = 0;
cardRect.localPosition =
Vector3.Lerp(cardRect.localPosition, targetPos + new Vector3(0, 150f, 0), Time.deltaTime * 20f);
Vector3.Lerp(cardRect.localPosition, targetPos + new Vector3(0, 100f, 0), Time.deltaTime * 20f);
cardRect.localRotation =
Quaternion.Lerp(cardRect.localRotation, Quaternion.identity, Time.deltaTime * 20f);
cardRect.localScale =
Vector3.Lerp(cardRect.localScale, Vector3.one * 1.2f, Time.deltaTime * 20f);
Vector3.Lerp(cardRect.localScale, Vector3.one, Time.deltaTime * 20f);
}
else
{

View File

@@ -10,7 +10,14 @@ namespace Continentis.MainGame.UI
{
public List<CardViewBase> cardViews;
public TMP_Text cardCountText;
protected override void Awake()
{
base.Awake();
cardViews = new List<CardViewBase>();
UpdateCountText();
}
public virtual void AddCard(CardViewBase cardObject)
{
cardViews.Add(cardObject);

View File

@@ -53,7 +53,7 @@ namespace Continentis.MainGame.UI
}));
seq.AppendInterval(0.1f);
seq.Append(CombatUIManager.Instance.combatMainPage.handPile.rectTransform.DOAnchorPosY(150f, 0.2f));
seq.Append(CombatUIManager.Instance.combatMainPage.handPile.rectTransform.DOAnchorPosY(80f, 0.2f));
seq.Play();
}
@@ -69,7 +69,7 @@ namespace Continentis.MainGame.UI
playerHero.deckSubmodule.SetUpHandCardViews();
}));
seq.AppendInterval(0.1f);
seq.Append(CombatUIManager.Instance.combatMainPage.handPile.rectTransform.DOAnchorPosY(150f, 0.2f));
seq.Append(CombatUIManager.Instance.combatMainPage.handPile.rectTransform.DOAnchorPosY(80f, 0.2f));
seq.Play();
}
else
@@ -81,6 +81,9 @@ namespace Continentis.MainGame.UI
public void UpdateTeamPileText(CombatTeam team)
{
int currentCardCount = team.deckSubmodule.HandPile.Count;
gameObject.SetActive(currentCardCount != 0);
teamPileText.text = $"{currentCardCount}/10";
Debug.Log($"Updated team pile text: {teamPileText.text}");
}

View File

@@ -61,7 +61,8 @@ namespace Continentis.MainGame
if (hit.collider.gameObject.CompareTag("Character"))
{
hoveringCharacterView ??= hit.collider.GetComponent<CombatCharacterViewBase>();
hoveringCharacterView.SetOutline(true);
if (Mouse.current.leftButton.wasPressedThisFrame)
{
if (hoveringCharacterView == selectingCharacterView)
@@ -88,6 +89,7 @@ namespace Continentis.MainGame
}
else
{
hoveringCharacterView?.SetOutline(false);
hoveringCharacterView = null;
if (Mouse.current.leftButton.wasPressedThisFrame)

View File

@@ -6,18 +6,36 @@ namespace Continentis.MainGame.UI
{
public class CharacterAvatar : MonoBehaviour
{
public CharacterBase character;
public Image characterImage;
public Image frame;
public Sprite normalFrame;
public Sprite actionFrame;
public void Initialize(CharacterBase character)
{
this.character = character;
characterImage.sprite = character.data.avatar;
normalFrame = MainGameManager.Instance.basePrefabs.fractionFrames[character.fraction][0];
actionFrame = MainGameManager.Instance.basePrefabs.fractionFrames[character.fraction][1];
frame.sprite = normalFrame;
frame.color = MainGameManager.Instance.basePrefabs.fractionColors[character.fraction];
frame.material = Instantiate(frame.material);
Highlight(false);
}
public void Highlight(bool isHighlighted)
{
Debug.Log($"Highlighting {character.data.displayName}: {isHighlighted}");
if (isHighlighted)
{
frame.material.SetFloat("_SineGlowFade", 1);
frame.material.SetColor("_SineGlowColor", frame.color * 2);
}
else
{
frame.material.SetFloat("_SineGlowFade", 0);
frame.material.SetColor("_SineGlowColor", Color.white);
}
Mask mask = CombatUIManager.Instance.combatMainPage.actionOrderDisplayer.avatarContainer.GetComponent<Mask>();
MaskUtilities.NotifyStencilStateChanged(mask);
}
}
}

View File

@@ -1,3 +1,4 @@
using Lean.Pool;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
@@ -10,8 +11,24 @@ namespace Continentis.MainGame.UI
public Image titleBackground, contentBackground;
public TMP_Text titleText, contentText;
public static InformationBox Create(RectTransform parent, ref InformationBox exclusivity)
{
GameObject infoBoxPrefab = MainGameManager.Instance.basePrefabs.informationBox;
exclusivity ??= LeanPool.Spawn(infoBoxPrefab, parent).GetComponent<InformationBox>();
return exclusivity;
}
public static void Despawn(ref InformationBox infoBox)
{
if (infoBox != null)
{
LeanPool.Despawn(infoBox.gameObject);
infoBox = null;
}
}
/// <summary>
/// 卡牌的关键词和描述
/// 处于LayoutGroup中时的初始化
/// </summary>
public void Initialize(string title, string content)
{
@@ -21,7 +38,7 @@ namespace Continentis.MainGame.UI
}
/// <summary>
/// Buff的名称和描述
/// 非LayoutGroup中时的初始化
/// </summary>
public void Initialize(string title, string content, Vector2 basePosition)
{

View File

@@ -12,8 +12,6 @@ namespace Continentis.MainGame.UI
public Image icon;
public List<TMP_Text> textList;
public TMP_Text iconText => textList[0];
public InformationBox infoBox;
public virtual void UpdateIcon()
{

View File

@@ -95,14 +95,6 @@ namespace Continentis.MainGame.UI
public override void OnPointerEnter(PointerEventData eventData)
{
GameObject infoBoxPrefab = MainGameManager.Instance.basePrefabs.informationBox;
RectTransform canvasTransform = CombatUIManager.Instance.hudPage.rectTransform;
if (infoBox == null)
{
infoBox = LeanPool.Spawn(infoBoxPrefab, canvasTransform).GetComponent<InformationBox>();
}
BuffTextInterpreter.InterpretText(buff);
string dispelThreshold = buff.dispelThreshold switch
{
@@ -115,16 +107,14 @@ namespace Continentis.MainGame.UI
dispelThreshold = dispelThreshold.Localize();
string finalDescription = buff.contentSubmodule.interpretedFunctionText + "\n" + dispelThreshold;
Vector2 basePosition = canvasTransform.InverseTransformPoint(rectTransform.position);
infoBox.Initialize(buff.contentSubmodule.displayName, finalDescription, basePosition);
Debug.Log("Pointer Enter Buff Icon");
RectTransform canvasTransform = CombatUIManager.Instance.hudPage.rectTransform;
Vector2 basePosition = canvasTransform.InverseTransformPoint(rectTransform.position);
InformationBox.Create(canvasTransform, ref infoBox).Initialize(buff.contentSubmodule.displayName, finalDescription, basePosition);
}
public override void OnPointerExit(PointerEventData eventData)
{
Debug.Log("Pointer Exit Buff Icon");
if (infoBox != null)
{
LeanPool.Despawn(infoBox.gameObject);

View File

@@ -12,7 +12,6 @@ namespace Continentis.MainGame.UI
public EquipmentBase equipment;
public Image background;
public Image icon;
private InformationBox infoBox;
public void Initialize(EquipmentBase equipment = null)
{