From 07b26e6c3398ccbb60d0a96a180c1ac5a84e1d6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=A6=E8=AF=AD?= Date: Fri, 1 Nov 2024 14:07:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=95=8C=E9=9D=A2=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/Assets/Ether/Scenes/Boot.unity | 120 ++++-- client/Assets/Ether/Scripts/Boot.cs | 3 +- .../Scripts/Common/EventCenter/EventCenter.cs | 257 ++++++------ .../Ether/Scripts/Module/Entity/Entity.cs | 6 + .../Module/Extension/UGUI/Image/ImageEx.cs | 13 + .../Ether/Scripts/Module/UI/FrameBase.cs | 370 ++++++++++++++---- .../Resources/ES3/ES3GlobalReferences.asset | 3 +- .../Scripts/Frame/Loading/LoadingFrame.cs | 6 +- 8 files changed, 556 insertions(+), 222 deletions(-) diff --git a/client/Assets/Ether/Scenes/Boot.unity b/client/Assets/Ether/Scenes/Boot.unity index ce473e5..d66cdba 100644 --- a/client/Assets/Ether/Scenes/Boot.unity +++ b/client/Assets/Ether/Scenes/Boot.unity @@ -237,7 +237,6 @@ GameObject: m_Component: - component: {fileID: 327250662} - component: {fileID: 327250664} - - component: {fileID: 327250665} - component: {fileID: 327250666} m_Layer: 0 m_Name: Boot @@ -275,29 +274,6 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: scenceName: Boot ---- !u!114 &327250665 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 327250661} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 446f0f9233c243e43be6af9f1b6b6357, type: 3} - m_Name: - m_EditorClassIdentifier: - serializationData: - SerializedFormat: 2 - SerializedBytes: - ReferencedUnityObjects: [] - SerializedBytesString: - Prefab: {fileID: 0} - PrefabModificationsReferencedUnityObjects: [] - PrefabModifications: [] - SerializationNodes: [] - key: Boot - dontDestroy: 0 --- !u!114 &327250666 MonoBehaviour: m_ObjectHideFlags: 0 @@ -310,6 +286,17 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 00fb6396f1c23af489fb839f49a6e7a9, type: 3} m_Name: m_EditorClassIdentifier: + serializationData: + SerializedFormat: 2 + SerializedBytes: + ReferencedUnityObjects: [] + SerializedBytesString: + Prefab: {fileID: 0} + PrefabModificationsReferencedUnityObjects: [] + PrefabModifications: [] + SerializationNodes: [] + key: Boot + dontDestroy: 1 --- !u!1 &344948064 stripped GameObject: m_CorrespondingSourceObject: {fileID: 3818956800902594484, guid: 2d40455ce379bd946bbf5e5e4e71d04c, type: 3} @@ -859,6 +846,81 @@ CanvasRenderer: m_CorrespondingSourceObject: {fileID: 7994283247447831877, guid: 2d40455ce379bd946bbf5e5e4e71d04c, type: 3} m_PrefabInstance: {fileID: 5978091752429385269} m_PrefabAsset: {fileID: 0} +--- !u!1 &729029397 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 729029400} + - component: {fileID: 729029399} + - component: {fileID: 729029398} + m_Layer: 0 + m_Name: New ImageEx + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &729029398 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 729029397} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 70e78a4898214182969b5f5c1049ac6e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &729029399 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 729029397} + m_CullTransparentMesh: 1 +--- !u!224 &729029400 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 729029397} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &758576394 GameObject: m_ObjectHideFlags: 0 @@ -1068,7 +1130,7 @@ MonoBehaviour: openPrefabs: 0 prefabs: [] idRef: - _Keys: 5337fb48ba082f4c11da0277d9afca7edd7b5efceef80727d52bb9c665d7aa545cd63732fbb03921f9fbdfe7d589f4265fc87a4a912787717f7186df3643453fed272c5aecffe812e387642fb5503d06d362220ad1fe5b4de27d054df1dabd62b18c3b97fd14986685d215c868729107c05703bcb18424275266b4f8129b12635882ddde307e8172e3b977a1034eb51fa8fc8664117feb6e01cb08d748b7900e9e1ea5806706dd7405d661b4ab5e5235590b7edfd2fb0b53c80735ccfd696e64b779c0dd0bc978512705a1c4e2c93d5fe2c181c2c64ec35d45c66a241e3041716dd34732a6b98e01cbd5afbfeb312b053d1dcbb8111980158f100aa834627e4e801055f30791b7341e456a049e475a770f909ec304057d79ada23f483cc8ca68a89fc00479e1f3312a0028a97c7a4b2a6c819aa3c3ba497973315f552eff8f180fd25cff8755fd1011962244d1d95b638f4099a91e4ca23e50fe914a6209ac2b97ebb968a060ab16c1b221ea5070373eda76fec8762d5571f49656ecf638ff62d1f6b9ba3ae62d1e6bdbc9e041900521c75371ec0be3b43a412a74090abf1f074e7ce6a54883fc0db720cbad08c94c639135b34aa9eb6d12437efc655b372853453e6e3a55a027496ae3a9ef7e20e402b5d008a7cfecc425fcf5080c775dd4384c2a712b5ae01c3bc1829056e9b44c5820c42d7dafd45d5adcc628f903af460cf08fc4576ef0a36bee44e64d5c6e3b46574f134ccfa976207934f9def7eac0113c84477978a3c70f6899906bed0ffd6d751eafac3d6d2447e85c2f5c167d9c0384d511d727c2cd05e9dd4c96c61df268c873abe96692b05757716de38c950616027318e701d9b938ecb4951bb9ba0d366ac7258a2985691686682e9830b1917de563993936da6a10468c034e026b62639dc8b2ac456fbf7723d09295f7ad97624613ff1c54476d705d14449c821b131a07cbfc67fee538755cdde99ab82be6680a5f6ae99581481c36224f312a22f407428870d44ed09b2b4b74c0765dd2b877f02ea94021220d33ece7cd246af8b57fd2f15730ba121939122e745391a4007138f8e7660277c15242bf5b938578430c391e5a3a632fb61ad82900ced1cb051b7217f8c22ab3374c83b49d7fd2ad83627cd647659343dc08bf32c2d38870dc75bb3f059c7005377919f242e732c912295962b558ec95502ec6107ea38af52b12d928c592a8e6f27e0dc07d8686c33b0b20982cea2534624f9134d75f8693ee2239cff0f5fb807f3f55334a2c17caa776b3767c0e37bf135bc67502740f93f75eafa04cb6d3460f60196c3f597e8e665a23b1ec03ef03a57a446b458e7d0cb1172ba87d767df1a36d9ae3d95b009325360fa897c07ffa4d54052d06c17461220bc94f6dbe5127015ebaf1802a8b0f6825c2ce9fd80ffe2b31d1caceff9721320657a9839a1db2693492aa1edd5882c558622b6b535eaca0471cb1fb55dd68bd17fd7eacb11eb855737eaf76d3b6eaf219fa2f7b7056b2b419b0815cd4519ebc77de1077d40bd55e63f12c1838809e9611491ef1473787b9325cfd99288f98c11f3c73436baefd5f19622eb6d67711374e186e8a32ac753f565645780e3c36d37612c802f2a5d49d477d0be409d0e3bb4bc64a0f210e8e734f4d653d0b8992aa2c5a40c4af0e44a943d142b5a19036867377d3b80ed94d987cac4c5ac0686e4215a047516fe1f3c27ea0cc50cbd9d1be1721357da3b547fa58d8415a5a9e6aac3f84ca40d887f5547d113aafa59d63567c0b719f33f09e6058b307b8ddb1e2e336e0efb9f06f1a701676046d8568ab443b97d665100adf30232a99257f3d76cb0de21a3952559af20ffe76560af31a3f08c27c45db7cd22c4021dd1a083fef53007ffe182fa6b29101b094595704ae26143d58ae6b7306af7169480d973327703234d0382ce97e8411277b7d417c980367728e4801be365469460d88fb486fa2554d7452269e75e95b2c62bc0877910b0133d9513bc0912023ebb830194c652175f3c199300f6e42648381f1f3bd803b0f48d9c3af1db83e226a8aeda95afd570c932cf20362dba53a6a12ee736e972b1ab892d073a171583b8376c6848099092dddf34a7bf7030024d6cb0047b1faff623fa7a295d00000064af80f37d21c9503852d86d9a22abb021d1b5062e1a6124b6e540b5ca7d76b2e1b3b328757beff0677b100da75263956b91b4cc203f3e35d193c3581efc6a353c357be66f733ab5e1c4aeb2fa637d5471bb516c2232d310d1f8fa193f481f63d5653181e67d25e12c6aade4dde120451127d9ca5dd65776bda4eb7986de8956554adda521fb7e048570488ce0b7eec316b0d5a8ee264e445cb84f8b58af77f22eb875f7412a88f365ee4fbe1ee4577593be82c608e0782489320889abe2abe5f7b991c7be087e114646fd00297fca81004ae0e8cdc204f0d0ba7e2f220f477765ea59aabd604874c0717c3fdd884df6a88886093c6b4c45bb6f17977952cca6f08a55b0d9d02c608355b85c45c513570884c7ba8550b3c12960a0a1a75f049331ecc0acdd62e327911bf278db968f841bf4d8ffabf8ba5451c183fb24342b85b19801c4aa39a042ec8a05db28e0e1a02e355119389252f0f591dbdc030f0901013078ccc4b04b01137a92d6b870e692f6ab708d93f674846f2d59ea253ecce47326d9f87814db7170623c932539b966786ec29e8f9694f54bf46bf21a2536422e26d7792f7ab9245eeae1ed7a4fcb9581b026aad68a74169ccc6a2e25a30e93c0b114160e092e4044de14fbc5a3a8e1644ca435d7429d6566f7f8b7effe078348d946e883e6c4446a04c3283029ce36e857a7288c964c853d0098c760c4f810caf8309cfc3ab56792cad997d645d1d4a98ef392298615c27130308122790ba14532d96ac61dfba3c394160521a423a4bb1403cef4fcffe4d679763d3485ad74f0469aafbcc4e1806823ca06a3f4f091ba0f3ec9f7f225e1b5347730bd4414e6e0e4380a01924105867b12666446ab2228de94dc0fe0a1c77a6755ed061f1675daf8e91147244ee5a6dbfbb048efc1562c8d65ca7d941dc5086f8535260f432754ac8b7b5d89daf2dd7a82dbdc52106569f0467c8b1f0c8106be28f7af19bfa7872b9443abaa07565858ad031131e8b59ffa9f1645bfa263a6e38b50af2cbc4735d59b4f4233364018e0142272096fc76911684b85569e26d2080347d14948c45c65d8d6dd37f7c3446f0f25c3c4e5a273c3e78db470c1d39c3dd2a5d011913238d8761c3088fa3129a4ffd465c3faa2e260db9520d678c45c1ab560aaae0cd5e0516eac4af1e30536699be08f129227bcd047cf12c99ce0a14a683b4e6aebd7ae4a3b58dd69121072399128c567bab688ada3da663db316a48e0d956a1e539135739254d7395a53be37514c6ac5b606605e5c23f149b21078eb4ba0a47349a08d326e28fa1f9dc0ccbfd3b1139944213808dae43dd050045181edb2750af8316f0e2662cc20ff802c2cf0a11d73340068f5976457aa9d432269da6bfd4045c7bb798052468382d3ad47a6dd7ab69cb5b551824da527fbc158075635561ac4b41ee869f95102c085c823527695bba8f465e0ab3ae9e894738240f5c22637d637fc5afe925c9364a280fc75b88a626703bc19847df76d43f042d57d0f45c4aef271678782df4c7d4228b9f7cb63d38233cc5b151be74e5eb3aa4ba393fccbd2126fc0cfca62fe90f2ab9e025e1f4ea9025333bbd5b95f4ad6ea3cc576426e1e81cde1f5c7887c0e301de18b37e04d89113092d0ba01a81aa391dbc2fb6e751263255fcfc69d508ac3aa024a7efd4778b76cf42f87835c7b66e709235368eb4882223daa28b53508471468e532ab47f0a6d66564e9c6ca58c14863b08a2927fdf62deceb0f52aeaae700baa148b6f6ef70e7938631afddb717cba378d4f3ea9525b78bf8e07f80cc2215c41200f6b433e45d720a54fd113b7217a79f2f38ec9d330ba0773223a66de286ed1c4e99b4196058ceed11e38e59f39d2a75d920706af5f5941576339d09f7a65cfef3aa09aea0a1750273e3e2a4a62efead736424b5675a087a4e7ab70507b139c1eed21a6f35eb8ac4ed28eeeeb243a5060e8cc236e2307a51040a646114ff2abdda7efd63878cc7f25231d65e81d89270062be64cf5642fbba2c4143ff034116aa7dac96353293c5b2273e343f4f1f3cd7513b607353b2de17b32a1b2b04b774c76eaf8db8177b03fbfa51f49a2dc6c6cc8fa925ac21e6f52161bb7f4f1e03ce210c79e6a66ebf2e9b1f9f95b50ab83ed2b8e8d08d26534da4626ebaa6746fd65e6ec5d0ea313cb9ee438866e90a91342d0a27242d1e44be48457f877747a52cbf9ab3a615424e12d6246ac9183a6366881f61a55d49a93fb2841930b04b41a6e7b52584be15e014a7c505ad767ba60ea7e50f97a900308a0d8b0c6fd67ec221e2c3e163141902736c8650c93332515aac9c4e0dd43f8a8b7c7900b5aa3ff08288c669a111629f6f52722d54496a9a45d1f20176a046f3f4c242bc68b13bf39b370acf82ec0a8a347326357b1e76aedd2746ada665774911898664ed33036499d5b4e24f6c73beb52e8a969c562d28de1cb7bee4532ec29242bf76f5043e8550928aa329142ffc7cf00e3a548e54bc5c5e86d07b447ffe4ec2031277fc7915f43742cb0c87298d62a2c43236523fe227ec2171986043ba76e8554b787a71a28f2d16d9f60c065ab5cbde56d77a65a77e6b400ac70e2f380db2490200bd103c486e34fb31f3183ef89c42dbbbb57f108e7589acb72c7c25a800905102d16165bf51f7adaa8f3877a0e1439e80ea3951ddf265d724317c32505015b6bf576450970e4284aa712f052f091e31323e36d91d7d8e5f1f5d50a3aa7a1168eb46681cd457e4d528371bae88e84a929b3320da960b5e4ef3b13195764439c6aac92b3a10c494ae2493614f0a835f9e7bea2bae8465b761771e1a07922b1defd50b0673d613ba276b2409d0203eff29e03c0ff783f2232fe0a83d10c3b2db2e521604db50027c3573e051365b5c733fb81d6c3257656553540603ba8f7628657e4f55cd54df43c3b8ec44a6ea49630169264237ac5d1056050a1cf1fdd616875c7b087c2620e04af4974329a0a57d4c248c0c8c314b119418943d615da7f686e7273a7093212b0f15322fa7e9955af25d5507feaea1d92eb27a742fe126c2b3d4a159f2488d81562866563e8097849eeb6f58ecd72bfa2ce1195889e51444f8c9e5140fb32b3c6cb4fd5049763f1a4fd9a5798ddc05fe83b8e701e9195bed35873b6fc268f8bdb31bb55cf571774150345a3f9128845ad1f35f47c9afde3f214119299102e43777eefa6da8e7e991bb2c07412953589906e3d04f2e16f575b2abce4d5220a4912471fc3c64ba862a770a882f4e51738c2c590a79b0063398b90e3762877638145fb6fd55a7dd2eb14caea379b825027e4e54fd577f2bfc9ea542541e21a61fe5a795570539aa26bb7819164bb2362d5e9fbb80131aaa732f14011f43172b412aa495f6719fa841816935e569f6e490d4b141dd2cc3367ab0bff8fd2a7d7d2eca2202cc29c4db45dcaf129f62a1e0fd35f118af59c85f7e7ffc7c1e1f48516eb08735585623980e3901709e2b587e08dc21a4ed2bb395e93d4c0a994355122d7033ae2c27114bc44284000f2239c8cb3516cc004a800a14d9b574a00f70eb9d6e9de31940f08021fa263e6e53df14d40b2eb6384e53d5bac8a57c0246445320e13077a80560bcb8e93ebcb24e1f16e3e9f0f4fa42cd41873c3524c363c1a380b34cee7b79c51558617bdca8586f5d1400adf16e204f9df49dc52c564d20ab8b641df5f81471c9d04807848c3ddf47968b3336427bb0ef0528fbcacf23b06cdcdb239b2604d5ca15cd3aa28f431a5413311b82bc58cdb0d9d7dbf3cd1e201e14b85d641868aa71ffb9a90d3f7bcd66b4baf8c43956758cdf800624c01ba6024c3a627c19739e45f1a9b702d00801070db3114a2c4b6bd0ba54f84778388aab1db48a9d673fc6166bbb2789e26fc1a2660daeac0649faf9fa6707d64b6166e2b1f7cd04285a322e865109a79f12716f50ba50b6473feb93043d6065a90be1fad1166cefb344eb101815ad1eff2f57040a191e5ac20ad2088593680fca198e8d0e19e73d7a444259e9eae728d07161a8289676b23815a5484266925aef4f14311b813b226b6c84f0f51f1d327a49b205564b6549cd0cb9213c4f19be34192c0c845c0bba817be3b9dbbc8254215a0260f4f58eb0c915f6df786ceac69a10646fad234c6ff66ff14893d9f62c1f05a83fd80fbbbc4c353b98948c1cc26d370a90bbfc623953548b6cbe870d85dd50381a05aac059d51b38918e7c12ea4b11e7dbf73fa93f38653c17f7112a61e303bb9f33f3c8cf675f22ac6fe87d1cfa07e1a06da861c4f16775912fe15edc1412ac45830a0c449c6d5168cd282f347f301d2763dae60f57166ffe9adef6ab6a67cc3b8cc89463743036231c5e33180424b0282faae8e56e5ae1308ebb1c3e0803ff29e4da2ff93f0319ded11de79e8f31746b2a87341c76309acaf36f1034d21a6013b56a66ac66089e71c5fc9ab14372223013c067032a769fa63e0ea248927bb6fd8f540b8a6538fbde173da886691786819041479281630440b29741977e69ccdbc588ebeccd173e279524d9d4c2477ff3913793722370fd06e9cbd7490358b855ffecabe3df3c43bb30b4bd367a5940e612cde871c74cd59a2652f6c42a2300791f70093d46179a9f77e3e6b1647edca52c91f5ad253fb2d7b6bfa0e0d051f8fdbb9997bd8903dfeefd0ed8f196590c3d8f1f409ca443c7722f31d4691f2f3c56a87c0010076cee9bdda18caf3170c57f718b721ab368a7523339f26fa4788673faf0a647ac11bb49755ceb58aa10db1cef6628bf3b2ad17b0827619f551f9f95c90e90e5c77944fc92ab05f7ba3ed9a8307b02d460548d028d799fb6a200f5a05a25d962413d5ce59283aaa5bf40038a3485fa1c6f723bb3b2137d0a1812fa5a6ffe300065513bc9252c87f6242458e0fa03e32e7575909382f5f4670875fdb4871802dc38020f793e3bbd63054572714463efebd1331b059163818fa22cc0af283b7d3d273519fcf36aef39b72c72c3999953939a11e353fefc4ad580611b6a7a0e3ac9c7519a7a7decdf3b235343410e410af72754b7c5e12fc4dc7f1083aab17b41560e3b7515ff26ea51cd59d055c0731c3d93244326c400abf71543fb6d69348aa81265b0b6330a08ff95086cc4ffe6630dd33fc12a4198e4f0197effbc2157bb02e479682622d3719e2c4244336b1808d02007bf57094b1654b5602f4ef53bdf123c6ae0867d3dea00cd22030123e7a4cd7930dc289764f8986213903d5cdc570f9d5671d5f98f4e5df2407718b1e88762fb02c7255fb77ad87147246acc285caa790c9b3288312b161e3ae62725eeb5b5642c425aa47c6e54d1488a96252d99bdcb7526dd1b6f2bd61446da537ed4d7c7c610c49eace82da7a17ffbc5e0363cb7602525f3502cfee2bc6d1ec003982b8d0c79238ed806c629ba27692d0f9d88344a5f45417ae8ce793608c5e1bdf30f11775ed6d7466d48908244ea9d8af62c915f073b2f320b2dea2f6339f4c98d71719279d37732fa7d99fd7efa527c1204447226bbdaae09a5e9cb791a49949127347b39967143da3848c814ef6cfd6b9ec0ec7c67f0494b209b1e15acb913c72e8ea62fcdb6a775874c5e035e3c08ee19c8e858a2e8d5c814d0e605532d86f15c8f437dedd3c6ab989dfb4cb0b2111c6dcf04745f93dab94722e403cfa1c8b5d350603206742413706c0f041476e79e40366722ce046c364a76ca0fb7cadbf6d446786052de16f8abf104355c20592ec5b93d05f81418311cd6187056eba45a6fe7d05ad957464164d3745a83f476e49b4d05451a1d1e32146fbc45c297acc6a29ef30fe05dc9cf8acaa9341cbecdd33846310a01c1b0a0b466f56965fe7f32d852471bff983b07e82b301cc8521656a1e80c7b9a5d3a1f12aca547aecd9574b589a46e06e9d2d18139f32b0d33269daf60384d0bfa977a182709520d0b4b493f5b2e3eaea850b8153bf92bb099ee217af8680e06e380b0211e862d0dda3b891156136961644b57b1f063471cfc2c268cf260708e827bdf893f72034b4483f5f460286d273052294d9d772b599b2fb707d1b837adea73980d148609adbd9bd79b109e44d4be4dbc4589bd0ff4af7912ef44041d04445e202b3f8511ab487c8f029f8f48feea8bc61e747d36577c73427167060e3d472ba94e82e614bda19971f9b2ee6b3fc10fd9d0ca3c71c82878a7b3c78311508bcd49ca38967f2e60f68224f4c3096bdf02b0572d3e730ab97076fa8ec70be277de921a5b5e78578faa6fd4ba4d44ec821392ca34687dcb415484a90c7a5f99ea9fac1631ee10808a58c782ce9f506c2c627ca159d516e05b5c5cafe22164f7f52916e55fd11d8edcedab73cf00671f5a0f2a9108fe3feb7633452a6d9f62980c4188084ac933fd7feec56c29a3115bf43c54d3f6d300f4692b6e2c8cf2037c4f437f11886f69dcbcd3eee5c62c13e6ba5fe0560cca71e142949e1e5b07758f0eb7e31adcff2d7b2dd06f363e192cc3e7ab19142da66f7b2da0ace2f1777fb65d5fd70f49f93dba8c5b83dc3aa75ed7979ef9f9df75444bd99713c3acb5764aaf452721bde30ce1e85e88d122924a2a017c85708e866b2c5cdc161ff3fe0ed6e4382df4803c19341c4e9ad42e36698e12ccc097dfdb6a6a71705158786d29aed933c22812c0090abcbe54be3650542cbc756ccff38a62f2134fb2a3d8684fb384325ab3957e7b52c3b5da2187ab5fc3c5269c0201595d6396cf15c20e6532546ea03903f5a13ec50e416d569a7b6b34aa5e74cd84ed76829262cef172a92dbddc1a3be453b94efee81a5ef50e5a745973200b6d50a74b5833a6035f8dfd1cac9df2ea8e187218e05ee7cf49973b62a8b1a203d5c5d41f413b6b78128a1430f710132777c8ac26d303c7d805523d47655d253e6c63c61e89ca3c42063ce07ea9f1a900df7149715dc8d5d98cac241101dbeb4b9b2a3b6d4af5b14204ef2c0ea7969c35399faa23a62a402a5095e37ff5e4bdd22e1b0d3f02c1f231c670a6564c8de82f30575e7a2a00ac3787fbf8321d01288ea3b1b84595f31fb073a57d4cbdc804d037bb3902b9243eaf9bc4b431c38db2ce8012e224460e3285e5575a4d6777609578803e27c5d52b818df6562e3fedece5f3afcc3055d7e8ba12401862caf115122549aa44cbda92553e63b13d9c9eb908958ba615db38c4888d09f456dd34eb6a178c2120dd57fc3b57dd3c36ec9941cc1847a673a5a211c051677a440f8e4b55cad5724bed9b4631b74977752f07a9b29877496acd0d2ac6d99eba76b5fb2c394e64161db62925a3f6fefb119a94ce1843a22b7eaa656be364129e09f4dc4d3d5f308d7be4480268b741a16879ee17f20a84535dc7054db71264314ef106bd1b362f8f026395e7ceb4d7ed34485444349701d4792fab03647e448d497a5176b18386315882e5aa6093deee62f3820066a966e60f3144eb8b2b2a841ef961ab9d9fc34f3d22ecb2b25673e551445ea8ffbb0b0d1f37867f3f9aa62c579f73a60b7574fe2f33c28896199866415e99ce8ad283d912ab732bdabc71277bbf5a50ca1af1c7316179ccf882770530133e1fff285d7a21b24648175f27135bd29dea4b4fd29423785becfb9126a41dd57218d3a9b0d17873d8f182de6eb81ed7ac56bded4a6f2df08b07f11ca6a01c33dc33b9b033e1115854d10e65dfa4397134b1e0725d0b264ca8906d7cb432613a5a6bdb032ffa098e6865987861c830d1be80170b3f562a2ff292f85c8c6a0b8733d40a74c8355ed14492253c5c605270c03e3a344a6d050540ac109c02ad002f33a32608a8dc06a7e1ac58b35e89060ba7b3d92cf0e034450b5051411063707a2d550703cb5f219517297cdfd0fe737e7ace7f282e743ead901d02a8753b6a81c42d1e4b6ef52a07d56e44195c13140ac3d4c742e34856a1935a72ad5c7920dcbefa1aa3df2813900686ad40cfdb09a4320c6b4902ac64f37b8348ec7d8362b171de27a8d14816ede7574969f5972d48af3184b0f2292512960d1e6270ff0d761703310f4c9e2de9f558315af5ce02e555003c4bffb15c66fbeaed3bd64b5c189a2cae0e9ae104effb9159b5a5801c39f5fc478ec3a67667a7cb1361b0f13fbf4be74037df0b7e37052b47910a120a7c06b546da03ce24bf5deb4a990a9a60132ee8ff733fac58ea7d1189975ee55b6a3e67a504549b457dc381d9f4c1e42c6ccb35622212973caa370fd0af77de4132e172b018ba3d2ab72ade671396506293460893f9d4521a8e25793b46ed122afc68bd1f23e76471c567167f64b6db3f89723d696e4a475c90573f3e3379703517b3637b537085551e68306e412c4a4500b8c4b82a7c994e21608fcba8263e4a091f68e7e6a96d07bc84ef4b9b18887bf2345d5699a2105a4723a073edbdcd6617edcd2e816d19427656a2688fe17644c5422e79c88abb5d1d56275a77092201b7896289e6b7fc7be5e41fbdff5835279ae5afaa8e549d5ea92b112a46beca6ccc5fe0e7bc00d40db94c6b1b9501a17674b10ca3473270620098ccef6be5663cd99f63664072c80c7f22172942dd964deb759a380522746c + _Keys: 5337fb48ba082f4c11da0277d9afca7edd7b5efceef80727d52bb9c665d7aa545cd63732fbb03921f9fbdfe7d589f4265fc87a4a912787717f7186df3643453fed272c5aecffe812e387642fb5503d06d362220ad1fe5b4de27d054df1dabd62b18c3b97fd14986685d215c868729107c05703bcb18424275882ddde307e8172e3b977a1034eb51fa8fc8664117feb6e01cb08d748b7900e9e1ea5806706dd7405d661b4ab5e5235590b7edfd2fb0b53c80735ccfd696e64b779c0dd0bc978512705a1c4e2c93d5fe2c181c2c64ec35d45c66a241e3041716dd34732a6b98e01cbd5afbfeb312b053d1dcbb8111980158f100aa834627e4e801055f30791b7341e456a049e475a770f909ec304057d79ada23f483cc8ca68a89fc00479e1f3312a0028a97c7a4b2a6c819aa3c3ba497973315f552eff8f180fd25cff8755fd1011962244d1d95b638f4099a91e4ca23e50fe914a6209ac2b97ebb968a060ab16c1b221ea5070373eda76fec8762d5571f49656ecf638ff62d1f6b9ba3ae62d1e6bdbc9e041900521c75371ec0be3b43a412a74090abf1f074e7ce6a54883fc0db720cbad08c94c639135b34aa9eb6d12437efc655b372853453e6e3a55a027496ae3a9ef7e20e402b5d008a7cfecc425fcf5080c775dd4384c2a712b5ae01c3bc1829056e9b44c5820c42d7dafd45d5adcc628f903af460cf08fc4576ef0a36bee44e64d5c6e3b46574f134ccfa976207934f9def7eac0113c84477978a3c70f6899906bed0ffd6d751eafac3d6d2447e85c2f5c167d9c0384d511d727c2cd05e9dd4c96c61df268c873abe96692b05757716de38c950616027318e701d9b938ecb4951bb9ba0d366ac7258a2985691686682e9830b1917de563993936da6a10468c034e026b62639dc8b2ac456fbf7723d09295f7ad97624613ff1c54476d705d14449c821b131a07cbfc67fee538755cdde99ab82be6680a5f6ae99581481c36224f312a22f407428870d44ed09b2b4b74c0765dd2b877f02ea94021220d33ece7cd246af8b57fd2f15730ba121939122e745391a4007138f8e7660277c15242bf5b938578430c391e5a3a632fb61ad82900ced1cb051b7217f8c22ab3374c83b49d7fd2ad83627cd647659343dc08bf32c2d38870dc75bb3f059c7005377919f242e732c912295962b558ec95502ec6107ea38af52b12d928c592a8e6f27e0dc07d8686c33b0b20982cea2534624f9134d75f8693ee2239cff0f5fb807f3f55334a2c17caa776b3767c0e37bf135bc67502740f93f75eafa04cb6d3460f60196c3f597e8e665a23b1ec03ef03a57a446b458e7d0cb1172ba87d767df1a36d9ae3d95b009325360fa897c07ffa4d54052d06c17461220bc94f6dbe5127015ebaf1802a8b0f6825c2ce9fd80ffe2b31d1caceff9721320657a9839a1db2693492aa1edd5882c558622b6b535eaca0471cb1fb55dd68bd17fd7eacb11eb855737eaf76d3b6eaf219fa2f7b7056b2b419b0815cd4519ebc77de1077d40bd55e63f12c1838809e9611491ef1473787b9325cfd99288f98c11f3c73436baefd5f19622eb6d67711374e186e8a32ac753f565645780e3c36d37612c802f2a5d49d477d0be409d0e3bb4bc64a0f210e8e734f4d653d0b8992aa2c5a40c4af0e44a943d142b5a19036867377d3b80ed94d987cac4c5ac0686e4215a047516fe1f3c27ea0cc50cbd9d1be1721357da3b547fa58d8415a5a9e6aac3f84ca40d887f5547d113aafa59d63567c0b719f33f09e6058b307b8ddb1e2e336e0efb9f06f1a701676046d8568ab443b97d665100adf30232a99257f3d76cb0de21a3952559af20ffe76560af31a3f08c27c45db7cd22c4021dd1a083fef53007ffe182fa6b29101b094595704ae26143d58ae6b7306af7169480d973327703234d0382ce97e8411277b7d417c980367728e4801be365469460d88fb486fa2554d7452269e75e95b2c62bc0877910b0133d9513bc0912023ebb830194c652175f3c199300f6e42648381f1f3bd803b0f48d9c3af1db83e226a8aeda95afd570c932cf20362dba53a6a12ee736e972b1ab892d073a171583b8376c6848099092dddf34a7bf7030024d6cb0047b1faff623fa7a295d00000064af80f37d21c9503852d86d9a22abb021d1b5062e1a6124b6e540b5ca7d76b2e1b3b328757beff0677b100da75263956b91b4cc203f3e35d193c3581efc6a353c357be66f733ab5e1c4aeb2fa637d5471bb516c2232d310d1f8fa193f481f63d5653181e67d25e12c6aade4dde120451127d9ca5dd65776bda4eb7986de8956554adda521fb7e048570488ce0b7eec316b0d5a8ee264e445cb84f8b58af77f22eb875f7412a88f365ee4fbe1ee4577593be82c608e0782489320889abe2abe5f7b991c7be087e114646fd00297fca81004ae0e8cdc204f0d0ba7e2f220f477765ea59aabd604874c0717c3fdd884df6a88886093c6b4c45bb6f17977952cca6f08a55b0d9d02c608355b85c45c513570884c7ba8550b3c12960a0a1a75f049331ecc0acdd62e327911bf278db968f841bf4d8ffabf8ba5451c183fb24342b85b19801c4aa39a042ec8a05db28e0e1a02e355119389252f0f591dbdc030f0901013078ccc4b04b01137a92d6b870e692f6ab708d93f674846f2d59ea253ecce47326d9f87814db7170623c932539b966786ec29e8f9694f54bf46bf21a2536422e26d7792f7ab9245eeae1ed7a4fcb9581b026aad68a74169ccc6a2e25a30e93c0b114160e092e4044de14fbc5a3a8e1644ca435d7429d6566f7f8b7effe078348d946e883e6c4446a04c3283029ce36e857a7288c964c853d0098c760c4f810caf8309cfc3ab56792cad997d645d1d4a98ef392298615c27130308122790ba14532d96ac61dfba3c394160521a423a4bb1403cef4fcffe4d679763d3485ad74f0469aafbcc4e1806823ca06a3f4f091ba0f3ec9f7f225e1b0e4380a01924105867b12666446ab2228de94dc0fe0a1c77a6755ed061f1675daf8e91147244ee5a6dbfbb048efc1562c8d65ca7d941dc5086f8535260f432754ac8b7b5d89daf2dd7a82dbdc52106569f0467c8b1f0c8106be28f7af19bfa7872b9443abaa07565858ad031131e8b59ffa9f1645bfa263a6e38b50af2cbc4735d59b4f4233364018e0142272096fc76911684b85569e26d2080347d14948c45c65d8d6dd37f7c3446f0f25c3c4e5a273c3e78db470c1d39c3dd2a5d011913238d8761c3088fa3129a4ffd465c3faa2e260db9520d678c45c1ab560aaae0cd5e0516eac4af1e30536699be08f129227bcd047cf12c99ce0a14a683b4e6aebd7ae4a3b58dd69121072399128c567bab688ada3da663db316a48e0d956a1e539135739254d7395a53be37514c6ac5b606605e5c23f149b21078eb4ba0a47349a08d326e28fa1f9dc0ccbfd3b1139944213808dae43dd050045181edb2750af8316f0e2662cc20ff802c2cf0a11d73340068f5976457aa9d432269da6bfd4045c7bb798052468382d3ad47a6dd7ab69cb5b551824da527fbc158075635561ac4b41ee869f95102c085c823527695bba8f465e0ab3ae9e894738240f5c22637d637fc5afe925c9364a280fc75b88a626703bc19847df76d43f042d57d0f45c4aef271678782df4c7d4228b9f7cb63d38233cc5b151be74e5eb3aa4ba393fccbd2126fc0cfca62fe90f2ab9e025e1f4ea9025333bbd5b95f4ad6ea3cc576426e1e81cde1f5c7887c0e301de18b37e04d89113092d0ba01a81aa391dbc2fb6e751263255fcfc69d508ac3aa024a7efd4778b76cf42f87835c7b66e709235368eb4882223daa28b53508471468e532ab47f0a6d66564e9c6ca58c14863b08a2927fdf62deceb0f52aeaae700baa148b6f6ef70e7938631afddb717cba378d4f3ea9525b78bf8e07f80cc2215c41200f6b433e45d720a54fd113b7217a79f2f38ec9d330ba0773223a66de286ed1c4e99b4196058ceed11e38e59f39d2a75d920706af5f5941576339d09f7a65cfef3aa09aea0a1750273e3e2a4a62efead736424b5675a087a4e7ab70507b139c1eed21a6f35eb8ac4ed28eeeeb243a5060e8cc236e2307a51040a646114ff2abdda7efd63878cc7f25231d65e81d89270062be64cf5642fbba2c4143ff034116aa7dac96353293c5b2273e343f4f1f3cd7513b607353b2de17b32a1b2b04b774c76eaf8db8177b03fbfa51f49a2dc6c6cc8fa925ac21e6f52161bb7f4f1e03ce210c79e6a66ebf2e9b1f9f95b50ab83ed2b8e8d08d26534da4626ebaa6746fd65e6ec5d0ea313cb9ee438866e90a91342d0a27242d1e44be48457f877747a52cbf9ab3a615424e12d6246ac9183a6366881f61a55d49a93fb2841930b04b41a6e7b52584be15e014a7c505ad767ba60ea7e50f97a900308a0d8b0c6fd67ec221e2c3e163141902736c8650c93332515aac9c4e0dd43f8a8b7c7900b5aa3ff08288c669a111629f6f52722d54496a9a45d1f20176a046f3f4c242bc68b13bf39b370acf82ec0a8a347326357b1e76aedd2746ada665774911898664ed33036499d5b4e24f6c73beb52e8a969c562d28de1cb7bee4532ec29242bf76f5043e8550928aa329142ffc7cf00e3a548e54bc5c5e86d07b447ffe4ec2031277fc7915f43742cb0c87298d62a2c43236523fe227ec2171986043ba76e8554b787a71a28f2d16d9f60c065ab5cbde56d77a65a77e6b400ac70e2f380db2490200bd103c486e34fb31f3183ef89c42dbbbb57f108e7589acb72c7c25a800905102d16165bf51f7adaa8f3877a0e1439e80ea3951ddf265d724317c32505015b6bf576450970e4284aa712f052f091e31323e36d91d7d8e5f1f5d50a3aa7a1168eb46681cd457e4d528371bae88e84a929b3320da960b5e4ef3b13195764439c6aac92b3a10c494ae2493614f0a835f9e7bea2bae8465b761771e1a07922b1defd50b0673d613ba276b2409d0203eff29e03c0ff783f2232fe0a83d10c3b2db2e521604db50027c3573e051365b5c733fb81d6c3257656553540603ba8f7628657e4f55cd54df43c3b8ec44a6ea49630169264237ac5d1056050a1cf1fdd616875c7b087c2620e04af4974329a0a57d4c248c0c8c314b119418943d615da7f686e7273a7093212b0f15322fa7e9955af25d5507feaea1d92eb27a742fe126c2b3d4a159f2488d81562866563e8097849eeb6f58ecd72bfa2ce1195889e51444f8c9e5140fb32b3c6cb4fd5049763f1a4fd9a5798ddc05fe83b8e701e9195bed35873b6fc268f8bdb31bb55cf571774150345a3f9128845ad1f35f47c9afde3f214119299102e43777eefa6da8e7e991bb2c07412953589906e3d04f2e16f575b2abce4d5220a4912471fc3c64ba862a770a882f4e51738c2c590a79b0063398b90e3762877638145fb6fd55a7dd2eb14caea379b825027e4e54fd577f2bfc9ea542541e21a61fe5a795570539aa26bb7819164bb2362d5e9fbb80131aaa732f14011f43172b412aa495f6719fa841816935e569f6e490d4b141dd2cc3367ab0bff8fd2a7d7d2eca2202cc29c4db45dcaf129f62a1e0fd35f118af59c85f7e7ffc7c1e1f48516eb08735585623980e3901709e2b587e08dc21a4ed2bb395e93d4c0a994355122d7033ae2c27114bc44284000f2239c8cb3516cc004a800a14d9b574a00f70eb9d6e9de31940f08021fa263e6e53df14d40b2eb6384e53d5bac8a57c0246445320e13077a80560bcb8e93ebcb24e1f16e3e9f0f4fa42cd41873c3524c363c1a380b34cee7b79c51558617bdca8586f5d1400adf16e204f9df49dc52c564d20ab8b641df5f81471c9d04807848c3ddf47968b3336427bb0ef0528fbcacf23b06cdcdb239b2604d5ca15cd3aa28f431a5413311b82bc58cdb0d9d7dbf3cd1e201e14b85d641868aa71ffb9a90d3f7bcd66b4baf8c43956758cdf800624c01ba6024c3a627c19739e45f1a9b702d00801070db3114a2c4b6bd0ba54f84778388aab1db48a9d673fc6166bbb2789e26fc1a2660daeac0649faf9fa6707d64b6166e2b1f7cd04285a322e865109a79f12716f50ba50b6473feb93043d6065a90be1fad1166cefb344eb101815ad1eff2f57040a191e5ac20ad2088593680fca198e8d0e19e73d7a444259e9eae728d07161a8289676b23815a5484266925aef4f14311b813b226b6c84f0f51f1d327a49b205564b6549cd0cb9213c4f19be34192c0c845c0bba817be3b9dbbc8254215a0260f4f58eb0c915f6df786ceac69a10646fad234c6ff66ff14893d9f62c1f05a83fd80fbbbc4c353b98948c1cc26d370a90bbfc623953548b6cbe870d85dd50381a05aac059d51b38918e7c12ea4b11e7dbf73fa93f38653c17f7112a61e303bb9f33f3c8cf675f22ac6fe87d1cfa07e1a06da861c4f16775912fe15edc1412ac45830a0c449c6d5168cd282f347f301d2763dae60f57166ffe9adef6ab6a67cc3b8cc89463743036231c5e33180424b0282faae8e56e5ae1308ebb1c3e0803ff29e4da2ff93f0319ded11de79e8f31746b2a87341c76309acaf36f1034d21a6013b56a66ac66089e71c5fc9ab14372223013c067032a769fa63e0ea248927bb6fd8f540b8a6538fbde173da886691786819041479281630440b29741977e69ccdbc588ebeccd173e279524d9d4c2477ff3913793722370fd06e9cbd7490358b855ffecabe3df3c43bb30b4bd367a5940e612cde871c74cd59a2652f6c42a2300791f70093d46179a9f77e3e6b1647edca52c91f5ad253fb2d7b6bfa0e0d051f8fdbb9997bd8903dfeefd0ed8f196590c3d8f1f409ca443c7722f31d4691f2f3c56a87c0010076cee9bdda18caf3170c57f718b721ab368a7523339f26fa4788673faf0a647ac11bb49755ceb58aa10db1cef6628bf3b2ad17b0827619f551f9f95c90e90e5c77944fc92ab05f7ba3ed9a8307b02d460548d028d799fb6a200f5a05a25d962413d5ce59283aaa5bf40038a3485fa1c6f723bb3b2137d0a1812fa5a6ffe300065513bc9252c87f6242458e0fa03e32e7575909382f5f4670875fdb4871802dc38020f793e3bbd63054572714463efebd1331b059163818fa22cc0af283b7d3d273519fcf36aef39b72c72c3999953939a11e353fefc4ad580611b6a7a0e3ac9c7519a7a7decdf3b235343410e410af72754b7c5e12fc4dc7f1083aab17b41560e3b7515ff26ea51cd59d055c0731c3d93244326c400abf71543fb6d69348aa81265b0b6330a08ff95086cc4ffe6630dd33fc12a4198e4f0197effbc2157bb02e479682622d3719e2c4244336b1808d02007bf57094b1654b5602f4ef53bdf123c6ae0867d3dea00cd22030123e7a4cd7930dc289764f8986213903d5cdc570f9d5671d5f98f4e5df2407718b1e88762fb02c7255fb77ad87147246acc285caa790c9b3288312b161e3ae62725eeb5b5642c425aa47c6e54d1488a96252d99bdcb7526dd1b6f2bd61446da537ed4d7c7c610c49eace82da7a17ffbc5e0363cb7602525f3502cfee2bc6d1ec003982b8d0c79238ed806c629ba27692d0f9d88344a5f45417ae8ce793608c5e1bdf30f11775ed6d7466d48908244ea9d8af62c915f073b2f320b2dea2f6339f4c98d71719279d37732fa7d99fd7efa527c1204447226bbdaae09a5e9cb791a49949127347b39967143da3848c814ef6cfd6b9ec0ec7c67f0494b209b1e15acb913c72e8ea62fcdb6a775874c5e035e3c08ee19c8e858a2e8d5c814d0e605532d86f15c8f437dedd3c6ab989dfb4cb0b2111c6dcf04745f93dab94722e403cfa1c8b5d350603206742413706c0f041476e79e40366722ce046c364a76ca0fb7cadbf6d446786052de16f8abf104355c20592ec5b93d05f81418311cd6187056eba45a6fe7d05ad957464164d3745a83f476e49b4d05451a1d1e32146fbc45c297acc6a29ef30fe05dc9cf8acaa9341cbecdd33846310a01c1b0a0b466f56965fe7f32d852471bff983b07e82b301cc8521656a1e80c7b9a5d3a1f12aca547aecd9574b589a46e06e9d2d18139f32b0d33269daf60384d0bfa977a182709520d0b4b493f5b2e3eaea850b8153bf92bb099ee217af8680e06e380b0211e862d0dda3b891156136961644b57b1f063471cfc2c268cf260708e827bdf893f72034b4483f5f460286d273052294d9d772b599b2fb707d1b837adea73980d148609adbd9bd79b109e44d4be4dbc4589bd0ff4af7912ef44041d04445e202b3f8511ab487c8f029f8f48feea8bc61e747d36577c73427167060e3d472ba94e82e614bda19971f9b2ee6b3fc10fd9d0ca3c71c82878a7b3c78311508bcd49ca38967f2e60f68224f4c3096bdf02b0572d3e730ab97076fa8ec70be277de921a5b5e78578faa6fd4ba4d44ec821392ca34687dcb415484a90c7a5f99ea9fac1631ee10808a58c782ce9f506c2c627ca159d516e05b5c5cafe22164f7f52916e55fd11d8edcedab73cf00671f5a0f2a9108fe3feb7633452a6d9f62980c4188084ac933fd7feec56c29a3115bf43c54d3f6d300f4692b6e2c8cf2037c4f437f11886f69dcbcd3eee5c62c13e6ba5fe0560cca71e142949e1e5b07758f0eb7e31adcff2d7b2dd06f363e192cc3e7ab19142da66f7b2da0ace2f1777fb65d5fd70f49f93dba8c5b83dc3aa75ed7979ef9f9df75444bd99713c3acb5764aaf452721bde30ce1e85e88d122924a2a017c85708e866b2c5cdc161ff3fe0ed6e4382df4803c19341c4e9ad42e36698e12ccc097dfdb6a6a71705158786d29aed933c22812c0090abcbe54be3650542cbc756ccff38a62f2134fb2a3d8684fb384325ab3957e7b52c3b5da2187ab5fc3c5269c0201595d6396cf15c20e6532546ea03903f5a13ec50e416d569a7b6b34aa5e74cd84ed76829262cef172a92dbddc1a3be453b94efee81a5ef50e5a745973200b6d50a74b5833a6035f8dfd1cac9df2ea8e187218e05ee7cf49973b62a8b1a203d5c5d41f413b6b78128a1430f710132777c8ac26d303c7d805523d47655d253e6c63c61e89ca3c42063ce07ea9f1a900df7149715dc8d5d98cac241101dbeb4b9b2a3b6d4af5b14204ef2c0ea7969c35399faa23a62a402a5095e37ff5e4bdd22e1b0d3f02c1f231c670a6564c8de82f30575e7a2a00ac3787fbf8321d01288ea3b1b84595f31fb073a57d4cbdc804d037bb3902b9243eaf9bc4b431c38db2ce8012e224460e3285e5575a4d6777609578803e27c5d52b818df6562e3fedece5f3afcc3055d7e8ba12401862caf115122549aa44cbda92553e63b13d9c9eb908958ba615db38c4888d09f456dd34eb6a178c2120dd57fc3b57dd3c36ec9941cc1847a673a5a211c051677a440f8e4b55cad5724bed9b4631b74977752f07a9b29877496acd0d2ac6d99eba76b5fb2c394e64161db62925a3f6fefb119a94ce1843a22b7eaa656be364129e09f4dc4d3d5f308d7be4480268b741a16879ee17f20a84535dc7054db71264314ef106bd1b362f8f026395e7ceb4d7ed34485444349701d4792fab03647e448d497a5176b18386315882e5aa6093deee62f3820066a966e60f3144eb8b2b2a841ef961ab9d9fc34f3d22ecb2b25673e551445ea8ffbb0b0d1f37867f3f9aa62c579f73a60b7574fe2f33c28896199866415e99ce8ad283d912ab732bdabc71277bbf5a50ca1af1c7316179ccf882770530133e1fff285d7a21b24648175f27135bd29dea4b4fd29423785becfb9126a41dd57218d3a9b0d17873d8f182de6eb81ed7ac56bded4a6f2df08b07f11ca6a01c33dc33b9b033e1115854d10e65dfa4397134b1e0725d0b264ca8906d7cb432613a5a6bdb032ffa098e6865987861c830d1be80170b3f562a2ff292f85c8c6a0b8733d40a74c8355ed14492253c5c605270c03e3a344a6d050540ac109c02ad002f33a32608a8dc06a7e1ac58b35e89060ba7b3d92cf0e034450b5051411063707a2d550703cb5f219517297cdfd0fe737e7ace7f282e743ead901d02a8753b6a81c42d1e4b6ef52a07d56e44195c13140ac3d4c742e34856a1935a72ad5c7920dcbefa1aa3df2813900686ad40cfdb09a4320c6b4902ac64f37b8348ec7d8362b171de27a8d14816ede7574969f5972d48af3184b0f2292512960d1e6270ff0d761703310f4c9e2de9f558315af5ce02e555003c4bffb15c66fbeaed3bd64b5c189a2cae0e9ae104effb9159b5a5801c39f5fc478ec3a67667a7cb1361b0f13fbf4be74037df0b7e37052b47910a120a7c06b546da03ce24bf5deb4a990a9a60132ee8ff733fac58ea7d1189975ee55b6a3e67a504549b457dc381d9f4c1e42c6ccb35622212973caa370fd0af77de4132e172b018ba3d2ab72ade671396506293460893f9d4521a8e25793b46ed122afc68bd1f23e76471c567167f64b6db3f89723d696e4a475c90573f3e3379703517b3637b537085551e68306e412c4a4500b8c4b82a7c994e21608fcba8263e4a091f68e7e6a96d07bc84ef4b9b18887bf2345d5699a2105a4723a073edbdcd6617edcd2e816d19427656a2688fe17644c5422e79c88abb5d1d56275a77092201b7896289e6b7fc7be5e41fbdff5835279ae5afaa8e549d5ea92b112a46beca6ccc5fe0e7bc00d40db94c6b1b9501a17674b10ca3473270620098ccef6be5663cd99f63664072c80c7f22172942dd964deb759a380522746c80a1f71a566a23002df4668621f0400676ad90cb4a4de26a69b4cb718e73a56acb2200dc4a4b8539 _Values: - {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} - {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} @@ -1085,7 +1147,6 @@ MonoBehaviour: - {fileID: 327250661} - {fileID: 327250662} - {fileID: 327250664} - - {fileID: 327250665} - {fileID: 327250666} - {fileID: 8363959960880081480, guid: c309ebf7d22bfc644b409dbe21ff4a7c, type: 3} - {fileID: 1723145820396879019, guid: c309ebf7d22bfc644b409dbe21ff4a7c, type: 3} @@ -1336,7 +1397,6 @@ MonoBehaviour: - {fileID: 327250661} - {fileID: 327250662} - {fileID: 327250664} - - {fileID: 327250665} - {fileID: 327250666} - {fileID: 884736908} - {fileID: 344948076} @@ -2024,6 +2084,11 @@ MonoBehaviour: - {fileID: 1260057674} - {fileID: 1260057676} - {fileID: 1260057675} + - {fileID: 729029397} + - {fileID: 729029399} + - {fileID: 729029400} + - {fileID: 729029398} + - {fileID: 11500000, guid: 70e78a4898214182969b5f5c1049ac6e, type: 3} --- !u!4 &1650476989 Transform: m_ObjectHideFlags: 0 @@ -2518,3 +2583,4 @@ SceneRoots: - {fileID: 5978091752429385269} - {fileID: 549239009} - {fileID: 1650476989} + - {fileID: 729029400} diff --git a/client/Assets/Ether/Scripts/Boot.cs b/client/Assets/Ether/Scripts/Boot.cs index 86fe07c..67ff392 100644 --- a/client/Assets/Ether/Scripts/Boot.cs +++ b/client/Assets/Ether/Scripts/Boot.cs @@ -13,7 +13,7 @@ using UnityEngine; namespace Ether { - public class Boot : SingletonForMono + public class Boot : Entity { private void Start() { @@ -23,7 +23,6 @@ namespace Ether EtherInputManager.Inst.Init(); UIManager.Inst.Init(); - DontDestroyOnLoad(gameObject); Application.runInBackground = true; OnInit(); diff --git a/client/Assets/Ether/Scripts/Common/EventCenter/EventCenter.cs b/client/Assets/Ether/Scripts/Common/EventCenter/EventCenter.cs index c517817..38f9499 100644 --- a/client/Assets/Ether/Scripts/Common/EventCenter/EventCenter.cs +++ b/client/Assets/Ether/Scripts/Common/EventCenter/EventCenter.cs @@ -28,33 +28,33 @@ public class EventCenter { #region 普通事件 - private static Dictionary normalEventDic = new Dictionary(); + private static Dictionary allEventDic = new Dictionary(); - private static void OnListenerAdding(string eventType, Delegate callBack) + private static void OnListenerAdding(string eventType, Delegate callback) { - normalEventDic.TryAdd(eventType, null); + allEventDic.TryAdd(eventType, null); - Delegate d = normalEventDic[eventType]; + Delegate d = allEventDic[eventType]; - if (!string.IsNullOrEmpty(eventType) && d != null && d.GetType() != callBack.GetType()) + if (!string.IsNullOrEmpty(eventType) && d != null && d.GetType() != callback.GetType()) { - throw new Exception($"尝试为事件{eventType}添加不同类型的委托,当前事件所对应的委托为{d.GetType()},要添加的委托类型为{callBack.GetType()}"); + throw new Exception($"尝试为事件{eventType}添加不同类型的委托,当前事件所对应的委托为{d.GetType()},要添加的委托类型为{callback.GetType()}"); } } - private static void OnListenerRemoving(string eventType, Delegate callBack) + private static void OnListenerRemoving(string eventType, Delegate callback) { - if (normalEventDic.ContainsKey(eventType)) + if (allEventDic.ContainsKey(eventType)) { - Delegate d = normalEventDic[eventType]; + Delegate d = allEventDic[eventType]; if (d == null) { throw new Exception($"移除监听错误:事件{eventType}没有对应的委托"); } - else if (d.GetType() != callBack.GetType()) + else if (d.GetType() != callback.GetType()) { throw new Exception( - $"移除监听错误:尝试为事件{eventType}移除不同类型的委托,当前委托类型为{d.GetType()},要移除的委托类型为{callBack.GetType()}"); + $"移除监听错误:尝试为事件{eventType}移除不同类型的委托,当前委托类型为{d.GetType()},要移除的委托类型为{callback.GetType()}"); } return; } @@ -64,9 +64,9 @@ public class EventCenter private static void OnListenerRemoved(string eventType) { - if (normalEventDic[eventType] == null) + if (allEventDic[eventType] == null) { - normalEventDic.Remove(eventType); + allEventDic.Remove(eventType); } } @@ -76,66 +76,66 @@ public class EventCenter /// 无参数监听 /// /// 事件 - /// 回调 - public static void AddListener(string eventType, Action callBack) + /// 回调 + public static void AddListener(string eventType, Action callback) { - OnListenerAdding(eventType, callBack); - normalEventDic[eventType] = (Action)normalEventDic[eventType] + callBack; + OnListenerAdding(eventType, callback); + allEventDic[eventType] = (Action)allEventDic[eventType] + callback; } /// /// 一个参数监听 /// /// 事件 - /// 回调 - public static void AddListener(string eventType, Action callBack) + /// 回调 + public static void AddListener(string eventType, Action callback) { - OnListenerAdding(eventType, callBack); - normalEventDic[eventType] = (Action)normalEventDic[eventType] + callBack; + OnListenerAdding(eventType, callback); + allEventDic[eventType] = (Action)allEventDic[eventType] + callback; } /// /// 两个参数监听 /// /// 事件 - /// 回调 - public static void AddListener(string eventType, Action callBack) + /// 回调 + public static void AddListener(string eventType, Action callback) { - OnListenerAdding(eventType, callBack); - normalEventDic[eventType] = (Action)normalEventDic[eventType] + callBack; + OnListenerAdding(eventType, callback); + allEventDic[eventType] = (Action)allEventDic[eventType] + callback; } /// /// 三个参数监听 /// /// 事件 - /// 回调 - public static void AddListener(string eventType, Action callBack) + /// 回调 + public static void AddListener(string eventType, Action callback) { - OnListenerAdding(eventType, callBack); - normalEventDic[eventType] = (Action)normalEventDic[eventType] + callBack; + OnListenerAdding(eventType, callback); + allEventDic[eventType] = (Action)allEventDic[eventType] + callback; } /// /// 四个参数监听 /// /// 事件 - /// 回调 - public static void AddListener(string eventType, Action callBack) + /// 回调 + public static void AddListener(string eventType, Action callback) { - OnListenerAdding(eventType, callBack); - normalEventDic[eventType] = (Action)normalEventDic[eventType] + callBack; + OnListenerAdding(eventType, callback); + allEventDic[eventType] = (Action)allEventDic[eventType] + callback; } /// /// 五个参数监听 /// /// 事件 - /// 回调 - public static void AddListener(string eventType, Action callBack) + /// 回调 + public static void AddListener(string eventType, Action callback) { - OnListenerAdding(eventType, callBack); - normalEventDic[eventType] = (Action)normalEventDic[eventType] + callBack; + OnListenerAdding(eventType, callback); + allEventDic[eventType] = (Action)allEventDic[eventType] + callback; } @@ -146,11 +146,11 @@ public class EventCenter /// 无参移除监听 /// /// 事件 - /// 回调 - public static void RemoveListener(string eventType, Action callBack) + /// 回调 + public static void RemoveListener(string eventType, Action callback) { - OnListenerRemoving(eventType, callBack); - normalEventDic[eventType] = (Action)normalEventDic[eventType] - callBack; + OnListenerRemoving(eventType, callback); + allEventDic[eventType] = (Action)allEventDic[eventType] - callback; OnListenerRemoved(eventType); } @@ -158,11 +158,11 @@ public class EventCenter /// 一个参数移除监听 /// /// 事件 - /// 回调 - public static void RemoveListener(string eventType, Action callBack) + /// 回调 + public static void RemoveListener(string eventType, Action callback) { - OnListenerRemoving(eventType, callBack); - normalEventDic[eventType] = (Action)normalEventDic[eventType] - callBack; + OnListenerRemoving(eventType, callback); + allEventDic[eventType] = (Action)allEventDic[eventType] - callback; OnListenerRemoved(eventType); } @@ -170,11 +170,11 @@ public class EventCenter /// 两个参数移除监听 /// /// 事件 - /// 回调 - public static void RemoveListener(string eventType, Action callBack) + /// 回调 + public static void RemoveListener(string eventType, Action callback) { - OnListenerRemoving(eventType, callBack); - normalEventDic[eventType] = (Action)normalEventDic[eventType] - callBack; + OnListenerRemoving(eventType, callback); + allEventDic[eventType] = (Action)allEventDic[eventType] - callback; OnListenerRemoved(eventType); } @@ -182,11 +182,11 @@ public class EventCenter /// 三个参数移除监听 /// /// 事件 - /// 回调 - public static void RemoveListener(string eventType, Action callBack) + /// 回调 + public static void RemoveListener(string eventType, Action callback) { - OnListenerRemoving(eventType, callBack); - normalEventDic[eventType] = (Action)normalEventDic[eventType] - callBack; + OnListenerRemoving(eventType, callback); + allEventDic[eventType] = (Action)allEventDic[eventType] - callback; OnListenerRemoved(eventType); } @@ -194,11 +194,11 @@ public class EventCenter /// 四个参数移除监听 /// /// 事件 - /// 回调 - public static void RemoveListener(string eventType, Action callBack) + /// 回调 + public static void RemoveListener(string eventType, Action callback) { - OnListenerRemoving(eventType, callBack); - normalEventDic[eventType] = (Action)normalEventDic[eventType] - callBack; + OnListenerRemoving(eventType, callback); + allEventDic[eventType] = (Action)allEventDic[eventType] - callback; OnListenerRemoved(eventType); } @@ -206,14 +206,38 @@ public class EventCenter /// 五个参数移除监听 /// /// 事件 - /// 回调 - public static void RemoveListener(string eventType, Action callBack) + /// 回调 + public static void RemoveListener(string eventType, Action callback) { - OnListenerRemoving(eventType, callBack); - normalEventDic[eventType] = (Action)normalEventDic[eventType] - callBack; + OnListenerRemoving(eventType, callback); + allEventDic[eventType] = (Action)allEventDic[eventType] - callback; OnListenerRemoved(eventType); } + public static void RemoveListener(string eventType, Delegate callback) + { + // 如果 dictB 中存在相同的键 + if (allEventDic.ContainsKey(eventType)) + { + // 获取 MulticastDelegate + MulticastDelegate multicastDelegate = allEventDic[eventType] as MulticastDelegate; + + // 移除指定的委托 + Delegate[] invocationList = multicastDelegate.GetInvocationList(); + Delegate[] newInvocationList = Array.FindAll(invocationList, d => d != callback); + + // 更新 dictB 中的委托 + if (newInvocationList.Length > 0) + { + allEventDic[eventType] = Delegate.Combine(newInvocationList); + } + else + { + // 如果没有剩余的委托,则从 dictB 中删除该键 + allEventDic.Remove(eventType); + } + } + } //==================================================广播事件======================================================== @@ -224,11 +248,11 @@ public class EventCenter public static void BroadCast(string eventType) { Delegate d; - if (normalEventDic.TryGetValue(eventType, out d)) + if (allEventDic.TryGetValue(eventType, out d)) { - if (d is Action callBack) + if (d is Action callback) { - callBack(); + callback(); } else { @@ -244,11 +268,11 @@ public class EventCenter public static void BroadCast(string eventType, K arg) { Delegate d; - if (normalEventDic.TryGetValue(eventType, out d)) + if (allEventDic.TryGetValue(eventType, out d)) { - if (d is Action callBack) + if (d is Action callback) { - callBack(arg); + callback(arg); } else { @@ -264,11 +288,11 @@ public class EventCenter public static void BroadCast(string eventType, K arg1, X arg2) { Delegate d; - if (normalEventDic.TryGetValue(eventType, out d)) + if (allEventDic.TryGetValue(eventType, out d)) { - if (d is Action callBack) + if (d is Action callback) { - callBack(arg1, arg2); + callback(arg1, arg2); } else { @@ -284,11 +308,11 @@ public class EventCenter public static void BroadCast(string eventType, K arg1, X arg2, Y arg3) { Delegate d; - if (normalEventDic.TryGetValue(eventType, out d)) + if (allEventDic.TryGetValue(eventType, out d)) { - if (d is Action callBack) + if (d is Action callback) { - callBack(arg1, arg2, arg3); + callback(arg1, arg2, arg3); } else { @@ -304,11 +328,11 @@ public class EventCenter public static void BroadCast(string eventType, K arg1, X arg2, Y arg3, Z arg4) { Delegate d; - if (normalEventDic.TryGetValue(eventType, out d)) + if (allEventDic.TryGetValue(eventType, out d)) { - if (d is Action callBack) + if (d is Action callback) { - callBack(arg1, arg2, arg3, arg4); + callback(arg1, arg2, arg3, arg4); } else { @@ -324,11 +348,11 @@ public class EventCenter public static void BroadCast(string eventType, K arg1, X arg2, Y arg3, Z arg4, W arg5) { Delegate d; - if (normalEventDic.TryGetValue(eventType, out d)) + if (allEventDic.TryGetValue(eventType, out d)) { - if (d is Action callBack) + if (d is Action callback) { - callBack(arg1, arg2, arg3, arg4, arg5); + callback(arg1, arg2, arg3, arg4, arg5); } else { @@ -349,66 +373,66 @@ public class EventCenter /// 无参数监听 /// /// 事件 - /// 回调 - public static void AddListener(T eventType, Action callBack) where T : Enum + /// 回调 + public static void AddListener(T eventType, Action callback) where T : Enum { string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; - AddListener(eventName, callBack); + AddListener(eventName, callback); } /// /// 一个参数监听 /// /// 事件 - /// 回调 - public static void AddListener(T eventType, Action callBack) where T : Enum + /// 回调 + public static void AddListener(T eventType, Action callback) where T : Enum { string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; - AddListener(eventName, callBack); + AddListener(eventName, callback); } /// /// 两个参数监听 /// /// 事件 - /// 回调 - public static void AddListener(T eventType, Action callBack) where T : Enum + /// 回调 + public static void AddListener(T eventType, Action callback) where T : Enum { string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; - AddListener(eventName, callBack); + AddListener(eventName, callback); } /// /// 三个参数监听 /// /// 事件 - /// 回调 - public static void AddListener(T eventType, Action callBack) where T : Enum + /// 回调 + public static void AddListener(T eventType, Action callback) where T : Enum { string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; - AddListener(eventName, callBack); + AddListener(eventName, callback); } /// /// 四个参数监听 /// /// 事件 - /// 回调 - public static void AddListener(T eventType, Action callBack) where T : Enum + /// 回调 + public static void AddListener(T eventType, Action callback) where T : Enum { string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; - AddListener(eventName, callBack); + AddListener(eventName, callback); } /// /// 五个参数监听 /// /// 事件 - /// 回调 - public static void AddListener(T eventType, Action callBack) where T : Enum + /// 回调 + public static void AddListener(T eventType, Action callback) where T : Enum { string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; - AddListener(eventName, callBack); + AddListener(eventName, callback); } @@ -419,66 +443,66 @@ public class EventCenter /// 无参移除监听 /// /// 事件 - /// 回调 - public static void RemoveListener(T eventType, Action callBack) where T : Enum + /// 回调 + public static void RemoveListener(T eventType, Action callback) where T : Enum { string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; - RemoveListener(eventName, callBack); + RemoveListener(eventName, callback); } /// /// 一个参数移除监听 /// /// 事件 - /// 回调 - public static void RemoveListener(T eventType, Action callBack) where T : Enum + /// 回调 + public static void RemoveListener(T eventType, Action callback) where T : Enum { string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; - RemoveListener(eventName, callBack); + RemoveListener(eventName, callback); } /// /// 两个参数移除监听 /// /// 事件 - /// 回调 - public static void RemoveListener(T eventType, Action callBack) where T : Enum + /// 回调 + public static void RemoveListener(T eventType, Action callback) where T : Enum { string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; - RemoveListener(eventName, callBack); + RemoveListener(eventName, callback); } /// /// 三个参数移除监听 /// /// 事件 - /// 回调 - public static void RemoveListener(T eventType, Action callBack) where T : Enum + /// 回调 + public static void RemoveListener(T eventType, Action callback) where T : Enum { string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; - RemoveListener(eventName, callBack); + RemoveListener(eventName, callback); } /// /// 四个参数移除监听 /// /// 事件 - /// 回调 - public static void RemoveListener(T eventType, Action callBack) where T : Enum + /// 回调 + public static void RemoveListener(T eventType, Action callback) where T : Enum { string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; - RemoveListener(eventName, callBack); + RemoveListener(eventName, callback); } /// /// 五个参数移除监听 /// /// 事件 - /// 回调 - public static void RemoveListener(T eventType, Action callBack) where T : Enum + /// 回调 + public static void RemoveListener(T eventType, Action callback) where T : Enum { string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; - RemoveListener(eventName, callBack); + RemoveListener(eventName, callback); } @@ -551,7 +575,8 @@ public class EventCenter /// public static void Clear() { - normalEventDic.Clear(); + allEventDic.Clear(); } + } diff --git a/client/Assets/Ether/Scripts/Module/Entity/Entity.cs b/client/Assets/Ether/Scripts/Module/Entity/Entity.cs index 026d90b..62c25d5 100644 --- a/client/Assets/Ether/Scripts/Module/Entity/Entity.cs +++ b/client/Assets/Ether/Scripts/Module/Entity/Entity.cs @@ -31,9 +31,15 @@ namespace Ether } } + protected virtual void OnClear() + { + + } + private void OnDestroy() { EntityManager.Inst.RemoveEntity(this); + OnClear(); } void OnApplicationQuit() diff --git a/client/Assets/Ether/Scripts/Module/Extension/UGUI/Image/ImageEx.cs b/client/Assets/Ether/Scripts/Module/Extension/UGUI/Image/ImageEx.cs index 0894037..ba29e15 100644 --- a/client/Assets/Ether/Scripts/Module/Extension/UGUI/Image/ImageEx.cs +++ b/client/Assets/Ether/Scripts/Module/Extension/UGUI/Image/ImageEx.cs @@ -11,6 +11,19 @@ namespace Ether { public class ImageEx : Image { + private void OnRectTransformDimensionsChange() + { + base.OnRectTransformDimensionsChange(); + Debug.LogError("OnRectTransformDimensionsChange"); + } + + private void OnTransformChildrenChanged() + { + Debug.LogError("1111111111"); + } + + + #if UNITY_EDITOR [MenuItem("GameObject/UIEx/ImageEx", priority = -1000)] diff --git a/client/Assets/Ether/Scripts/Module/UI/FrameBase.cs b/client/Assets/Ether/Scripts/Module/UI/FrameBase.cs index fcd9578..42b1fdf 100644 --- a/client/Assets/Ether/Scripts/Module/UI/FrameBase.cs +++ b/client/Assets/Ether/Scripts/Module/UI/FrameBase.cs @@ -1,12 +1,13 @@ /******************************************************************** - 文件: FrameBase.cs - 作者: 梦语 - 邮箱: 1982614048@qq.com - 创建时间: 2024/03/29 17:28:19 - 最后修改: 梦语 - 最后修改时间: 2024/04/04 16:58:56 - 功能: 界面基类 + 文件: FrameBase.cs + 作者: 梦语 + 邮箱: 1982614048@qq.com + 创建时间: 2024/03/29 17:28:19 + 最后修改: 梦语 + 最后修改时间: 2024/04/04 16:58:56 + 功能: 界面基类 *********************************************************************/ + using System; using System.Collections; using System.Collections.Generic; @@ -23,7 +24,7 @@ namespace Ether public virtual string PrefabPath { get; } public FrameData FrameData { get; private set; } - + public OpenFrameData OpenFrameData; public DictionaryEx subFrames = new DictionaryEx(); @@ -33,14 +34,16 @@ namespace Ether FrameData = new FrameData(); OpenFrameData = new OpenFrameData(); UIElementAttribute elementAttribute = GetType().GetCustomAttribute(); - FrameData.PrefabPath = (elementAttribute != null && !string.IsNullOrEmpty(elementAttribute.framePrefabPath)) ? elementAttribute.framePrefabPath : PrefabPath; + FrameData.PrefabPath = (elementAttribute != null && !string.IsNullOrEmpty(elementAttribute.framePrefabPath)) + ? elementAttribute.framePrefabPath + : PrefabPath; FrameData.Tier = elementAttribute == null ? FrameTier.Middle : elementAttribute.tier; FrameData.FrameType = elementAttribute == null ? FrameType.Frame : elementAttribute.frameType; FrameData.FrameName = GetType().Name; } #region 界面生命周期 - + /// /// 绑定UIRoot /// @@ -51,17 +54,67 @@ namespace Ether OnClick(FrameData.Root, OnFocus); } - protected virtual void OnInit() { } - protected virtual void OnOpenAnim() { FrameData.Root?.SetActive(true); } - protected virtual void OnShow() { } - protected virtual void OnClose() { } - protected virtual void OnSubscribe() { } - protected virtual void OnUnSubscribe() { } - protected virtual void OnFocus(PointerEventData pointerEventData) { } - public virtual void OnUpdate(float deltaTime) { } + /// + /// 初始化界面 + /// + protected virtual void OnInit() + { + } + + /// + /// 开启动画 + /// + protected virtual void OnOpenAnim() + { + FrameData.Root?.SetActive(true); + } + + /// + /// 打开界面 + /// + protected virtual void OnShow() + { + } + + /// + /// 关闭界面 + /// + protected virtual void OnClose() + { + } + + /// + /// 注册事件 + /// + protected virtual void OnSubscribe() + { + } + + /// + /// 取消事件注册 + /// + protected virtual void OnUnSubscribe() + { + } + + /// + /// 选中界面 + /// + /// + protected virtual void OnFocus(PointerEventData pointerEventData) + { + } + + /// + /// 循环 + /// + /// + public virtual void OnUpdate(float deltaTime) + { + } #endregion - + /// /// 打开界面 /// @@ -69,8 +122,9 @@ namespace Ether { if (openFrameData != null) { - OpenFrameData = openFrameData ; + OpenFrameData = openFrameData; } + BindRoot(); FrameData.Root.transform.SetAsLastSibling(); Debug.Log($"界面{FrameData.FrameName}打开"); @@ -88,6 +142,7 @@ namespace Ether public void CloseFrame(Action callback = null) { Debug.Log($"界面{FrameData.FrameName}关闭"); + RemoveAllEvent(); OnUnSubscribe(); OnClose(); FrameData.Root.SetVisible(false, () => @@ -98,7 +153,7 @@ namespace Ether callback?.Invoke(); }); } - + /// /// 返回上个界面 /// @@ -107,6 +162,9 @@ namespace Ether UIManager.Inst.BackFrame(FrameData.FrameName, FrameData.FrameType); } + /// + /// 关闭界面 + /// public void Close() { //如果是子界面的话使用父界面的关闭 @@ -116,11 +174,12 @@ namespace Ether parentFrameBase.CloseSubFrame(FrameData.FrameName); return; } - + foreach (var framePair in subFrames) { UIManager.Inst.CloseFrame(framePair.Key); } + subFrames.Clear(); UIManager.Inst.CloseFrame(FrameData.FrameName); } @@ -132,27 +191,29 @@ namespace Ether if (openFrameData == null || openFrameData.ParentFrameData == null) { Debug.LogError("打开子界面需要FrameData,并给FrameData中的ParentData赋值"); - return; + return; } + UIManager.Inst.OpenFrame(openFrameData, callback); T frame = UIManager.Inst.GetFrame(); subFrames.TryAdd(typeof(T).Name, frame); } - public void CloseSubFrame(Action callback = null) where T : FrameBase + protected void CloseSubFrame(Action callback = null) where T : FrameBase { CloseSubFrame(typeof(T).Name, callback); } - - public void CloseSubFrame(string subFrameName, Action callback = null) + + protected void CloseSubFrame(string subFrameName, Action callback = null) { subFrames.Remove(subFrameName); UIManager.Inst.CloseFrame(subFrameName, callback); } #endregion - + #region 查找物体 + /// /// 子物体缓存 /// @@ -231,7 +292,7 @@ namespace Ether protected Transform GetChild(string path) { var tempTrans = CheckChildCache(path); - if (tempTrans != null) + if (tempTrans) { return tempTrans; } @@ -248,11 +309,181 @@ namespace Ether //Debug.Log("GetComponent:" + typeof(T) + " : " + path); return GetChild(path).GetComponent(); } + + #endregion + + + #region 事件 + + private Dictionary eventDic = new Dictionary(); + + private void OnListenerAdding(string eventType, Delegate callback) + { + eventDic.TryAdd(eventType, null); + + Delegate d = eventDic[eventType]; + + if (!string.IsNullOrEmpty(eventType) && d != null && d.GetType() != callback.GetType()) + { + throw new Exception( + $"尝试为事件{eventType}添加不同类型的委托,当前事件所对应的委托为{d.GetType()},要添加的委托类型为{callback.GetType()}"); + } + } + + private void RemoveAllEvent() + { + foreach (var eventPair in eventDic) + { + EventCenter.RemoveListener(eventPair.Key, eventPair.Value); + } + + eventDic.Clear(); + } + + /// + /// 无参数监听 + /// + /// 事件 + /// 回调 + protected void AddEventListener(string eventType, Action callback) + { + OnListenerAdding(eventType, callback); + eventDic[eventType] = (Action)eventDic[eventType] + callback; + EventCenter.AddListener(eventType, callback); + } + + /// + /// 一个参数监听 + /// + /// 事件 + /// 回调 + protected void AddEventListener(string eventType, Action callback) + { + OnListenerAdding(eventType, callback); + eventDic[eventType] = (Action)eventDic[eventType] + callback; + EventCenter.AddListener(eventType, callback); + } + + /// + /// 两个参数监听 + /// + /// 事件 + /// 回调 + protected void AddEventListener(string eventType, Action callback) + { + OnListenerAdding(eventType, callback); + eventDic[eventType] = (Action)eventDic[eventType] + callback; + EventCenter.AddListener(eventType, callback); + } + + /// + /// 三个参数监听 + /// + /// 事件 + /// 回调 + protected void AddEventListener(string eventType, Action callback) + { + OnListenerAdding(eventType, callback); + eventDic[eventType] = (Action)eventDic[eventType] + callback; + EventCenter.AddListener(eventType, callback); + } + + /// + /// 四个参数监听 + /// + /// 事件 + /// 回调 + protected void AddEventListener(string eventType, Action callback) + { + OnListenerAdding(eventType, callback); + eventDic[eventType] = (Action)eventDic[eventType] + callback; + EventCenter.AddListener(eventType, callback); + } + + /// + /// 五个参数监听 + /// + /// 事件 + /// 回调 + protected void AddEventListener(string eventType, Action callback) + { + OnListenerAdding(eventType, callback); + eventDic[eventType] = (Action)eventDic[eventType] + callback; + EventCenter.AddListener(eventType, callback); + } + + /// + /// 无参数监听 + /// + /// 事件 + /// 回调 + protected void AddEventListener(T eventType, Action callback) where T : Enum + { + string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; + AddEventListener(eventName, callback); + } + + /// + /// 一个参数监听 + /// + /// 事件 + /// 回调 + protected void AddEventListener(T eventType, Action callback) where T : Enum + { + string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; + AddEventListener(eventName, callback); + } + + /// + /// 两个参数监听 + /// + /// 事件 + /// 回调 + protected void AddEventListener(T eventType, Action callback) where T : Enum + { + string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; + AddEventListener(eventName, callback); + } + + /// + /// 三个参数监听 + /// + /// 事件 + /// 回调 + protected void AddEventListener(T eventType, Action callback) where T : Enum + { + string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; + AddEventListener(eventName, callback); + } + + /// + /// 四个参数监听 + /// + /// 事件 + /// 回调 + protected void AddEventListener(T eventType, Action callback) where T : Enum + { + string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; + AddEventListener(eventName, callback); + } + + /// + /// 五个参数监听 + /// + /// 事件 + /// 回调 + protected void AddEventListener(T eventType, Action callback) where T : Enum + { + string eventName = $"{eventType.GetType()}_{eventType.ToString()}"; + AddEventListener(eventName, callback); + } + #endregion //========================================= 事件工具 ============================================ - + #region 按钮事件 + protected void OnBtnLeftClick(string path, Action action) { ButtonEx btn = GetComponent(path); @@ -268,10 +499,7 @@ namespace Ether protected void OnBtnLeftClick(ButtonEx btn, Action action) { btn.OnLeftClick.RemoveAllListeners(); - btn.OnLeftClick.AddListener(() => - { - action?.Invoke(); - }); + btn.OnLeftClick.AddListener(() => { action?.Invoke(); }); } protected void OnBtnRightClick(string path, Action action) @@ -289,14 +517,13 @@ namespace Ether protected void OnBtnRightClick(ButtonEx btn, Action action) { btn.OnRightClick.RemoveAllListeners(); - btn.OnRightClick.AddListener(() => - { - action?.Invoke(); - }); + btn.OnRightClick.AddListener(() => { action?.Invoke(); }); } + #endregion #region 文本 + protected void SetText(string path, string text) { Text label = GetComponent(path); @@ -313,9 +540,11 @@ namespace Ether { label.text = text; } + #endregion #region 图片 + protected void SetSprite(string path, string spritePath) { Image img = GetComponent(path); @@ -332,9 +561,11 @@ namespace Ether { img.sprite = LoaderTools.LoadAsset(spritePath); } + #endregion #region 输入框 + protected void SetInputFieldValue(string path, string text) { GetComponent(path).text = text; @@ -361,13 +592,11 @@ namespace Ether InputField input = obj.GetComponent(); OnInputFieldValueChanged(input, action); } + protected void OnInputFieldValueChanged(InputField input, Action action) { input.onValueChanged.RemoveAllListeners(); - input.onValueChanged.AddListener((str) => - { - action?.Invoke(str); - }); + input.onValueChanged.AddListener((str) => { action?.Invoke(str); }); } protected void OnInputFieldEnd(string path, Action action) @@ -384,14 +613,13 @@ namespace Ether protected void OnInputFieldEnd(InputField input, Action action) { - input.onEndEdit.AddListener((str) => - { - action?.Invoke(str); - }); + input.onEndEdit.AddListener((str) => { action?.Invoke(str); }); } + #endregion #region 复选框 + protected void OnToggleChange(string path, Action action) { Toggle toggle = GetComponent(path); @@ -406,14 +634,13 @@ namespace Ether protected void OnToggleChange(Toggle toggle, Action action) { - toggle.onValueChanged.AddListener((isChange) => - { - action?.Invoke(isChange); - }); + toggle.onValueChanged.AddListener((isChange) => { action?.Invoke(isChange); }); } + #endregion #region 滑动条 + protected void OnSliderChange(string path, Action action) { Slider slider = GetComponent(path); @@ -428,14 +655,13 @@ namespace Ether protected void OnSliderChange(Slider slider, Action action) { - slider.onValueChanged.AddListener((value) => - { - action?.Invoke(value); - }); + slider.onValueChanged.AddListener((value) => { action?.Invoke(value); }); } + #endregion #region EventTrigger事件 + /// /// EventTrigger监听 /// @@ -527,21 +753,23 @@ namespace Ether /// 拖拽结束回调 internal void OnDragMove(GameObject obj, Action dragEndcallback = null) { - RectTransform canvas = UIManager.Inst.MainCanvas.GetComponent(); ; //得到canvas的ugui坐标 - RectTransform objRect = obj.GetComponent(); //得到图片的ugui坐标 - Vector2 offset = new Vector3(); //用来得到鼠标和图片的差值 - Vector3 imgReduceScale = new Vector3(0.8f, 0.8f, 1); //设置图片缩放 - Vector3 imgNormalScale = new Vector3(1, 1, 1); //正常大小 + RectTransform canvas = UIManager.Inst.MainCanvas.GetComponent(); + ; //得到canvas的ugui坐标 + RectTransform objRect = obj.GetComponent(); //得到图片的ugui坐标 + Vector2 offset = new Vector3(); //用来得到鼠标和图片的差值 + Vector3 imgReduceScale = new Vector3(0.8f, 0.8f, 1); //设置图片缩放 + Vector3 imgNormalScale = new Vector3(1, 1, 1); //正常大小 AddTriggersListener(obj, EventTriggerType.BeginDrag, (BaseEventData) => { PointerEventData eventData = (PointerEventData)BaseEventData; - Vector2 mouseDown = eventData.position; //记录鼠标按下时的屏幕坐标 - Vector2 mouseUguiPos = new Vector2(); //定义一个接收返回的ugui坐标 + Vector2 mouseDown = eventData.position; //记录鼠标按下时的屏幕坐标 + Vector2 mouseUguiPos = new Vector2(); //定义一个接收返回的ugui坐标 - bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, mouseDown, eventData.enterEventCamera, out mouseUguiPos); - if (isRect) //如果在 + bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, mouseDown, + eventData.enterEventCamera, out mouseUguiPos); + if (isRect) //如果在 { //计算图片中心和鼠标点的差值 offset = objRect.anchoredPosition - mouseUguiPos; @@ -551,10 +779,11 @@ namespace Ether AddTriggersListener(obj, EventTriggerType.Drag, (BaseEventData) => { PointerEventData eventData = (PointerEventData)BaseEventData; - Vector2 mouseDrag = eventData.position; //当鼠标拖动时的屏幕坐标 - Vector2 uguiPos = new Vector2(); //用来接收转换后的拖动坐标 - //和上面类似 - bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, mouseDrag, eventData.enterEventCamera, out uguiPos); + Vector2 mouseDrag = eventData.position; //当鼠标拖动时的屏幕坐标 + Vector2 uguiPos = new Vector2(); //用来接收转换后的拖动坐标 + //和上面类似 + bool isRect = RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas, mouseDrag, + eventData.enterEventCamera, out uguiPos); if (isRect) { @@ -563,10 +792,8 @@ namespace Ether } }); - AddTriggersListener(obj, EventTriggerType.EndDrag, (BaseEventData) => - { - dragEndcallback?.Invoke((PointerEventData)BaseEventData); - }); + AddTriggersListener(obj, EventTriggerType.EndDrag, + (BaseEventData) => { dragEndcallback?.Invoke((PointerEventData)BaseEventData); }); } internal void OnDragMove(string path, Action action = null) @@ -574,6 +801,7 @@ namespace Ether GameObject obj = GetChild(path).gameObject; OnDragMove(obj, action); } + #endregion } -} +} \ No newline at end of file diff --git a/client/Assets/Plugins/Easy Save 3/Resources/ES3/ES3GlobalReferences.asset b/client/Assets/Plugins/Easy Save 3/Resources/ES3/ES3GlobalReferences.asset index 29ce6f6..eaf20c6 100644 --- a/client/Assets/Plugins/Easy Save 3/Resources/ES3/ES3GlobalReferences.asset +++ b/client/Assets/Plugins/Easy Save 3/Resources/ES3/ES3GlobalReferences.asset @@ -688,4 +688,5 @@ MonoBehaviour: - {fileID: 2975532688965488616, guid: 0aaca3e185238014bba82a38ce55f4fc, type: 3} - {fileID: 11500000, guid: e741851cba3ad425c91ecf922cc6b379, type: 3} - {fileID: 11500000, guid: efe58df89b5b74a97a123b5ed2b70422, type: 3} - _Values: 5337fb48ba082f4c11da0277d9afca7edd7b5efceef80727e387642fb5503d06e27d054df1dabd62d362220ad1fe5b4de3b977a1034eb51fa8fc8664117feb6e01cb08d748b7900e9e1ea5806706dd7405d661b4ab5e5235590b7edfd2fb0b53c80735ccfd696e64b779c0dd0bc978512705a1c4e2c93d5fe2c181c2c64ec35d45c66a241e3041716dd34732a6b98e01cbd5afbfeb312b053d1dcbb8111980158f100aa834627e4e801055f30791b7341e456a049e475a770f909ec304057d79ada23f483cc8ca68a89fc00479e1f3312a0028a97c7a4b2a6c819aa3c3ba497973315f552eff8f180fd25cff8755fd1011962244d1d95b638f4099a91e4ca23e6ae3a9ef7e20e402b5d008a7cfecc425fcf5080c775dd4384c2a712b5ae01c3bc1829056e9b44c5820c42d7dafd45d5adcc628f903af460cf08fc4576ef0a36bee44e64d5c6e3b46574f134ccfa976207934f9def7eac0113c84477978a3c70f6899906bed0ffd6d751eafac3d6d2447e85c2f5c167d9c0384d511d727c2cd05e9dd4c96c61df268c873abe96692b05757716de38c950616027318e701d9b938ecb4951bb9ba0d366ac7258a2985691686682e9830b1917de563993936da6a10468c034e026b62639dc8b2ac456fbf7723d09295f7ad97624613ff1c54476d705d14449c821b131a07cbfc67fee538755cdde99ab82be6680a5f6ae99581481c36224f312a22f407428870d44ed09b2b4b74c0765dd2b877ece7cd246af8b57fd2f15730ba12193938f8e7660277c15242bf5b938578430c391e5a3a632fb61ad82900ced1cb051b7217f8c22ab3374c83b49d7fd2ad83627cd647659343dc08bf32c2d38870dc75bb3f059c7005377919f242e732c912295962b558ec95502ec6107ea38af52b12d928c592a8e6f27e0dc07d8686c33b0b20982cea2534624f9134d75f8693ee2239cff0f5fb807f3f55334a2c17caa776b3767c0e37bf135bc67502740f93f75eafa04cb6d3460f60196c3f597e8e665a23b1ec03ef03a57a446b458e7d0cb1172ba87d767df1a36d9ae3d95b009325360fa897c07ffa4d54052d06c17461220bbaf1802a8b0f6825c2ce9fd80ffe2b31d1caceff9721320657a9839a1db2693492aa1edd5882c558622b6b535eaca0471cb1fb55dd68bd17fd7eacb11eb85573bf4d8ffabf8ba54519801c4aa39a042eb094595704ae26148381f1f3bd803b0f3d58ae6b7306af7169480d973327703234d0382ce97e8411277b7d417c980367460d88fb486fa2551c183fb24342b85b11bf278db968f8412c62bc0877910b014d7452269e75e95b728e4801be36546933d9513bc0912023ebb830194c652175f3c199300f6e4264d6cb0047b1faff6248d9c3af1db83e226a8aeda95afd570c932cf20362dba53a6a12ee736e972b1ab892d073a171583b8376c6848099092dddf34a7bf70300247ffe182fa6b291014af80f37d21c9503852d86d9a22abb021d1b5062e1a6124b6e540b5ca7d76b2e1b3b328757beff0677b100da75263956b91b4cc203f3e35d193c3581efc6a353c357be66f733ab5e1c4aeb2fa637d5471bb516c2232d310d1f8fa193f481f63d5653181e67d25e12c6aade4dde120451127d9ca5dd65776bda4eb7986de8956554adda521fb7e048570488ce0b7eec316b0d5a8ee264e445cb84f8b58af77f22eb875f7412a88f365ee4fbe1ee4577593be82c608e0782489320889abe2abe5f7b991c7be087e114646fd00297fca81004ae0e8cdc204f0d0ba7e2f220f477765ea59aabd604874c0717c3fdd884df6a88886093c6b4c45bb6f17977952cca6f08a55b0d9d02c608355b85c45c513570884c7ba8550b3c12960a0a1a75f049331ecc0acdd62e32793fa7a295d0000006e26d7792f7ab9245eeae1ed7a4fcb9581b026aad68a741690b114160e092e4044de14fbc5a3a8e166f7f8b7effe078348d946e883e6c4446ccc6a2e25a30e93ce5d5b6a08124795daf8309cfc3ab5679130308122790ba14532d96ac61dfba3cb1403cef4fcffe4d8b9f7cb63d38233cc5b151be74e5eb3aa4ba393fccbd2126fc0cfca62fe90f2ab9e025e1f4ea9025333bbd5b95f4ad6ede1f5c7887c0e301de18b37e04d89113092d0ba01a81aa391dbc2fb6e7512632dcc9fa81aab5332410e2ea21b5973076ac33aa42444bdb21679763d3485ad74f55fcfc69d508ac3aa024a7efd4778b76cf42f87835c7b66e709235368eb4882223daa28b53508471468e532ab47f0a6d66564e9c6ca58c14863b08a2927fdf62deceb0f52aeaae700baa148b6f6ef70e7938631afddb717ca3cc576426e1e81cba378d4f3ea9525b78bf8e07f80cc2215c41200f6b433e45d720a54fd113b7217a79f2f38ec9d330ba0773223a66de286ed1c4e99b4196058ceed11e38e59f39d2a75d920706af5f5941576339d09f7a65cfef3aa09aea0a1750273e3e2a4a62efead736424b5675c6c6cc8fa925ac21e6f52161bb7f4f1e03ce210c79e6a66ebf2e9b1f9f95b50ab83ed2b8e8d08d26534da4626ebaa6741f3cd7513b60735393c5b2273e343f4f4116aa7dac96353242fbba2c4143ff0389270062be64cf56cc7f25231d65e81df2abdda7efd6387807a51040a646114f3a5060e8cc236e23b8ac4ed28eeeeb24139c1eed21a6f35ea087a4e7ab70507b6fd65e6ec5d0ea313cb9ee438866e90a91342d0a27242d1e44be48457f877747a52cbf9ab3a615424e12d6246ac9183a6366881f61a55d49a93fb2841930b04b41a6e7b52584be15e014a7c505ad767ba60ea7e50f97a900308a0d8b0c6fd67ec221e2c3e163141944ca435d7429d65602736c8650c93332515aac9c4e0dd43f7b03fbfa51f49a2db774c76eaf8db8178a8b7c7900b5aa3ff08288c669a111629f6f52722d54496a9a45d1f20176a046f3f4c242bc68b13b8a347326357b1e76aedd2746ada665774911898664ed33036499d5b4e24f6c73beb52e8a969c562d28de1cb7bee4532ec29242bf76f5043e8550928aa329142ffc7cf00e3a548e54bc5c5e86d07b447fb2de17b32a1b2b043c486e34fb31f3183ef89c42dbbbb57f380db2490200bd10a77e6b400ac70e2f15f43742cb0c8729f39b370acf82ec0afe4ec2031277fc795ab5cbde56d77a65a28f2d16d9f60c06ba76e8554b787a71e227ec21719860438d62a2c43236523f108e7589acb72c7c25a800905102d16165bf51f7adaa8f3877a0e1439e80ea3951ddf265d724317c32505015b6bf576450970e4284aa712f052f091e31323e36d91d7d8e5f1f5d50a3aa7a1168eb46681cd457e4d528371bae88e84a929b3320da960b5e4ef3b1313a10c494ae2493614f0a835f9e7bea2bae8465b761771e1a07922b1defd50b0673d613ba276b2409d0203eff29e03c0ff783f2232fe0a83d95764439c6aac92bfa2f7b7056b2b419122e745391a40071f02ea94021220d33365b5c733fb81d6cdb50027c3573e0517eaf76d3b6eaf219c94f6dbe5127015e10c3b2db2e5216043257656553540603ba8f7628657e4f55cd54df43c3b8ec44a6ea49630169264237ac5d1056050a1cf1fdd616875c7b087c2620e04af4974329a0a57d4c248c0c8c314b119418943d615da7f686e7273a7093212b0f15322fa7e9955af25d5507feaea1d92eb27a742fe126c2b3d4a159f2488d81562866563e8097849eeb6f58ecd72bfa2ce1195889e51444f8c9e514f571774150345a3f9128845ad1f35f47c9afde3f214119299102e43777eefa6d2e16f575b2abce4d2953589906e3d04fa8e7e991bb2c074149763f1a4fd9a579c268f8bdb31bb55ce9195bed35873b6f8ddc05fe83b8e7010fb32b3c6cb4fd505220a4912471fc3c64ba862a770a882f4e51738c2c590a79b0063398b90e3762172b412aa495f671c85f7e7ffc7c1e1fa5484266925aef4fc51558617bdca8587d7d2eca2202cc296bd0ba54f8477838b2362d5e9fbb801361a8289676b23815b825027e4e54fd57eb93043d6065a90b716f50ba50b6473f8aab1db48a9d673f39c8cb3516cc004aeb101815ad1eff2fe1fad1166cefb344d5ca15cd3aa28f43114bc44284000f2214311b813b226b6c55122d7033ae2c2784f0f51f1d327a497f2bfc9ea542541e587e08dc21a4ed2b1aaa732f14011f43b06cdcdb239b2604d2088593680fca19b205564b6549cd0cb9213c4f19be3419b395e93d4c0a994357040a191e5ac20a21a61fe5a7955705c6166bbb2789e26fcd66b4baf8c4395648516eb08735585670eb9d6e9de31940322e865109a79f128e8d0e19e73d7a444259e9eae728d07160bcb8e93ebcb24e800a14d9b574a00ff08021fa263e6e5366e2b1f7cd04285a01070db3114a2c4bc1a2660daeac0649faf9fa6707d64b612c0c845c0bba817be3b9dbbc8254215a53d5bac8a57c024623980e3901709e2b445320e13077a805df14d40b2eb6384e1a5413311b82bc58f6e490d4b141dd2cc3367ab0bff8fd2a71c9d04807848c3d758cdf800624c01b4f9df49dc52c564dcdb0d9d7dbf3cd1ecd41873c3524c363df47968b3336427bc4db45dcaf129f62201e14b85d641868a6024c3a627c19739fa841816935e5696f5d1400adf16e201f16e3e9f0f4fa4239aa26bb7819164bb0ef0528fbcacf23aa71ffb9a90d3f7ba1e0fd35f118af59c1a380b34cee7b7920ab8b641df5f8149e45f1a9b702d008a7dd2eb14caea3790260f4f58eb0c915f6df786ceac69a10646fad234c6ff66ff14893d9f62c1f05a83fd80fbbbc4c353b98948c1cc26d371d2763dae60f57166ffe9adef6ab6a67cc3b8cc89463743036231c5e33180424b0282faae8e56e5ae1308ebb1c3e0803877638145fb6fd55746b2a87341c76309acaf36f1034d21a6013b56a66ac66089e71c5fc9ab14372223013c067032a769fa63e0ea248927bb6fd8f540b8a6538fbde173da886691786819041479281630440b29741977e69ccdbc588ebeccd173e279524d9d4c2477ff3913793722370fd06e9cbd7490358b855ffecabe3df3c43bb30b4bd367a5940e612cde871c74cd59a2652f6c42a2300791f70093d46179a9f77e3e6b1647edca52c91f5ad253fff29e4da2ff93f03dfeefd0ed8f19659f8fdbb9997bd8903b2d7b6bfa0e0d05119ded11de79e8f310c3d8f1f409ca443c7722f31d4691f2fee9bdda18caf31703c56a87c0010076cc57f718b721ab368a7523339f26fa4788673faf0a647ac11bb49755ceb58aa10db1cef6628bf3b2ad17b0827619f551f9f95c90e90e5c77944fc92ab05f7ba3ed9a8307b02d460548d028d799fb6a200f5a05a25d962413d5ce59283aaa5bf40038a3485fa1c6f723bb3b2137d0a1812fa5a6ffe300065513bc9252c87f6242458e0fa03e32e7575909382f5f4670875fdb4871802dc38020f793e3bbd63054572714463efebd1331b059163818fa22cc0af283b7d3d273519fcf36aef39b72c72c3999953939a11e353fefc4ad580611b6a7a0e3ac9c7519a7a7decdf3b235343410e410af72754b7c5e12fc4dc7f1083aab17b41560e3b7515ff26ea51cd59d055c0731c3d93244326c400abf71543fb6d69348aa81265b0b6330a08ff95086cc4ffe6630dd33fc12a4198e4f0197effbc2157bb02e479682622d3719e2c4244336b1808d02007bf57094b1654b5602f4ef53bdf123c6ae0867d3dea00cd22030123e7a4cd7930dc289764f8986213903d5cdc570f9d5671d5f98f4e5df2407718b1e88762fb02c7255fb77ad87147246acc285caa790c9b3288312b161e3ae62725eeb5b5642c425aa47c6e54d1488a96252d99bdcb7526dd1b6f2bd61446da537ed4d7c7c610c49eace82da7a17ffbc5e0363cb7602525f3502cfee2bc6d1ec003982b8d0c79238ed806c629ba27692d0f9d88344a5f45417ae8ce793608c5e1bdf30f11775ed6d7466d48908244ea9d8af62c915f073b2f320b2dea2f6339f4c98d71719279d37732fa7d99fd7efa527c1204447226bbdaae09a5e9cb791a49949127347b39967143da3848c814ef6cfd6b9ec0ec7c67f0494b209b1e15acb913c72e8ea62fcdb6a775874c5e035e3c08ee19c8e858a2e8d5c814d0e605532d86f15c8f437dedd3c6ab989dfb4cb0b2111c6dcf04745f93dab94722e403cfa1c8b5d350603206742413706c0f041476e79e40366722ce046c364a76ca0fb7cadbf6d446786052de16f8abf104355c20592ec5b93d05f81418311cd6187056eba45a6fe7d05ad957464164d3745a83f476e49b4d05451a1d1e32146fbc45c297acc6a29ef30fe05dc9cf8acaa9341cbecdd33846310a01c1b0a0b466f56965fe7f32d852471bff983b07e82b301cc8521656a1e80c7b9a5d3a1f12aca547aecd9574b589a46e06e9d2d18139f32b0d33269daf60384d0bfa977a182709520d0b4b493f5b2e3eaea850b8153bf92bb099ee217af8680e06e380b0211e862d0dda3b891156136961644b57b1f063471cfc2c268cf260708e827bdf893f72034b4483f5f460286d273052294d9d772b599b2fb707d1b837adea73980d148609adbd9bd79b109e44d4be4dbc4589bd0ff4af7912ef44041d04445e202b3f8511ab487c8f029f8f48feea8bc61e747d36577c73427167060e3d472ba94e82e614bda19971f9b2ee6b3fc10fd9d0ca3c71c82878a7b3c78311508bcd49ca38967f2e60f68224f4c3096bdf02b0572d3e730ab97076fa8ec70be277de921a5b5e78578faa6fd4ba4d44ec821392ca34687dcb415484a90c7a5f99ea9fac1631ee10808a58c782ce9f506c2c627ca159d516e05b5c5cafe22164f7f52916e55fd11d8edcedab73cf00671f5a0f2a9108fe3feb7633452a6d9f62980c4188084ac933fd7feec56c29a3115bf43c54d3f6d300f4692b6e2c8cf2037c4f437f11886f69dcbcd3eee5c62c13e6ba5fe0560cca71e142949e1e5b07758f0eb7e31adcff2d7b2dd06f363e192cc3e7ab19142da66f7b2da0ace2f1777fb65d5fd70f49f93dba8c5b83dc3aa75ed7979ef9f9df75444bd99713c3acb5764aaf452721bde30ce1e85e88d122924a2a017c85708e866b2c5cdc161ff3fe0ed6e4382df4803c195973200b6d50a74b5833a6035f8dfd1cac9df2ea8e187218341c4e9ad42e3669a8b1a203d5c5d41f413b6b78128a1430f710132777c8ac26d303c7d805523d47655d253e6c63c61e89ca3c42063ce07ea9f1a900df7149715dc8d5d98cac241101dbeb4b9b2a3b6d4af5b14204ef2c0ea7969c35399faa23a62a402a5095e37ff5e4bdd22e1b0d3f02c1f231c670a6564c8de82f30575e7a2a00ac3787fbf8321d01288ea3b1b84595f31fb073a57d4cbdc804d037bb3902b9243eaf9bc4b431c38db2ce8012e224460e3285e5575a4d6777609578803e27c5d52b818df6562e3fedece5f3afcc3055d7e8ba12401862caf115122549aa44cbda92553e63b13d9c9eb908958ba615e05ee7cf49973b62dd34eb6a178c2120dd57fc3b57dd3c36db38c4888d09f4562f07a9b29877496acd0d2ac6d99eba76b62925a3f6fefb119a94ce1843a22b7eaa656be364129e09 + - {fileID: 11500000, guid: 70e78a4898214182969b5f5c1049ac6e, type: 3} + _Values: 5337fb48ba082f4c11da0277d9afca7edd7b5efceef80727e387642fb5503d06e27d054df1dabd62d362220ad1fe5b4de3b977a1034eb51fa8fc8664117feb6e01cb08d748b7900e9e1ea5806706dd7405d661b4ab5e5235590b7edfd2fb0b53c80735ccfd696e64b779c0dd0bc978512705a1c4e2c93d5fe2c181c2c64ec35d45c66a241e3041716dd34732a6b98e01cbd5afbfeb312b053d1dcbb8111980158f100aa834627e4e801055f30791b7341e456a049e475a770f909ec304057d79ada23f483cc8ca68a89fc00479e1f3312a0028a97c7a4b2a6c819aa3c3ba497973315f552eff8f180fd25cff8755fd1011962244d1d95b638f4099a91e4ca23e6ae3a9ef7e20e402b5d008a7cfecc425fcf5080c775dd4384c2a712b5ae01c3bc1829056e9b44c5820c42d7dafd45d5adcc628f903af460cf08fc4576ef0a36bee44e64d5c6e3b46574f134ccfa976207934f9def7eac0113c84477978a3c70f6899906bed0ffd6d751eafac3d6d2447e85c2f5c167d9c0384d511d727c2cd05e9dd4c96c61df268c873abe96692b05757716de38c950616027318e701d9b938ecb4951bb9ba0d366ac7258a2985691686682e9830b1917de563993936da6a10468c034e026b62639dc8b2ac456fbf7723d09295f7ad97624613ff1c54476d705d14449c821b131a07cbfc67fee538755cdde99ab82be6680a5f6ae99581481c36224f312a22f407428870d44ed09b2b4b74c0765dd2b877ece7cd246af8b57fd2f15730ba12193938f8e7660277c15242bf5b938578430c391e5a3a632fb61ad82900ced1cb051b7217f8c22ab3374c83b49d7fd2ad83627cd647659343dc08bf32c2d38870dc75bb3f059c7005377919f242e732c912295962b558ec95502ec6107ea38af52b12d928c592a8e6f27e0dc07d8686c33b0b20982cea2534624f9134d75f8693ee2239cff0f5fb807f3f55334a2c17caa776b3767c0e37bf135bc67502740f93f75eafa04cb6d3460f60196c3f597e8e665a23b1ec03ef03a57a446b458e7d0cb1172ba87d767df1a36d9ae3d95b009325360fa897c07ffa4d54052d06c17461220bbaf1802a8b0f6825c2ce9fd80ffe2b31d1caceff9721320657a9839a1db2693492aa1edd5882c558622b6b535eaca0471cb1fb55dd68bd17fd7eacb11eb85573bf4d8ffabf8ba54519801c4aa39a042eb094595704ae26148381f1f3bd803b0f3d58ae6b7306af7169480d973327703234d0382ce97e8411277b7d417c980367460d88fb486fa2551c183fb24342b85b11bf278db968f8412c62bc0877910b014d7452269e75e95b728e4801be36546933d9513bc0912023ebb830194c652175f3c199300f6e4264d6cb0047b1faff6248d9c3af1db83e226a8aeda95afd570c932cf20362dba53a6a12ee736e972b1ab892d073a171583b8376c6848099092dddf34a7bf70300247ffe182fa6b291014af80f37d21c9503852d86d9a22abb021d1b5062e1a6124b6e540b5ca7d76b2e1b3b328757beff0677b100da75263956b91b4cc203f3e35d193c3581efc6a353c357be66f733ab5e1c4aeb2fa637d5471bb516c2232d310d1f8fa193f481f63d5653181e67d25e12c6aade4dde120451127d9ca5dd65776bda4eb7986de8956554adda521fb7e048570488ce0b7eec316b0d5a8ee264e445cb84f8b58af77f22eb875f7412a88f365ee4fbe1ee4577593be82c608e0782489320889abe2abe5f7b991c7be087e114646fd00297fca81004ae0e8cdc204f0d0ba7e2f220f477765ea59aabd604874c0717c3fdd884df6a88886093c6b4c45bb6f17977952cca6f08a55b0d9d02c608355b85c45c513570884c7ba8550b3c12960a0a1a75f049331ecc0acdd62e32793fa7a295d0000006e26d7792f7ab9245eeae1ed7a4fcb9581b026aad68a741690b114160e092e4044de14fbc5a3a8e166f7f8b7effe078348d946e883e6c4446ccc6a2e25a30e93ce5d5b6a08124795daf8309cfc3ab5679130308122790ba14532d96ac61dfba3cb1403cef4fcffe4d8b9f7cb63d38233cc5b151be74e5eb3aa4ba393fccbd2126fc0cfca62fe90f2ab9e025e1f4ea9025333bbd5b95f4ad6ede1f5c7887c0e301de18b37e04d89113092d0ba01a81aa391dbc2fb6e7512632dcc9fa81aab5332410e2ea21b5973076ac33aa42444bdb21679763d3485ad74f55fcfc69d508ac3aa024a7efd4778b76cf42f87835c7b66e709235368eb4882223daa28b53508471468e532ab47f0a6d66564e9c6ca58c14863b08a2927fdf62deceb0f52aeaae700baa148b6f6ef70e7938631afddb717ca3cc576426e1e81cba378d4f3ea9525b78bf8e07f80cc2215c41200f6b433e45d720a54fd113b7217a79f2f38ec9d330ba0773223a66de286ed1c4e99b4196058ceed11e38e59f39d2a75d920706af5f5941576339d09f7a65cfef3aa09aea0a1750273e3e2a4a62efead736424b5675c6c6cc8fa925ac21e6f52161bb7f4f1e03ce210c79e6a66ebf2e9b1f9f95b50ab83ed2b8e8d08d26534da4626ebaa6741f3cd7513b60735393c5b2273e343f4f4116aa7dac96353242fbba2c4143ff0389270062be64cf56cc7f25231d65e81df2abdda7efd6387807a51040a646114f3a5060e8cc236e23b8ac4ed28eeeeb24139c1eed21a6f35ea087a4e7ab70507b6fd65e6ec5d0ea313cb9ee438866e90a91342d0a27242d1e44be48457f877747a52cbf9ab3a615424e12d6246ac9183a6366881f61a55d49a93fb2841930b04b41a6e7b52584be15e014a7c505ad767ba60ea7e50f97a900308a0d8b0c6fd67ec221e2c3e163141944ca435d7429d65602736c8650c93332515aac9c4e0dd43f7b03fbfa51f49a2db774c76eaf8db8178a8b7c7900b5aa3ff08288c669a111629f6f52722d54496a9a45d1f20176a046f3f4c242bc68b13b8a347326357b1e76aedd2746ada665774911898664ed33036499d5b4e24f6c73beb52e8a969c562d28de1cb7bee4532ec29242bf76f5043e8550928aa329142ffc7cf00e3a548e54bc5c5e86d07b447fb2de17b32a1b2b043c486e34fb31f3183ef89c42dbbbb57f380db2490200bd10a77e6b400ac70e2f15f43742cb0c8729f39b370acf82ec0afe4ec2031277fc795ab5cbde56d77a65a28f2d16d9f60c06ba76e8554b787a71e227ec21719860438d62a2c43236523f108e7589acb72c7c25a800905102d16165bf51f7adaa8f3877a0e1439e80ea3951ddf265d724317c32505015b6bf576450970e4284aa712f052f091e31323e36d91d7d8e5f1f5d50a3aa7a1168eb46681cd457e4d528371bae88e84a929b3320da960b5e4ef3b1313a10c494ae2493614f0a835f9e7bea2bae8465b761771e1a07922b1defd50b0673d613ba276b2409d0203eff29e03c0ff783f2232fe0a83d95764439c6aac92bfa2f7b7056b2b419122e745391a40071f02ea94021220d33365b5c733fb81d6cdb50027c3573e0517eaf76d3b6eaf219c94f6dbe5127015e10c3b2db2e5216043257656553540603ba8f7628657e4f55cd54df43c3b8ec44a6ea49630169264237ac5d1056050a1cf1fdd616875c7b087c2620e04af4974329a0a57d4c248c0c8c314b119418943d615da7f686e7273a7093212b0f15322fa7e9955af25d5507feaea1d92eb27a742fe126c2b3d4a159f2488d81562866563e8097849eeb6f58ecd72bfa2ce1195889e51444f8c9e514f571774150345a3f9128845ad1f35f47c9afde3f214119299102e43777eefa6d2e16f575b2abce4d2953589906e3d04fa8e7e991bb2c074149763f1a4fd9a579c268f8bdb31bb55ce9195bed35873b6f8ddc05fe83b8e7010fb32b3c6cb4fd505220a4912471fc3c64ba862a770a882f4e51738c2c590a79b0063398b90e3762172b412aa495f671c85f7e7ffc7c1e1fa5484266925aef4fc51558617bdca8587d7d2eca2202cc296bd0ba54f8477838b2362d5e9fbb801361a8289676b23815b825027e4e54fd57eb93043d6065a90b716f50ba50b6473f8aab1db48a9d673f39c8cb3516cc004aeb101815ad1eff2fe1fad1166cefb344d5ca15cd3aa28f43114bc44284000f2214311b813b226b6c55122d7033ae2c2784f0f51f1d327a497f2bfc9ea542541e587e08dc21a4ed2b1aaa732f14011f43b06cdcdb239b2604d2088593680fca19b205564b6549cd0cb9213c4f19be3419b395e93d4c0a994357040a191e5ac20a21a61fe5a7955705c6166bbb2789e26fcd66b4baf8c4395648516eb08735585670eb9d6e9de31940322e865109a79f128e8d0e19e73d7a444259e9eae728d07160bcb8e93ebcb24e800a14d9b574a00ff08021fa263e6e5366e2b1f7cd04285a01070db3114a2c4bc1a2660daeac0649faf9fa6707d64b612c0c845c0bba817be3b9dbbc8254215a53d5bac8a57c024623980e3901709e2b445320e13077a805df14d40b2eb6384e1a5413311b82bc58f6e490d4b141dd2cc3367ab0bff8fd2a71c9d04807848c3d758cdf800624c01b4f9df49dc52c564dcdb0d9d7dbf3cd1ecd41873c3524c363df47968b3336427bc4db45dcaf129f62201e14b85d641868a6024c3a627c19739fa841816935e5696f5d1400adf16e201f16e3e9f0f4fa4239aa26bb7819164bb0ef0528fbcacf23aa71ffb9a90d3f7ba1e0fd35f118af59c1a380b34cee7b7920ab8b641df5f8149e45f1a9b702d008a7dd2eb14caea3790260f4f58eb0c915f6df786ceac69a10646fad234c6ff66ff14893d9f62c1f05a83fd80fbbbc4c353b98948c1cc26d371d2763dae60f57166ffe9adef6ab6a67cc3b8cc89463743036231c5e33180424b0282faae8e56e5ae1308ebb1c3e0803877638145fb6fd55746b2a87341c76309acaf36f1034d21a6013b56a66ac66089e71c5fc9ab14372223013c067032a769fa63e0ea248927bb6fd8f540b8a6538fbde173da886691786819041479281630440b29741977e69ccdbc588ebeccd173e279524d9d4c2477ff3913793722370fd06e9cbd7490358b855ffecabe3df3c43bb30b4bd367a5940e612cde871c74cd59a2652f6c42a2300791f70093d46179a9f77e3e6b1647edca52c91f5ad253fff29e4da2ff93f03dfeefd0ed8f19659f8fdbb9997bd8903b2d7b6bfa0e0d05119ded11de79e8f310c3d8f1f409ca443c7722f31d4691f2fee9bdda18caf31703c56a87c0010076cc57f718b721ab368a7523339f26fa4788673faf0a647ac11bb49755ceb58aa10db1cef6628bf3b2ad17b0827619f551f9f95c90e90e5c77944fc92ab05f7ba3ed9a8307b02d460548d028d799fb6a200f5a05a25d962413d5ce59283aaa5bf40038a3485fa1c6f723bb3b2137d0a1812fa5a6ffe300065513bc9252c87f6242458e0fa03e32e7575909382f5f4670875fdb4871802dc38020f793e3bbd63054572714463efebd1331b059163818fa22cc0af283b7d3d273519fcf36aef39b72c72c3999953939a11e353fefc4ad580611b6a7a0e3ac9c7519a7a7decdf3b235343410e410af72754b7c5e12fc4dc7f1083aab17b41560e3b7515ff26ea51cd59d055c0731c3d93244326c400abf71543fb6d69348aa81265b0b6330a08ff95086cc4ffe6630dd33fc12a4198e4f0197effbc2157bb02e479682622d3719e2c4244336b1808d02007bf57094b1654b5602f4ef53bdf123c6ae0867d3dea00cd22030123e7a4cd7930dc289764f8986213903d5cdc570f9d5671d5f98f4e5df2407718b1e88762fb02c7255fb77ad87147246acc285caa790c9b3288312b161e3ae62725eeb5b5642c425aa47c6e54d1488a96252d99bdcb7526dd1b6f2bd61446da537ed4d7c7c610c49eace82da7a17ffbc5e0363cb7602525f3502cfee2bc6d1ec003982b8d0c79238ed806c629ba27692d0f9d88344a5f45417ae8ce793608c5e1bdf30f11775ed6d7466d48908244ea9d8af62c915f073b2f320b2dea2f6339f4c98d71719279d37732fa7d99fd7efa527c1204447226bbdaae09a5e9cb791a49949127347b39967143da3848c814ef6cfd6b9ec0ec7c67f0494b209b1e15acb913c72e8ea62fcdb6a775874c5e035e3c08ee19c8e858a2e8d5c814d0e605532d86f15c8f437dedd3c6ab989dfb4cb0b2111c6dcf04745f93dab94722e403cfa1c8b5d350603206742413706c0f041476e79e40366722ce046c364a76ca0fb7cadbf6d446786052de16f8abf104355c20592ec5b93d05f81418311cd6187056eba45a6fe7d05ad957464164d3745a83f476e49b4d05451a1d1e32146fbc45c297acc6a29ef30fe05dc9cf8acaa9341cbecdd33846310a01c1b0a0b466f56965fe7f32d852471bff983b07e82b301cc8521656a1e80c7b9a5d3a1f12aca547aecd9574b589a46e06e9d2d18139f32b0d33269daf60384d0bfa977a182709520d0b4b493f5b2e3eaea850b8153bf92bb099ee217af8680e06e380b0211e862d0dda3b891156136961644b57b1f063471cfc2c268cf260708e827bdf893f72034b4483f5f460286d273052294d9d772b599b2fb707d1b837adea73980d148609adbd9bd79b109e44d4be4dbc4589bd0ff4af7912ef44041d04445e202b3f8511ab487c8f029f8f48feea8bc61e747d36577c73427167060e3d472ba94e82e614bda19971f9b2ee6b3fc10fd9d0ca3c71c82878a7b3c78311508bcd49ca38967f2e60f68224f4c3096bdf02b0572d3e730ab97076fa8ec70be277de921a5b5e78578faa6fd4ba4d44ec821392ca34687dcb415484a90c7a5f99ea9fac1631ee10808a58c782ce9f506c2c627ca159d516e05b5c5cafe22164f7f52916e55fd11d8edcedab73cf00671f5a0f2a9108fe3feb7633452a6d9f62980c4188084ac933fd7feec56c29a3115bf43c54d3f6d300f4692b6e2c8cf2037c4f437f11886f69dcbcd3eee5c62c13e6ba5fe0560cca71e142949e1e5b07758f0eb7e31adcff2d7b2dd06f363e192cc3e7ab19142da66f7b2da0ace2f1777fb65d5fd70f49f93dba8c5b83dc3aa75ed7979ef9f9df75444bd99713c3acb5764aaf452721bde30ce1e85e88d122924a2a017c85708e866b2c5cdc161ff3fe0ed6e4382df4803c195973200b6d50a74b5833a6035f8dfd1cac9df2ea8e187218341c4e9ad42e3669a8b1a203d5c5d41f413b6b78128a1430f710132777c8ac26d303c7d805523d47655d253e6c63c61e89ca3c42063ce07ea9f1a900df7149715dc8d5d98cac241101dbeb4b9b2a3b6d4af5b14204ef2c0ea7969c35399faa23a62a402a5095e37ff5e4bdd22e1b0d3f02c1f231c670a6564c8de82f30575e7a2a00ac3787fbf8321d01288ea3b1b84595f31fb073a57d4cbdc804d037bb3902b9243eaf9bc4b431c38db2ce8012e224460e3285e5575a4d6777609578803e27c5d52b818df6562e3fedece5f3afcc3055d7e8ba12401862caf115122549aa44cbda92553e63b13d9c9eb908958ba615e05ee7cf49973b62dd34eb6a178c2120dd57fc3b57dd3c36db38c4888d09f4562f07a9b29877496acd0d2ac6d99eba76b62925a3f6fefb119a94ce1843a22b7eaa656be364129e09cb2200dc4a4b8539 diff --git a/client/Assets/Scripts/Frame/Loading/LoadingFrame.cs b/client/Assets/Scripts/Frame/Loading/LoadingFrame.cs index 1e9d4e4..6895552 100644 --- a/client/Assets/Scripts/Frame/Loading/LoadingFrame.cs +++ b/client/Assets/Scripts/Frame/Loading/LoadingFrame.cs @@ -17,7 +17,7 @@ namespace Ether protected override void OnSubscribe() { - EventCenter.AddListener("CutSceneSucc", CutSceneSucc); + AddEventListener("CutSceneSucc", CutSceneSucc); } private void CutSceneSucc() @@ -25,9 +25,5 @@ namespace Ether _AnimatorCrossfade.SetTrigger("FadeExit"); } - protected override void OnUnSubscribe() - { - EventCenter.RemoveListener("CutSceneSucc", CutSceneSucc); - } } }