Compare commits

...

2 Commits

Author SHA1 Message Date
villaingames
ffc837728e Merge branch 'main' of https://git.firstvillain.com/Public/AssetBase 2023-09-19 21:56:45 +09:00
villaingames
2fa543d0ff 오브젝트 풀링 추가, dll 제거 -> 코드로 전환 2023-09-19 21:56:41 +09:00
45 changed files with 1371 additions and 889 deletions

View File

@ -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

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 2cda990e2423bbf4892e6590ba056729
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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;
}
}

View File

@ -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<TestEvent>(OnTestEvent);
}
private void OnDisable()
{
EventBus.Instance.Unsubscribe<TestEvent>(OnTestEvent);
}
private void OnTestEvent(TestEvent e)
{
Debug.Log($"Test event got message {e.TestIntValue} {e.TestStringValue}");
}
}

View File

@ -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");
}
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: a8734ea3ee422854a8491e4ea1703e8f
guid: 55b7d7145426a6442afc947ca54a1dd6
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -0,0 +1,76 @@
using FirstVillain.Singleton;
using System;
using System.Collections.Generic;
using UnityEngine.Events;
namespace FirstVillain.EventBus
{
public class EventBus : UnitySingleton<EventBus>
{
private readonly Dictionary<Type, EventDelegate> _delegateDict = new Dictionary<Type, EventDelegate>();
private readonly Dictionary<Delegate, EventDelegate> _delegateLookupDict = new Dictionary<Delegate, EventDelegate>();
public delegate void EventDelegate<T>(T myEvent) where T : EventBase;
private delegate void EventDelegate(EventBase myEvent);
public void Subscribe<T>(EventDelegate<T> 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<T>(EventDelegate<T> 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; }
}
}
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 20c6a74d993d2514185dafb53f2b6ee9
guid: d805fa4bf208bc743a5c594fb7ce5b96
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: c83704f62c0d8ab479e531a2a580ca7c
guid: df3e1889274209648b49327c0c1a1743
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: a6939f1ad30bcf34c94706d8c6260649
guid: 0dc076918be024147877d7f394a956c9
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -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)
{ }
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 29bceafc84dbcbc45a445598589a16a3
guid: bb2faed0be04aee4ba5c492fc2a97d4b
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 4080c592a876fcd469b85c1e1c7908b2
guid: 3554d81ff3e375e4b9354b811054c289
folderAsset: yes
DefaultImporter:
externalObjects: {}

View File

@ -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;
}
}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: cd5bc50399c22b949a535da2d35d8924
guid: 52962f8621e0ba54faa8682f81bee221
MonoImporter:
externalObjects: {}
serializedVersion: 2

View File

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

View File

@ -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);
}
}
}
}

View File

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

View File

@ -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);
}
}
}

View File

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

View File

@ -0,0 +1,43 @@
using System;
using UnityEngine;
namespace FirstVillain.ScrollView
{
public class InfiniteCell : MonoBehaviour
{
public event Action<GameObject> OnSelected;
private RectTransform _rectTransform;
public RectTransform RectTransform
{
get
{
if (_rectTransform == null)
_rectTransform = GetComponent<RectTransform>();
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);
}
}
}

View File

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

View File

@ -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<InfiniteCell> 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);
}
}
}

View File

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

View File

@ -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<InfiniteCellData> _dataList = new List<InfiniteCellData>();
protected List<InfiniteCell> _cellList = new List<InfiniteCell>();
protected Queue<InfiniteCell> _cellPool = new Queue<InfiniteCell>();
protected YieldInstruction _waitEndOfFrame = new WaitForEndOfFrame();
private Coroutine _snappingProcesser;
public event Action OnRectTransformUpdate;
public event Action<GameObject> OnCellSelected;
public Action OnRefresh;
public bool IsInitialized
{
get;
private set;
}
public virtual void Initialize()
{
if (IsInitialized)
return;
_scrollRect = GetComponent<ScrollRect>();
_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();
}
}
}
}

View File

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

View File

@ -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);
}
}
}
}

View File

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

View File

@ -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);
}
}
}

View File

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

View File

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

View File

@ -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<PoolManager>
{
[SerializeField] private int _capacity = 10;
[SerializeField] private int _maxSize = 1000;
[SerializeField] private bool _collectionCheck = true;
//음... 클래스 타입별로 풀을 만드는건?
private Dictionary<string, PoolItem> _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<T>(string path, Transform parent = null)
{
return Spawn(path, parent).GetComponent<T>();
}
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<GameObject>(path);
var pool = new PoolItem(path, CreateNewObjectPool(resource, resourceName));
_poolDict.Add(resourceName, pool);
}
}
private ObjectPool<GameObject> CreateNewObjectPool(GameObject prefab, string resourceName)
{
return new ObjectPool<GameObject>(
() =>
{
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<T>(string resourcePath) where T : UnityEngine.Object
{
var resourceObj = Resources.Load<T>(resourcePath);
if (resourceObj == null)
{
throw new ResourceCriticalException($"Cannot Load Resources Object [{resourcePath}]");
}
return resourceObj;
}
#endregion Resource Load
#region AssetBundle Refresh Shader
private void RefreshShader<T>(UnityEngine.Object obj)
{
//AssetBundle은 custom shader를 포함하지 않으므로 불러올 시점에 shader를 재설정해준다.
if (typeof(GameObject) == typeof(T))
{
GameObject go = obj as GameObject;
if (go.GetComponents<Renderer>() != null)
{
RefreshShader(go.GetComponents<Renderer>());
}
if (go.GetComponentsInChildren<Renderer>(true) != null)
{
RefreshShader(go.GetComponentsInChildren<Renderer>(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
}
}

View File

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

View File

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

View File

@ -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<GameObject> Pool { get; private set; }
public PoolItem(string path, ObjectPool<GameObject> pool)
{
Path = path;
Pool = pool;
}
}
}

View File

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

View File

@ -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()
{
}
}

View File

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

View File

@ -1,33 +0,0 @@
fileFormatVersion: 2
guid: 8c96c7edf3aa4ce4cb713a09ad33e2cc
PluginImporter:
externalObjects: {}
serializedVersion: 2
iconMap: {}
executionOrder: {}
defineConstraints: []
isPreloaded: 0
isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData:
- first:
Any:
second:
enabled: 1
settings: {}
- first:
Editor: Editor
second:
enabled: 0
settings:
DefaultValueInitialized: true
- first:
Windows Store Apps: WindowsStoreApps
second:
enabled: 0
settings:
CPU: AnyCPU
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@ -0,0 +1,93 @@
using UnityEngine;
namespace FirstVillain.Singleton
{
public class UnitySingleton<T> : 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<T>();
}
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<T> : 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<T>();
}
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()
{ }
}
}

View File

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

View File

@ -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}

View File

@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: a4094ca87d4a63a438643822920c39c9
guid: 2136612acad4b7a43ac7a55ee222ad75
DefaultImporter:
externalObjects: {}
userData: