制作了设置界面/优化了ranking界面
This commit is contained in:
parent
b350373dc1
commit
5f76b892ec
@ -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:
|
||||||
@ -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 |
@ -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 |
@ -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: []
|
||||||
|
|||||||
@ -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
@ -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())
|
||||||
{
|
{
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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, () =>
|
||||||
{
|
{
|
||||||
|
|||||||
8
My project/Assets/Scripts/UI/SettingUI.meta
Normal file
8
My project/Assets/Scripts/UI/SettingUI.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7140f4f8df7058a40b9fe1448fc5d0e2
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7120fbc18cddc8740bd3eb0691318e49
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user