UI update 02

This commit is contained in:
FloatGaming
2026-06-30 21:21:30 +08:00
parent b2a1e307a4
commit f62f643cfc
1666 changed files with 211081 additions and 22799 deletions
@@ -1,5 +1,6 @@
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.Collections;
using System.Collections.Generic;
@@ -23,11 +24,20 @@ public class load_teammatesProfile : MonoBehaviour
public Image teammate_profile_boarder_04;
public Image teammate_profile_boarder_05;
[Header("Level Colors")]
public Color levelColor_C;
public Color levelColor_B;
public Color levelColor_A;
public Color levelColor_S;
[Header("Level Border Sprites")]
public Sprite[] levelBorderSprites;
[Header("Hover Details")]
public loadDetailsPrefab hoverDetailsLoader;
public GameObject hoverDetailsPrefab;
public GameObject hoverDetailsParent;
private bool hoverTargetsBound;
private void Awake()
{
EnsureHoverTargetsBound();
}
// Start is called once before the first execution of Update after the MonoBehaviour is created
IEnumerator Start()
@@ -36,6 +46,38 @@ public class load_teammatesProfile : MonoBehaviour
update_teammates_profile();
}
private void EnsureHoverTargetsBound()
{
if (hoverTargetsBound)
{
return;
}
BindHoverTarget(teammate_profile_01, 1);
BindHoverTarget(teammate_profile_02, 2);
BindHoverTarget(teammate_profile_03, 3);
BindHoverTarget(teammate_profile_04, 4);
BindHoverTarget(teammate_profile_05, 5);
hoverTargetsBound = true;
}
private void BindHoverTarget(Image targetImage, int slotIndex)
{
if (targetImage == null)
{
return;
}
TeammateProfileHoverTarget hoverTarget = targetImage.GetComponent<TeammateProfileHoverTarget>();
if (hoverTarget == null)
{
hoverTarget = targetImage.gameObject.AddComponent<TeammateProfileHoverTarget>();
}
hoverTarget.Bind(this, slotIndex);
}
private IEnumerator EnsureHeroCache()
{
if (heroCacheReady) yield break;
@@ -49,7 +91,7 @@ public class load_teammatesProfile : MonoBehaviour
}
heroCacheBuilding = true;
var allHeroes = Resources.LoadAll<AllyHero_SO>("");
var allHeroes = RuntimeResourcesCache.LoadAllAllyHeroes();
heroById = new Dictionary<int, AllyHero_SO>();
if (allHeroes != null)
{
@@ -79,6 +121,8 @@ public class load_teammatesProfile : MonoBehaviour
public void update_teammates_profile()
{
EnsureHoverTargetsBound();
if (!heroCacheReady)
{
StartCoroutine(EnsureHeroCacheThenUpdate());
@@ -98,12 +142,12 @@ public class load_teammatesProfile : MonoBehaviour
teammate_profile_04.sprite = GetHeroSquareProfile(heroId4);
teammate_profile_05.sprite = GetHeroSquareProfile(heroId5);
// Set border colors based on hero level
teammate_profile_boarder_01.color = GetBorderColor(GetHeroLevel(heroId1, 1));
teammate_profile_boarder_02.color = GetBorderColor(GetHeroLevel(heroId2, 2));
teammate_profile_boarder_03.color = GetBorderColor(GetHeroLevel(heroId3, 3));
teammate_profile_boarder_04.color = GetBorderColor(GetHeroLevel(heroId4, 4));
teammate_profile_boarder_05.color = GetBorderColor(GetHeroLevel(heroId5, 5));
// Set border sprites based on hero level
ApplyBorderSprite(teammate_profile_boarder_01, GetHeroLevelKey(heroId1, 1));
ApplyBorderSprite(teammate_profile_boarder_02, GetHeroLevelKey(heroId2, 2));
ApplyBorderSprite(teammate_profile_boarder_03, GetHeroLevelKey(heroId3, 3));
ApplyBorderSprite(teammate_profile_boarder_04, GetHeroLevelKey(heroId4, 4));
ApplyBorderSprite(teammate_profile_boarder_05, GetHeroLevelKey(heroId5, 5));
}
private Sprite GetHeroSquareProfile(int heroId)
@@ -117,58 +161,153 @@ public class load_teammatesProfile : MonoBehaviour
return null;
}
private string GetHeroLevel(int heroId, int slotIndex)
private string GetHeroLevelKey(int heroId, int slotIndex)
{
if (heroId == 0) return "C";
if (heroById == null) return "C";
if (heroId == 0) return "Fallback";
if (heroById == null) return "Fallback";
AllyHero_SO hero;
if (!heroById.TryGetValue(heroId, out hero) || hero == null) return "C";
int exp = hero.ally_currentEXP;
int keySlot = Mathf.Clamp(slotIndex, 1, 5);
string expKey = $"selected_heroSlot0{keySlot}_exp";
if (PlayerPrefs.HasKey(expKey))
exp = PlayerPrefs.GetInt(expKey, exp);
return GetRatingFromSO(hero, exp);
if (!heroById.TryGetValue(heroId, out hero) || hero == null) return "Fallback";
return GetRatingKeyFromSO(hero);
}
private string GetRatingFromSO(AllyHero_SO so, int currentExp)
private string GetRatingKeyFromSO(AllyHero_SO so)
{
if (so == null || so.levelStats == null || so.levelStats.Count == 0) return "C";
if (so == null || so.levelStats == null || so.levelStats.Count == 0) return "Fallback";
return so.GetDisplayLevelRatingKey();
}
List<AllyHero_SO.AllyLevelInfo> sorted = new List<AllyHero_SO.AllyLevelInfo>();
foreach (var l in so.levelStats) if (l != null) sorted.Add(l);
sorted.Sort((a, b) => a.requiredEXP.CompareTo(b.requiredEXP));
int selectedIndex = 0;
for (int i = 0; i < sorted.Count; i++)
private void ApplyBorderSprite(Image targetImage, string level)
{
if (targetImage == null)
{
if (currentExp >= sorted[i].requiredEXP)
{
selectedIndex = i;
}
else
{
break;
}
return;
}
if (selectedIndex <= 0) return "C";
if (selectedIndex == 1) return "B";
if (selectedIndex == 2) return "A";
return "S";
Sprite borderSprite = GetBorderSprite(level);
targetImage.sprite = borderSprite;
targetImage.color = Color.white;
}
private Color GetBorderColor(string level)
private Sprite GetBorderSprite(string level)
{
Color color;
if (levelBorderSprites == null || levelBorderSprites.Length == 0)
{
return null;
}
int index;
switch (level)
{
case "C": color = levelColor_C; break;
case "B": color = levelColor_B; break;
case "A": color = levelColor_A; break;
case "S": color = levelColor_S; break;
default: color = Color.white; break;
case "Fallback": index = 4; break;
case "C": index = 0; break;
case "B": index = 1; break;
case "A": index = 2; break;
case "S": index = 3; break;
default: index = 4; break;
}
if (index < 0 || index >= levelBorderSprites.Length)
{
return null;
}
return levelBorderSprites[index];
}
public void ShowHeroDetailsForSlot(int slotIndex)
{
loadDetailsPrefab detailsLoader = ResolveDetailsLoader();
if (detailsLoader == null)
{
return;
}
if (!heroCacheReady)
{
return;
}
int heroId = GetSelectedHeroId(slotIndex);
if (heroId == 0 || heroById == null)
{
return;
}
AllyHero_SO hero;
if (!heroById.TryGetValue(heroId, out hero) || hero == null)
{
return;
}
string type = "\u89d2\u8272";
string name = string.IsNullOrEmpty(hero.ally_heroName) ? "\u672a\u77e5\u89d2\u8272" : hero.ally_heroName;
string status = "\u53ef\u7528";
string description = string.IsNullOrEmpty(hero.ally_heroDescription) ? "\u65e0\u63cf\u8ff0" : hero.ally_heroDescription;
if (hoverDetailsPrefab != null)
{
detailsLoader.detailsPrefab = hoverDetailsPrefab;
}
if (hoverDetailsParent != null)
{
detailsLoader.detailsParent = hoverDetailsParent;
}
detailsLoader.ShowDetails(type, name, status, description, Input.mousePosition);
}
public void HideHeroDetails()
{
loadDetailsPrefab detailsLoader = ResolveDetailsLoader();
if (detailsLoader != null)
{
detailsLoader.HideDetails();
}
}
private loadDetailsPrefab ResolveDetailsLoader()
{
if (hoverDetailsLoader != null)
{
return hoverDetailsLoader;
}
return loadDetailsPrefab.Instance;
}
private int GetSelectedHeroId(int slotIndex)
{
int keySlot = Mathf.Clamp(slotIndex, 1, 5);
return PlayerPrefs.GetInt($"selected_heroSlot0{keySlot}_heroID", 0);
}
private sealed class TeammateProfileHoverTarget : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
private load_teammatesProfile owner;
private int slotIndex;
public void Bind(load_teammatesProfile targetOwner, int targetSlotIndex)
{
owner = targetOwner;
slotIndex = targetSlotIndex;
}
public void OnPointerEnter(PointerEventData eventData)
{
if (owner != null)
{
owner.ShowHeroDetailsForSlot(slotIndex);
}
}
public void OnPointerExit(PointerEventData eventData)
{
if (owner != null)
{
owner.HideHeroDetails();
}
}
color.a = 1f;
return color;
}
}