From 2fa543d0ff92673b62fd34f3162c1aba157a0f9f Mon Sep 17 00:00:00 2001 From: villaingames Date: Tue, 19 Sep 2023 21:56:41 +0900 Subject: [PATCH] =?UTF-8?q?=EC=98=A4=EB=B8=8C=EC=A0=9D=ED=8A=B8=20?= =?UTF-8?q?=ED=92=80=EB=A7=81=20=EC=B6=94=EA=B0=80,=20dll=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20->=20=EC=BD=94=EB=93=9C=EB=A1=9C=20=EC=A0=84?= =?UTF-8?q?=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sample/Scenes/SampleEventScene.unity | 779 ------------------ .../Sample/Scenes/SampleEventScene.unity.meta | 7 - .../Sample/Scripts/SampleEvents.cs | 13 - .../Sample/Scripts/SampleListener.cs | 23 - .../Sample/Scripts/SamplePublisher.cs | 16 - .../EventManager/{Sample => }/Scripts.meta | 2 +- .../EventManager/Scripts/EventBus.cs | 76 ++ .../EventBus.cs.meta} | 2 +- .../Sample.meta => Exceptions.meta} | 2 +- .../Scenes.meta => Exceptions/Scripts.meta} | 2 +- .../Exceptions/Scripts/CriticalExceptions.cs | 11 + .../Scripts/CriticalExceptions.cs.meta} | 2 +- .../{Plugins.meta => Extensions.meta} | 2 +- .../Extensions/TransformExtension.cs | 42 + .../TransformExtension.cs.meta} | 2 +- .../InfinityScrollView/Scripts.meta | 8 + .../HorizontalGridInfiniteScrollView.cs | 122 +++ .../HorizontalGridInfiniteScrollView.cs.meta | 11 + .../Scripts/HorizontalInfiniteScrollView.cs | 122 +++ .../HorizontalInfiniteScrollView.cs.meta | 11 + .../Scripts/InfiniteCell.cs | 43 + .../Scripts/InfiniteCell.cs.meta | 11 + .../Scripts/InfiniteCellData.cs | 35 + .../Scripts/InfiniteCellData.cs.meta | 11 + .../Scripts/InfiniteScrollView.cs | 181 ++++ .../Scripts/InfiniteScrollView.cs.meta | 11 + .../Scripts/VerticalGridInfiniteScrollView.cs | 123 +++ .../VerticalGridInfiniteScrollView.cs.meta | 11 + .../Scripts/VerticalInfiniteScrollView.cs | 123 +++ .../VerticalInfiniteScrollView.cs.meta | 11 + Assets/FirstVillain/ObjectPool.meta | 8 + Assets/FirstVillain/ObjectPool/PoolManager.cs | 191 +++++ .../ObjectPool/PoolManager.cs.meta | 11 + Assets/FirstVillain/ObjectPool/Scripts.meta | 8 + .../ObjectPool/Scripts/PoolItem.cs | 20 + .../ObjectPool/Scripts/PoolItem.cs.meta | 11 + .../ObjectPool/Scripts/PoolManager.cs | 18 + .../ObjectPool/Scripts/PoolManager.cs.meta | 11 + .../Plugins/FirstVillainLibrary.dll | Bin 21504 -> 0 bytes .../Plugins/FirstVillainLibrary.dll.meta | 33 - Assets/FirstVillain/Singleton.meta | 8 + .../FirstVillain/Singleton/UnitySingleton.cs | 93 +++ .../Singleton/UnitySingleton.cs.meta | 11 + .../Sample.unity} | 20 +- .../Sample.unity.meta} | 2 +- 45 files changed, 1371 insertions(+), 889 deletions(-) delete mode 100644 Assets/FirstVillain/EventManager/Sample/Scenes/SampleEventScene.unity delete mode 100644 Assets/FirstVillain/EventManager/Sample/Scenes/SampleEventScene.unity.meta delete mode 100644 Assets/FirstVillain/EventManager/Sample/Scripts/SampleEvents.cs delete mode 100644 Assets/FirstVillain/EventManager/Sample/Scripts/SampleListener.cs delete mode 100644 Assets/FirstVillain/EventManager/Sample/Scripts/SamplePublisher.cs rename Assets/FirstVillain/EventManager/{Sample => }/Scripts.meta (77%) create mode 100644 Assets/FirstVillain/EventManager/Scripts/EventBus.cs rename Assets/FirstVillain/EventManager/{Sample/Scripts/SampleEvents.cs.meta => Scripts/EventBus.cs.meta} (83%) rename Assets/FirstVillain/{EventManager/Sample.meta => Exceptions.meta} (77%) rename Assets/FirstVillain/{EventManager/Sample/Scenes.meta => Exceptions/Scripts.meta} (77%) create mode 100644 Assets/FirstVillain/Exceptions/Scripts/CriticalExceptions.cs rename Assets/FirstVillain/{EventManager/Sample/Scripts/SampleListener.cs.meta => Exceptions/Scripts/CriticalExceptions.cs.meta} (83%) rename Assets/FirstVillain/{Plugins.meta => Extensions.meta} (77%) create mode 100644 Assets/FirstVillain/Extensions/TransformExtension.cs rename Assets/FirstVillain/{EventManager/Sample/Scripts/SamplePublisher.cs.meta => Extensions/TransformExtension.cs.meta} (83%) create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts.meta create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalGridInfiniteScrollView.cs create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalGridInfiniteScrollView.cs.meta create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalInfiniteScrollView.cs create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalInfiniteScrollView.cs.meta create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCell.cs create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCell.cs.meta create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCellData.cs create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCellData.cs.meta create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteScrollView.cs create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteScrollView.cs.meta create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts/VerticalGridInfiniteScrollView.cs create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts/VerticalGridInfiniteScrollView.cs.meta create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts/VerticalInfiniteScrollView.cs create mode 100644 Assets/FirstVillain/InfinityScrollView/Scripts/VerticalInfiniteScrollView.cs.meta create mode 100644 Assets/FirstVillain/ObjectPool.meta create mode 100644 Assets/FirstVillain/ObjectPool/PoolManager.cs create mode 100644 Assets/FirstVillain/ObjectPool/PoolManager.cs.meta create mode 100644 Assets/FirstVillain/ObjectPool/Scripts.meta create mode 100644 Assets/FirstVillain/ObjectPool/Scripts/PoolItem.cs create mode 100644 Assets/FirstVillain/ObjectPool/Scripts/PoolItem.cs.meta create mode 100644 Assets/FirstVillain/ObjectPool/Scripts/PoolManager.cs create mode 100644 Assets/FirstVillain/ObjectPool/Scripts/PoolManager.cs.meta delete mode 100644 Assets/FirstVillain/Plugins/FirstVillainLibrary.dll delete mode 100644 Assets/FirstVillain/Plugins/FirstVillainLibrary.dll.meta create mode 100644 Assets/FirstVillain/Singleton.meta create mode 100644 Assets/FirstVillain/Singleton/UnitySingleton.cs create mode 100644 Assets/FirstVillain/Singleton/UnitySingleton.cs.meta rename Assets/{FirstVillain/EventManager/Sample/Scenes/SampleNextScene.unity => Scenes/Sample.unity} (94%) rename Assets/{FirstVillain/EventManager/Sample/Scenes/SampleNextScene.unity.meta => Scenes/Sample.unity.meta} (74%) diff --git a/Assets/FirstVillain/EventManager/Sample/Scenes/SampleEventScene.unity b/Assets/FirstVillain/EventManager/Sample/Scenes/SampleEventScene.unity deleted file mode 100644 index bd629df..0000000 --- a/Assets/FirstVillain/EventManager/Sample/Scenes/SampleEventScene.unity +++ /dev/null @@ -1,779 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 3 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 1 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 0 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 0 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 500 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 500 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 2 - m_PVRDenoiserTypeDirect: 0 - m_PVRDenoiserTypeIndirect: 0 - m_PVRDenoiserTypeAO: 0 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 0 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 0} - m_LightingSettings: {fileID: 0} ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 2 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - accuratePlacement: 0 - maxJobWorkers: 0 - preserveTilesOutsideBounds: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &462390051 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 462390055} - - component: {fileID: 462390054} - - component: {fileID: 462390053} - - component: {fileID: 462390052} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &462390052 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 462390051} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &462390053 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 462390051} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 - m_PresetInfoIsWorld: 0 ---- !u!223 &462390054 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 462390051} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_AdditionalShaderChannelsFlag: 25 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!224 &462390055 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 462390051} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1764732231} - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!1 &519420028 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 519420032} - - component: {fileID: 519420031} - - component: {fileID: 519420029} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &519420029 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 519420028} - m_Enabled: 1 ---- !u!20 &519420031 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 519420028} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 2 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_FocalLength: 50 - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 1 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 0 - m_HDR: 1 - m_AllowMSAA: 0 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 0 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &519420032 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 519420028} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: -10} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &782199217 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 782199220} - - component: {fileID: 782199219} - - component: {fileID: 782199218} - m_Layer: 0 - m_Name: EventSystem - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &782199218 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 782199217} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} - m_Name: - m_EditorClassIdentifier: - m_SendPointerHoverToParent: 1 - m_HorizontalAxis: Horizontal - m_VerticalAxis: Vertical - m_SubmitButton: Submit - m_CancelButton: Cancel - m_InputActionsPerSecond: 10 - m_RepeatDelay: 0.5 - m_ForceModuleActive: 0 ---- !u!114 &782199219 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 782199217} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_FirstSelected: {fileID: 0} - m_sendNavigationEvents: 1 - m_DragThreshold: 10 ---- !u!4 &782199220 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 782199217} - 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_RootOrder: 5 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1017676595 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1017676597} - - component: {fileID: 1017676596} - m_Layer: 0 - m_Name: TestPublisher - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1017676596 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1017676595} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: cd5bc50399c22b949a535da2d35d8924, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &1017676597 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1017676595} - 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_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1374948899 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1374948901} - - component: {fileID: 1374948900} - m_Layer: 0 - m_Name: EventBus - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1374948900 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1374948899} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 1156878957, guid: 8c96c7edf3aa4ce4cb713a09ad33e2cc, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &1374948901 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1374948899} - 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_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1532598558 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1532598560} - - component: {fileID: 1532598559} - m_Layer: 0 - m_Name: TestListener - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1532598559 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1532598558} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 29bceafc84dbcbc45a445598589a16a3, type: 3} - m_Name: - m_EditorClassIdentifier: ---- !u!4 &1532598560 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1532598558} - 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_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1764732230 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1764732231} - - component: {fileID: 1764732234} - - component: {fileID: 1764732233} - - component: {fileID: 1764732232} - m_Layer: 5 - m_Name: Button - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1764732231 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1764732230} - 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: - - {fileID: 1824310142} - m_Father: {fileID: 462390055} - m_RootOrder: 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: -367.875, y: -104.24999} - m_SizeDelta: {x: 160, y: 30} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1764732232 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1764732230} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1764732233} - m_OnClick: - m_PersistentCalls: - m_Calls: - - m_Target: {fileID: 1017676596} - m_TargetAssemblyTypeName: Publisher, Assembly-CSharp - m_MethodName: OnClickPublish - m_Mode: 1 - m_Arguments: - m_ObjectArgument: {fileID: 0} - m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine - m_IntArgument: 0 - m_FloatArgument: 0 - m_StringArgument: - m_BoolArgument: 0 - m_CallState: 2 ---- !u!114 &1764732233 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1764732230} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, 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: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - 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 &1764732234 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1764732230} - m_CullTransparentMesh: 1 ---- !u!1 &1824310141 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1824310142} - - component: {fileID: 1824310144} - - component: {fileID: 1824310143} - m_Layer: 5 - m_Name: Text (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1824310142 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1824310141} - 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: 1764732231} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1824310143 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1824310141} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: Button - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4281479730 - m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 24 - m_fontSizeBase: 24 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 0 - m_fontSizeMax: 0 - m_fontStyle: 0 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 0 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1824310144 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1824310141} - m_CullTransparentMesh: 1 diff --git a/Assets/FirstVillain/EventManager/Sample/Scenes/SampleEventScene.unity.meta b/Assets/FirstVillain/EventManager/Sample/Scenes/SampleEventScene.unity.meta deleted file mode 100644 index c1e3c88..0000000 --- a/Assets/FirstVillain/EventManager/Sample/Scenes/SampleEventScene.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 2cda990e2423bbf4892e6590ba056729 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/FirstVillain/EventManager/Sample/Scripts/SampleEvents.cs b/Assets/FirstVillain/EventManager/Sample/Scripts/SampleEvents.cs deleted file mode 100644 index 4f43fd4..0000000 --- a/Assets/FirstVillain/EventManager/Sample/Scripts/SampleEvents.cs +++ /dev/null @@ -1,13 +0,0 @@ -using FirstVillain.EventBus; - -public class TestEvent : EventBase -{ - public int TestIntValue { get; private set; } - public string TestStringValue { get; private set; } - - public TestEvent(int intValue, string stringValue) - { - TestIntValue = intValue; - TestStringValue = stringValue; - } -} diff --git a/Assets/FirstVillain/EventManager/Sample/Scripts/SampleListener.cs b/Assets/FirstVillain/EventManager/Sample/Scripts/SampleListener.cs deleted file mode 100644 index b2b3737..0000000 --- a/Assets/FirstVillain/EventManager/Sample/Scripts/SampleListener.cs +++ /dev/null @@ -1,23 +0,0 @@ -using FirstVillain.EventBus; -using FirstVillain.ScrollView; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; - -public class SampleListener : MonoBehaviour -{ - void Start() - { - EventBus.Instance.Subscribe(OnTestEvent); - } - - private void OnDisable() - { - EventBus.Instance.Unsubscribe(OnTestEvent); - } - - private void OnTestEvent(TestEvent e) - { - Debug.Log($"Test event got message {e.TestIntValue} {e.TestStringValue}"); - } -} diff --git a/Assets/FirstVillain/EventManager/Sample/Scripts/SamplePublisher.cs b/Assets/FirstVillain/EventManager/Sample/Scripts/SamplePublisher.cs deleted file mode 100644 index a067ae7..0000000 --- a/Assets/FirstVillain/EventManager/Sample/Scripts/SamplePublisher.cs +++ /dev/null @@ -1,16 +0,0 @@ -using FirstVillain.EventBus; -using System.Collections; -using System.Collections.Generic; -using UnityEngine; -using UnityEngine.SceneManagement; - -public class SamplePublisher : MonoBehaviour -{ - - public void OnClickPublish() - { - EventBus.Instance.Publish(new TestEvent(100, "times")); - - SceneManager.LoadScene("SampleNextScene"); - } -} diff --git a/Assets/FirstVillain/EventManager/Sample/Scripts.meta b/Assets/FirstVillain/EventManager/Scripts.meta similarity index 77% rename from Assets/FirstVillain/EventManager/Sample/Scripts.meta rename to Assets/FirstVillain/EventManager/Scripts.meta index 101b222..5861535 100644 --- a/Assets/FirstVillain/EventManager/Sample/Scripts.meta +++ b/Assets/FirstVillain/EventManager/Scripts.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a8734ea3ee422854a8491e4ea1703e8f +guid: 55b7d7145426a6442afc947ca54a1dd6 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/FirstVillain/EventManager/Scripts/EventBus.cs b/Assets/FirstVillain/EventManager/Scripts/EventBus.cs new file mode 100644 index 0000000..48afbdf --- /dev/null +++ b/Assets/FirstVillain/EventManager/Scripts/EventBus.cs @@ -0,0 +1,76 @@ +using FirstVillain.Singleton; +using System; +using System.Collections.Generic; +using UnityEngine.Events; + +namespace FirstVillain.EventBus +{ + public class EventBus : UnitySingleton + { + private readonly Dictionary _delegateDict = new Dictionary(); + private readonly Dictionary _delegateLookupDict = new Dictionary(); + + public delegate void EventDelegate(T myEvent) where T : EventBase; + private delegate void EventDelegate(EventBase myEvent); + + public void Subscribe(EventDelegate callback) where T : EventBase + { + EventDelegate newDelegate = e => callback(e as T); + _delegateLookupDict[callback] = newDelegate; + + var type = typeof(T); + if (!_delegateDict.TryGetValue(type, out EventDelegate tempDeletage)) + { + _delegateDict[type] = tempDeletage; + } + + _delegateDict[type] += newDelegate; + } + + public void Unsubscribe(EventDelegate callback) where T : EventBase + { + if (_delegateLookupDict.TryGetValue(callback, out EventDelegate targetDelegate)) + { + var type = typeof(T); + if (_delegateDict.TryGetValue(type, out EventDelegate tempDelegate)) + { + tempDelegate -= targetDelegate; + if (tempDelegate == null) + { + _delegateDict.Remove(type); + } + else + { + _delegateDict[type] = tempDelegate; + } + } + + _delegateLookupDict.Remove(callback); + } + } + + public void Publish(EventBase eventType) + { + if (_delegateDict.TryGetValue(eventType.GetType(), out EventDelegate callback)) + { + callback.Invoke(eventType); + } + } + + public void Clear() + { + _delegateDict.Clear(); + _delegateLookupDict.Clear(); + } + } + + public class EventBase + { + private int _errorCode; + public int ErrorCode + { + get { return _errorCode; } + set { _errorCode = value; } + } + } +} \ No newline at end of file diff --git a/Assets/FirstVillain/EventManager/Sample/Scripts/SampleEvents.cs.meta b/Assets/FirstVillain/EventManager/Scripts/EventBus.cs.meta similarity index 83% rename from Assets/FirstVillain/EventManager/Sample/Scripts/SampleEvents.cs.meta rename to Assets/FirstVillain/EventManager/Scripts/EventBus.cs.meta index 6924e9e..970253d 100644 --- a/Assets/FirstVillain/EventManager/Sample/Scripts/SampleEvents.cs.meta +++ b/Assets/FirstVillain/EventManager/Scripts/EventBus.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 20c6a74d993d2514185dafb53f2b6ee9 +guid: d805fa4bf208bc743a5c594fb7ce5b96 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/FirstVillain/EventManager/Sample.meta b/Assets/FirstVillain/Exceptions.meta similarity index 77% rename from Assets/FirstVillain/EventManager/Sample.meta rename to Assets/FirstVillain/Exceptions.meta index 7f57366..42b052d 100644 --- a/Assets/FirstVillain/EventManager/Sample.meta +++ b/Assets/FirstVillain/Exceptions.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: c83704f62c0d8ab479e531a2a580ca7c +guid: df3e1889274209648b49327c0c1a1743 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/FirstVillain/EventManager/Sample/Scenes.meta b/Assets/FirstVillain/Exceptions/Scripts.meta similarity index 77% rename from Assets/FirstVillain/EventManager/Sample/Scenes.meta rename to Assets/FirstVillain/Exceptions/Scripts.meta index 194029e..b95c01e 100644 --- a/Assets/FirstVillain/EventManager/Sample/Scenes.meta +++ b/Assets/FirstVillain/Exceptions/Scripts.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a6939f1ad30bcf34c94706d8c6260649 +guid: 0dc076918be024147877d7f394a956c9 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/FirstVillain/Exceptions/Scripts/CriticalExceptions.cs b/Assets/FirstVillain/Exceptions/Scripts/CriticalExceptions.cs new file mode 100644 index 0000000..d0dcfb2 --- /dev/null +++ b/Assets/FirstVillain/Exceptions/Scripts/CriticalExceptions.cs @@ -0,0 +1,11 @@ +using System; +using UnityEngine; + +public class ResourceCriticalException : UnityException +{ + public ResourceCriticalException(string message) : base(message) + { } + + public ResourceCriticalException(string message, Exception innerException) : base(message, innerException) + { } +} diff --git a/Assets/FirstVillain/EventManager/Sample/Scripts/SampleListener.cs.meta b/Assets/FirstVillain/Exceptions/Scripts/CriticalExceptions.cs.meta similarity index 83% rename from Assets/FirstVillain/EventManager/Sample/Scripts/SampleListener.cs.meta rename to Assets/FirstVillain/Exceptions/Scripts/CriticalExceptions.cs.meta index 0aca5e3..9498c85 100644 --- a/Assets/FirstVillain/EventManager/Sample/Scripts/SampleListener.cs.meta +++ b/Assets/FirstVillain/Exceptions/Scripts/CriticalExceptions.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 29bceafc84dbcbc45a445598589a16a3 +guid: bb2faed0be04aee4ba5c492fc2a97d4b MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/FirstVillain/Plugins.meta b/Assets/FirstVillain/Extensions.meta similarity index 77% rename from Assets/FirstVillain/Plugins.meta rename to Assets/FirstVillain/Extensions.meta index 67b6458..46ca321 100644 --- a/Assets/FirstVillain/Plugins.meta +++ b/Assets/FirstVillain/Extensions.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4080c592a876fcd469b85c1e1c7908b2 +guid: 3554d81ff3e375e4b9354b811054c289 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/FirstVillain/Extensions/TransformExtension.cs b/Assets/FirstVillain/Extensions/TransformExtension.cs new file mode 100644 index 0000000..e354a01 --- /dev/null +++ b/Assets/FirstVillain/Extensions/TransformExtension.cs @@ -0,0 +1,42 @@ +using UnityEngine; + +public static class TransformExtension +{ + public static void DetroyChildren(this Transform transform) + { + foreach (var child in transform) + { + GameObject.Destroy(((Transform)child).gameObject); + } + } + + public static Transform Reset(this Transform transform, Transform parent = null) + { + if (parent != null) + { + transform.SetParent(parent); + } + + transform.localPosition = Vector3.zero; + transform.localRotation = Quaternion.identity; + transform.localScale = Vector3.one; + return transform; + } + + public static RectTransform Reset(this RectTransform rectTransform, Transform parent, Vector2 deltaSize = default(Vector2)) + { + if (parent != null) + { + rectTransform.SetParent(parent); + } + + rectTransform.anchoredPosition = Vector2.zero; + + rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, deltaSize.x); + rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, deltaSize.y); + + rectTransform.localScale = Vector3.one; + rectTransform.localRotation = Quaternion.identity; + return rectTransform; + } +} diff --git a/Assets/FirstVillain/EventManager/Sample/Scripts/SamplePublisher.cs.meta b/Assets/FirstVillain/Extensions/TransformExtension.cs.meta similarity index 83% rename from Assets/FirstVillain/EventManager/Sample/Scripts/SamplePublisher.cs.meta rename to Assets/FirstVillain/Extensions/TransformExtension.cs.meta index 6532fbc..ccd5de8 100644 --- a/Assets/FirstVillain/EventManager/Sample/Scripts/SamplePublisher.cs.meta +++ b/Assets/FirstVillain/Extensions/TransformExtension.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: cd5bc50399c22b949a535da2d35d8924 +guid: 52962f8621e0ba54faa8682f81bee221 MonoImporter: externalObjects: {} serializedVersion: 2 diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts.meta b/Assets/FirstVillain/InfinityScrollView/Scripts.meta new file mode 100644 index 0000000..0d7dc44 --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aedcacb105fc4ac4d8d326bf517ac934 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalGridInfiniteScrollView.cs b/Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalGridInfiniteScrollView.cs new file mode 100644 index 0000000..2dff892 --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalGridInfiniteScrollView.cs @@ -0,0 +1,122 @@ +using System.Collections; +using UnityEngine; +namespace FirstVillain.ScrollView +{ + public class HorizontalGridInfiniteScrollView : InfiniteScrollView + { + [SerializeField] private int _rowCount = 1; + [SerializeField] private bool _isAtLeft = true; + [SerializeField] private bool _isAtRight = true; + protected override void OnValueChanged(Vector2 normalizedPosition) + { + if (_rowCount <= 0) + { + _rowCount = 1; + } + float viewportInterval = _scrollRect.viewport.rect.width; + float minViewport = -_scrollRect.content.anchoredPosition.x; + Vector2 viewportRange = new Vector2(minViewport - _extendVisibleRange, minViewport + viewportInterval + _extendVisibleRange); + float contentWidth = _padding.x; + for (int i = 0; i < _dataList.Count; i += _rowCount) + { + for (int j = 0; j < _rowCount; j++) + { + int index = i + j; + if (index >= _dataList.Count) + break; + var visibleRange = new Vector2(contentWidth, contentWidth + _dataList[index].CellSize.x); + if (visibleRange.y < viewportRange.x || visibleRange.x > viewportRange.y) + { + RecycleCell(index); + } + } + contentWidth += _dataList[i].CellSize.x + _spacing; + } + contentWidth = _padding.x; + for (int i = 0; i < _dataList.Count; i += _rowCount) + { + for (int j = 0; j < _rowCount; j++) + { + int index = i + j; + if (index >= _dataList.Count) + break; + var visibleRange = new Vector2(contentWidth, contentWidth + _dataList[index].CellSize.x); + if (visibleRange.y >= viewportRange.x && visibleRange.x <= viewportRange.y) + { + SetupCell(index, new Vector2(contentWidth, (_dataList[index].CellSize.y + _spacing) * -j)); + if (visibleRange.y >= viewportRange.x) + _cellList[index].transform.SetAsLastSibling(); + else + _cellList[index].transform.SetAsFirstSibling(); + } + } + contentWidth += _dataList[i].CellSize.x + _spacing; + } + if (_scrollRect.content.sizeDelta.x > viewportInterval) + { + _isAtLeft = viewportRange.x + _extendVisibleRange <= _dataList[0].CellSize.x; + _isAtRight = _scrollRect.content.sizeDelta.x - viewportRange.y + _extendVisibleRange <= _dataList[_dataList.Count - 1].CellSize.x; + } + else + { + _isAtLeft = true; + _isAtRight = true; + } + } + + public sealed override void Refresh() + { + if (!IsInitialized) + { + Initialize(); + } + if (_scrollRect.viewport.rect.width == 0) + StartCoroutine(DelayToRefresh()); + else + DoRefresh(); + } + + private void DoRefresh() + { + float width = _padding.x; + for (int i = 0; i < _dataList.Count; i += _rowCount) + { + width += _dataList[i].CellSize.x + _spacing; + } + for (int i = 0; i < _cellList.Count; i++) + { + RecycleCell(i); + } + width += _padding.y; + _scrollRect.content.sizeDelta = new Vector2(width, _scrollRect.content.sizeDelta.y); + OnValueChanged(_scrollRect.normalizedPosition); + OnRefresh?.Invoke(); + } + + private IEnumerator DelayToRefresh() + { + yield return _waitEndOfFrame; + DoRefresh(); + } + + public override void Snap(int index, float duration) + { + if (!IsInitialized) + return; + if (index >= _dataList.Count) + return; + var columeNumber = index / _rowCount; + var width = _padding.x; + for (int i = 0; i < columeNumber; i++) + { + width += _dataList[i * _rowCount].CellSize.x + _spacing; + } + width = Mathf.Min(_scrollRect.content.rect.width - _scrollRect.viewport.rect.width, width); + if (_scrollRect.content.anchoredPosition.x != width) + { + DoSnapping(new Vector2(-width, 0), duration); + } + } + } +} + diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalGridInfiniteScrollView.cs.meta b/Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalGridInfiniteScrollView.cs.meta new file mode 100644 index 0000000..7738ecd --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalGridInfiniteScrollView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3ba537b7830dfe8489ec7c89ca26bb4b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalInfiniteScrollView.cs b/Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalInfiniteScrollView.cs new file mode 100644 index 0000000..42bc58c --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalInfiniteScrollView.cs @@ -0,0 +1,122 @@ +using System.Collections; +using UnityEngine; +namespace FirstVillain.ScrollView +{ + public class HorizontalInfiniteScrollView : InfiniteScrollView + { + [SerializeField] private bool _isAtLeft = true; + [SerializeField] private bool _isAtRight = true; + + public override void Initialize() + { + base.Initialize(); + _isAtLeft = true; + _isAtRight = true; + } + + protected override void OnValueChanged(Vector2 normalizedPosition) + { + if (_dataList.Count == 0) + return; + float viewportInterval = _scrollRect.viewport.rect.width; + float minViewport = -_scrollRect.content.anchoredPosition.x; + Vector2 viewportRange = new Vector2(minViewport - _extendVisibleRange, minViewport + viewportInterval + _extendVisibleRange); + float contentWidth = _padding.x; + for (int i = 0; i < _dataList.Count; i++) + { + var visibleRange = new Vector2(contentWidth, contentWidth + _dataList[i].CellSize.x); + if (visibleRange.y < viewportRange.x || visibleRange.x > viewportRange.y) + { + RecycleCell(i); + } + contentWidth += _dataList[i].CellSize.x + _spacing; + } + contentWidth = _padding.x; + for (int i = 0; i < _dataList.Count; i++) + { + var visibleRange = new Vector2(contentWidth, contentWidth + _dataList[i].CellSize.x); + if (visibleRange.y >= viewportRange.x && visibleRange.x <= viewportRange.y) + { + SetupCell(i, new Vector2(contentWidth, 0)); + if (visibleRange.y >= viewportRange.x) + _cellList[i].transform.SetAsLastSibling(); + else + _cellList[i].transform.SetAsFirstSibling(); + } + contentWidth += _dataList[i].CellSize.x + _spacing; + } + if (_scrollRect.content.sizeDelta.x > viewportInterval) + { + _isAtLeft = viewportRange.x + _extendVisibleRange <= _dataList[0].CellSize.x; + _isAtRight = _scrollRect.content.sizeDelta.x - viewportRange.y + _extendVisibleRange <= _dataList[_dataList.Count - 1].CellSize.x; + } + else + { + _isAtLeft = true; + _isAtRight = true; + } + } + + public sealed override void Refresh() + { + if (!IsInitialized) + { + Initialize(); + } + if (_scrollRect.viewport.rect.width == 0) + StartCoroutine(DelayToRefresh()); + else + DoRefresh(); + } + + private void DoRefresh() + { + float width = _padding.x; + for (int i = 0; i < _dataList.Count; i++) + { + width += _dataList[i].CellSize.x + _spacing; + } + for (int i = 0; i < _cellList.Count; i++) + { + RecycleCell(i); + } + width += _padding.y; + _scrollRect.content.sizeDelta = new Vector2(width, _scrollRect.content.sizeDelta.y); + OnValueChanged(_scrollRect.normalizedPosition); + OnRefresh?.Invoke(); + } + + private IEnumerator DelayToRefresh() + { + yield return _waitEndOfFrame; + DoRefresh(); + } + + public override void Snap(int index, float duration) + { + if (!IsInitialized) + return; + if (index >= _dataList.Count) + return; + if (_scrollRect.content.rect.width < _scrollRect.viewport.rect.width) + return; + float width = _padding.x; + for (int i = 0; i < index; i++) + { + width += _dataList[i].CellSize.x + _spacing; + } + width = Mathf.Min(_scrollRect.content.rect.width - _scrollRect.viewport.rect.width, width); + if (_scrollRect.content.anchoredPosition.x != width) + { + DoSnapping(new Vector2(-width, 0), duration); + } + } + + public override void Remove(int index) + { + var removeCell = _dataList[index]; + base.Remove(index); + _scrollRect.content.anchoredPosition -= new Vector2(removeCell.CellSize.x + _spacing, 0); + } + } +} \ No newline at end of file diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalInfiniteScrollView.cs.meta b/Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalInfiniteScrollView.cs.meta new file mode 100644 index 0000000..905eef8 --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts/HorizontalInfiniteScrollView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 98c7305fb419ce4448024fdf3bc3c489 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCell.cs b/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCell.cs new file mode 100644 index 0000000..87d4c69 --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCell.cs @@ -0,0 +1,43 @@ +using System; +using UnityEngine; +namespace FirstVillain.ScrollView +{ + public class InfiniteCell : MonoBehaviour + { + public event Action OnSelected; + + private RectTransform _rectTransform; + public RectTransform RectTransform + { + get + { + if (_rectTransform == null) + _rectTransform = GetComponent(); + return _rectTransform; + } + } + + private InfiniteCellData cellData; + public InfiniteCellData CellData + { + set + { + cellData = value; + cellData.OnUpdate(this); + } + get + { + return cellData; + } + } + + public virtual void OnUpdate() { } + + public void InvokeSelected() + { + if (OnSelected != null) + OnSelected.Invoke(gameObject); + } + } +} + diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCell.cs.meta b/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCell.cs.meta new file mode 100644 index 0000000..56bb99d --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCell.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b184ddbaea802444b9d761cb1f7e1aa9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCellData.cs b/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCellData.cs new file mode 100644 index 0000000..fd653e5 --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCellData.cs @@ -0,0 +1,35 @@ +using System; +using UnityEngine; +namespace FirstVillain.ScrollView +{ + public class InfiniteCellData + { + public int Index { get; set; } + public Vector2 CellSize { get; private set; } + + private object _data; + + public Action OnUpdated; + + public InfiniteCellData() + { + + } + + public InfiniteCellData(Vector2 cellSize) + { + this.CellSize = cellSize; + } + + public InfiniteCellData(Vector2 cellSize, object data) + { + this.CellSize = cellSize; + this._data = data; + } + + public void OnUpdate(InfiniteCell cell) + { + OnUpdated?.Invoke(cell); + } + } +} \ No newline at end of file diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCellData.cs.meta b/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCellData.cs.meta new file mode 100644 index 0000000..785ecb0 --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteCellData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f2374611890d914ca5159dabdbbd5ca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteScrollView.cs b/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteScrollView.cs new file mode 100644 index 0000000..489ad88 --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteScrollView.cs @@ -0,0 +1,181 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityEngine.UI; + +namespace FirstVillain.ScrollView +{ + [RequireComponent(typeof(ScrollRect))] + public abstract class InfiniteScrollView : UIBehaviour + { + [SerializeField] private int _cellPoolSize = 20; + [SerializeField] protected float _spacing = 0f; + [SerializeField] protected Vector2 _padding; + [SerializeField] protected float _extendVisibleRange; + + [SerializeField] private InfiniteCell _cellPrefab; + [SerializeField] protected ScrollRect _scrollRect; + + protected List _dataList = new List(); + protected List _cellList = new List(); + protected Queue _cellPool = new Queue(); + protected YieldInstruction _waitEndOfFrame = new WaitForEndOfFrame(); + private Coroutine _snappingProcesser; + + public event Action OnRectTransformUpdate; + public event Action OnCellSelected; + public Action OnRefresh; + + public bool IsInitialized + { + get; + private set; + } + + public virtual void Initialize() + { + if (IsInitialized) + return; + _scrollRect = GetComponent(); + _scrollRect.onValueChanged.AddListener(OnValueChanged); + for (int i = 0; i < _cellPoolSize; i++) + { + var newCell = Instantiate(_cellPrefab, _scrollRect.content); + newCell.gameObject.SetActive(false); + _cellPool.Enqueue(newCell); + } + IsInitialized = true; + } + + protected abstract void OnValueChanged(Vector2 normalizedPosition); + + public abstract void Refresh(); + + public virtual void Add(InfiniteCellData data) + { + if (!IsInitialized) + { + Initialize(); + } + data.Index = _dataList.Count; + _dataList.Add(data); + _cellList.Add(null); + } + + public virtual void Remove(int index) + { + if (!IsInitialized) + { + Initialize(); + } + if (_dataList.Count == 0) + return; + _dataList.RemoveAt(index); + Refresh(); + } + + public abstract void Snap(int index, float duration); + + public void SnapLast(float duration) + { + Snap(_dataList.Count - 1, duration); + } + + protected void DoSnapping(Vector2 target, float duration) + { + if (!gameObject.activeInHierarchy) + return; + StopSnapping(); + _snappingProcesser = StartCoroutine(ProcessSnapping(target, duration)); + } + + public void StopSnapping() + { + if (_snappingProcesser != null) + { + StopCoroutine(_snappingProcesser); + _snappingProcesser = null; + } + } + + private IEnumerator ProcessSnapping(Vector2 target, float duration) + { + _scrollRect.velocity = Vector2.zero; + Vector2 startPos = _scrollRect.content.anchoredPosition; + float t = 0; + while (t < 1f) + { + if (duration <= 0) + t = 1; + else + t += Time.deltaTime / duration; + _scrollRect.content.anchoredPosition = Vector2.Lerp(startPos, target, t); + var normalizedPos = _scrollRect.normalizedPosition; + if (normalizedPos.y < 0 || normalizedPos.x > 1) + { + break; + } + yield return null; + } + if (duration <= 0) + OnValueChanged(_scrollRect.normalizedPosition); + _snappingProcesser = null; + } + + protected void SetupCell(int index, Vector2 pos) + { + if (_cellList[index] == null) + { + var cell = _cellPool.Dequeue(); + cell.gameObject.SetActive(true); + cell.CellData = _dataList[index]; + cell.RectTransform.anchoredPosition = pos; + _cellList[index] = cell; + cell.OnSelected += OnCellObjSelected; + } + } + + protected void RecycleCell(int index) + { + if (_cellList[index] != null) + { + var cell = _cellList[index]; + _cellList[index] = null; + _cellPool.Enqueue(cell); + cell.gameObject.SetActive(false); + cell.OnSelected -= OnCellObjSelected; + } + } + + private void OnCellObjSelected(GameObject selectedCell) + { + OnCellSelected?.Invoke(selectedCell); + } + + public virtual void Clear() + { + if (IsInitialized == false) + Initialize(); + _scrollRect.velocity = Vector2.zero; + _scrollRect.content.anchoredPosition = Vector2.zero; + _dataList.Clear(); + for (int i = 0; i < _cellList.Count; i++) + { + RecycleCell(i); + } + _cellList.Clear(); + Refresh(); + } + + protected override void OnRectTransformDimensionsChange() + { + base.OnRectTransformDimensionsChange(); + if (_scrollRect) + { + OnRectTransformUpdate?.Invoke(); + } + } + } +} \ No newline at end of file diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteScrollView.cs.meta b/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteScrollView.cs.meta new file mode 100644 index 0000000..1107ed1 --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts/InfiniteScrollView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cda563cd2d16cff448cfca3e81aed475 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts/VerticalGridInfiniteScrollView.cs b/Assets/FirstVillain/InfinityScrollView/Scripts/VerticalGridInfiniteScrollView.cs new file mode 100644 index 0000000..a7f24a0 --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts/VerticalGridInfiniteScrollView.cs @@ -0,0 +1,123 @@ +using System.Collections; +using UnityEngine; + +namespace FirstVillain.ScrollView +{ + public class VerticalGridInfiniteScrollView : InfiniteScrollView + { + [SerializeField] private bool _isAtTop = true; + [SerializeField] private bool _isAtBottom = true; + [SerializeField] private int _columeCount = 1; + + protected override void OnValueChanged(Vector2 normalizedPosition) + { + if (_columeCount <= 0) + { + _columeCount = 1; + } + float viewportInterval = _scrollRect.viewport.rect.height; + float minViewport = _scrollRect.content.anchoredPosition.y; + Vector2 viewportRange = new Vector2(minViewport, minViewport + viewportInterval); + float contentHeight = _padding.x; + for (int i = 0; i < _dataList.Count; i += _columeCount) + { + for (int j = 0; j < _columeCount; j++) + { + int index = i + j; + if (index >= _dataList.Count) + break; + var visibleRange = new Vector2(contentHeight, contentHeight + _dataList[index].CellSize.y); + if (visibleRange.y < viewportRange.x || visibleRange.x > viewportRange.y) + { + RecycleCell(index); + } + } + contentHeight += _dataList[i].CellSize.y + _spacing; + } + contentHeight = _padding.x; + for (int i = 0; i < _dataList.Count; i += _columeCount) + { + for (int j = 0; j < _columeCount; j++) + { + int index = i + j; + if (index >= _dataList.Count) + break; + var visibleRange = new Vector2(contentHeight, contentHeight + _dataList[index].CellSize.y); + if (visibleRange.y >= viewportRange.x && visibleRange.x <= viewportRange.y) + { + SetupCell(index, new Vector2((_dataList[index].CellSize.x + _spacing) * j, -contentHeight)); + if (visibleRange.y >= viewportRange.x) + _cellList[index].transform.SetAsLastSibling(); + else + _cellList[index].transform.SetAsFirstSibling(); + } + } + contentHeight += _dataList[i].CellSize.y + _spacing; + } + if (_scrollRect.content.sizeDelta.y > viewportInterval) + { + _isAtTop = viewportRange.x + _extendVisibleRange <= _dataList[0].CellSize.y; + _isAtBottom = _scrollRect.content.sizeDelta.y - viewportRange.y + _extendVisibleRange <= _dataList[_dataList.Count - 1].CellSize.y; + } + else + { + _isAtTop = true; + _isAtBottom = true; + } + } + + public sealed override void Refresh() + { + if (!IsInitialized) + { + Initialize(); + } + if (_scrollRect.viewport.rect.height == 0) + StartCoroutine(DelayToRefresh()); + else + DoRefresh(); + } + + private void DoRefresh() + { + float height = _padding.x; + for (int i = 0; i < _dataList.Count; i += _columeCount) + { + height += _dataList[i].CellSize.y + _spacing; + } + for (int i = 0; i < _cellList.Count; i++) + { + RecycleCell(i); + } + height += _padding.y; + _scrollRect.content.sizeDelta = new Vector2(_scrollRect.content.sizeDelta.x, height); + OnValueChanged(_scrollRect.normalizedPosition); + OnRefresh?.Invoke(); + } + + private IEnumerator DelayToRefresh() + { + yield return _waitEndOfFrame; + DoRefresh(); + } + + public override void Snap(int index, float duration) + { + if (!IsInitialized) + return; + if (index >= _dataList.Count) + return; + var rowNumber = index / _columeCount; + var height = _padding.x; + for (int i = 0; i < rowNumber; i++) + { + height += _dataList[i * _columeCount].CellSize.y + _spacing; + } + height = Mathf.Min(_scrollRect.content.rect.height - _scrollRect.viewport.rect.height, height); + if (_scrollRect.content.anchoredPosition.y != height) + { + DoSnapping(new Vector2(0, height), duration); + } + } + } +} \ No newline at end of file diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts/VerticalGridInfiniteScrollView.cs.meta b/Assets/FirstVillain/InfinityScrollView/Scripts/VerticalGridInfiniteScrollView.cs.meta new file mode 100644 index 0000000..ed29450 --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts/VerticalGridInfiniteScrollView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 692efced3d752f5448fc15089d4eadf5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts/VerticalInfiniteScrollView.cs b/Assets/FirstVillain/InfinityScrollView/Scripts/VerticalInfiniteScrollView.cs new file mode 100644 index 0000000..b104445 --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts/VerticalInfiniteScrollView.cs @@ -0,0 +1,123 @@ +using System.Collections; +using UnityEngine; + +namespace FirstVillain.ScrollView +{ + public class VerticalInfiniteScrollView : InfiniteScrollView + { + [SerializeField] private bool _isAtTop = true; + [SerializeField] private bool _isAtBottom = true; + + public override void Initialize() + { + base.Initialize(); + _isAtTop = true; + _isAtBottom = true; + } + + protected override void OnValueChanged(Vector2 normalizedPosition) + { + if (_dataList.Count == 0) + return; + float viewportInterval = _scrollRect.viewport.rect.height; + float minViewport = _scrollRect.content.anchoredPosition.y; + Vector2 viewportRange = new Vector2(minViewport - _extendVisibleRange, minViewport + viewportInterval + _extendVisibleRange); + float contentHeight = _padding.x; + for (int i = 0; i < _dataList.Count; i++) + { + var visibleRange = new Vector2(contentHeight, contentHeight + _dataList[i].CellSize.y); + if (visibleRange.y < viewportRange.x || visibleRange.x > viewportRange.y) + { + RecycleCell(i); + } + contentHeight += _dataList[i].CellSize.y + _spacing; + } + contentHeight = _padding.x; + for (int i = 0; i < _dataList.Count; i++) + { + var visibleRange = new Vector2(contentHeight, contentHeight + _dataList[i].CellSize.y); + if (visibleRange.y >= viewportRange.x && visibleRange.x <= viewportRange.y) + { + SetupCell(i, new Vector2(0, -contentHeight)); + if (visibleRange.y >= viewportRange.x) + _cellList[i].transform.SetAsLastSibling(); + else + _cellList[i].transform.SetAsFirstSibling(); + } + contentHeight += _dataList[i].CellSize.y + _spacing; + } + if (_scrollRect.content.sizeDelta.y > viewportInterval) + { + _isAtTop = viewportRange.x + _extendVisibleRange <= 0.001f; + _isAtBottom = _scrollRect.content.sizeDelta.y - viewportRange.y + _extendVisibleRange <= 0.001f; + } + else + { + _isAtTop = true; + _isAtBottom = true; + } + } + + public sealed override void Refresh() + { + if (!IsInitialized) + { + Initialize(); + } + if (_scrollRect.viewport.rect.height == 0) + StartCoroutine(DelayToRefresh()); + else + DoRefresh(); + } + + private void DoRefresh() + { + float height = _padding.x; + for (int i = 0; i < _dataList.Count; i++) + { + height += _dataList[i].CellSize.y + _spacing; + } + for (int i = 0; i < _cellList.Count; i++) + { + RecycleCell(i); + } + height += _padding.y; + _scrollRect.content.sizeDelta = new Vector2(_scrollRect.content.sizeDelta.x, height); + OnValueChanged(_scrollRect.normalizedPosition); + OnRefresh?.Invoke(); + } + + private IEnumerator DelayToRefresh() + { + yield return _waitEndOfFrame; + DoRefresh(); + } + + public override void Snap(int index, float duration) + { + if (!IsInitialized) + return; + if (index >= _dataList.Count) + return; + if (_scrollRect.content.rect.height < _scrollRect.viewport.rect.height) + return; + float height = _padding.x; + for (int i = 0; i < index; i++) + { + height += _dataList[i].CellSize.y + _spacing; + } + height = Mathf.Min(_scrollRect.content.rect.height - _scrollRect.viewport.rect.height, height); + if (_scrollRect.content.anchoredPosition.y != height) + { + DoSnapping(new Vector2(0, height), duration); + } + } + + public override void Remove(int index) + { + var removeCell = _dataList[index]; + base.Remove(index); + _scrollRect.content.anchoredPosition -= new Vector2(0, removeCell.CellSize.y + _spacing); + } + } +} \ No newline at end of file diff --git a/Assets/FirstVillain/InfinityScrollView/Scripts/VerticalInfiniteScrollView.cs.meta b/Assets/FirstVillain/InfinityScrollView/Scripts/VerticalInfiniteScrollView.cs.meta new file mode 100644 index 0000000..e16591f --- /dev/null +++ b/Assets/FirstVillain/InfinityScrollView/Scripts/VerticalInfiniteScrollView.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5add22e6e1ba6e44e92b2bc861b338ef +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FirstVillain/ObjectPool.meta b/Assets/FirstVillain/ObjectPool.meta new file mode 100644 index 0000000..3baf628 --- /dev/null +++ b/Assets/FirstVillain/ObjectPool.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1128e5138db06b045ba9419c71b5ad3f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FirstVillain/ObjectPool/PoolManager.cs b/Assets/FirstVillain/ObjectPool/PoolManager.cs new file mode 100644 index 0000000..cdb297b --- /dev/null +++ b/Assets/FirstVillain/ObjectPool/PoolManager.cs @@ -0,0 +1,191 @@ +using FirstVillain.Singleton; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using UnityEngine; +using UnityEngine.Pool; + +namespace FirstVillain.ObjectPool +{ + //GameObject Pooling + public class PoolManager : UnitySingleton + { + [SerializeField] private int _capacity = 10; + [SerializeField] private int _maxSize = 1000; + [SerializeField] private bool _collectionCheck = true; + + //À½... Ŭ·¡½º ŸÀÔº°·Î Ç®À» ¸¸µå´Â°Ç? + private Dictionary _poolDict = new(); + + public GameObject Spawn(string path, Transform parent = null) + { + string name = Path.GetFileName(path); + if(!_poolDict.ContainsKey(name)) + { + CreatePoolItem(path); + } + + var pooledObj = _poolDict[name].Pool.Get(); + + if (parent != null) + { + pooledObj.transform.Reset(parent); + } + + return pooledObj; + } + + public T Spawn(string path, Transform parent = null) + { + return Spawn(path, parent).GetComponent(); + } + + public void ReleaseGameObject(GameObject obj) + { + if (_poolDict.ContainsKey(obj.name)) + { + try + { + obj.transform.Reset(); + try + { + _poolDict[obj.name].Pool.Release(obj); + } + catch + { + obj.SetActive(false); + } + } + catch (Exception ex) + { + Debug.LogError($"Exception has occured!!! Object : {obj.name} === {ex.Message}"); + } + } + else + { + Debug.LogWarning($"Object[{obj.name}] does not exist in pool dictionary. But it's been destroyed anyway :D"); + Destroy(obj); + } + } + + #region Create Pool + //ÇöÀç Resources.Load ±â¹ÝÀ¸·Î ±¸Çö... + public void CreatePoolItem(string path) + { + string resourceName = Path.GetFileName(path); + if(!_poolDict.ContainsKey(resourceName)) + { + var resource = LoadAssetOnResources(path); + var pool = new PoolItem(path, CreateNewObjectPool(resource, resourceName)); + _poolDict.Add(resourceName, pool); + } + } + + private ObjectPool CreateNewObjectPool(GameObject prefab, string resourceName) + { + return new ObjectPool( + () => + { + GameObject obj = Instantiate(prefab); + obj.name = resourceName; + return obj; + }, + OnGetItem, + OnReleaseItem, + OnDestroyItem, + _collectionCheck /* Collection checks will throw errors if we try to release an item that is already in the pool.*/, + _capacity/*defalut capacity*/, + _maxSize + ); + } + + private void OnGetItem(GameObject obj) + { + obj.SetActive(true); + } + + private void OnReleaseItem(GameObject obj) + { + obj.SetActive(false); + } + + private void OnDestroyItem(GameObject obj) + { + Destroy(obj); + } + + #endregion Create Pool + + #region Resource Load + + //¸®¼Ò½º °ü¸®·Î ÀÌÀü ¿¹Á¤ + public T LoadAssetOnResources(string resourcePath) where T : UnityEngine.Object + { + var resourceObj = Resources.Load(resourcePath); + if (resourceObj == null) + { + throw new ResourceCriticalException($"Cannot Load Resources Object [{resourcePath}]"); + } + + return resourceObj; + } + #endregion Resource Load + + #region AssetBundle Refresh Shader + private void RefreshShader(UnityEngine.Object obj) + { + //AssetBundleÀº custom shader¸¦ Æ÷ÇÔÇÏÁö ¾ÊÀ¸¹Ç·Î ºÒ·¯¿Ã ½ÃÁ¡¿¡ shader¸¦ Àç¼³Á¤ÇØÁØ´Ù. + if (typeof(GameObject) == typeof(T)) + { + GameObject go = obj as GameObject; + if (go.GetComponents() != null) + { + RefreshShader(go.GetComponents()); + } + + if (go.GetComponentsInChildren(true) != null) + { + RefreshShader(go.GetComponentsInChildren(true)); + } + + } + else if (typeof(Material) == typeof(T)) + { + RefreshShader(obj as Material); + } + } + + private void RefreshShader(Material material) + { + Shader shader = Shader.Find(material.shader.name); + if (shader != null) + { + material.shader = shader; + } + else + { + Debug.LogWarning(string.Format("unable to refresh shader: [{0}] in material [{1}]", material.shader.name, material.name)); + } + } + + private void RefreshShader(Renderer[] renderers) + { + if (null == renderers) + { + return; + } + + for (int i = 0; i < renderers.Length; i++) + { + Material[] materials = renderers[i].sharedMaterials; + for (int j = 0; j < materials.Length; j++) + { + if (materials[j] == null) { continue; } + RefreshShader(materials[j]); + } + } + } + #endregion AssetBundle Refresh Shader + } +} \ No newline at end of file diff --git a/Assets/FirstVillain/ObjectPool/PoolManager.cs.meta b/Assets/FirstVillain/ObjectPool/PoolManager.cs.meta new file mode 100644 index 0000000..d416370 --- /dev/null +++ b/Assets/FirstVillain/ObjectPool/PoolManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 885efdebb82f5f14bba737c867e902da +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FirstVillain/ObjectPool/Scripts.meta b/Assets/FirstVillain/ObjectPool/Scripts.meta new file mode 100644 index 0000000..8b56f28 --- /dev/null +++ b/Assets/FirstVillain/ObjectPool/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 74481aa5ac659be4ab8460d20956ed3d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FirstVillain/ObjectPool/Scripts/PoolItem.cs b/Assets/FirstVillain/ObjectPool/Scripts/PoolItem.cs new file mode 100644 index 0000000..5275b35 --- /dev/null +++ b/Assets/FirstVillain/ObjectPool/Scripts/PoolItem.cs @@ -0,0 +1,20 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Pool; + +namespace FirstVillain.ObjectPool +{ + public class PoolItem + { + public string Path { get; private set; } + public IObjectPool Pool { get; private set; } + + public PoolItem(string path, ObjectPool pool) + { + Path = path; + Pool = pool; + } + } + +} diff --git a/Assets/FirstVillain/ObjectPool/Scripts/PoolItem.cs.meta b/Assets/FirstVillain/ObjectPool/Scripts/PoolItem.cs.meta new file mode 100644 index 0000000..6465563 --- /dev/null +++ b/Assets/FirstVillain/ObjectPool/Scripts/PoolItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b3b33e646436f184dbe0e8a8009734c1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FirstVillain/ObjectPool/Scripts/PoolManager.cs b/Assets/FirstVillain/ObjectPool/Scripts/PoolManager.cs new file mode 100644 index 0000000..9bba959 --- /dev/null +++ b/Assets/FirstVillain/ObjectPool/Scripts/PoolManager.cs @@ -0,0 +1,18 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class PoolManager : MonoBehaviour +{ + // Start is called before the first frame update + void Start() + { + + } + + // Update is called once per frame + void Update() + { + + } +} diff --git a/Assets/FirstVillain/ObjectPool/Scripts/PoolManager.cs.meta b/Assets/FirstVillain/ObjectPool/Scripts/PoolManager.cs.meta new file mode 100644 index 0000000..b41c59a --- /dev/null +++ b/Assets/FirstVillain/ObjectPool/Scripts/PoolManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 84874bcaa5a0a144dad2b80a4c9545ef +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FirstVillain/Plugins/FirstVillainLibrary.dll b/Assets/FirstVillain/Plugins/FirstVillainLibrary.dll deleted file mode 100644 index a374ac760d1a21a0c150fbe57d7f2bf0a7723e92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21504 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 : MonoBehaviour where T : UnityEngine.Component + { + private static T _instance = null; + + public static T Instance + { + get + { + if (_instance == null) + { + string name = (typeof(T)).ToString(); + _instance = new GameObject(name).AddComponent(); + } + + return _instance; + } + } + private void Awake() + { + if (_instance != null && _instance != this) + { + Destroy(gameObject); + return; + } + else + { + _instance = this as T; + } + + DontDestroyOnLoad(gameObject); + + AwakeSingleton(); + } + + private void OnDestroy() + { + if (_instance == this) + { + _instance = null; + } + } + + protected virtual void AwakeSingleton() + { } + } + public class UnitySingletonOnce : MonoBehaviour where T : UnityEngine.Component + { + private static T _instance = null; + + public static T Instance + { + get + { + if (_instance == null) + { + string name = (typeof(T)).ToString(); + _instance = new GameObject(name).AddComponent(); + } + + return _instance; + } + } + private void Awake() + { + if (_instance != null && _instance != this) + { + Destroy(gameObject); + return; + } + else + { + _instance = this as T; + } + + AwakeSingleton(); + } + + private void OnDestroy() + { + if (_instance == this) + { + _instance = null; + } + } + + protected virtual void AwakeSingleton() + { } + } +} diff --git a/Assets/FirstVillain/Singleton/UnitySingleton.cs.meta b/Assets/FirstVillain/Singleton/UnitySingleton.cs.meta new file mode 100644 index 0000000..8a28893 --- /dev/null +++ b/Assets/FirstVillain/Singleton/UnitySingleton.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7ead3c5ad702e604aa2162aecd9baf1b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/FirstVillain/EventManager/Sample/Scenes/SampleNextScene.unity b/Assets/Scenes/Sample.unity similarity index 94% rename from Assets/FirstVillain/EventManager/Sample/Scenes/SampleNextScene.unity rename to Assets/Scenes/Sample.unity index 1aec802..8d0e42b 100644 --- a/Assets/FirstVillain/EventManager/Sample/Scenes/SampleNextScene.unity +++ b/Assets/Scenes/Sample.unity @@ -123,7 +123,7 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} ---- !u!1 &1819587514 +--- !u!1 &449865083 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -131,9 +131,9 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 1819587517} - - component: {fileID: 1819587516} - - component: {fileID: 1819587515} + - component: {fileID: 449865086} + - component: {fileID: 449865085} + - component: {fileID: 449865084} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -141,21 +141,21 @@ GameObject: m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!81 &1819587515 +--- !u!81 &449865084 AudioListener: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1819587514} + m_GameObject: {fileID: 449865083} m_Enabled: 1 ---- !u!20 &1819587516 +--- !u!20 &449865085 Camera: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1819587514} + m_GameObject: {fileID: 449865083} m_Enabled: 1 serializedVersion: 2 m_ClearFlags: 1 @@ -192,13 +192,13 @@ Camera: m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 ---- !u!4 &1819587517 +--- !u!4 &449865086 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1819587514} + m_GameObject: {fileID: 449865083} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: -10} m_LocalScale: {x: 1, y: 1, z: 1} diff --git a/Assets/FirstVillain/EventManager/Sample/Scenes/SampleNextScene.unity.meta b/Assets/Scenes/Sample.unity.meta similarity index 74% rename from Assets/FirstVillain/EventManager/Sample/Scenes/SampleNextScene.unity.meta rename to Assets/Scenes/Sample.unity.meta index 1471b3d..a90cf57 100644 --- a/Assets/FirstVillain/EventManager/Sample/Scenes/SampleNextScene.unity.meta +++ b/Assets/Scenes/Sample.unity.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: a4094ca87d4a63a438643822920c39c9 +guid: 2136612acad4b7a43ac7a55ee222ad75 DefaultImporter: externalObjects: {} userData: