From 5f76b892ec4aab61b2634145a5b3679c32f69773 Mon Sep 17 00:00:00 2001 From: daixiawu Date: Thu, 10 Jul 2025 01:13:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=B6=E4=BD=9C=E4=BA=86=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E7=95=8C=E9=9D=A2/=E4=BC=98=E5=8C=96=E4=BA=86ranking=E7=95=8C?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UI/MainUIButton/AnimObject.controller | 101 + .../MainUIButton/AnimObject.controller.meta | 8 + .../ArtResources/TH1UI/Setting/backbar.png | Bin 1254 -> 15259 bytes .../TH1UI/Setting/backbar.png.meta | 4 +- .../ArtResources/TH1UI/Setting/frontbar.png | Bin 972 -> 15168 bytes .../TH1UI/Setting/frontbar.png.meta | 4 +- .../Resources/Prefab/UI/MainUIButton.prefab | 2 +- My project/Assets/Scenes/SampleScene.unity | 15571 +++++++++++++++- .../Assets/Scripts/Logic/Input/InputLogic.cs | 3 +- .../Assets/Scripts/UI/CameraController.cs | 6 +- My project/Assets/Scripts/UI/RankingUI.cs | 60 +- My project/Assets/Scripts/UI/SettingUI.meta | 8 + .../UI/SettingUI/VolumeSliderController.cs | 81 + .../SettingUI/VolumeSliderController.cs.meta | 11 + .../Assets/Scripts/UI/UIBlockCameraDrag.cs | 55 +- 15 files changed, 15022 insertions(+), 892 deletions(-) create mode 100644 My project/Assets/Resources/Animations/UI/MainUIButton/AnimObject.controller create mode 100644 My project/Assets/Resources/Animations/UI/MainUIButton/AnimObject.controller.meta create mode 100644 My project/Assets/Scripts/UI/SettingUI.meta create mode 100644 My project/Assets/Scripts/UI/SettingUI/VolumeSliderController.cs create mode 100644 My project/Assets/Scripts/UI/SettingUI/VolumeSliderController.cs.meta diff --git a/My project/Assets/Resources/Animations/UI/MainUIButton/AnimObject.controller b/My project/Assets/Resources/Animations/UI/MainUIButton/AnimObject.controller new file mode 100644 index 000000000..2edb39755 --- /dev/null +++ b/My project/Assets/Resources/Animations/UI/MainUIButton/AnimObject.controller @@ -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: diff --git a/My project/Assets/Resources/Animations/UI/MainUIButton/AnimObject.controller.meta b/My project/Assets/Resources/Animations/UI/MainUIButton/AnimObject.controller.meta new file mode 100644 index 000000000..55b1ccfc7 --- /dev/null +++ b/My project/Assets/Resources/Animations/UI/MainUIButton/AnimObject.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 208393dbda50cf54c96ad00190db1062 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/My project/Assets/Resources/ArtResources/TH1UI/Setting/backbar.png b/My project/Assets/Resources/ArtResources/TH1UI/Setting/backbar.png index 765cc859d7af7a46e84bb5ce218367333a834145..85698824ca0a1f23808c8899456aed32cb48839b 100644 GIT binary patch literal 15259 zcmeI3Yg7|w8pnsL8l<+zqMi!7F|OEMOlA@YBx4e_2`(r>4i^D?s0@<<29nH}nMeqh z2C21nEpAotvg}sWR%^GF?XL9VTGEScrF2(%s-o*2L$`Lf9=l$;wz$}3XOa+J0yu3? zKTgg`=HY$+|L1w<_gs3Prp*|p={ zGAU`%%Zk-z#7rBBYBJ01APU^Mg}A#G*IHyt3=*9S>Fd9}W5O^Y! z1rK>>r^D(WngxdmD`6w-EW`Pf6Z+_CilvxpYLb$n?nw)Cb7D4!YEL*`n{C3<44b*0 zLl8tdp_3`BrwKTpU?`^pCotD2#TmsRcZ>NK@kK<5>STaFjE$?vL48hAxE@@s#H|1LX}!D2cQhk!R;Rl#$w+o z3#bM1Sa7tGa@a7|K-#b>0;cU%I(W1ZP=;0&YNV``gBuoMNY%j;H3KgHN<*{l42#)u zBHLu(8WbdHK{c8RM5|3pmsg~zGvr)^%Qcu%DJRr;dL^Q+#1RedhiEo~_Hn6A6z=4A zOE9(Nd!`2L<5I73klaa!Spf|{`tMs}f;8hwWswZGKI?&X%dKAjSyn)-8{0b4VI}=% z5{)?+g5Pm^*~pd)9b%y~iud?;E{fs&X=cFr4MA9R@R-)oVTGJQ8~H;gFpwXxPhO+0 zny}w(Lj_X#Rg))Ss7kgDa}dj_xHa)z_Ie=eSX+2{9n7EpR&wk_1X{<=&&Y}$Kc71O zP(!)3z>N#@&w)}0k82yP9MG5Wb82<^^%*LJ`@l;6H)sXB!>y%vw}Rc_)=_7Xon#HF zV70Jjz{Q`ufn%Y7dq^M*>1uVVS_g+Whdc5}7hx?ik=*`e_*I$C-Iw1J-Z7!E6fkN* zBhV2v2Br%5ckZ9bKr8pKz&)qHp$C<*lN{OzKXNd7M?Z36Fr8Qgq#+oKxC9Y_0udKT zLogO`2_gaoA})}IU@YPiL<9;%Tp$g>Si~iW2o#98KpKLvh)WO=C=hXhGz4Q2mmnfg zAmRdP2*x5VK}4WH#0An2j7406h(Lje3#1_!i?{?4fdUa1NJB6daS0*<1tKnxhF~n> z5<~l?B5rF~`7f3@e7I6t80tF&2kcMC^;u1sz3PfBW4Z--XxFn;m z{tl@5Hy?GzV_sD z2#UOsZCY07x^T7K%v@MH{fVE>S{VJo(wYBy+<2h;@V>=Caf9JAj4 zq3yzbFR1PmCiXtFqwCgo&-)1)_dVv4_l6?BSvma|H&5ryQAMQq9{9?cbaHl#E;3gR z84}t|zL}>sSo>O$laaIceA?I66-J3?7sL$sq28p`LySp zq}zE|@!uEwzk29AEl-H~+EkPmx9L($@$8SH;1h?NolUlTR~ybkgIn?vzdau7?S9)E z_u;lfMV+>H_I%u1;VbS!t~Woo?pTU-v3Ksumvr+#*)o)V``I;>m-of(()e!uZOZg> z|FJm^R{Z3Zd2cqpb?sWB{EyOCdL+{uqq?^2`6U1BU*7a8 z8sVGoN&ELbc0nJl=^tE+9QgOK)?>-&#YLHeuWzV*WD}+@#cS-(-a0#={qj)0gI>3= zHs{PxuQB#a&5;FvPB08?`+I9ggKzQP&)eRUpdC(Zr6buW9#H z@`j;oZ}Z0611s;jHoV3+Be&Sys99n2HDA4@xUuWn@1o=XI(R1YK=QjgbVJ(4b9sYH jpw*6+nrSuvi-+btbviRbw)hhN`fPS)uIc56$~XQW2W1HL literal 1254 zcmV8zX5cmJvjo)uZa$#vlR!ScJXmx9UX;UO8H15N%bDtM3}42moLi z_N!m3=hgc~eBdI2XlM+fCrAGV09b{C>RDqL9bD&wt{X%TtM3~(NCN;&;cfLx_2*ST z;Hp71G=|Wlt9~&6z=FMK45Lf07F{KX?p8l!!!!VJ^XyeWHm(}Y?Xp4iWn&C&UFJ;y z04wyqF^XQz`-aN|(ZlK=**FaV+giI)0RWiB)6VFhvx4YJb!X}0 z006AsoyOMr$mt;ZqVeQ<0D#--abxowI~_z%&iESuz-=;gYL)0@{A^_-H2|<49(Cf; zLMMah+pG=&0PA6BY@g%*%vc=)0M^NI`^1F`{n9SGp zA&4GKI0yj1R36kAM4KHg7XbjQnfuk|Q0+`T2>`%^c7~j24*;yU`$Khi>L~yKCbT`| zc6$I|z1-o6+*agGN7z#7^ba()>Au-=BD+L(F@0DuW?4AuVBQvd)==y0eG zrk(--U_u90hyZ|f_kO6}O+5twz=Yln)tjlO005ZKe~0Sr)KdTeOlWVY_NJZ!0AND9 zL-l&sR;n!2AOUBc{$I;8;6INTKM_0`k~so{9FJ4D>2(M^lIKWTsDZR z?lwlz_GRA)0I+0xjWKkohfH53h-&<)?eEohS9vo4z!Lmg{ktn{@wsXc%{-`{Hm({0 z08HU+;}fXQeCXmlt{X&E8`YDe*Swpw0RXORc53~zu6Z~7B7$gUt9sn{Guq~&J`@1p zl>Nq^$DX&K2S_h6h-NmcN7Xmg{Y8H`0I;@ptKS>XBwOf1qn8mxCv8`MYuszJ)A;im z0KhyB8y~9pvihSXp0T>@AUbJie2&q*6R)pU_2mG-jrX#8bK>=?6+IOCe<^*}KUEVC QdH?_b07*qoM6N<$g6*eR^#A|> diff --git a/My project/Assets/Resources/ArtResources/TH1UI/Setting/backbar.png.meta b/My project/Assets/Resources/ArtResources/TH1UI/Setting/backbar.png.meta index 5ff629434..2fdcb0bfa 100644 --- a/My project/Assets/Resources/ArtResources/TH1UI/Setting/backbar.png.meta +++ b/My project/Assets/Resources/ArtResources/TH1UI/Setting/backbar.png.meta @@ -49,7 +49,7 @@ TextureImporter: alignment: 0 spritePivot: {x: 0.5, y: 0.5} spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteBorder: {x: 29, y: 32, z: 29, w: 33} spriteGenerateFallbackPhysicsShape: 1 alphaUsage: 1 alphaIsTransparency: 1 @@ -100,7 +100,7 @@ TextureImporter: physicsShape: [] bones: [] spriteID: 5e97eb03825dee720800000000000000 - internalID: 0 + internalID: 1537655665 vertices: [] indices: edges: [] diff --git a/My project/Assets/Resources/ArtResources/TH1UI/Setting/frontbar.png b/My project/Assets/Resources/ArtResources/TH1UI/Setting/frontbar.png index 5f469092fbeab1e064d893bb05ecd69711324300..0731810a2672461d0ff6c028930d1be637685079 100644 GIT binary patch literal 15168 zcmeI3e^3f}DDg9uPPyIBCMVw+AbCx9jcV z9jJ*hiAEA*W734N$UqUR#_BXpJJV=2mH?A#D$T^05JQ!T29y5K*4n0-Xm{_9yO#re zlTQA8cjoRM-uL@`o_9a*5B8tkURl0kmS(O7!?0PUc3YM5o2Pup8Oh4`BUfs_QhriJ zd#!|FGc(jr0=Bz73&Ttcd1sAWUm!w z{`aFNa4qjD#8*)c(jk^`4ZOX@&sDdSJK2^-*6hNUST&X)tt9YrGNTQ8JwAyJ7UH42 zv=Xb$1g;H9Ju9TS&$lpDN07Wr!1_@iNg`CJ?VJ8-bqVK z^0M^`f(X({oszRzB?P4VEkwK}Hs7&qoQ;t=tAR97 zI+D`qDW`#?Nds*#E+$PhNdig2%D5a3!Nt3qfgA-o((E)CX-ZEU%wP^c8J|PhKQ2aQ zzE&1c3*>RJv|I3d8QIEvnR<>8ef1V1)(9x0tBNiWJc3^t7H2hDh{>7(S7@ctr9Me! zd@NULvnma_Jny0zLmtJrO{|Wg@);fF$}{WCMkA{;x(s?Ft2el*0xks6;Q;LuQriT! zN!=}x)UI!s8n91DUE$}IlaBEK8g=yFw8SK7CX}-ClCnOVfpx2_-q2ZA&8-{XI@aOg zLuZo6_$5x=afSHUmWv)@(KAZ*gmx~?uF?pkPeizN{QQiq*opIL zQ4cj*SqsXzn9v;PEyRSjSmm(3Mx9enQ%GN6AeD>ItKShT*d1@Jy}cFejz`yg*Oom&PhXv(1g@`_=jGyG_M);P4*d2Y#iNSQJ2uK4OBV15Kpa9_l zX+UFy3yKI7AY32~XpC?{5rG1P3#0*!5iTeqP=IiOG@voU1w{l35H64gG)B0fh(H0t z1=4`V2p1F)C_uPC8qgTwf+7M12p32L8Y5g#M4$lS0%<^FgbRuY6d+t64QPyTK@ouh zgbSnrjS(&=B2a*Efi$2o!UaVH3J@-k1~f*vpol;L!UfWR#t0V_5hy^oKpM~(;esLp z1qc^N0~#Y-P(+{r;R0zuV}uKe2oxY(APs1Ya6u7)0)z{s0gZ2qOA~wbkMk+-`vsI2 z``S}mTa}jrwXD6$fnhD*!?4XyV%QhAl;0~D)(|Zcr{^kM!8v-#tGt{N=yjDZ4S;xM!tw`Q4T| zgAX6-*W~mW@}46v7j}%K{;hlFk%6^)*Qc@db&K=64m@}5S0lB?(WAbHd%2Ad3^=R$ z+mhSgT-=_M;Wkly?F75y!?V*5_C0pJj@Y-qW8YhI332v|56pUf`gg>%rv8d1)0Pbv zyYQmVr@4Q7>*tp)c5#P_K3XTWcUR@CF8Fgo_==M&j_qG0 z6rIU9|4#bg@1_T?E>0m&h~Gb%VmX~KSh6w8wC(UEZ1l4W(~l%RYE1j*tX0X0o8Ib6 zOZ<^$>xqNbfx%ab+pP2M{tuZoI)BJGdgM&nc=iIuWvn< z-M9I^V>t1QW&cNiDkop|9Xey0bEarR t?Tbrio@y96)v^5j^F7o4%AH8T?r7amr)^B>R#r1sx~$xGcxm01{{h^c*98Co literal 972 zcmV;-12g=IP)*aR5jvoxG=;K~P$mm2&m~EU)IvfBtSa@vQiZYw zxQ=%vk~Eq%1J?+hFr?uMWjk;dXslrfUgsvEqf3UDnb^?p)l}M5ltwn^+ z7?fWqtw3j8<4BTX)(K3{?c^8AUVJ=Ql9XOEus^qxE0oEUc)nPYq#`yGI%Kd=HsHIt zBuV8PN9d5jLRp_(7D-a%)cr^ek5@1=@NhC?p zTbclKvQ8mMir!ocMUqqtZ3$tadP$P1F);xqWSv5i6uk*)*OZqeX*gpO;7isiBuUZx zk^sF~r;sE?uQvf+WSv5i6ulk`MUqqt&lBKo)+r=O(Yu!bw}JkwlSq=H)eqcCfcL<| zjKfHh;`I=CpZg!ml`NA;lA?AQ{w%O{5%`*27D-a1z5$ouPoaDO&Se%yk`$}+gbpG9 z)hmaAzD(jsl48^c9LVkD7s@-JtL||mNwMkz-sE-)Uk-T!cvROolB5_tB6P-}!b150 ztOY*TE0H8AI-dz$@gx6WvDer402_f{bqFO%ipwuTNAwh)7-~I~o4}5dOe9H)PCua= zZWcQ^+yYytfvtF_B1sBeu#M0SMU`5y@f@%QA19Wi(X5Zq1;hSdG0hUdH-II;;~IpL zB*o=1p#yG|`e52M<(~}0zeI?BC zbAUs@_p}$5Qz$v_fZf1MU>DF`!5EUHe@i!EPM<}X14s3UUJHYE|2mK8ySbJczb5WB30000 b.PlayerScore.CompareTo(a.PlayerScore)); 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++) { var row = content.Find("Row (" + i + ")"); @@ -41,37 +43,35 @@ public class RankingUI var player = playerList[i]; if (!Table.Instance.PlayerDataAssets.GetPlayerInfo(player, out var playerInfo)) continue; - row.gameObject.SetActive(true); - row.Find("Head0/Text").GetComponent().text = (i + 1).ToString(); - string forceName = playerInfo.ForceName; - string civName = "带领 <"+playerInfo.CivName+">"; + //row.gameObject.SetActive(true); + row.Find("Rank").GetComponent().text = (i + 1).ToString(); + string name = playerInfo.ForceName; Sprite sprite = playerInfo.LeaderIllustration; - row.Find("Head1/Avatar/AvatarMask/AvatarImage").GetComponent().color = Color.white; - row.Find("Head2/Text").GetComponent().text = _mapData.GetCityCount(player.Id).ToString(); - row.Find("Head3/Text").GetComponent().text = player.PlayerScore.ToString(); - row.Find("Head1/TextGroup/Text1").GetComponent().color = Color.black; + row.Find("AvatarMask/AvatarImage").GetComponent().color = Color.white; + row.Find("CityCount").GetComponent().text = _mapData.GetCityCount(player.Id).ToString(); + row.Find("Score").GetComponent().text = player.PlayerScore.ToString(); + row.Find("Name").GetComponent().color = Color.black; if (!selfPlayer.MeetPlayers.Contains(player.Id)) { - forceName = "未知领袖"; - civName = "带领 <未知文明>"; + name = "???"; sprite = null; } if (!player.Alive) { - civName = "已出局"; - row.Find("Head1/Avatar/AvatarMask/AvatarImage").GetComponent().color = new Color(128,128,128 ,1);; + row.Find("Name").GetComponent().color = Color.gray; + row.Find("AvatarMask/AvatarImage").GetComponent().color = new Color(128,128,128 ,1);; } if (player == selfPlayer) { - row.Find("Head1/TextGroup/Text1").GetComponent().color = Color.blue; + row.Find("Name").GetComponent().color = Color.blue; } - row.Find("Head1/TextGroup/Text1").GetComponent().text = forceName; - row.Find("Head1/TextGroup/Text2").GetComponent().text = civName; - row.Find("Head1/Avatar/AvatarMask/AvatarImage").GetComponent().sprite = sprite; + if(name != "???") + MultilingualManager.Instance.SetUIText(row.Find("Name").GetComponent(),name); + row.Find("AvatarMask/AvatarImage").GetComponent().sprite = sprite; } else { @@ -111,6 +111,29 @@ public class RankingUI AnimationClip fadeInClip = Resources.Load("Animations/UI/RankingPanelFadeIn"); if (fadeInClip != null) animancer.Play(fadeInClip); + + + var playerList = new List(_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(); + 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); } @@ -126,6 +149,9 @@ public class RankingUI AnimationClip fadeOutClip = Resources.Load("Animations/UI/RankingPanelFadeOut"); if (fadeOutClip != null) 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, () => { diff --git a/My project/Assets/Scripts/UI/SettingUI.meta b/My project/Assets/Scripts/UI/SettingUI.meta new file mode 100644 index 000000000..08af7ae1a --- /dev/null +++ b/My project/Assets/Scripts/UI/SettingUI.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7140f4f8df7058a40b9fe1448fc5d0e2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/My project/Assets/Scripts/UI/SettingUI/VolumeSliderController.cs b/My project/Assets/Scripts/UI/SettingUI/VolumeSliderController.cs new file mode 100644 index 000000000..7c3783855 --- /dev/null +++ b/My project/Assets/Scripts/UI/SettingUI/VolumeSliderController.cs @@ -0,0 +1,81 @@ +// VolumeSliderController.cs +using UnityEngine; +using UnityEngine.UI; +using UnityEngine.Events; // 用于 UnityEvent + +/// +/// 控制UI Slider的脚本,用于音量调节。 +/// 提供了获取0-100值的接口,并触发回调事件。 +/// 该脚本直接挂载在 Slider UI 对象上。 +/// +[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 { } + + [Header("Volume Settings")] + [Tooltip("当滑条值改变时触发的事件。传递的参数是0-100的整数音量值。")] + public T_0_100_IntEvent OnVolumeChanged; + + private void Awake() + { + volumeSlider = GetComponent(); + + // 确保 Slider 的范围是 0 到 1 + volumeSlider.minValue = 0f; + volumeSlider.maxValue = 1f; + + // 监听 Slider 的值变化事件 + volumeSlider.onValueChanged.AddListener(HandleSliderValueChanged); + } + + private void OnDestroy() + { + // 移除事件监听,防止内存泄漏(尤其是在场景切换时) + if (volumeSlider != null) + { + volumeSlider.onValueChanged.RemoveListener(HandleSliderValueChanged); + } + } + + /// + /// 处理 Slider 值变化的内部方法。 + /// 将 0-1 的浮点值转换为 0-100 的整数,并触发事件。 + /// + /// Slider 的 0-1 浮点值。 + 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}"); // 可用于调试 + } + + /// + /// 设置 Slider 的初始音量值(0-100)。 + /// 通常在游戏启动或加载设置时调用。 + /// + /// 要设置的 0-100 整数音量值。 + public void SetInitialVolume(int volume0_100) + { + // Clamp确保输入值在有效范围内 + float clampedVolume = Mathf.Clamp(volume0_100, 0, 100); + // 将 0-100 的整数转换为 0-1 的浮点值赋给 Slider + volumeSlider.value = clampedVolume / 100f; + } + + /// + /// 获取当前的音量值(0-100)。 + /// + /// 当前的 0-100 整数音量值。 + public int GetCurrentVolume() + { + return Mathf.RoundToInt(volumeSlider.value * 100f); + } +} + diff --git a/My project/Assets/Scripts/UI/SettingUI/VolumeSliderController.cs.meta b/My project/Assets/Scripts/UI/SettingUI/VolumeSliderController.cs.meta new file mode 100644 index 000000000..7ccd2a035 --- /dev/null +++ b/My project/Assets/Scripts/UI/SettingUI/VolumeSliderController.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7120fbc18cddc8740bd3eb0691318e49 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/My project/Assets/Scripts/UI/UIBlockCameraDrag.cs b/My project/Assets/Scripts/UI/UIBlockCameraDrag.cs index b7fd7b07b..76a8b481a 100644 --- a/My project/Assets/Scripts/UI/UIBlockCameraDrag.cs +++ b/My project/Assets/Scripts/UI/UIBlockCameraDrag.cs @@ -1,17 +1,68 @@ using UnityEngine; 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; + // 是否应该阻止游戏中的拖动操作(用于点击并拖动的情况) + // 当鼠标在UI上按下时设为true,鼠标抬起时设为false + public static bool ShouldBlockDrag = false; + + // --- IPointerEnterHandler --- public void OnPointerEnter(PointerEventData eventData) { IsPointerOnUI = true; } + // --- IPointerExitHandler --- public void OnPointerExit(PointerEventData eventData) { IsPointerOnUI = false; + + // 当鼠标移出UI时,如果不是因为正在拖动而被阻止(即不是因为鼠标在UI上按下), + // 并且鼠标已经抬起,那么 ShouldBlockDrag 应该被重置。 + // 但为了简单和可靠,我们主要依赖 OnPointerUp 来重置 ShouldBlockDrag。 + // 所以这里可以不用特别处理 ShouldBlockDrag。 } -} \ No newline at end of file + + // --- 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; + } +}