制作了设置界面/优化了ranking界面

This commit is contained in:
daixiawu 2025-07-10 01:13:33 +08:00
parent b350373dc1
commit 5f76b892ec
15 changed files with 15022 additions and 892 deletions

View File

@ -0,0 +1,101 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: AnimObject
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
m_StateMachine: {fileID: 2768166325940865170}
m_Mask: {fileID: 0}
m_Motions: []
m_Behaviours: []
m_BlendingMode: 0
m_SyncedLayerIndex: -1
m_DefaultWeight: 0
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1102 &386020394252181346
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: MainUIButtonPopup
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 45ae98f78d33e3b44a04a2bbc8e4a8f2, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1107 &2768166325940865170
AnimatorStateMachine:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 4995783479505684282}
m_Position: {x: 200, y: 0, z: 0}
- serializedVersion: 1
m_State: {fileID: 386020394252181346}
m_Position: {x: 235, y: 65, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
m_AnyStatePosition: {x: 50, y: 20, z: 0}
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 4995783479505684282}
--- !u!1102 &4995783479505684282
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: MainUIButtonPopin
m_Speed: 1
m_CycleOffset: 0
m_Transitions: []
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
m_WriteDefaultValues: 1
m_Mirror: 0
m_SpeedParameterActive: 0
m_MirrorParameterActive: 0
m_CycleOffsetParameterActive: 0
m_TimeParameterActive: 0
m_Motion: {fileID: 7400000, guid: 4bfae3d33a8376043b410a868198affd, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 208393dbda50cf54c96ad00190db1062
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 9100000
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -49,7 +49,7 @@ TextureImporter:
alignment: 0 alignment: 0
spritePivot: {x: 0.5, y: 0.5} spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100 spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0} spriteBorder: {x: 29, y: 32, z: 29, w: 33}
spriteGenerateFallbackPhysicsShape: 1 spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1 alphaUsage: 1
alphaIsTransparency: 1 alphaIsTransparency: 1
@ -100,7 +100,7 @@ TextureImporter:
physicsShape: [] physicsShape: []
bones: [] bones: []
spriteID: 5e97eb03825dee720800000000000000 spriteID: 5e97eb03825dee720800000000000000
internalID: 0 internalID: 1537655665
vertices: [] vertices: []
indices: indices:
edges: [] edges: []

Binary file not shown.

Before

Width:  |  Height:  |  Size: 972 B

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -49,7 +49,7 @@ TextureImporter:
alignment: 0 alignment: 0
spritePivot: {x: 0.5, y: 0.5} spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100 spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0} spriteBorder: {x: 23, y: 23, z: 23, w: 23}
spriteGenerateFallbackPhysicsShape: 1 spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1 alphaUsage: 1
alphaIsTransparency: 1 alphaIsTransparency: 1
@ -100,7 +100,7 @@ TextureImporter:
physicsShape: [] physicsShape: []
bones: [] bones: []
spriteID: 5e97eb03825dee720800000000000000 spriteID: 5e97eb03825dee720800000000000000
internalID: 0 internalID: 1537655665
vertices: [] vertices: []
indices: indices:
edges: [] edges: []

View File

@ -418,7 +418,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 24.751007, y: -1.6001015} m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 324.75, y: 92.857} m_SizeDelta: {x: 324.75, y: 92.857}
m_Pivot: {x: 0.5, y: 0.5} m_Pivot: {x: 0.5, y: 0.5}
--- !u!95 &7485576305012119696 --- !u!95 &7485576305012119696

File diff suppressed because it is too large Load Diff

View File

@ -39,7 +39,6 @@ namespace Logic
Transform currentTransform = clickedUI.transform; Transform currentTransform = clickedUI.transform;
while (currentTransform != null) while (currentTransform != null)
{ {
Debug.Log(currentTransform.name);
if (currentTransform.name == "UICanvas" || currentTransform.name == "HintMap" ) if (currentTransform.name == "UICanvas" || currentTransform.name == "HintMap" )
{ {
return true; return true;
@ -114,6 +113,8 @@ namespace Logic
if (Input.GetMouseButtonUp(0)) // 检测鼠标点击 if (Input.GetMouseButtonUp(0)) // 检测鼠标点击
{ {
//给相机拖动系统打的补丁
UIBlockCameraDrag.ShouldBlockDrag = false;
//Debug.Log("Alive"); //Debug.Log("Alive");
if (EventSystem.current.IsPointerOverGameObject()) if (EventSystem.current.IsPointerOverGameObject())
{ {

View File

@ -33,8 +33,8 @@ public class CameraController : MonoBehaviour
void Update() void Update()
{ {
if (UIBlockCameraDrag.ShouldBlockDrag || UIBlockCameraDrag.IsPointerOnUI ) return;
HandleSmoothMove(); HandleSmoothMove();
if (UIBlockCameraDrag.IsPointerOnUI) return;
HandleZoom(); HandleZoom();
HandlePan(); HandlePan();
@ -42,7 +42,6 @@ public class CameraController : MonoBehaviour
void HandleSmoothMove() void HandleSmoothMove()
{ {
if (_isMoving && _smoothTargetPosition.HasValue) if (_isMoving && _smoothTargetPosition.HasValue)
{ {
_moveProgress += Time.deltaTime / _moveDuration; _moveProgress += Time.deltaTime / _moveDuration;
@ -77,7 +76,8 @@ public class CameraController : MonoBehaviour
{ {
_dragOrigin = Camera.main.ScreenToWorldPoint(Input.mousePosition); _dragOrigin = Camera.main.ScreenToWorldPoint(Input.mousePosition);
} }
if (Input.GetMouseButton(0)) if (Input.GetMouseButton(0))
{ {
Vector3 difference = _dragOrigin - Camera.main.ScreenToWorldPoint(Input.mousePosition); Vector3 difference = _dragOrigin - Camera.main.ScreenToWorldPoint(Input.mousePosition);

View File

@ -5,6 +5,8 @@ using RuntimeData;
using Animancer; using Animancer;
using TMPro; using TMPro;
using UnityEngine.UI; using UnityEngine.UI;
using Logic.Multilingual;
using TH1Resource;
public class RankingUI public class RankingUI
{ {
@ -32,7 +34,7 @@ public class RankingUI
playerList.Sort((a, b) => b.PlayerScore.CompareTo(a.PlayerScore)); playerList.Sort((a, b) => b.PlayerScore.CompareTo(a.PlayerScore));
var selfPlayer = _mapData.PlayerMap.SelfPlayerData; var selfPlayer = _mapData.PlayerMap.SelfPlayerData;
var content = RORankingUI.transform.Find("MsgList/ScrollView/Viewport/Content"); var content = RORankingUI.transform.Find("MsgList/Scroll View/Viewport/Content");
for (int i = 0; i < 16; i++) for (int i = 0; i < 16; i++)
{ {
var row = content.Find("Row (" + i + ")"); var row = content.Find("Row (" + i + ")");
@ -41,37 +43,35 @@ public class RankingUI
var player = playerList[i]; var player = playerList[i];
if (!Table.Instance.PlayerDataAssets.GetPlayerInfo(player, out var playerInfo)) if (!Table.Instance.PlayerDataAssets.GetPlayerInfo(player, out var playerInfo))
continue; continue;
row.gameObject.SetActive(true); //row.gameObject.SetActive(true);
row.Find("Head0/Text").GetComponent<TextMeshProUGUI>().text = (i + 1).ToString(); row.Find("Rank").GetComponent<TextMeshProUGUI>().text = (i + 1).ToString();
string forceName = playerInfo.ForceName; string name = playerInfo.ForceName;
string civName = "带领 <"+playerInfo.CivName+">";
Sprite sprite = playerInfo.LeaderIllustration; Sprite sprite = playerInfo.LeaderIllustration;
row.Find("Head1/Avatar/AvatarMask/AvatarImage").GetComponent<Image>().color = Color.white; row.Find("AvatarMask/AvatarImage").GetComponent<Image>().color = Color.white;
row.Find("Head2/Text").GetComponent<TextMeshProUGUI>().text = _mapData.GetCityCount(player.Id).ToString(); row.Find("CityCount").GetComponent<TextMeshProUGUI>().text = _mapData.GetCityCount(player.Id).ToString();
row.Find("Head3/Text").GetComponent<TextMeshProUGUI>().text = player.PlayerScore.ToString(); row.Find("Score").GetComponent<TextMeshProUGUI>().text = player.PlayerScore.ToString();
row.Find("Head1/TextGroup/Text1").GetComponent<TextMeshProUGUI>().color = Color.black; row.Find("Name").GetComponent<TextMeshProUGUI>().color = Color.black;
if (!selfPlayer.MeetPlayers.Contains(player.Id)) if (!selfPlayer.MeetPlayers.Contains(player.Id))
{ {
forceName = "未知领袖"; name = "???";
civName = "带领 <未知文明>";
sprite = null; sprite = null;
} }
if (!player.Alive) if (!player.Alive)
{ {
civName = "已出局"; row.Find("Name").GetComponent<TextMeshProUGUI>().color = Color.gray;
row.Find("Head1/Avatar/AvatarMask/AvatarImage").GetComponent<Image>().color = new Color(128,128,128 ,1);; row.Find("AvatarMask/AvatarImage").GetComponent<Image>().color = new Color(128,128,128 ,1);;
} }
if (player == selfPlayer) if (player == selfPlayer)
{ {
row.Find("Head1/TextGroup/Text1").GetComponent<TextMeshProUGUI>().color = Color.blue; row.Find("Name").GetComponent<TextMeshProUGUI>().color = Color.blue;
} }
row.Find("Head1/TextGroup/Text1").GetComponent<TextMeshProUGUI>().text = forceName; if(name != "???")
row.Find("Head1/TextGroup/Text2").GetComponent<TextMeshProUGUI>().text = civName; MultilingualManager.Instance.SetUIText(row.Find("Name").GetComponent<TextMeshProUGUI>(),name);
row.Find("Head1/Avatar/AvatarMask/AvatarImage").GetComponent<Image>().sprite = sprite; row.Find("AvatarMask/AvatarImage").GetComponent<Image>().sprite = sprite;
} }
else else
{ {
@ -111,6 +111,29 @@ public class RankingUI
AnimationClip fadeInClip = Resources.Load<AnimationClip>("Animations/UI/RankingPanelFadeIn"); AnimationClip fadeInClip = Resources.Load<AnimationClip>("Animations/UI/RankingPanelFadeIn");
if (fadeInClip != null) if (fadeInClip != null)
animancer.Play(fadeInClip); animancer.Play(fadeInClip);
var playerList = new List<PlayerData>(_mapData.PlayerMap.PlayerDataList);
var content = RORankingUI.transform.Find("MsgList/Scroll View/Viewport/Content");
for (int i = 0; i < 16; i++)
{
var row = content.Find("Row (" + i + ")");
if (i < playerList.Count)
{
var player = playerList[i];
if (!Table.Instance.PlayerDataAssets.GetPlayerInfo(player, out var playerInfo))
continue;
row.gameObject.SetActive(false);
var anim = row.GetComponent<AnimancerComponent>();
if (anim != null)
Timer.Instance.TimerRegister(anim,
() =>
{
row.gameObject.SetActive(true);
anim.Play(ResourceCache.Instance.AnimCache.UICommonPanelFadeIn);
}, 0.1f * i);
}
}
Timer.Instance.TimerRegister(RORankingUI, () => { _isAnimating = false; }, _fadeDuration); Timer.Instance.TimerRegister(RORankingUI, () => { _isAnimating = false; }, _fadeDuration);
} }
@ -126,6 +149,9 @@ public class RankingUI
AnimationClip fadeOutClip = Resources.Load<AnimationClip>("Animations/UI/RankingPanelFadeOut"); AnimationClip fadeOutClip = Resources.Load<AnimationClip>("Animations/UI/RankingPanelFadeOut");
if (fadeOutClip != null) if (fadeOutClip != null)
animancer.Play(fadeOutClip); animancer.Play(fadeOutClip);
var content = RORankingUI.transform.Find("MsgList/Scroll View/Viewport/Content");
foreach (Transform child in content)
child.gameObject.SetActive(false);
Timer.Instance.TimerRegister(RORankingUI, () => Timer.Instance.TimerRegister(RORankingUI, () =>
{ {

View File

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

View File

@ -0,0 +1,81 @@
// VolumeSliderController.cs
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events; // 用于 UnityEvent
/// <summary>
/// 控制UI Slider的脚本用于音量调节。
/// 提供了获取0-100值的接口并触发回调事件。
/// 该脚本直接挂载在 Slider UI 对象上。
/// </summary>
[RequireComponent(typeof(Slider))] // 确保挂载此脚本的对象上必然有Slider组件
public class VolumeSliderController : MonoBehaviour
{
private Slider volumeSlider;
// UnityEvent 允许在 Inspector 中拖拽方法进行绑定,也可以通过代码订阅
// T_0_100_IntEvent 表示当值改变时会传递一个0-100之间的整数
[System.Serializable]
public class T_0_100_IntEvent : UnityEvent<int> { }
[Header("Volume Settings")]
[Tooltip("当滑条值改变时触发的事件。传递的参数是0-100的整数音量值。")]
public T_0_100_IntEvent OnVolumeChanged;
private void Awake()
{
volumeSlider = GetComponent<Slider>();
// 确保 Slider 的范围是 0 到 1
volumeSlider.minValue = 0f;
volumeSlider.maxValue = 1f;
// 监听 Slider 的值变化事件
volumeSlider.onValueChanged.AddListener(HandleSliderValueChanged);
}
private void OnDestroy()
{
// 移除事件监听,防止内存泄漏(尤其是在场景切换时)
if (volumeSlider != null)
{
volumeSlider.onValueChanged.RemoveListener(HandleSliderValueChanged);
}
}
/// <summary>
/// 处理 Slider 值变化的内部方法。
/// 将 0-1 的浮点值转换为 0-100 的整数,并触发事件。
/// </summary>
/// <param name="value01">Slider 的 0-1 浮点值。</param>
private void HandleSliderValueChanged(float value01)
{
int volume0_100 = Mathf.RoundToInt(value01 * 100f);
// 触发传递 0-100 整数的事件
OnVolumeChanged?.Invoke(volume0_100);
// Debug.Log($"Volume changed to: {volume0_100}"); // 可用于调试
}
/// <summary>
/// 设置 Slider 的初始音量值0-100
/// 通常在游戏启动或加载设置时调用。
/// </summary>
/// <param name="volume0_100">要设置的 0-100 整数音量值。</param>
public void SetInitialVolume(int volume0_100)
{
// Clamp确保输入值在有效范围内
float clampedVolume = Mathf.Clamp(volume0_100, 0, 100);
// 将 0-100 的整数转换为 0-1 的浮点值赋给 Slider
volumeSlider.value = clampedVolume / 100f;
}
/// <summary>
/// 获取当前的音量值0-100
/// </summary>
/// <returns>当前的 0-100 整数音量值。</returns>
public int GetCurrentVolume()
{
return Mathf.RoundToInt(volumeSlider.value * 100f);
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7120fbc18cddc8740bd3eb0691318e49
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -1,17 +1,68 @@
using UnityEngine; using UnityEngine;
using UnityEngine.EventSystems; using UnityEngine.EventSystems;
public class UIBlockCameraDrag : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler // 为避免潜在的冲突和更清晰的逻辑,建议将类名稍作更改,以反映其新功能
// 例如UIMouseBlocker或者就保持 UIBlockCameraDrag 也可以,只要功能上能理解
public class UIBlockCameraDrag : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerDownHandler, IPointerUpHandler
{ {
// 是否当前鼠标指针在UI上用于滚轮等瞬时判断
public static bool IsPointerOnUI = false; public static bool IsPointerOnUI = false;
// 是否应该阻止游戏中的拖动操作(用于点击并拖动的情况)
// 当鼠标在UI上按下时设为true鼠标抬起时设为false
public static bool ShouldBlockDrag = false;
// --- IPointerEnterHandler ---
public void OnPointerEnter(PointerEventData eventData) public void OnPointerEnter(PointerEventData eventData)
{ {
IsPointerOnUI = true; IsPointerOnUI = true;
} }
// --- IPointerExitHandler ---
public void OnPointerExit(PointerEventData eventData) public void OnPointerExit(PointerEventData eventData)
{ {
IsPointerOnUI = false; IsPointerOnUI = false;
// 当鼠标移出UI时如果不是因为正在拖动而被阻止即不是因为鼠标在UI上按下
// 并且鼠标已经抬起,那么 ShouldBlockDrag 应该被重置。
// 但为了简单和可靠,我们主要依赖 OnPointerUp 来重置 ShouldBlockDrag。
// 所以这里可以不用特别处理 ShouldBlockDrag。
} }
}
// --- IPointerDownHandler ---
public void OnPointerDown(PointerEventData eventData)
{
// 仅当左键按下时才处理
if (eventData.button == PointerEventData.InputButton.Left)
{
//Debug.Log("Check is down");
// 鼠标在UI上按下左键则阻止任何潜在的拖动操作
ShouldBlockDrag = true;
}
}
// --- IPointerUpHandler ---
public void OnPointerUp(PointerEventData eventData)
{
// 仅当左键按下时才处理
if (eventData.button == PointerEventData.InputButton.Left)
{
//Debug.Log("Check is up");
// 鼠标在UI上按下左键则阻止任何潜在的拖动操作
//ShouldBlockDrag = false;
}
}
// 确保在禁用或销毁时重置静态变量,以防万一
void OnDisable()
{
// 这里需要更谨慎。因为静态变量是全局的如果场景中有多个UIBlockCameraDrag实例
// 某个实例的禁用或销毁不应该轻易重置由其他实例设置的全局状态。
// 但为了安全起见如果在没有其他UI元素会阻止拖动的情况下可以考虑在这里重置。
// 更安全的做法是:在游戏关闭前或重要状态切换时(比如加载新场景)进行统一重置。
// Untuk tujuan demonstrasi ini, kita tidak akan reset IsPointerOnUI dan ShouldBlockDrag di OnDisable.
// 如果只有一个UIBlockCameraDrag实例或者所有实例都是同时存在的那么可以考虑
// IsPointerOnUI = false;
// ShouldBlockDrag = false;
}
}