first commit
This commit is contained in:
commit
2a326cb7f4
8
Assets/Scenes.meta
Normal file
8
Assets/Scenes.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bf18b4a67daaf0e4a8c55131f4788acb
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
432
Assets/Scenes/SampleScene.unity
Normal file
432
Assets/Scenes/SampleScene.unity
Normal file
@ -0,0 +1,432 @@
|
||||
%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: 10
|
||||
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: 0
|
||||
m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1}
|
||||
m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 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.18028378, g: 0.22571412, b: 0.30692285, a: 1}
|
||||
m_UseRadianceAmbientProbe: 0
|
||||
--- !u!157 &3
|
||||
LightmapSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 12
|
||||
m_GISettings:
|
||||
serializedVersion: 2
|
||||
m_BounceScale: 1
|
||||
m_IndirectOutputScale: 1
|
||||
m_AlbedoBoost: 1
|
||||
m_EnvironmentLightingMode: 0
|
||||
m_EnableBakedLightmaps: 1
|
||||
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_ReflectionCompression: 2
|
||||
m_MixedBakeMode: 2
|
||||
m_BakeBackend: 1
|
||||
m_PVRSampling: 1
|
||||
m_PVRDirectSampleCount: 32
|
||||
m_PVRSampleCount: 512
|
||||
m_PVRBounces: 2
|
||||
m_PVREnvironmentSampleCount: 256
|
||||
m_PVREnvironmentReferencePointCount: 2048
|
||||
m_PVRFilteringMode: 1
|
||||
m_PVRDenoiserTypeDirect: 1
|
||||
m_PVRDenoiserTypeIndirect: 1
|
||||
m_PVRDenoiserTypeAO: 1
|
||||
m_PVRFilterTypeDirect: 0
|
||||
m_PVRFilterTypeIndirect: 0
|
||||
m_PVRFilterTypeAO: 0
|
||||
m_PVREnvironmentMIS: 1
|
||||
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: 20201, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_LightingSettings: {fileID: 0}
|
||||
--- !u!196 &4
|
||||
NavMeshSettings:
|
||||
serializedVersion: 2
|
||||
m_ObjectHideFlags: 0
|
||||
m_BuildSettings:
|
||||
serializedVersion: 3
|
||||
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
|
||||
buildHeightMesh: 0
|
||||
maxJobWorkers: 0
|
||||
preserveTilesOutsideBounds: 0
|
||||
debug:
|
||||
m_Flags: 0
|
||||
m_NavMeshData: {fileID: 0}
|
||||
--- !u!1 &330585543
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 330585546}
|
||||
- component: {fileID: 330585545}
|
||||
- component: {fileID: 330585544}
|
||||
- component: {fileID: 330585547}
|
||||
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 &330585544
|
||||
AudioListener:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 330585543}
|
||||
m_Enabled: 1
|
||||
--- !u!20 &330585545
|
||||
Camera:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 330585543}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 2
|
||||
m_ClearFlags: 1
|
||||
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
|
||||
m_projectionMatrixMode: 1
|
||||
m_GateFitMode: 2
|
||||
m_FOVAxisMode: 0
|
||||
m_Iso: 200
|
||||
m_ShutterSpeed: 0.005
|
||||
m_Aperture: 16
|
||||
m_FocusDistance: 10
|
||||
m_FocalLength: 50
|
||||
m_BladeCount: 5
|
||||
m_Curvature: {x: 2, y: 11}
|
||||
m_BarrelClipping: 0.25
|
||||
m_Anamorphism: 0
|
||||
m_SensorSize: {x: 36, y: 24}
|
||||
m_LensShift: {x: 0, y: 0}
|
||||
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: 0
|
||||
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: 3
|
||||
m_HDR: 1
|
||||
m_AllowMSAA: 1
|
||||
m_AllowDynamicResolution: 0
|
||||
m_ForceIntoRT: 0
|
||||
m_OcclusionCulling: 1
|
||||
m_StereoConvergence: 10
|
||||
m_StereoSeparation: 0.022
|
||||
--- !u!4 &330585546
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 330585543}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 1, z: -10}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &330585547
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 330585543}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_RenderShadows: 1
|
||||
m_RequiresDepthTextureOption: 2
|
||||
m_RequiresOpaqueTextureOption: 2
|
||||
m_CameraType: 0
|
||||
m_Cameras: []
|
||||
m_RendererIndex: -1
|
||||
m_VolumeLayerMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 1
|
||||
m_VolumeTrigger: {fileID: 0}
|
||||
m_VolumeFrameworkUpdateModeOption: 2
|
||||
m_RenderPostProcessing: 1
|
||||
m_Antialiasing: 0
|
||||
m_AntialiasingQuality: 2
|
||||
m_StopNaN: 0
|
||||
m_Dithering: 0
|
||||
m_ClearDepth: 1
|
||||
m_AllowXRRendering: 1
|
||||
m_AllowHDROutput: 1
|
||||
m_UseScreenCoordOverride: 0
|
||||
m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_RequiresDepthTexture: 0
|
||||
m_RequiresColorTexture: 0
|
||||
m_Version: 2
|
||||
m_TaaSettings:
|
||||
quality: 3
|
||||
frameInfluence: 0.1
|
||||
jitterScale: 1
|
||||
mipBias: 0
|
||||
varianceClampScale: 0.9
|
||||
contrastAdaptiveSharpening: 0
|
||||
--- !u!1 &410087039
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 410087041}
|
||||
- component: {fileID: 410087040}
|
||||
- component: {fileID: 410087042}
|
||||
m_Layer: 0
|
||||
m_Name: Directional Light
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!108 &410087040
|
||||
Light:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 410087039}
|
||||
m_Enabled: 1
|
||||
serializedVersion: 11
|
||||
m_Type: 1
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_Intensity: 2
|
||||
m_Range: 10
|
||||
m_SpotAngle: 30
|
||||
m_InnerSpotAngle: 21.80208
|
||||
m_CookieSize: 10
|
||||
m_Shadows:
|
||||
m_Type: 2
|
||||
m_Resolution: -1
|
||||
m_CustomResolution: -1
|
||||
m_Strength: 1
|
||||
m_Bias: 0.05
|
||||
m_NormalBias: 0.4
|
||||
m_NearPlane: 0.2
|
||||
m_CullingMatrixOverride:
|
||||
e00: 1
|
||||
e01: 0
|
||||
e02: 0
|
||||
e03: 0
|
||||
e10: 0
|
||||
e11: 1
|
||||
e12: 0
|
||||
e13: 0
|
||||
e20: 0
|
||||
e21: 0
|
||||
e22: 1
|
||||
e23: 0
|
||||
e30: 0
|
||||
e31: 0
|
||||
e32: 0
|
||||
e33: 1
|
||||
m_UseCullingMatrixOverride: 0
|
||||
m_Cookie: {fileID: 0}
|
||||
m_DrawHalo: 0
|
||||
m_Flare: {fileID: 0}
|
||||
m_RenderMode: 0
|
||||
m_CullingMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_RenderingLayerMask: 1
|
||||
m_Lightmapping: 4
|
||||
m_LightShadowCasterMode: 0
|
||||
m_AreaSize: {x: 1, y: 1}
|
||||
m_BounceIntensity: 1
|
||||
m_ColorTemperature: 5000
|
||||
m_UseColorTemperature: 1
|
||||
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_UseBoundingSphereOverride: 0
|
||||
m_UseViewFrustumForShadowCasterCull: 1
|
||||
m_ForceVisible: 0
|
||||
m_ShadowRadius: 0
|
||||
m_ShadowAngle: 0
|
||||
--- !u!4 &410087041
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 410087039}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}
|
||||
m_LocalPosition: {x: 0, y: 3, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0}
|
||||
--- !u!114 &410087042
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 410087039}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_Version: 3
|
||||
m_UsePipelineSettings: 1
|
||||
m_AdditionalLightsShadowResolutionTier: 2
|
||||
m_LightLayerMask: 1
|
||||
m_RenderingLayers: 1
|
||||
m_CustomShadowLayers: 0
|
||||
m_ShadowLayerMask: 1
|
||||
m_ShadowRenderingLayers: 1
|
||||
m_LightCookieSize: {x: 1, y: 1}
|
||||
m_LightCookieOffset: {x: 0, y: 0}
|
||||
m_SoftShadowQuality: 1
|
||||
--- !u!1 &832575517
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 832575519}
|
||||
- component: {fileID: 832575518}
|
||||
m_Layer: 0
|
||||
m_Name: Global Volume
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!114 &832575518
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 832575517}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
m_IsGlobal: 1
|
||||
priority: 0
|
||||
blendDistance: 0
|
||||
weight: 1
|
||||
sharedProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2}
|
||||
--- !u!4 &832575519
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 832575517}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1660057539 &9223372036854775807
|
||||
SceneRoots:
|
||||
m_ObjectHideFlags: 0
|
||||
m_Roots:
|
||||
- {fileID: 330585546}
|
||||
- {fileID: 410087041}
|
||||
- {fileID: 832575519}
|
||||
7
Assets/Scenes/SampleScene.unity.meta
Normal file
7
Assets/Scenes/SampleScene.unity.meta
Normal file
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 99c9720ab356a0642a771bea13969a05
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/Settings.meta
Normal file
8
Assets/Settings.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 709f11a7f3c4041caa4ef136ea32d874
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
982
Assets/Settings/DefaultVolumeProfile.asset
Normal file
982
Assets/Settings/DefaultVolumeProfile.asset
Normal file
@ -0,0 +1,982 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &-9167874883656233139
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 5485954d14dfb9a4c8ead8edb0ded5b1, type: 3}
|
||||
m_Name: LiftGammaGain
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
lift:
|
||||
m_OverrideState: 1
|
||||
m_Value: {x: 1, y: 1, z: 1, w: 0}
|
||||
gamma:
|
||||
m_OverrideState: 1
|
||||
m_Value: {x: 1, y: 1, z: 1, w: 0}
|
||||
gain:
|
||||
m_OverrideState: 1
|
||||
m_Value: {x: 1, y: 1, z: 1, w: 0}
|
||||
--- !u!114 &-8270506406425502121
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 70afe9e12c7a7ed47911bb608a23a8ff, type: 3}
|
||||
m_Name: SplitToning
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
shadows:
|
||||
m_OverrideState: 1
|
||||
m_Value: {r: 0.5, g: 0.5, b: 0.5, a: 1}
|
||||
highlights:
|
||||
m_OverrideState: 1
|
||||
m_Value: {r: 0.5, g: 0.5, b: 0.5, a: 1}
|
||||
balance:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
--- !u!114 &-8104416584915340131
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 0}
|
||||
m_Name: CopyPasteTestComponent2
|
||||
m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEditor.Rendering.Tests:VolumeComponentCopyPasteTests/CopyPasteTestComponent2
|
||||
active: 1
|
||||
p1:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
p2:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
p21:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
--- !u!114 &-7750755424749557576
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 60f3b30c03e6ba64d9a27dc9dba8f28d, type: 3}
|
||||
m_Name: OutlineVolumeComponent
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
Enabled:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
--- !u!114 &-7743500325797982168
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ccf1aba9553839d41ae37dd52e9ebcce, type: 3}
|
||||
m_Name: MotionBlur
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
mode:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
quality:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
intensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
clamp:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.05
|
||||
--- !u!114 &-7274224791359825572
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 0fd9ee276a1023e439cf7a9c393195fa, type: 3}
|
||||
m_Name: TestAnimationCurveVolumeComponent
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
testParameter:
|
||||
m_OverrideState: 1
|
||||
m_Value:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0.5
|
||||
value: 10
|
||||
inSlope: 0
|
||||
outSlope: 10
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0
|
||||
outWeight: 0
|
||||
- serializedVersion: 3
|
||||
time: 1
|
||||
value: 15
|
||||
inSlope: 10
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0
|
||||
outWeight: 0
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
--- !u!114 &-6335409530604852063
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 66f335fb1ffd8684294ad653bf1c7564, type: 3}
|
||||
m_Name: ColorAdjustments
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
postExposure:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
contrast:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
colorFilter:
|
||||
m_OverrideState: 1
|
||||
m_Value: {r: 1, g: 1, b: 1, a: 1}
|
||||
hueShift:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
saturation:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
--- !u!114 &-6288072647309666549
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 29fa0085f50d5e54f8144f766051a691, type: 3}
|
||||
m_Name: FilmGrain
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
type:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
intensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
response:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.8
|
||||
texture:
|
||||
m_OverrideState: 1
|
||||
m_Value: {fileID: 0}
|
||||
--- !u!114 &-5520245016509672950
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 97c23e3b12dc18c42a140437e53d3951, type: 3}
|
||||
m_Name: Tonemapping
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
mode:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
neutralHDRRangeReductionMode:
|
||||
m_OverrideState: 1
|
||||
m_Value: 2
|
||||
acesPreset:
|
||||
m_OverrideState: 1
|
||||
m_Value: 3
|
||||
hueShiftAmount:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
detectPaperWhite:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
paperWhite:
|
||||
m_OverrideState: 1
|
||||
m_Value: 300
|
||||
detectBrightnessLimits:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
minNits:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.005
|
||||
maxNits:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1000
|
||||
--- !u!114 &-5360449096862653589
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 0}
|
||||
m_Name: VolumeComponentSupportedEverywhere
|
||||
m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEngine.Rendering.Tests:VolumeComponentEditorSupportedOnTests/VolumeComponentSupportedEverywhere
|
||||
active: 1
|
||||
--- !u!114 &-5139089513906902183
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 5a00a63fdd6bd2a45ab1f2d869305ffd, type: 3}
|
||||
m_Name: OasisFogVolumeComponent
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
Density:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
StartDistance:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
HeightRange:
|
||||
m_OverrideState: 1
|
||||
m_Value: {x: 0, y: 50}
|
||||
Tint:
|
||||
m_OverrideState: 1
|
||||
m_Value: {r: 1, g: 1, b: 1, a: 1}
|
||||
SunScatteringIntensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 2
|
||||
--- !u!114 &-4463884970436517307
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fb60a22f311433c4c962b888d1393f88, type: 3}
|
||||
m_Name: PaniniProjection
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
distance:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
cropToFit:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
--- !u!114 &-1410297666881709256
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 6bd486065ce11414fa40e631affc4900, type: 3}
|
||||
m_Name: ProbeVolumesOptions
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
normalBias:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.33
|
||||
viewBias:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
scaleBiasWithMinProbeDistance:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
samplingNoise:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.1
|
||||
animateSamplingNoise:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
leakReductionMode:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
minValidDotProductValue:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.1
|
||||
occlusionOnlyReflectionNormalization:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
intensityMultiplier:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
skyOcclusionIntensityMultiplier:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
--- !u!114 &-1216621516061285780
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 0b2db86121404754db890f4c8dfe81b2, type: 3}
|
||||
m_Name: Bloom
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
skipIterations:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
threshold:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.9
|
||||
intensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
scatter:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.7
|
||||
clamp:
|
||||
m_OverrideState: 1
|
||||
m_Value: 65472
|
||||
tint:
|
||||
m_OverrideState: 1
|
||||
m_Value: {r: 1, g: 1, b: 1, a: 1}
|
||||
highQualityFiltering:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
downscale:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
maxIterations:
|
||||
m_OverrideState: 1
|
||||
m_Value: 6
|
||||
dirtTexture:
|
||||
m_OverrideState: 1
|
||||
m_Value: {fileID: 0}
|
||||
dimension: 1
|
||||
dirtIntensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
--- !u!114 &-1170528603972255243
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 221518ef91623a7438a71fef23660601, type: 3}
|
||||
m_Name: WhiteBalance
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
temperature:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
tint:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
--- !u!114 &-581120513425526550
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 0}
|
||||
m_Name: CopyPasteTestComponent3
|
||||
m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEditor.Rendering.Tests:VolumeComponentCopyPasteTests/CopyPasteTestComponent3
|
||||
active: 1
|
||||
p1:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
p2:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
p31:
|
||||
m_OverrideState: 1
|
||||
m_Value: {r: 0, g: 0, b: 0, a: 1}
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3}
|
||||
m_Name: DefaultVolumeProfile
|
||||
m_EditorClassIdentifier:
|
||||
components:
|
||||
- {fileID: -9167874883656233139}
|
||||
- {fileID: 1918650496244738858}
|
||||
- {fileID: 853819529557874667}
|
||||
- {fileID: 1052315754049611418}
|
||||
- {fileID: -1170528603972255243}
|
||||
- {fileID: -8270506406425502121}
|
||||
- {fileID: -5520245016509672950}
|
||||
- {fileID: 7173750748008157695}
|
||||
- {fileID: 1666464333004379222}
|
||||
- {fileID: 9001657382290151224}
|
||||
- {fileID: -6335409530604852063}
|
||||
- {fileID: -1216621516061285780}
|
||||
- {fileID: 3959858460715838825}
|
||||
- {fileID: -7743500325797982168}
|
||||
- {fileID: 4644742534064026673}
|
||||
- {fileID: -4463884970436517307}
|
||||
- {fileID: -6288072647309666549}
|
||||
- {fileID: 7518938298396184218}
|
||||
- {fileID: -1410297666881709256}
|
||||
- {fileID: -7750755424749557576}
|
||||
- {fileID: -5139089513906902183}
|
||||
--- !u!114 &853819529557874667
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 06437c1ff663d574d9447842ba0a72e4, type: 3}
|
||||
m_Name: ScreenSpaceLensFlare
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
intensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
tintColor:
|
||||
m_OverrideState: 1
|
||||
m_Value: {r: 1, g: 1, b: 1, a: 1}
|
||||
bloomMip:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
firstFlareIntensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
secondaryFlareIntensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
warpedFlareIntensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
warpedFlareScale:
|
||||
m_OverrideState: 1
|
||||
m_Value: {x: 1, y: 1}
|
||||
samples:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
sampleDimmer:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.5
|
||||
vignetteEffect:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
startingPosition:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1.25
|
||||
scale:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1.5
|
||||
streaksIntensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
streaksLength:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.5
|
||||
streaksOrientation:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
streaksThreshold:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.25
|
||||
resolution:
|
||||
m_OverrideState: 1
|
||||
m_Value: 4
|
||||
chromaticAbberationIntensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.5
|
||||
--- !u!114 &1052315754049611418
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 558a8e2b6826cf840aae193990ba9f2e, type: 3}
|
||||
m_Name: ShadowsMidtonesHighlights
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
shadows:
|
||||
m_OverrideState: 1
|
||||
m_Value: {x: 1, y: 1, z: 1, w: 0}
|
||||
midtones:
|
||||
m_OverrideState: 1
|
||||
m_Value: {x: 1, y: 1, z: 1, w: 0}
|
||||
highlights:
|
||||
m_OverrideState: 1
|
||||
m_Value: {x: 1, y: 1, z: 1, w: 0}
|
||||
shadowsStart:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
shadowsEnd:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.3
|
||||
highlightsStart:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.55
|
||||
highlightsEnd:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
--- !u!114 &1666464333004379222
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 3eb4b772797da9440885e8bd939e9560, type: 3}
|
||||
m_Name: ColorCurves
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
master:
|
||||
m_OverrideState: 1
|
||||
m_Value:
|
||||
<length>k__BackingField: 2
|
||||
m_Loop: 0
|
||||
m_ZeroValue: 0
|
||||
m_Range: 1
|
||||
m_Curve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 0
|
||||
inSlope: 1
|
||||
outSlope: 1
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0
|
||||
outWeight: 0
|
||||
- serializedVersion: 3
|
||||
time: 1
|
||||
value: 1
|
||||
inSlope: 1
|
||||
outSlope: 1
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0
|
||||
outWeight: 0
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
red:
|
||||
m_OverrideState: 1
|
||||
m_Value:
|
||||
<length>k__BackingField: 2
|
||||
m_Loop: 0
|
||||
m_ZeroValue: 0
|
||||
m_Range: 1
|
||||
m_Curve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 0
|
||||
inSlope: 1
|
||||
outSlope: 1
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0
|
||||
outWeight: 0
|
||||
- serializedVersion: 3
|
||||
time: 1
|
||||
value: 1
|
||||
inSlope: 1
|
||||
outSlope: 1
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0
|
||||
outWeight: 0
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
green:
|
||||
m_OverrideState: 1
|
||||
m_Value:
|
||||
<length>k__BackingField: 2
|
||||
m_Loop: 0
|
||||
m_ZeroValue: 0
|
||||
m_Range: 1
|
||||
m_Curve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 0
|
||||
inSlope: 1
|
||||
outSlope: 1
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0
|
||||
outWeight: 0
|
||||
- serializedVersion: 3
|
||||
time: 1
|
||||
value: 1
|
||||
inSlope: 1
|
||||
outSlope: 1
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0
|
||||
outWeight: 0
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
blue:
|
||||
m_OverrideState: 1
|
||||
m_Value:
|
||||
<length>k__BackingField: 2
|
||||
m_Loop: 0
|
||||
m_ZeroValue: 0
|
||||
m_Range: 1
|
||||
m_Curve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 0
|
||||
inSlope: 1
|
||||
outSlope: 1
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0
|
||||
outWeight: 0
|
||||
- serializedVersion: 3
|
||||
time: 1
|
||||
value: 1
|
||||
inSlope: 1
|
||||
outSlope: 1
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0
|
||||
outWeight: 0
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
hueVsHue:
|
||||
m_OverrideState: 1
|
||||
m_Value:
|
||||
<length>k__BackingField: 0
|
||||
m_Loop: 1
|
||||
m_ZeroValue: 0.5
|
||||
m_Range: 1
|
||||
m_Curve:
|
||||
serializedVersion: 2
|
||||
m_Curve: []
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
hueVsSat:
|
||||
m_OverrideState: 1
|
||||
m_Value:
|
||||
<length>k__BackingField: 0
|
||||
m_Loop: 1
|
||||
m_ZeroValue: 0.5
|
||||
m_Range: 1
|
||||
m_Curve:
|
||||
serializedVersion: 2
|
||||
m_Curve: []
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
satVsSat:
|
||||
m_OverrideState: 1
|
||||
m_Value:
|
||||
<length>k__BackingField: 0
|
||||
m_Loop: 0
|
||||
m_ZeroValue: 0.5
|
||||
m_Range: 1
|
||||
m_Curve:
|
||||
serializedVersion: 2
|
||||
m_Curve: []
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
lumVsSat:
|
||||
m_OverrideState: 1
|
||||
m_Value:
|
||||
<length>k__BackingField: 0
|
||||
m_Loop: 0
|
||||
m_ZeroValue: 0.5
|
||||
m_Range: 1
|
||||
m_Curve:
|
||||
serializedVersion: 2
|
||||
m_Curve: []
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
--- !u!114 &1918650496244738858
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: e021b4c809a781e468c2988c016ebbea, type: 3}
|
||||
m_Name: ColorLookup
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
texture:
|
||||
m_OverrideState: 1
|
||||
m_Value: {fileID: 0}
|
||||
dimension: 1
|
||||
contribution:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
--- !u!114 &3959858460715838825
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: c01700fd266d6914ababb731e09af2eb, type: 3}
|
||||
m_Name: DepthOfField
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
mode:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
gaussianStart:
|
||||
m_OverrideState: 1
|
||||
m_Value: 10
|
||||
gaussianEnd:
|
||||
m_OverrideState: 1
|
||||
m_Value: 30
|
||||
gaussianMaxRadius:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
highQualitySampling:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
focusDistance:
|
||||
m_OverrideState: 1
|
||||
m_Value: 10
|
||||
aperture:
|
||||
m_OverrideState: 1
|
||||
m_Value: 5.6
|
||||
focalLength:
|
||||
m_OverrideState: 1
|
||||
m_Value: 50
|
||||
bladeCount:
|
||||
m_OverrideState: 1
|
||||
m_Value: 5
|
||||
bladeCurvature:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
bladeRotation:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
--- !u!114 &4251301726029935498
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 74955a4b0b4243bc87231e8b59ed9140, type: 3}
|
||||
m_Name: TestVolume
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
param:
|
||||
m_OverrideState: 1
|
||||
m_Value: 123
|
||||
--- !u!114 &4644742534064026673
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 81180773991d8724ab7f2d216912b564, type: 3}
|
||||
m_Name: ChromaticAberration
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
intensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
--- !u!114 &6940869943325143175
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 0}
|
||||
m_Name: VolumeComponentSupportedOnAnySRP
|
||||
m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEngine.Rendering.Tests:VolumeComponentEditorSupportedOnTests/VolumeComponentSupportedOnAnySRP
|
||||
active: 1
|
||||
--- !u!114 &7173750748008157695
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 899c54efeace73346a0a16faa3afe726, type: 3}
|
||||
m_Name: Vignette
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
color:
|
||||
m_OverrideState: 1
|
||||
m_Value: {r: 0, g: 0, b: 0, a: 1}
|
||||
center:
|
||||
m_OverrideState: 1
|
||||
m_Value: {x: 0.5, y: 0.5}
|
||||
intensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
smoothness:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.2
|
||||
rounded:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
--- !u!114 &7518938298396184218
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: c5e1dc532bcb41949b58bc4f2abfbb7e, type: 3}
|
||||
m_Name: LensDistortion
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
intensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
xMultiplier:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
yMultiplier:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
center:
|
||||
m_OverrideState: 1
|
||||
m_Value: {x: 0.5, y: 0.5}
|
||||
scale:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
--- !u!114 &9001657382290151224
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: cdfbdbb87d3286943a057f7791b43141, type: 3}
|
||||
m_Name: ChannelMixer
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
redOutRedIn:
|
||||
m_OverrideState: 1
|
||||
m_Value: 100
|
||||
redOutGreenIn:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
redOutBlueIn:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
greenOutRedIn:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
greenOutGreenIn:
|
||||
m_OverrideState: 1
|
||||
m_Value: 100
|
||||
greenOutBlueIn:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
blueOutRedIn:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
blueOutGreenIn:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
blueOutBlueIn:
|
||||
m_OverrideState: 1
|
||||
m_Value: 100
|
||||
--- !u!114 &9122958982931076880
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 0}
|
||||
m_Name: CopyPasteTestComponent1
|
||||
m_EditorClassIdentifier: Unity.RenderPipelines.Core.Editor.Tests:UnityEditor.Rendering.Tests:VolumeComponentCopyPasteTests/CopyPasteTestComponent1
|
||||
active: 1
|
||||
p1:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
p2:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
8
Assets/Settings/DefaultVolumeProfile.asset.meta
Normal file
8
Assets/Settings/DefaultVolumeProfile.asset.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ab09877e2e707104187f6f83e2f62510
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
135
Assets/Settings/Mobile_RPAsset.asset
Normal file
135
Assets/Settings/Mobile_RPAsset.asset
Normal file
@ -0,0 +1,135 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3}
|
||||
m_Name: Mobile_RPAsset
|
||||
m_EditorClassIdentifier:
|
||||
k_AssetVersion: 12
|
||||
k_AssetPreviousVersion: 12
|
||||
m_RendererType: 1
|
||||
m_RendererData: {fileID: 0}
|
||||
m_RendererDataList:
|
||||
- {fileID: 11400000, guid: 65bc7dbf4170f435aa868c779acfb082, type: 2}
|
||||
m_DefaultRendererIndex: 0
|
||||
m_RequireDepthTexture: 0
|
||||
m_RequireOpaqueTexture: 0
|
||||
m_OpaqueDownsampling: 0
|
||||
m_SupportsTerrainHoles: 1
|
||||
m_SupportsHDR: 1
|
||||
m_HDRColorBufferPrecision: 0
|
||||
m_MSAA: 1
|
||||
m_RenderScale: 0.8
|
||||
m_UpscalingFilter: 3
|
||||
m_FsrOverrideSharpness: 0
|
||||
m_FsrSharpness: 0.92
|
||||
m_EnableLODCrossFade: 1
|
||||
m_LODCrossFadeDitheringType: 1
|
||||
m_ShEvalMode: 0
|
||||
m_LightProbeSystem: 0
|
||||
m_ProbeVolumeMemoryBudget: 1024
|
||||
m_ProbeVolumeBlendingMemoryBudget: 256
|
||||
m_SupportProbeVolumeGPUStreaming: 0
|
||||
m_SupportProbeVolumeDiskStreaming: 0
|
||||
m_SupportProbeVolumeScenarios: 0
|
||||
m_SupportProbeVolumeScenarioBlending: 0
|
||||
m_ProbeVolumeSHBands: 1
|
||||
m_MainLightRenderingMode: 1
|
||||
m_MainLightShadowsSupported: 1
|
||||
m_MainLightShadowmapResolution: 1024
|
||||
m_AdditionalLightsRenderingMode: 1
|
||||
m_AdditionalLightsPerObjectLimit: 4
|
||||
m_AdditionalLightShadowsSupported: 0
|
||||
m_AdditionalLightsShadowmapResolution: 2048
|
||||
m_AdditionalLightsShadowResolutionTierLow: 256
|
||||
m_AdditionalLightsShadowResolutionTierMedium: 512
|
||||
m_AdditionalLightsShadowResolutionTierHigh: 1024
|
||||
m_ReflectionProbeBlending: 1
|
||||
m_ReflectionProbeBoxProjection: 1
|
||||
m_ShadowDistance: 50
|
||||
m_ShadowCascadeCount: 1
|
||||
m_Cascade2Split: 0.25
|
||||
m_Cascade3Split: {x: 0.1, y: 0.3}
|
||||
m_Cascade4Split: {x: 0.067, y: 0.2, z: 0.467}
|
||||
m_CascadeBorder: 0.2
|
||||
m_ShadowDepthBias: 1
|
||||
m_ShadowNormalBias: 1
|
||||
m_AnyShadowsSupported: 1
|
||||
m_SoftShadowsSupported: 0
|
||||
m_ConservativeEnclosingSphere: 1
|
||||
m_NumIterationsEnclosingSphere: 64
|
||||
m_SoftShadowQuality: 2
|
||||
m_AdditionalLightsCookieResolution: 1024
|
||||
m_AdditionalLightsCookieFormat: 1
|
||||
m_UseSRPBatcher: 1
|
||||
m_SupportsDynamicBatching: 0
|
||||
m_MixedLightingSupported: 1
|
||||
m_SupportsLightCookies: 1
|
||||
m_SupportsLightLayers: 1
|
||||
m_DebugLevel: 0
|
||||
m_StoreActionsOptimization: 0
|
||||
m_UseAdaptivePerformance: 1
|
||||
m_ColorGradingMode: 0
|
||||
m_ColorGradingLutSize: 32
|
||||
m_UseFastSRGBLinearConversion: 1
|
||||
m_SupportDataDrivenLensFlare: 1
|
||||
m_SupportScreenSpaceLensFlare: 1
|
||||
m_GPUResidentDrawerMode: 0
|
||||
m_UseLegacyLightmaps: 0
|
||||
m_SmallMeshScreenPercentage: 0
|
||||
m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0
|
||||
m_ShadowType: 1
|
||||
m_LocalShadowsSupported: 0
|
||||
m_LocalShadowsAtlasResolution: 256
|
||||
m_MaxPixelLights: 0
|
||||
m_ShadowAtlasResolution: 256
|
||||
m_VolumeFrameworkUpdateMode: 0
|
||||
m_VolumeProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2}
|
||||
apvScenesData:
|
||||
obsoleteSceneBounds:
|
||||
m_Keys: []
|
||||
m_Values: []
|
||||
obsoleteHasProbeVolumes:
|
||||
m_Keys: []
|
||||
m_Values:
|
||||
m_PrefilteringModeMainLightShadows: 3
|
||||
m_PrefilteringModeAdditionalLight: 4
|
||||
m_PrefilteringModeAdditionalLightShadows: 0
|
||||
m_PrefilterXRKeywords: 1
|
||||
m_PrefilteringModeForwardPlus: 1
|
||||
m_PrefilteringModeDeferredRendering: 0
|
||||
m_PrefilteringModeScreenSpaceOcclusion: 0
|
||||
m_PrefilterDebugKeywords: 1
|
||||
m_PrefilterWriteRenderingLayers: 1
|
||||
m_PrefilterHDROutput: 1
|
||||
m_PrefilterSSAODepthNormals: 1
|
||||
m_PrefilterSSAOSourceDepthLow: 1
|
||||
m_PrefilterSSAOSourceDepthMedium: 0
|
||||
m_PrefilterSSAOSourceDepthHigh: 1
|
||||
m_PrefilterSSAOInterleaved: 0
|
||||
m_PrefilterSSAOBlueNoise: 1
|
||||
m_PrefilterSSAOSampleCountLow: 1
|
||||
m_PrefilterSSAOSampleCountMedium: 0
|
||||
m_PrefilterSSAOSampleCountHigh: 1
|
||||
m_PrefilterDBufferMRT1: 1
|
||||
m_PrefilterDBufferMRT2: 1
|
||||
m_PrefilterDBufferMRT3: 1
|
||||
m_PrefilterSoftShadowsQualityLow: 1
|
||||
m_PrefilterSoftShadowsQualityMedium: 1
|
||||
m_PrefilterSoftShadowsQualityHigh: 1
|
||||
m_PrefilterSoftShadows: 0
|
||||
m_PrefilterScreenCoord: 1
|
||||
m_PrefilterNativeRenderPass: 1
|
||||
m_PrefilterUseLegacyLightmaps: 0
|
||||
m_ShaderVariantLogLevel: 0
|
||||
m_ShadowCascades: 0
|
||||
m_Textures:
|
||||
blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3}
|
||||
bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3}
|
||||
8
Assets/Settings/Mobile_RPAsset.asset.meta
Normal file
8
Assets/Settings/Mobile_RPAsset.asset.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5e6cbd92db86f4b18aec3ed561671858
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
66
Assets/Settings/Mobile_Renderer.asset
Normal file
66
Assets/Settings/Mobile_Renderer.asset
Normal file
@ -0,0 +1,66 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3}
|
||||
m_Name: Mobile_Renderer
|
||||
m_EditorClassIdentifier:
|
||||
debugShaders:
|
||||
debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7,
|
||||
type: 3}
|
||||
hdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3}
|
||||
probeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959,
|
||||
type: 3}
|
||||
probeVolumeResources:
|
||||
probeVolumeDebugShader: {fileID: 0}
|
||||
probeVolumeFragmentationDebugShader: {fileID: 0}
|
||||
probeVolumeOffsetDebugShader: {fileID: 0}
|
||||
probeVolumeSamplingDebugShader: {fileID: 0}
|
||||
probeSamplingDebugMesh: {fileID: 0}
|
||||
probeSamplingDebugTexture: {fileID: 0}
|
||||
probeVolumeBlendStatesCS: {fileID: 0}
|
||||
m_RendererFeatures: []
|
||||
m_RendererFeatureMap:
|
||||
m_UseNativeRenderPass: 1
|
||||
postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2}
|
||||
m_AssetVersion: 2
|
||||
m_OpaqueLayerMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_TransparentLayerMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_DefaultStencilState:
|
||||
overrideStencilState: 0
|
||||
stencilReference: 0
|
||||
stencilCompareFunction: 8
|
||||
passOperation: 2
|
||||
failOperation: 0
|
||||
zFailOperation: 0
|
||||
m_ShadowTransparentReceive: 0
|
||||
m_RenderingMode: 2
|
||||
m_DepthPrimingMode: 0
|
||||
m_CopyDepthMode: 0
|
||||
m_AccurateGbufferNormals: 0
|
||||
m_IntermediateTextureMode: 0
|
||||
--- !u!114 &1002035807535710140
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: a0ec52cecc795714f93f274c2e71e87b, type: 3}
|
||||
m_Name: GlobalVolumeFeature
|
||||
m_EditorClassIdentifier:
|
||||
m_Active: 1
|
||||
_baseProfile: {fileID: 11400000, guid: f2d4d916a6612574cad220d125febbf2, type: 2}
|
||||
8
Assets/Settings/Mobile_Renderer.asset.meta
Normal file
8
Assets/Settings/Mobile_Renderer.asset.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 65bc7dbf4170f435aa868c779acfb082
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
135
Assets/Settings/PC_RPAsset.asset
Normal file
135
Assets/Settings/PC_RPAsset.asset
Normal file
@ -0,0 +1,135 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: bf2edee5c58d82540a51f03df9d42094, type: 3}
|
||||
m_Name: PC_RPAsset
|
||||
m_EditorClassIdentifier:
|
||||
k_AssetVersion: 12
|
||||
k_AssetPreviousVersion: 12
|
||||
m_RendererType: 1
|
||||
m_RendererData: {fileID: 0}
|
||||
m_RendererDataList:
|
||||
- {fileID: 11400000, guid: f288ae1f4751b564a96ac7587541f7a2, type: 2}
|
||||
m_DefaultRendererIndex: 0
|
||||
m_RequireDepthTexture: 1
|
||||
m_RequireOpaqueTexture: 1
|
||||
m_OpaqueDownsampling: 1
|
||||
m_SupportsTerrainHoles: 1
|
||||
m_SupportsHDR: 1
|
||||
m_HDRColorBufferPrecision: 0
|
||||
m_MSAA: 1
|
||||
m_RenderScale: 1
|
||||
m_UpscalingFilter: 0
|
||||
m_FsrOverrideSharpness: 0
|
||||
m_FsrSharpness: 0.92
|
||||
m_EnableLODCrossFade: 1
|
||||
m_LODCrossFadeDitheringType: 1
|
||||
m_ShEvalMode: 0
|
||||
m_LightProbeSystem: 0
|
||||
m_ProbeVolumeMemoryBudget: 1024
|
||||
m_ProbeVolumeBlendingMemoryBudget: 256
|
||||
m_SupportProbeVolumeGPUStreaming: 0
|
||||
m_SupportProbeVolumeDiskStreaming: 0
|
||||
m_SupportProbeVolumeScenarios: 0
|
||||
m_SupportProbeVolumeScenarioBlending: 0
|
||||
m_ProbeVolumeSHBands: 1
|
||||
m_MainLightRenderingMode: 1
|
||||
m_MainLightShadowsSupported: 1
|
||||
m_MainLightShadowmapResolution: 2048
|
||||
m_AdditionalLightsRenderingMode: 1
|
||||
m_AdditionalLightsPerObjectLimit: 4
|
||||
m_AdditionalLightShadowsSupported: 1
|
||||
m_AdditionalLightsShadowmapResolution: 2048
|
||||
m_AdditionalLightsShadowResolutionTierLow: 256
|
||||
m_AdditionalLightsShadowResolutionTierMedium: 512
|
||||
m_AdditionalLightsShadowResolutionTierHigh: 1024
|
||||
m_ReflectionProbeBlending: 1
|
||||
m_ReflectionProbeBoxProjection: 1
|
||||
m_ShadowDistance: 50
|
||||
m_ShadowCascadeCount: 4
|
||||
m_Cascade2Split: 0.25
|
||||
m_Cascade3Split: {x: 0.1, y: 0.3}
|
||||
m_Cascade4Split: {x: 0.12299999, y: 0.2926, z: 0.53599995}
|
||||
m_CascadeBorder: 0.107758604
|
||||
m_ShadowDepthBias: 0.1
|
||||
m_ShadowNormalBias: 0.5
|
||||
m_AnyShadowsSupported: 1
|
||||
m_SoftShadowsSupported: 1
|
||||
m_ConservativeEnclosingSphere: 1
|
||||
m_NumIterationsEnclosingSphere: 64
|
||||
m_SoftShadowQuality: 3
|
||||
m_AdditionalLightsCookieResolution: 2048
|
||||
m_AdditionalLightsCookieFormat: 3
|
||||
m_UseSRPBatcher: 1
|
||||
m_SupportsDynamicBatching: 0
|
||||
m_MixedLightingSupported: 1
|
||||
m_SupportsLightCookies: 1
|
||||
m_SupportsLightLayers: 1
|
||||
m_DebugLevel: 0
|
||||
m_StoreActionsOptimization: 0
|
||||
m_UseAdaptivePerformance: 1
|
||||
m_ColorGradingMode: 0
|
||||
m_ColorGradingLutSize: 32
|
||||
m_UseFastSRGBLinearConversion: 0
|
||||
m_SupportDataDrivenLensFlare: 1
|
||||
m_SupportScreenSpaceLensFlare: 1
|
||||
m_GPUResidentDrawerMode: 0
|
||||
m_UseLegacyLightmaps: 0
|
||||
m_SmallMeshScreenPercentage: 0
|
||||
m_GPUResidentDrawerEnableOcclusionCullingInCameras: 0
|
||||
m_ShadowType: 1
|
||||
m_LocalShadowsSupported: 0
|
||||
m_LocalShadowsAtlasResolution: 256
|
||||
m_MaxPixelLights: 0
|
||||
m_ShadowAtlasResolution: 256
|
||||
m_VolumeFrameworkUpdateMode: 0
|
||||
m_VolumeProfile: {fileID: 11400000, guid: 10fc4df2da32a41aaa32d77bc913491c, type: 2}
|
||||
apvScenesData:
|
||||
obsoleteSceneBounds:
|
||||
m_Keys: []
|
||||
m_Values: []
|
||||
obsoleteHasProbeVolumes:
|
||||
m_Keys: []
|
||||
m_Values:
|
||||
m_PrefilteringModeMainLightShadows: 3
|
||||
m_PrefilteringModeAdditionalLight: 4
|
||||
m_PrefilteringModeAdditionalLightShadows: 0
|
||||
m_PrefilterXRKeywords: 1
|
||||
m_PrefilteringModeForwardPlus: 1
|
||||
m_PrefilteringModeDeferredRendering: 0
|
||||
m_PrefilteringModeScreenSpaceOcclusion: 1
|
||||
m_PrefilterDebugKeywords: 1
|
||||
m_PrefilterWriteRenderingLayers: 0
|
||||
m_PrefilterHDROutput: 1
|
||||
m_PrefilterSSAODepthNormals: 0
|
||||
m_PrefilterSSAOSourceDepthLow: 1
|
||||
m_PrefilterSSAOSourceDepthMedium: 1
|
||||
m_PrefilterSSAOSourceDepthHigh: 1
|
||||
m_PrefilterSSAOInterleaved: 1
|
||||
m_PrefilterSSAOBlueNoise: 0
|
||||
m_PrefilterSSAOSampleCountLow: 1
|
||||
m_PrefilterSSAOSampleCountMedium: 0
|
||||
m_PrefilterSSAOSampleCountHigh: 1
|
||||
m_PrefilterDBufferMRT1: 1
|
||||
m_PrefilterDBufferMRT2: 1
|
||||
m_PrefilterDBufferMRT3: 0
|
||||
m_PrefilterSoftShadowsQualityLow: 0
|
||||
m_PrefilterSoftShadowsQualityMedium: 0
|
||||
m_PrefilterSoftShadowsQualityHigh: 0
|
||||
m_PrefilterSoftShadows: 0
|
||||
m_PrefilterScreenCoord: 1
|
||||
m_PrefilterNativeRenderPass: 1
|
||||
m_PrefilterUseLegacyLightmaps: 0
|
||||
m_ShaderVariantLogLevel: 0
|
||||
m_ShadowCascades: 0
|
||||
m_Textures:
|
||||
blueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3}
|
||||
bayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3}
|
||||
8
Assets/Settings/PC_RPAsset.asset.meta
Normal file
8
Assets/Settings/PC_RPAsset.asset.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4b83569d67af61e458304325a23e5dfd
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
93
Assets/Settings/PC_Renderer.asset
Normal file
93
Assets/Settings/PC_Renderer.asset
Normal file
@ -0,0 +1,93 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: de640fe3d0db1804a85f9fc8f5cadab6, type: 3}
|
||||
m_Name: PC_Renderer
|
||||
m_EditorClassIdentifier:
|
||||
debugShaders:
|
||||
debugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, type: 3}
|
||||
hdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3}
|
||||
m_RendererFeatures:
|
||||
- {fileID: 7833122117494664109}
|
||||
m_RendererFeatureMap: ad6b866f10d7b46c
|
||||
m_UseNativeRenderPass: 1
|
||||
postProcessData: {fileID: 11400000, guid: 41439944d30ece34e96484bdb6645b55, type: 2}
|
||||
xrSystemData: {fileID: 11400000, guid: 60e1133243b97e347b653163a8c01b64, type: 2}
|
||||
shaders:
|
||||
blitPS: {fileID: 4800000, guid: c17132b1f77d20942aa75f8429c0f8bc, type: 3}
|
||||
copyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3}
|
||||
screenSpaceShadowPS: {fileID: 0}
|
||||
samplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3}
|
||||
stencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3}
|
||||
fallbackErrorPS: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3}
|
||||
fallbackLoadingPS: {fileID: 4800000, guid: 7f888aff2ac86494babad1c2c5daeee2, type: 3}
|
||||
materialErrorPS: {fileID: 4800000, guid: 5fd9a8feb75a4b5894c241777f519d4e, type: 3}
|
||||
coreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3}
|
||||
coreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, type: 3}
|
||||
blitHDROverlay: {fileID: 4800000, guid: a89bee29cffa951418fc1e2da94d1959, type: 3}
|
||||
cameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf, type: 3}
|
||||
objectMotionVector: {fileID: 4800000, guid: 7b3ede40266cd49a395def176e1bc486, type: 3}
|
||||
dataDrivenLensFlare: {fileID: 4800000, guid: 6cda457ac28612740adb23da5d39ea92, type: 3}
|
||||
m_AssetVersion: 2
|
||||
m_OpaqueLayerMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_TransparentLayerMask:
|
||||
serializedVersion: 2
|
||||
m_Bits: 4294967295
|
||||
m_DefaultStencilState:
|
||||
overrideStencilState: 0
|
||||
stencilReference: 1
|
||||
stencilCompareFunction: 3
|
||||
passOperation: 2
|
||||
failOperation: 0
|
||||
zFailOperation: 0
|
||||
m_ShadowTransparentReceive: 1
|
||||
m_RenderingMode: 2
|
||||
m_DepthPrimingMode: 0
|
||||
m_CopyDepthMode: 0
|
||||
m_AccurateGbufferNormals: 0
|
||||
m_IntermediateTextureMode: 0
|
||||
--- !u!114 &7833122117494664109
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: f62c9c65cf3354c93be831c8bc075510, type: 3}
|
||||
m_Name: ScreenSpaceAmbientOcclusion
|
||||
m_EditorClassIdentifier:
|
||||
m_Active: 1
|
||||
m_Settings:
|
||||
AOMethod: 0
|
||||
Downsample: 0
|
||||
AfterOpaque: 0
|
||||
Source: 1
|
||||
NormalSamples: 1
|
||||
Intensity: 0.4
|
||||
DirectLightingStrength: 0.25
|
||||
Radius: 0.3
|
||||
Samples: 1
|
||||
BlurQuality: 0
|
||||
Falloff: 100
|
||||
SampleCount: -1
|
||||
m_BlueNoise256Textures:
|
||||
- {fileID: 2800000, guid: 36f118343fc974119bee3d09e2111500, type: 3}
|
||||
- {fileID: 2800000, guid: 4b7b083e6b6734e8bb2838b0b50a0bc8, type: 3}
|
||||
- {fileID: 2800000, guid: c06cc21c692f94f5fb5206247191eeee, type: 3}
|
||||
- {fileID: 2800000, guid: cb76dd40fa7654f9587f6a344f125c9a, type: 3}
|
||||
- {fileID: 2800000, guid: e32226222ff144b24bf3a5a451de54bc, type: 3}
|
||||
- {fileID: 2800000, guid: 3302065f671a8450b82c9ddf07426f3a, type: 3}
|
||||
- {fileID: 2800000, guid: 56a77a3e8d64f47b6afe9e3c95cb57d5, type: 3}
|
||||
m_Shader: {fileID: 4800000, guid: 0849e84e3d62649e8882e9d6f056a017, type: 3}
|
||||
8
Assets/Settings/PC_Renderer.asset.meta
Normal file
8
Assets/Settings/PC_Renderer.asset.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f288ae1f4751b564a96ac7587541f7a2
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
159
Assets/Settings/SampleSceneProfile.asset
Normal file
159
Assets/Settings/SampleSceneProfile.asset
Normal file
@ -0,0 +1,159 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &-7893295128165547882
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 0b2db86121404754db890f4c8dfe81b2, type: 3}
|
||||
m_Name: Bloom
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
skipIterations:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
threshold:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
intensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.25
|
||||
scatter:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.5
|
||||
clamp:
|
||||
m_OverrideState: 0
|
||||
m_Value: 65472
|
||||
tint:
|
||||
m_OverrideState: 0
|
||||
m_Value: {r: 1, g: 1, b: 1, a: 1}
|
||||
highQualityFiltering:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
downscale:
|
||||
m_OverrideState: 0
|
||||
m_Value: 0
|
||||
maxIterations:
|
||||
m_OverrideState: 0
|
||||
m_Value: 6
|
||||
dirtTexture:
|
||||
m_OverrideState: 0
|
||||
m_Value: {fileID: 0}
|
||||
dimension: 1
|
||||
dirtIntensity:
|
||||
m_OverrideState: 0
|
||||
m_Value: 0
|
||||
--- !u!114 &-3357603926938260329
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 899c54efeace73346a0a16faa3afe726, type: 3}
|
||||
m_Name: Vignette
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
color:
|
||||
m_OverrideState: 0
|
||||
m_Value: {r: 0, g: 0, b: 0, a: 1}
|
||||
center:
|
||||
m_OverrideState: 0
|
||||
m_Value: {x: 0.5, y: 0.5}
|
||||
intensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.2
|
||||
smoothness:
|
||||
m_OverrideState: 0
|
||||
m_Value: 0.2
|
||||
rounded:
|
||||
m_OverrideState: 0
|
||||
m_Value: 0
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: d7fd9488000d3734a9e00ee676215985, type: 3}
|
||||
m_Name: SampleSceneProfile
|
||||
m_EditorClassIdentifier:
|
||||
components:
|
||||
- {fileID: 849379129802519247}
|
||||
- {fileID: -7893295128165547882}
|
||||
- {fileID: 7391319092446245454}
|
||||
- {fileID: -3357603926938260329}
|
||||
--- !u!114 &849379129802519247
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 97c23e3b12dc18c42a140437e53d3951, type: 3}
|
||||
m_Name: Tonemapping
|
||||
m_EditorClassIdentifier:
|
||||
active: 1
|
||||
mode:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
neutralHDRRangeReductionMode:
|
||||
m_OverrideState: 0
|
||||
m_Value: 2
|
||||
acesPreset:
|
||||
m_OverrideState: 0
|
||||
m_Value: 3
|
||||
hueShiftAmount:
|
||||
m_OverrideState: 0
|
||||
m_Value: 0
|
||||
detectPaperWhite:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0
|
||||
paperWhite:
|
||||
m_OverrideState: 1
|
||||
m_Value: 234
|
||||
detectBrightnessLimits:
|
||||
m_OverrideState: 1
|
||||
m_Value: 1
|
||||
minNits:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.005
|
||||
maxNits:
|
||||
m_OverrideState: 1
|
||||
m_Value: 647
|
||||
--- !u!114 &7391319092446245454
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 3
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: ccf1aba9553839d41ae37dd52e9ebcce, type: 3}
|
||||
m_Name: MotionBlur
|
||||
m_EditorClassIdentifier:
|
||||
active: 0
|
||||
mode:
|
||||
m_OverrideState: 0
|
||||
m_Value: 0
|
||||
quality:
|
||||
m_OverrideState: 1
|
||||
m_Value: 2
|
||||
intensity:
|
||||
m_OverrideState: 1
|
||||
m_Value: 0.6
|
||||
clamp:
|
||||
m_OverrideState: 0
|
||||
m_Value: 0.05
|
||||
8
Assets/Settings/SampleSceneProfile.asset.meta
Normal file
8
Assets/Settings/SampleSceneProfile.asset.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 10fc4df2da32a41aaa32d77bc913491c
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
248
Assets/Settings/UniversalRenderPipelineGlobalSettings.asset
Normal file
248
Assets/Settings/UniversalRenderPipelineGlobalSettings.asset
Normal file
@ -0,0 +1,248 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 2ec995e51a6e251468d2a3fd8a686257, type: 3}
|
||||
m_Name: UniversalRenderPipelineGlobalSettings
|
||||
m_EditorClassIdentifier:
|
||||
m_ShaderStrippingSetting:
|
||||
m_Version: 0
|
||||
m_ExportShaderVariants: 1
|
||||
m_ShaderVariantLogLevel: 0
|
||||
m_StripRuntimeDebugShaders: 1
|
||||
m_URPShaderStrippingSetting:
|
||||
m_Version: 0
|
||||
m_StripUnusedPostProcessingVariants: 1
|
||||
m_StripUnusedVariants: 1
|
||||
m_StripScreenCoordOverrideVariants: 1
|
||||
m_ShaderVariantLogLevel: 0
|
||||
m_ExportShaderVariants: 1
|
||||
m_StripDebugVariants: 1
|
||||
m_StripUnusedPostProcessingVariants: 1
|
||||
m_StripUnusedVariants: 1
|
||||
m_StripScreenCoordOverrideVariants: 1
|
||||
supportRuntimeDebugDisplay: 0
|
||||
m_EnableRenderGraph: 0
|
||||
m_Settings:
|
||||
m_SettingsList:
|
||||
m_List:
|
||||
- rid: 6852985685364965376
|
||||
- rid: 6852985685364965377
|
||||
- rid: 6852985685364965378
|
||||
- rid: 6852985685364965379
|
||||
- rid: 6852985685364965380
|
||||
- rid: 6852985685364965381
|
||||
- rid: 6852985685364965382
|
||||
- rid: 6852985685364965383
|
||||
- rid: 6852985685364965384
|
||||
- rid: 6852985685364965385
|
||||
- rid: 6852985685364965386
|
||||
- rid: 6852985685364965387
|
||||
- rid: 6852985685364965388
|
||||
- rid: 6852985685364965389
|
||||
- rid: 6852985685364965390
|
||||
- rid: 6852985685364965391
|
||||
- rid: 6852985685364965392
|
||||
- rid: 6852985685364965393
|
||||
- rid: 6852985685364965394
|
||||
- rid: 8712630790384254976
|
||||
m_RuntimeSettings:
|
||||
m_List: []
|
||||
m_AssetVersion: 8
|
||||
m_ObsoleteDefaultVolumeProfile: {fileID: 0}
|
||||
m_RenderingLayerNames:
|
||||
- Light Layer default
|
||||
- Light Layer 1
|
||||
- Light Layer 2
|
||||
- Light Layer 3
|
||||
- Light Layer 4
|
||||
- Light Layer 5
|
||||
- Light Layer 6
|
||||
- Light Layer 7
|
||||
m_ValidRenderingLayers: 0
|
||||
lightLayerName0: Light Layer default
|
||||
lightLayerName1: Light Layer 1
|
||||
lightLayerName2: Light Layer 2
|
||||
lightLayerName3: Light Layer 3
|
||||
lightLayerName4: Light Layer 4
|
||||
lightLayerName5: Light Layer 5
|
||||
lightLayerName6: Light Layer 6
|
||||
lightLayerName7: Light Layer 7
|
||||
apvScenesData:
|
||||
obsoleteSceneBounds:
|
||||
m_Keys: []
|
||||
m_Values: []
|
||||
obsoleteHasProbeVolumes:
|
||||
m_Keys: []
|
||||
m_Values:
|
||||
references:
|
||||
version: 2
|
||||
RefIds:
|
||||
- rid: 6852985685364965376
|
||||
type: {class: URPShaderStrippingSetting, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
|
||||
data:
|
||||
m_Version: 0
|
||||
m_StripUnusedPostProcessingVariants: 1
|
||||
m_StripUnusedVariants: 1
|
||||
m_StripScreenCoordOverrideVariants: 1
|
||||
- rid: 6852985685364965377
|
||||
type: {class: UniversalRenderPipelineEditorShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
|
||||
data:
|
||||
m_AutodeskInteractive: {fileID: 4800000, guid: 0e9d5a909a1f7e84882a534d0d11e49f, type: 3}
|
||||
m_AutodeskInteractiveTransparent: {fileID: 4800000, guid: 5c81372d981403744adbdda4433c9c11, type: 3}
|
||||
m_AutodeskInteractiveMasked: {fileID: 4800000, guid: 80aa867ac363ac043847b06ad71604cd, type: 3}
|
||||
m_TerrainDetailLit: {fileID: 4800000, guid: f6783ab646d374f94b199774402a5144, type: 3}
|
||||
m_TerrainDetailGrassBillboard: {fileID: 4800000, guid: 29868e73b638e48ca99a19ea58c48d90, type: 3}
|
||||
m_TerrainDetailGrass: {fileID: 4800000, guid: e507fdfead5ca47e8b9a768b51c291a1, type: 3}
|
||||
m_DefaultSpeedTree7Shader: {fileID: 4800000, guid: 0f4122b9a743b744abe2fb6a0a88868b, type: 3}
|
||||
m_DefaultSpeedTree8Shader: {fileID: -6465566751694194690, guid: 9920c1f1781549a46ba081a2a15a16ec, type: 3}
|
||||
m_DefaultSpeedTree9Shader: {fileID: -6465566751694194690, guid: cbd3e1cc4ae141c42a30e33b4d666a61, type: 3}
|
||||
- rid: 6852985685364965378
|
||||
type: {class: UniversalRendererResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
|
||||
data:
|
||||
m_Version: 0
|
||||
m_CopyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3}
|
||||
m_CameraMotionVector: {fileID: 4800000, guid: c56b7e0d4c7cb484e959caeeedae9bbf, type: 3}
|
||||
m_StencilDeferredPS: {fileID: 4800000, guid: e9155b26e1bc55942a41e518703fe304, type: 3}
|
||||
m_DBufferClear: {fileID: 4800000, guid: f056d8bd2a1c7e44e9729144b4c70395, type: 3}
|
||||
- rid: 6852985685364965379
|
||||
type: {class: UniversalRenderPipelineDebugShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
|
||||
data:
|
||||
m_DebugReplacementPS: {fileID: 4800000, guid: cf852408f2e174538bcd9b7fda1c5ae7, type: 3}
|
||||
m_HdrDebugViewPS: {fileID: 4800000, guid: 573620ae32aec764abd4d728906d2587, type: 3}
|
||||
m_ProbeVolumeSamplingDebugComputeShader: {fileID: 7200000, guid: 53626a513ea68ce47b59dc1299fe3959, type: 3}
|
||||
- rid: 6852985685364965380
|
||||
type: {class: UniversalRenderPipelineRuntimeShaders, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
|
||||
data:
|
||||
m_Version: 0
|
||||
m_FallbackErrorShader: {fileID: 4800000, guid: e6e9a19c3678ded42a3bc431ebef7dbd, type: 3}
|
||||
m_BlitHDROverlay: {fileID: 4800000, guid: a89bee29cffa951418fc1e2da94d1959, type: 3}
|
||||
m_CoreBlitPS: {fileID: 4800000, guid: 93446b5c5339d4f00b85c159e1159b7c, type: 3}
|
||||
m_CoreBlitColorAndDepthPS: {fileID: 4800000, guid: d104b2fc1ca6445babb8e90b0758136b, type: 3}
|
||||
m_SamplingPS: {fileID: 4800000, guid: 04c410c9937594faa893a11dceb85f7e, type: 3}
|
||||
- rid: 6852985685364965381
|
||||
type: {class: UniversalRenderPipelineRuntimeTextures, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
|
||||
data:
|
||||
m_Version: 1
|
||||
m_BlueNoise64LTex: {fileID: 2800000, guid: e3d24661c1e055f45a7560c033dbb837, type: 3}
|
||||
m_BayerMatrixTex: {fileID: 2800000, guid: f9ee4ed84c1d10c49aabb9b210b0fc44, type: 3}
|
||||
m_DebugFontTex: {fileID: 2800000, guid: 26a413214480ef144b2915d6ff4d0beb, type: 3}
|
||||
- rid: 6852985685364965382
|
||||
type: {class: Renderer2DResources, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
|
||||
data:
|
||||
m_Version: 0
|
||||
m_LightShader: {fileID: 4800000, guid: 3f6c848ca3d7bca4bbe846546ac701a1, type: 3}
|
||||
m_ProjectedShadowShader: {fileID: 4800000, guid: ce09d4a80b88c5a4eb9768fab4f1ee00, type: 3}
|
||||
m_SpriteShadowShader: {fileID: 4800000, guid: 44fc62292b65ab04eabcf310e799ccf6, type: 3}
|
||||
m_SpriteUnshadowShader: {fileID: 4800000, guid: de02b375720b5c445afe83cd483bedf3, type: 3}
|
||||
m_GeometryShadowShader: {fileID: 4800000, guid: 19349a0f9a7ed4c48a27445bcf92e5e1, type: 3}
|
||||
m_GeometryUnshadowShader: {fileID: 4800000, guid: 77774d9009bb81447b048c907d4c6273, type: 3}
|
||||
m_FallOffLookup: {fileID: 2800000, guid: 5688ab254e4c0634f8d6c8e0792331ca, type: 3}
|
||||
m_CopyDepthPS: {fileID: 4800000, guid: d6dae50ee9e1bfa4db75f19f99355220, type: 3}
|
||||
m_DefaultLitMaterial: {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2}
|
||||
m_DefaultUnlitMaterial: {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2}
|
||||
m_DefaultMaskMaterial: {fileID: 2100000, guid: 15d0c3709176029428a0da2f8cecf0b5, type: 2}
|
||||
- rid: 6852985685364965383
|
||||
type: {class: UniversalRenderPipelineEditorMaterials, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
|
||||
data:
|
||||
m_DefaultMaterial: {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2}
|
||||
m_DefaultParticleMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2}
|
||||
m_DefaultLineMaterial: {fileID: 2100000, guid: e823cd5b5d27c0f4b8256e7c12ee3e6d, type: 2}
|
||||
m_DefaultTerrainMaterial: {fileID: 2100000, guid: 594ea882c5a793440b60ff72d896021e, type: 2}
|
||||
m_DefaultDecalMaterial: {fileID: 2100000, guid: 31d0dcc6f2dd4e4408d18036a2c93862, type: 2}
|
||||
- rid: 6852985685364965384
|
||||
type: {class: URPDefaultVolumeProfileSettings, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
|
||||
data:
|
||||
m_Version: 0
|
||||
m_VolumeProfile: {fileID: 11400000, guid: ab09877e2e707104187f6f83e2f62510, type: 2}
|
||||
- rid: 6852985685364965385
|
||||
type: {class: RenderGraphSettings, ns: UnityEngine.Rendering.Universal, asm: Unity.RenderPipelines.Universal.Runtime}
|
||||
data:
|
||||
m_Version: 0
|
||||
m_EnableRenderCompatibilityMode: 0
|
||||
- rid: 6852985685364965386
|
||||
type: {class: GPUResidentDrawerResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.GPUDriven.Runtime}
|
||||
data:
|
||||
m_Version: 0
|
||||
m_InstanceDataBufferCopyKernels: {fileID: 7200000, guid: f984aeb540ded8b4fbb8a2047ab5b2e2, type: 3}
|
||||
m_InstanceDataBufferUploadKernels: {fileID: 7200000, guid: 53864816eb00f2343b60e1a2c5a262ef, type: 3}
|
||||
m_TransformUpdaterKernels: {fileID: 7200000, guid: 2a567b9b2733f8d47a700c3c85bed75b, type: 3}
|
||||
m_WindDataUpdaterKernels: {fileID: 7200000, guid: fde76746e4fd0ed418c224f6b4084114, type: 3}
|
||||
m_OccluderDepthPyramidKernels: {fileID: 7200000, guid: 08b2b5fb307b0d249860612774a987da, type: 3}
|
||||
m_InstanceOcclusionCullingKernels: {fileID: 7200000, guid: f6d223acabc2f974795a5a7864b50e6c, type: 3}
|
||||
m_OcclusionCullingDebugKernels: {fileID: 7200000, guid: b23e766bcf50ca4438ef186b174557df, type: 3}
|
||||
m_DebugOcclusionTestPS: {fileID: 4800000, guid: d3f0849180c2d0944bc71060693df100, type: 3}
|
||||
m_DebugOccluderPS: {fileID: 4800000, guid: b3c92426a88625841ab15ca6a7917248, type: 3}
|
||||
- rid: 6852985685364965387
|
||||
type: {class: STP/RuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime}
|
||||
data:
|
||||
m_setupCS: {fileID: 7200000, guid: 33be2e9a5506b2843bdb2bdff9cad5e1, type: 3}
|
||||
m_preTaaCS: {fileID: 7200000, guid: a679dba8ec4d9ce45884a270b0e22dda, type: 3}
|
||||
m_taaCS: {fileID: 7200000, guid: 3923900e2b41b5e47bc25bfdcbcdc9e6, type: 3}
|
||||
- rid: 6852985685364965388
|
||||
type: {class: ProbeVolumeBakingResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime}
|
||||
data:
|
||||
m_Version: 1
|
||||
dilationShader: {fileID: 7200000, guid: 6bb382f7de370af41b775f54182e491d, type: 3}
|
||||
subdivideSceneCS: {fileID: 7200000, guid: bb86f1f0af829fd45b2ebddda1245c22, type: 3}
|
||||
voxelizeSceneShader: {fileID: 4800000, guid: c8b6a681c7b4e2e4785ffab093907f9e, type: 3}
|
||||
traceVirtualOffsetCS: {fileID: 7200000, guid: 805f10d263aac4b4098c0279cd37a4f3, type: 3}
|
||||
traceVirtualOffsetRT: {fileID: 4807578003741378534, guid: b60511f4aa1443f4d8c0b18f4fec92f4, type: 3}
|
||||
skyOcclusionCS: {fileID: 7200000, guid: 798f52ec82fa04048a12826bbbbcf7b4, type: 3}
|
||||
skyOcclusionRT: {fileID: 4807578003741378534, guid: dfaf42b38dd001f49a72d8102b709f29, type: 3}
|
||||
renderingLayerCS: {fileID: 7200000, guid: a63c9cf933e3d8f41ae680a372784ebf, type: 3}
|
||||
renderingLayerRT: {fileID: 4807578003741378534, guid: c2be09c936362eb49a58f08aeb30627a, type: 3}
|
||||
- rid: 6852985685364965389
|
||||
type: {class: ProbeVolumeGlobalSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime}
|
||||
data:
|
||||
m_Version: 1
|
||||
m_ProbeVolumeDisableStreamingAssets: 0
|
||||
- rid: 6852985685364965390
|
||||
type: {class: ProbeVolumeDebugResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime}
|
||||
data:
|
||||
m_Version: 1
|
||||
probeVolumeDebugShader: {fileID: 4800000, guid: 3b21275fd12d65f49babb5286f040f2d, type: 3}
|
||||
probeVolumeFragmentationDebugShader: {fileID: 4800000, guid: 3a80877c579b9144ebdcc6d923bca303, type: 3}
|
||||
probeVolumeSamplingDebugShader: {fileID: 4800000, guid: bf54e6528c79a224e96346799064c393, type: 3}
|
||||
probeVolumeOffsetDebugShader: {fileID: 4800000, guid: db8bd7436dc2c5f4c92655307d198381, type: 3}
|
||||
probeSamplingDebugMesh: {fileID: -3555484719484374845, guid: 20be25aac4e22ee49a7db76fb3df6de2, type: 3}
|
||||
numbersDisplayTex: {fileID: 2800000, guid: 73fe53b428c5b3440b7e87ee830b608a, type: 3}
|
||||
- rid: 6852985685364965391
|
||||
type: {class: IncludeAdditionalRPAssets, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime}
|
||||
data:
|
||||
m_version: 0
|
||||
m_IncludeReferencedInScenes: 0
|
||||
m_IncludeAssetsByLabel: 0
|
||||
m_LabelToInclude:
|
||||
- rid: 6852985685364965392
|
||||
type: {class: ShaderStrippingSetting, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime}
|
||||
data:
|
||||
m_Version: 0
|
||||
m_ExportShaderVariants: 1
|
||||
m_ShaderVariantLogLevel: 0
|
||||
m_StripRuntimeDebugShaders: 1
|
||||
- rid: 6852985685364965393
|
||||
type: {class: ProbeVolumeRuntimeResources, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime}
|
||||
data:
|
||||
m_Version: 1
|
||||
probeVolumeBlendStatesCS: {fileID: 7200000, guid: a3f7b8c99de28a94684cb1daebeccf5d, type: 3}
|
||||
probeVolumeUploadDataCS: {fileID: 7200000, guid: 0951de5992461754fa73650732c4954c, type: 3}
|
||||
probeVolumeUploadDataL2CS: {fileID: 7200000, guid: 6196f34ed825db14b81fb3eb0ea8d931, type: 3}
|
||||
- rid: 6852985685364965394
|
||||
type: {class: RenderGraphGlobalSettings, ns: UnityEngine.Rendering, asm: Unity.RenderPipelines.Core.Runtime}
|
||||
data:
|
||||
m_version: 0
|
||||
m_EnableCompilationCaching: 1
|
||||
m_EnableValidityChecks: 1
|
||||
- rid: 8712630790384254976
|
||||
type: {class: RenderGraphUtilsResources, ns: UnityEngine.Rendering.RenderGraphModule.Util, asm: Unity.RenderPipelines.Core.Runtime}
|
||||
data:
|
||||
m_Version: 0
|
||||
m_CoreCopyPS: {fileID: 4800000, guid: 12dc59547ea167a4ab435097dd0f9add, type: 3}
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 18dc0cd2c080841dea60987a38ce93fa
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/VersionFlow.meta
Normal file
8
Assets/VersionFlow.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 775d8b4258ba62b4c89947022bc40fae
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/VersionFlow/Builder.meta
Normal file
8
Assets/VersionFlow/Builder.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 498e078458f2d9540b1e042ad2401f9e
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
819
Assets/VersionFlow/Builder/Builder.asset
Normal file
819
Assets/VersionFlow/Builder/Builder.asset
Normal file
@ -0,0 +1,819 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: c3028a02f45639447a8cf4f6fa36bff2, type: 3}
|
||||
m_Name: Builder
|
||||
m_EditorClassIdentifier:
|
||||
ConfigUploadPath: HXORG_Config_Root
|
||||
BucketName: 2020yoyo
|
||||
UploadPath: HXORG
|
||||
accessKeyId: LTAI5tCMR4e8A4W8sKvt1pLe
|
||||
accessKeySecret: yOGzDbtS1cGS9y5C7akfjgITf376CJ
|
||||
endPoint: oss-cn-hangzhou.aliyuncs.com
|
||||
Options: 256
|
||||
Groups:
|
||||
- GroupName: Map3
|
||||
BuildMode: 2
|
||||
OptionBundle: 1
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: f56b5ebbb63b8ee4cbfb9141c956b76b, type: 3}
|
||||
- {fileID: 102900000, guid: c44c562b11e37ac4dae217b6cfca7089, type: 3}
|
||||
- {fileID: 102900000, guid: 615bd05b2614a0c408a6e5dedbfa5b7e, type: 3}
|
||||
- {fileID: 102900000, guid: 40ebe47207b258c4bba20897cd2c32ce, type: 3}
|
||||
- {fileID: 102900000, guid: aea52b43d68a60c428617ff84dcb0d21, type: 3}
|
||||
- {fileID: 102900000, guid: 70481748098d1d64ea51e6886e785112, type: 3}
|
||||
- {fileID: 102900000, guid: c4d8becb39208fb459ba4d030ffa6dd5, type: 3}
|
||||
- {fileID: 102900000, guid: e8fdc89615aa20c43b6e5ae136d650a9, type: 3}
|
||||
- {fileID: 102900000, guid: 8351be4e8df28444b8202aec7436ec07, type: 3}
|
||||
- {fileID: 102900000, guid: d09787dd11c350b4caf8587019d3a0d3, type: 3}
|
||||
- {fileID: 102900000, guid: 4d2b8e9dbc452fd43a459c3e9da85e31, type: 3}
|
||||
- {fileID: 102900000, guid: 7df6942a13463d44fa815a7e8332e855, type: 3}
|
||||
- {fileID: 102900000, guid: 5cd393961b37ced408a9b3b0d0dc9b09, type: 3}
|
||||
- {fileID: 102900000, guid: be04a2544c40b5640927287ffe809402, type: 3}
|
||||
- {fileID: 102900000, guid: 5e5faa1c5c9b7de4092f0496bb86ee95, type: 3}
|
||||
- {fileID: 102900000, guid: 9fd63ab497ec1d64cb8872cb36604307, type: 3}
|
||||
- {fileID: 102900000, guid: afdfb029250cb7f45ac24b269c81162c, type: 3}
|
||||
- {fileID: 102900000, guid: 407100412e265ea4f8ad0a21184e73a4, type: 3}
|
||||
- {fileID: 102900000, guid: 1c4d2d7145204c74184ad63669607eb2, type: 3}
|
||||
- {fileID: 102900000, guid: c26ed64acf090354d8c46dec3c4c45a6, type: 3}
|
||||
- {fileID: 102900000, guid: 2a5370c0a77ea8e4eb7160fa4b7b7175, type: 3}
|
||||
- {fileID: 102900000, guid: 79c745b34a3e48f49b6b3a1b4c24edb3, type: 3}
|
||||
- {fileID: 102900000, guid: 0d359e5065512084f982d587f08c7715, type: 3}
|
||||
- {fileID: 102900000, guid: b2d364026874be147b75ff64b0fed420, type: 3}
|
||||
- {fileID: 102900000, guid: 70070756351324f418f96f6cd5e87258, type: 3}
|
||||
- {fileID: 102900000, guid: 789708a951fba164a97ad6e0cce1a7d2, type: 3}
|
||||
- {fileID: 102900000, guid: d408be43f2520a843ac4382b4384ef20, type: 3}
|
||||
- {fileID: 102900000, guid: 2e6c9646e783feb449255a9fc794a5e5, type: 3}
|
||||
- {fileID: 102900000, guid: 210b42a1dc7b48048ae171c7c57c3e71, type: 3}
|
||||
- {fileID: 102900000, guid: 9d0ee2cbed7563540946e571472983f5, type: 3}
|
||||
- {fileID: 102900000, guid: a21629ce348f1f24f86a327cc2a8cab3, type: 3}
|
||||
- {fileID: 102900000, guid: 430d5677994d8af44857b44815c96e32, type: 3}
|
||||
- {fileID: 102900000, guid: 8f843dd6cef9d494c973c2bd1e1c5065, type: 3}
|
||||
- {fileID: 102900000, guid: 01d093c0236839249933670231460506, type: 3}
|
||||
- {fileID: 102900000, guid: de2741aef2901ac468edde28f175159f, type: 3}
|
||||
- {fileID: 102900000, guid: 18f345e9c9a7cf5479257bb2b2b72137, type: 3}
|
||||
- {fileID: 102900000, guid: 9044cff7fe8367e428d0e79173f76170, type: 3}
|
||||
- {fileID: 102900000, guid: ce984af32654bbc4197115de9fd0ce1c, type: 3}
|
||||
- {fileID: 102900000, guid: 83d85af1d0a133f478c1a2d6282d5b49, type: 3}
|
||||
- {fileID: 102900000, guid: 1ab66b0ca2bf090418494cfa6aea69a9, type: 3}
|
||||
- {fileID: 102900000, guid: a5abc746506edf341a4b516a13935717, type: 3}
|
||||
- {fileID: 102900000, guid: f0152cb85bfd9594e8f1be1b6b4353c6, type: 3}
|
||||
- {fileID: 102900000, guid: 80dd7863e778a4d4eb8864edc8582f9f, type: 3}
|
||||
- {fileID: 102900000, guid: 5b2d061f27b261b43992a1e453068c44, type: 3}
|
||||
- {fileID: 102900000, guid: dee2fa28f3eea8644862f3135f741d01, type: 3}
|
||||
- {fileID: 102900000, guid: 338dc3fe06ce96e4aa7cb6a637f4bfd0, type: 3}
|
||||
- {fileID: 102900000, guid: 2c23430a7b331b74eb5f7849629d7648, type: 3}
|
||||
- {fileID: 102900000, guid: 3f713bf54184c074a97658622c4c14df, type: 3}
|
||||
- {fileID: 102900000, guid: 5f9a325c98801d14d8036b55b81fbb61, type: 3}
|
||||
- {fileID: 102900000, guid: c54018b62e592944eb821c5e19a3c657, type: 3}
|
||||
- {fileID: 102900000, guid: ded7a85d261e613479e053397a7c4be4, type: 3}
|
||||
- {fileID: 102900000, guid: 5aef6f830f203f5459ae63a27172d791, type: 3}
|
||||
- {fileID: 102900000, guid: 851b4f88cb389ef44b422d58445400f1, type: 3}
|
||||
- {fileID: 102900000, guid: 85ae20c2852051d4ab58511906a997e0, type: 3}
|
||||
- {fileID: 102900000, guid: 038d46fd1248e3a49a1aff32cb73dd07, type: 3}
|
||||
- {fileID: 102900000, guid: db586f1777099bb488fcb782e96bba48, type: 3}
|
||||
- {fileID: 102900000, guid: e04447df086dc2d46b11d26df2ec5dea, type: 3}
|
||||
- {fileID: 102900000, guid: 309e9c44dbad93c4abe53a67ae2f5284, type: 3}
|
||||
- {fileID: 102900000, guid: e51b3c9908edb3e468d06aaa0e6e0913, type: 3}
|
||||
- {fileID: 102900000, guid: 5e2a7bae518f87e4e9b31d376bccb7b0, type: 3}
|
||||
- {fileID: 102900000, guid: 319aab3854058c14d846db7c5fe2bb01, type: 3}
|
||||
- {fileID: 102900000, guid: 09cc4522ed7b7fb4a894386db754190f, type: 3}
|
||||
- {fileID: 102900000, guid: 743f99eae25be5a4db287b8351d282f0, type: 3}
|
||||
- {fileID: 102900000, guid: 18a85a4d78ba76b488bf4318694d6456, type: 3}
|
||||
- {fileID: 102900000, guid: e4d450067eed80641a56ffd0df80d343, type: 3}
|
||||
- {fileID: 102900000, guid: eb71635fb24d2f84b98a447a3dc458fd, type: 3}
|
||||
- {fileID: 102900000, guid: 26e633cc3a6968e4f911a7693b479d11, type: 3}
|
||||
- {fileID: 102900000, guid: 0391552a86d4d054ea1742fe47c4b109, type: 3}
|
||||
- {fileID: 102900000, guid: b3539114eea3fbf4d84197b9a506595c, type: 3}
|
||||
- {fileID: 102900000, guid: 2a3b2b66847bd734b8d741c9fb1d8caf, type: 3}
|
||||
- {fileID: 102900000, guid: eb276450a046ac14f91667d3f095df73, type: 3}
|
||||
- {fileID: 102900000, guid: 669918a28b4f956459377e5392f33b52, type: 3}
|
||||
- {fileID: 102900000, guid: 50bd91b08db8a4a4689907e710662744, type: 3}
|
||||
- {fileID: 102900000, guid: 28d4036141347754b95ab4e07b07d2bc, type: 3}
|
||||
- {fileID: 102900000, guid: 956147eebf0c0f54483ab482b19d43fe, type: 3}
|
||||
- {fileID: 102900000, guid: e5abcd015200b3c4ba0e9e7299e73781, type: 3}
|
||||
- {fileID: 102900000, guid: 60a0651165328f046a1c9a695cd5ca4f, type: 3}
|
||||
- {fileID: 102900000, guid: c5ba838208359264ba7bd9a2e6acbfed, type: 3}
|
||||
- {fileID: 102900000, guid: e5abcd015200b3c4ba0e9e7299e73781, type: 3}
|
||||
- {fileID: 102900000, guid: 7da079f2adf63b7458cf1f63d8014ce1, type: 3}
|
||||
- {fileID: 102900000, guid: 9a7ba7474baaa6b4eaed380c5e7f92c5, type: 3}
|
||||
- {fileID: 102900000, guid: 4abd70c835ec26c4c97b520cf4a93f3a, type: 3}
|
||||
- {fileID: 102900000, guid: 9f3a60d0c467b6b488275de91864faeb, type: 3}
|
||||
- {fileID: 102900000, guid: f3440a93be25ad84eab181ac123c078f, type: 3}
|
||||
- {fileID: 102900000, guid: 9f91ca73b2033fd46ab17c0b365b22ca, type: 3}
|
||||
- {fileID: 102900000, guid: f78a22b4c9b3c2d4c9554fd59896be1f, type: 3}
|
||||
- {fileID: 102900000, guid: 489f51c0e499fe34b97b5f9345cbf772, type: 3}
|
||||
- {fileID: 102900000, guid: f7e94dc761a709b479fe3e33371bb2e4, type: 3}
|
||||
- {fileID: 102900000, guid: 0b3f1a0dfdb1ddb43a2b2390f065c835, type: 3}
|
||||
- {fileID: 102900000, guid: af303c14fa2a4de429fea0b9135d7369, type: 3}
|
||||
- {fileID: 102900000, guid: ef02a4ae25b46b2449874ee1e8cc2eb1, type: 3}
|
||||
- GroupName: Map4
|
||||
BuildMode: 2
|
||||
OptionBundle: 1
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 9f9d0ee2f99bae84cb613d3cca056c03, type: 3}
|
||||
- {fileID: 102900000, guid: d1d6cd2077def434f97e514418242dfc, type: 3}
|
||||
- {fileID: 102900000, guid: a023396aa6805c24b853c3554f3c9618, type: 3}
|
||||
- {fileID: 102900000, guid: 572c0fe586d9854469ef26e8557db740, type: 3}
|
||||
- {fileID: 102900000, guid: 5b28df89d4b10c746b3d4b25a65b30f6, type: 3}
|
||||
- {fileID: 102900000, guid: 532181617cfbc1e468fb80452f769c90, type: 3}
|
||||
- {fileID: 102900000, guid: 872641a0d120b0148ba0e0ef293382ad, type: 3}
|
||||
- {fileID: 102900000, guid: c663dd811ee7541489cccb8cec38ad1b, type: 3}
|
||||
- {fileID: 102900000, guid: 49f7292e68fa1ab4bb2ddcd7e3d27d1d, type: 3}
|
||||
- {fileID: 102900000, guid: 328c93189d0bfb24793f28aefe08abad, type: 3}
|
||||
- {fileID: 102900000, guid: f3f09f1bce492714dad4fe8b8ca79cc4, type: 3}
|
||||
- {fileID: 102900000, guid: 56a1c071dd512ad488e75828134b8253, type: 3}
|
||||
- {fileID: 102900000, guid: 8125e081fec81c94a9539ecc40e9cafd, type: 3}
|
||||
- {fileID: 102900000, guid: 94aa162632d96e3488ebf8085db4a4e6, type: 3}
|
||||
- {fileID: 102900000, guid: 9f572aad211fed244b31f6c60e230827, type: 3}
|
||||
- {fileID: 102900000, guid: f7c64d7d88805d547a3b1ae2be5841a7, type: 3}
|
||||
- {fileID: 102900000, guid: 43ad70fa891b3654faca65d5e372097a, type: 3}
|
||||
- {fileID: 102900000, guid: 74ee76acd5a319142b61caba55db7a98, type: 3}
|
||||
- {fileID: 102900000, guid: 8c731810f94057d42b18a850af2d06a6, type: 3}
|
||||
- {fileID: 102900000, guid: 6cf1d9fdbace03243b3f99792ddacb39, type: 3}
|
||||
- {fileID: 102900000, guid: fddaf09c8247229418f0350c2feba513, type: 3}
|
||||
- {fileID: 102900000, guid: 1af11c89ce147dc439738f9859c94df8, type: 3}
|
||||
- {fileID: 102900000, guid: 458f268c6bced2f43a2b030174eab130, type: 3}
|
||||
- {fileID: 102900000, guid: c6ba7e14b5e7d5f45a2bd7944c162447, type: 3}
|
||||
- {fileID: 102900000, guid: ba66cb98299c0df44bb95897d39202f9, type: 3}
|
||||
- {fileID: 102900000, guid: 4dd92c1edb41dd447ab109998a17df68, type: 3}
|
||||
- {fileID: 102900000, guid: d799125b95b650248bb82628ebc3ec57, type: 3}
|
||||
- {fileID: 102900000, guid: 77d8b8d3e3e13804a897ec6a81fb43c8, type: 3}
|
||||
- {fileID: 102900000, guid: d7b9051e1f646894dbad52698d8790a1, type: 3}
|
||||
- {fileID: 102900000, guid: 10dff0d8ebc296b4a9caf7e1a2f8bfa6, type: 3}
|
||||
- {fileID: 102900000, guid: 2d417979f1bbb8842a9c477630f08ca8, type: 3}
|
||||
- {fileID: 102900000, guid: 1ef61d14c5403f14aa8c5fdfd4d96008, type: 3}
|
||||
- {fileID: 102900000, guid: 016ffd43ecbf9624c88d2217de8dede3, type: 3}
|
||||
- {fileID: 102900000, guid: f1487c26209a2d14bb9ff0eb80abdeec, type: 3}
|
||||
- {fileID: 102900000, guid: 669b6c39e99d2164ab5d492b65c08d2c, type: 3}
|
||||
- {fileID: 102900000, guid: 796996721bcf91e4095a503b5f0a908c, type: 3}
|
||||
- {fileID: 102900000, guid: 2f34bcf24b4c0a947a0a36a14a9f44e5, type: 3}
|
||||
- {fileID: 102900000, guid: 457e02831ef450b4daa12b1626f7f77b, type: 3}
|
||||
- {fileID: 102900000, guid: a5a4a6c96065d9640866e06afb2f795a, type: 3}
|
||||
- {fileID: 102900000, guid: a47b9779cc21c2d4f94f5cabbf4eef01, type: 3}
|
||||
- {fileID: 102900000, guid: fe5e546f599701744ad894ec2e27fae4, type: 3}
|
||||
- {fileID: 102900000, guid: 05fe15b933511e544af3ae426307d587, type: 3}
|
||||
- {fileID: 102900000, guid: 4a13758ff5b9f5f4b90519010de885f7, type: 3}
|
||||
- {fileID: 102900000, guid: 0a269c2e71f4b7444ae3971742cfb613, type: 3}
|
||||
- {fileID: 102900000, guid: a16bb3879a92898408642f8404d49145, type: 3}
|
||||
- {fileID: 102900000, guid: 8439502d222ad99468e41b23b63736c5, type: 3}
|
||||
- {fileID: 102900000, guid: 4d09556739e71c94a86b6856afcf8b40, type: 3}
|
||||
- {fileID: 102900000, guid: f5b3232dd8ed7394dbcb40d16db22115, type: 3}
|
||||
- {fileID: 102900000, guid: 43b4d39b5824e9d449144aaf21c1733a, type: 3}
|
||||
- {fileID: 102900000, guid: 3b1f0abc6ea65c041b471eddf4946441, type: 3}
|
||||
- {fileID: 102900000, guid: ab7ba41e8ad889b4f8c6f210aa504de1, type: 3}
|
||||
- {fileID: 102900000, guid: 973de367526668a418e9877cd40788c6, type: 3}
|
||||
- {fileID: 102900000, guid: 2acad33d1000b9249ae912427487947a, type: 3}
|
||||
- {fileID: 102900000, guid: 91b937997e3956a4ea786a54a36c6f6c, type: 3}
|
||||
- {fileID: 102900000, guid: ee8f59dd31097864e93a9a761120dd03, type: 3}
|
||||
- {fileID: 102900000, guid: a75e5ed975058d24f9f630f81de3aa0f, type: 3}
|
||||
- {fileID: 102900000, guid: 6d483abaea05fc14490ba6938ceb72e6, type: 3}
|
||||
- {fileID: 102900000, guid: 3eaf656e9d7e5fa4d8296ddfa67b9e6a, type: 3}
|
||||
- {fileID: 102900000, guid: 5c4e791c2dd456b439f622bb3a0d75ac, type: 3}
|
||||
- {fileID: 102900000, guid: f6639c21754e40543955bdac790eec4f, type: 3}
|
||||
- {fileID: 102900000, guid: f3285d6aad566fc4fa5603dfd6bbeee3, type: 3}
|
||||
- {fileID: 102900000, guid: a7937f3a9ecd4a447bc4e6f352f0d205, type: 3}
|
||||
- {fileID: 102900000, guid: ff65b10fd0163ef41af9481bedfc1618, type: 3}
|
||||
- {fileID: 102900000, guid: b4cfa457dbfb46d48bea3a9e0bcc6db7, type: 3}
|
||||
- {fileID: 102900000, guid: bc5bd37a880e18c43befb0ba9edc6772, type: 3}
|
||||
- {fileID: 102900000, guid: 46f5116990d10274ea35dfa7922ea89c, type: 3}
|
||||
- {fileID: 102900000, guid: 72c3e91701992c84ebd0133aaca8fb6c, type: 3}
|
||||
- {fileID: 102900000, guid: 4ce868778be619343877dbe21feef400, type: 3}
|
||||
- {fileID: 102900000, guid: 184fb253f8563734aaf35c8c860e2148, type: 3}
|
||||
- {fileID: 102900000, guid: 9575eefd45bac94488b1f9f22008df3f, type: 3}
|
||||
- {fileID: 102900000, guid: 84e833ab8fc1b0e42b6cc8496b74ff62, type: 3}
|
||||
- {fileID: 102900000, guid: 9858e5061a2fd5542a02b9c926ad6150, type: 3}
|
||||
- {fileID: 102900000, guid: fbddce1f2f7799341b8d052efd73067d, type: 3}
|
||||
- {fileID: 102900000, guid: f46afbb72e947ed4e90c250d4b88c4ab, type: 3}
|
||||
- {fileID: 102900000, guid: fccd219ca6421cb46995742155f406a9, type: 3}
|
||||
- {fileID: 102900000, guid: e9283db8ece4b994eb97ee9f632b2c21, type: 3}
|
||||
- {fileID: 102900000, guid: 6721fe72a769c644487f5cf2371ef204, type: 3}
|
||||
- {fileID: 102900000, guid: f2cddd04cd2b1cc479b8ae1f53e47553, type: 3}
|
||||
- {fileID: 102900000, guid: 6b22739415d988241995c0efc18f244e, type: 3}
|
||||
- {fileID: 102900000, guid: e229db66ec425c447ae06f1092d99927, type: 3}
|
||||
- {fileID: 102900000, guid: 8fba5d51135f5c3428073b5995a8d03d, type: 3}
|
||||
- {fileID: 102900000, guid: 48b2da294f3459046aa49095067ce00b, type: 3}
|
||||
- {fileID: 102900000, guid: 7c6da8f9e8014fe4a99c9a92eaf8d9a9, type: 3}
|
||||
- {fileID: 102900000, guid: a24945fdec8836c439169302b8bc140e, type: 3}
|
||||
- {fileID: 102900000, guid: 05fed90ac64c18c42886b48edd0b7f77, type: 3}
|
||||
- {fileID: 102900000, guid: 8b3023561e33e8949a2df16d081b8a5c, type: 3}
|
||||
- {fileID: 102900000, guid: 24ad3c185aa55774d82b7a4b5607afe9, type: 3}
|
||||
- {fileID: 102900000, guid: e53d4091b239f8448a5c06eebeb1f09d, type: 3}
|
||||
- {fileID: 102900000, guid: 4cdc572dc8d29c443be5c3e3f5a7298b, type: 3}
|
||||
- {fileID: 102900000, guid: 4a69d98d5cb0b984282280a90346c12c, type: 3}
|
||||
- GroupName: Map5
|
||||
BuildMode: 2
|
||||
OptionBundle: 1
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: dc7c21fc5e21e5345af7faca9be75479, type: 3}
|
||||
- {fileID: 102900000, guid: fb179ed8e350e3544aea0e3d7717819f, type: 3}
|
||||
- {fileID: 102900000, guid: f12abf35ee4eb9f4392525dd864e2b2e, type: 3}
|
||||
- {fileID: 102900000, guid: 631739482ba14894483b404990882b88, type: 3}
|
||||
- {fileID: 102900000, guid: fae61a2dcbc76d54fad536404a0c5cd9, type: 3}
|
||||
- {fileID: 102900000, guid: 8caca7e46df15ed44aeeae6d40d11445, type: 3}
|
||||
- {fileID: 102900000, guid: da2dd8f9e93a29b4ba724776c3c746d0, type: 3}
|
||||
- {fileID: 102900000, guid: a7f03e0b22951734683d8481265a9f01, type: 3}
|
||||
- GroupName: Map6
|
||||
BuildMode: 2
|
||||
OptionBundle: 1
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: f402e9187c99e9748b5e879c42f95f70, type: 3}
|
||||
- {fileID: 102900000, guid: 283d989ee61ab854b8244b2ba8f1291f, type: 3}
|
||||
- {fileID: 102900000, guid: c4a0dd51624a6db47846d133eb435562, type: 3}
|
||||
- {fileID: 102900000, guid: 4b68170c5139d364ebe0c7a03cb2e0bd, type: 3}
|
||||
- {fileID: 102900000, guid: 44f41148c92e36b4b9d0773bc0e17777, type: 3}
|
||||
- {fileID: 102900000, guid: 49fe6b7166742e14a87c79d07ea26c49, type: 3}
|
||||
- {fileID: 102900000, guid: fe93b0f159250fe4caa8f3005b3eab5e, type: 3}
|
||||
- {fileID: 102900000, guid: b35a36a3ac9b35a41b4b3a3efc21dd64, type: 3}
|
||||
- {fileID: 102900000, guid: ef8bc4bb1fc3a40409e46f8bbe9c3837, type: 3}
|
||||
- {fileID: 102900000, guid: c4af3ff01a6772c4c801fd1276439cd7, type: 3}
|
||||
- {fileID: 102900000, guid: 78db74d7db94d9c438ebec8e16e252ed, type: 3}
|
||||
- {fileID: 102900000, guid: 561ac0744f2cdaf4bb0f6b6beb8e99ad, type: 3}
|
||||
- {fileID: 102900000, guid: 9b6e5d5bbbd4e16419c475a82e9c573c, type: 3}
|
||||
- {fileID: 102900000, guid: a752fe8d8e2e0bd4e88433aa157101a2, type: 3}
|
||||
- {fileID: 102900000, guid: c2b7f31eb7d11f44eb7d5c2925f80102, type: 3}
|
||||
- {fileID: 102900000, guid: e40fd018e3455f643828b1267729170c, type: 3}
|
||||
- {fileID: 102900000, guid: 65deaf53bd8f62c40b4d65916fedc6c6, type: 3}
|
||||
- {fileID: 102900000, guid: 913af1012c707974285d33bc028ab24b, type: 3}
|
||||
- {fileID: 102900000, guid: 3ead118ed9fb9134094144a486426b35, type: 3}
|
||||
- {fileID: 102900000, guid: dc7927ca5f5617048a6874af3e828dc7, type: 3}
|
||||
- {fileID: 102900000, guid: 95b56c7f6927e8845b08488d6b5b3982, type: 3}
|
||||
- {fileID: 102900000, guid: 476b2ed49221cde4f9ee43b9305a33e1, type: 3}
|
||||
- {fileID: 102900000, guid: 9dc96993a52a97d49afd1c664b55731d, type: 3}
|
||||
- {fileID: 102900000, guid: aa4a06e4b6fed474a8c1731462d833e3, type: 3}
|
||||
- {fileID: 102900000, guid: d591b24d6d0f44b4984e4e74bcfebea0, type: 3}
|
||||
- {fileID: 102900000, guid: 6831bd2e1887c1b438703346493c66a4, type: 3}
|
||||
- {fileID: 102900000, guid: 6e174f4eec390f948be422ceed2d1484, type: 3}
|
||||
- {fileID: 102900000, guid: 6468281a168f76c4a82b63f6895da49a, type: 3}
|
||||
- {fileID: 102900000, guid: c2144280285995b49990813784ca213b, type: 3}
|
||||
- {fileID: 102900000, guid: 8f24abb3689607a4a968d8088ac92df2, type: 3}
|
||||
- {fileID: 102900000, guid: 0f25b33523173054797ec209079fc386, type: 3}
|
||||
- {fileID: 102900000, guid: ed0904c516883e54b9aef0ca30655978, type: 3}
|
||||
- {fileID: 102900000, guid: 586e9405a0882d44c9d7119b1ab9262f, type: 3}
|
||||
- {fileID: 102900000, guid: 04d667164b90fa0488af6f7af5ba8435, type: 3}
|
||||
- {fileID: 102900000, guid: 123023dc294c64a43a67e31105772175, type: 3}
|
||||
- {fileID: 102900000, guid: 0ee211928ebefaa47aeb6adba1a5a4d7, type: 3}
|
||||
- {fileID: 102900000, guid: 88cb25427c3fda34898c5f6ae3df8262, type: 3}
|
||||
- {fileID: 102900000, guid: 65d36fef9efef4b4592dd2f48917ad93, type: 3}
|
||||
- {fileID: 102900000, guid: 669faaff39775df4cb4f50b9930a4b85, type: 3}
|
||||
- {fileID: 102900000, guid: fc9c5e0dab6a7dd4489676737fa8dd6c, type: 3}
|
||||
- {fileID: 102900000, guid: dc413e5b21601f24a8823db0611210b9, type: 3}
|
||||
- {fileID: 102900000, guid: 23d46059c3af28a46923d9515e4f4a1e, type: 3}
|
||||
- {fileID: 102900000, guid: 0f2a3a13d5a1f654fb9febdb2e633acf, type: 3}
|
||||
- {fileID: 102900000, guid: b77fb6178600e5241b1ba22fd4f5bfa8, type: 3}
|
||||
- {fileID: 102900000, guid: 045039ac4805a484e810d70584f8effc, type: 3}
|
||||
- {fileID: 102900000, guid: 6a7f4cc7e53535544bc7d3b47cc80073, type: 3}
|
||||
- {fileID: 102900000, guid: 9cc5a37c0f237754abea2cd0132bb6e7, type: 3}
|
||||
- {fileID: 102900000, guid: 8b9c445c26373884498c9000d06efac2, type: 3}
|
||||
- {fileID: 102900000, guid: 4975906bc43044f448c66d19fa1277d2, type: 3}
|
||||
- {fileID: 102900000, guid: b79d6bceafe36dd45a84d980a693e476, type: 3}
|
||||
- {fileID: 102900000, guid: 80ce3e9582f37ff448ea87e04a79f69c, type: 3}
|
||||
- {fileID: 102900000, guid: a6d123825ff91ce438cc867a0c5ef07e, type: 3}
|
||||
- {fileID: 102900000, guid: 066fe78a1b628b749b5b93131a28ec23, type: 3}
|
||||
- {fileID: 102900000, guid: f6a6ce36941878e4f9b2c6645bebbd94, type: 3}
|
||||
- {fileID: 102900000, guid: 115e18cd11257944582f6a4a793078d9, type: 3}
|
||||
- {fileID: 102900000, guid: 49e441569224b3e4186417e2ba73eb71, type: 3}
|
||||
- {fileID: 102900000, guid: 5e3314b112179db438c84186aed630d4, type: 3}
|
||||
- {fileID: 102900000, guid: 11c48e038f5a11e43840012c9e4e09f3, type: 3}
|
||||
- {fileID: 102900000, guid: 762fa5fdbce5c9443ba4f13b12345c95, type: 3}
|
||||
- {fileID: 102900000, guid: d97aa2c49cdc439418bbbf4c90152eed, type: 3}
|
||||
- {fileID: 102900000, guid: 0c07315c6c3f67949b88adc46642c3da, type: 3}
|
||||
- {fileID: 102900000, guid: 3efe4f31ff2c4e34b9f961249bdc5893, type: 3}
|
||||
- {fileID: 102900000, guid: e554a262bd647094f84484e3342ba152, type: 3}
|
||||
- {fileID: 102900000, guid: 77351950eb30af249aab0c3a52bfb762, type: 3}
|
||||
- {fileID: 102900000, guid: c997d9d0e941bed448699d1880d0eb56, type: 3}
|
||||
- {fileID: 102900000, guid: 5b35a950f0bf6ba48a831358abe4c700, type: 3}
|
||||
- {fileID: 102900000, guid: 581ba7d9f7c8e9842bedf5e1d3aa264d, type: 3}
|
||||
- {fileID: 102900000, guid: e53f319c7e5f0674ca1d02a07b818664, type: 3}
|
||||
- GroupName: Map7
|
||||
BuildMode: 2
|
||||
OptionBundle: 1
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: a9426cd83dc666649b68c95fcfb575cc, type: 3}
|
||||
- {fileID: 102900000, guid: cc6cd58f8db945e4da873310409a6812, type: 3}
|
||||
- {fileID: 102900000, guid: 7664160da873aa74d922e2e9f0fe274d, type: 3}
|
||||
- {fileID: 102900000, guid: ca2e8ea601ce9b745a1358b140f8d7ea, type: 3}
|
||||
- {fileID: 102900000, guid: 6efb13fe6485b324790e1f28500e5f1b, type: 3}
|
||||
- {fileID: 102900000, guid: 8e795d1d79845484aa5e530426d484ec, type: 3}
|
||||
- {fileID: 102900000, guid: a9ef9418dc6f0e34ca2712f01a998742, type: 3}
|
||||
- GroupName: Map8
|
||||
BuildMode: 2
|
||||
OptionBundle: 1
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: e23e00e7b52768c4db4b69052549c871, type: 3}
|
||||
- {fileID: 102900000, guid: a728aa93e93f1554a8a5ed8197a64d82, type: 3}
|
||||
- {fileID: 102900000, guid: 542210d745c40af42a3d957a002dd211, type: 3}
|
||||
- {fileID: 102900000, guid: 3c1cd6929080ed24790a64d7c7c339ba, type: 3}
|
||||
- {fileID: 102900000, guid: 831e1019dceab894c984be8c5fcb765b, type: 3}
|
||||
- {fileID: 102900000, guid: 604fdfc69e04deb4e92fee049366a03a, type: 3}
|
||||
- {fileID: 102900000, guid: b293e14f94edd2f4b890ed6a8cc14aa7, type: 3}
|
||||
- {fileID: 102900000, guid: e336f2c576a493f49b9248e9951e9470, type: 3}
|
||||
- {fileID: 102900000, guid: 8eb703344ddd7334e8c2b901735b854b, type: 3}
|
||||
- {fileID: 102900000, guid: dc6a4e4fa6fcf8742b3011e1ad593767, type: 3}
|
||||
- {fileID: 102900000, guid: ab85a7bf4e8bdf64da8279c1a271682b, type: 3}
|
||||
- {fileID: 102900000, guid: 56606269bb98d374cbbd95a0f0894180, type: 3}
|
||||
- {fileID: 102900000, guid: cfa2233f239323c40a524af8f309c802, type: 3}
|
||||
- {fileID: 102900000, guid: 36f6cf659f716f44c9b7d6bf08a6d9bd, type: 3}
|
||||
- {fileID: 102900000, guid: d594ef98b2577ad4bb0f0e9e95a94eec, type: 3}
|
||||
- {fileID: 102900000, guid: 813227d0761bff045a7370c4d71abf2c, type: 3}
|
||||
- {fileID: 102900000, guid: 182307a3ff008cc4eb52d918bdd95d28, type: 3}
|
||||
- {fileID: 102900000, guid: 0b8412af030b56542b4dd785d63ec2f8, type: 3}
|
||||
- {fileID: 102900000, guid: e682e4c61a9207445be5b446773ad1c1, type: 3}
|
||||
- {fileID: 102900000, guid: c9ffb832991ed574ab597a34028c7661, type: 3}
|
||||
- {fileID: 102900000, guid: 89374b99162d24543a458ecea8356f25, type: 3}
|
||||
- {fileID: 102900000, guid: 40c7d2816b686634e8acbc9bffb6b9d1, type: 3}
|
||||
- {fileID: 102900000, guid: c9bc4709fda5950438fa8d40629c4248, type: 3}
|
||||
- {fileID: 102900000, guid: 0499ac212b94f924eb9ba479eaddbca9, type: 3}
|
||||
- {fileID: 102900000, guid: 153fe694cde28604a9934a4a5b23b72b, type: 3}
|
||||
- {fileID: 102900000, guid: f4caf3d8eb0e0a042ac9d4217d9c5fcb, type: 3}
|
||||
- {fileID: 102900000, guid: eb8821333ff04be429c9193f0692d82d, type: 3}
|
||||
- {fileID: 102900000, guid: a55a142c8c0531e439a171745bd0b1ca, type: 3}
|
||||
- {fileID: 102900000, guid: 6aafb5fc8bc554044b5af8e4bb4c59b8, type: 3}
|
||||
- {fileID: 102900000, guid: f6a0f0781e753324a81af8bf8f91f76f, type: 3}
|
||||
- {fileID: 102900000, guid: f53d332324449a7449d405bbc3c77e74, type: 3}
|
||||
- {fileID: 102900000, guid: 2d321cbe58f468c4baeb1fd4f53e3ac4, type: 3}
|
||||
- {fileID: 102900000, guid: 843237c47c0942f48857fd834e95321c, type: 3}
|
||||
- {fileID: 102900000, guid: bfb0bfaed23441746ac2c1b211a2185e, type: 3}
|
||||
- {fileID: 102900000, guid: 4abf1ad9a05030d43b52b5bd1d5bf0d0, type: 3}
|
||||
- {fileID: 102900000, guid: a3b9ed9d68155c34193a01a71eede86a, type: 3}
|
||||
- {fileID: 102900000, guid: fbe548e79b6d6024c82914414feab8cd, type: 3}
|
||||
- {fileID: 102900000, guid: 193889ecf7be5fe4fb59c5f6b02041a2, type: 3}
|
||||
- {fileID: 102900000, guid: a3582b1de68b3384d9852ec146198b26, type: 3}
|
||||
- {fileID: 102900000, guid: 8584365d5ec2c1f4d93de075eea2a7c6, type: 3}
|
||||
- {fileID: 102900000, guid: 6b6ddf3c44e4e3f40b88a1e18fc6ea57, type: 3}
|
||||
- {fileID: 102900000, guid: 713e33b35190e704facb2a810d006002, type: 3}
|
||||
- {fileID: 102900000, guid: 707ea13b191006e4cb4170b9c7b9c194, type: 3}
|
||||
- {fileID: 102900000, guid: d3fe61201a116924787823f3751d2f15, type: 3}
|
||||
- {fileID: 102900000, guid: 3cb0212fa8611314080945ef8b7654af, type: 3}
|
||||
- {fileID: 102900000, guid: 9518c0df65958a24d8bf4a899130db5b, type: 3}
|
||||
- {fileID: 102900000, guid: 3fae1762e63641342bf5a77ab5f2d05f, type: 3}
|
||||
- {fileID: 102900000, guid: 46aea466cab6f7a42b04abbbb71e4f9b, type: 3}
|
||||
- {fileID: 102900000, guid: adac25388f67c3648a1525bfaf329c1a, type: 3}
|
||||
- {fileID: 102900000, guid: 8068f98c938a21c43bc3b0964f6a206f, type: 3}
|
||||
- {fileID: 102900000, guid: ed852fe8c9e0ee342a061fa03b8bedda, type: 3}
|
||||
- {fileID: 102900000, guid: 525a304cc2c6a9a40b5e07b39ed5a475, type: 3}
|
||||
- {fileID: 102900000, guid: 66869f39364238f4c93a56f858510a94, type: 3}
|
||||
- GroupName: Map9
|
||||
BuildMode: 2
|
||||
OptionBundle: 1
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 676e5200b9cd58344aee3fda3828a223, type: 3}
|
||||
- {fileID: 102900000, guid: 0ead8d7ec05d9ab4e9ac6bfcff079d88, type: 3}
|
||||
- {fileID: 102900000, guid: edb6cf6907d603d4aa708a3c3899a35f, type: 3}
|
||||
- {fileID: 102900000, guid: 061a1dec8947236478acbcdd9559f507, type: 3}
|
||||
- {fileID: 102900000, guid: 3683c412edfc3e6489d30180aa5caa92, type: 3}
|
||||
- {fileID: 102900000, guid: 052fab060a06baa4a88de780074f455f, type: 3}
|
||||
- {fileID: 102900000, guid: 96c3f62eac643c14ab9dbc34b21dc830, type: 3}
|
||||
- GroupName: Map10
|
||||
BuildMode: 2
|
||||
OptionBundle: 1
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 3b7abb4be3a7086458b7d667a6e24e79, type: 3}
|
||||
- {fileID: 102900000, guid: b90e2caa040282641a62a78804a3a420, type: 3}
|
||||
- {fileID: 102900000, guid: 0b4dcaaa97cecfc439aa1e935b555283, type: 3}
|
||||
- {fileID: 102900000, guid: f21a83e4940c8bf4f97199a368d3b552, type: 3}
|
||||
- {fileID: 102900000, guid: 3972ea7d3e85a7741915698a2ab118bd, type: 3}
|
||||
- {fileID: 102900000, guid: 91896703f4a0bc44eb4b799842eeab1e, type: 3}
|
||||
- {fileID: 102900000, guid: 3f9f52c135bcfa54b8a7253d4ba1a7bb, type: 3}
|
||||
- {fileID: 102900000, guid: f2cab77237d6a8c41acd6d1e96e371df, type: 3}
|
||||
- {fileID: 102900000, guid: f266f391e88fccb449b5e27b857d6cdf, type: 3}
|
||||
- {fileID: 102900000, guid: c8eb108d9f4b1a44e954f23b4f65e16c, type: 3}
|
||||
- {fileID: 102900000, guid: 255afba6153bbcb45b8d0e8f3866ddd2, type: 3}
|
||||
- {fileID: 102900000, guid: f3779612587fa3e40ba819c96f19703d, type: 3}
|
||||
- {fileID: 102900000, guid: 3f3c9964f8f74a843ba108af7707a1e3, type: 3}
|
||||
- {fileID: 102900000, guid: 66d671f0d09e78641a942e3ba81ae790, type: 3}
|
||||
- {fileID: 102900000, guid: a8fa695c8ab6eeb459c0f7b0864e7710, type: 3}
|
||||
- {fileID: 102900000, guid: 94eccbbc9a55cd04fb7d805cd7c318f0, type: 3}
|
||||
- {fileID: 102900000, guid: ef45e1ac27665a64bbf1f8585d144f53, type: 3}
|
||||
- {fileID: 102900000, guid: b9202e2dbc456c842951ed9bdd0587bd, type: 3}
|
||||
- {fileID: 102900000, guid: 487ea4ea6664d0d419886b149ffa6861, type: 3}
|
||||
- {fileID: 102900000, guid: 9e4cd3fc7978c0743ada477372e377d5, type: 3}
|
||||
- {fileID: 102900000, guid: edcbcd120e930e24280c84dc7216fb59, type: 3}
|
||||
- {fileID: 102900000, guid: e9dd4b0f1bb98574084b96b217120a03, type: 3}
|
||||
- {fileID: 102900000, guid: 72dfcbef8b26a5d40a7394f486f1dff6, type: 3}
|
||||
- {fileID: 102900000, guid: 5adc5a92ec10a204fade14256eb05a3a, type: 3}
|
||||
- {fileID: 102900000, guid: d4ef5498294a18248ad489e49a94ec1c, type: 3}
|
||||
- {fileID: 102900000, guid: ce608c3315de32d4f9659ed3439221fe, type: 3}
|
||||
- {fileID: 102900000, guid: 28f3efbe6adcafc40a643c4ba12124b7, type: 3}
|
||||
- {fileID: 102900000, guid: d53ae7b08115159479047d6eb7ca13f0, type: 3}
|
||||
- {fileID: 102900000, guid: a01ec71acb8b095479a7bffae7a22254, type: 3}
|
||||
- {fileID: 102900000, guid: 9c280030169550746865993e0229e750, type: 3}
|
||||
- {fileID: 102900000, guid: acd87c54ed2d9814eb63db31eb6de164, type: 3}
|
||||
- {fileID: 102900000, guid: 9ad2975243cc8614aafe32e995c862fe, type: 3}
|
||||
- {fileID: 102900000, guid: 2cd3e174af0439c45a23fded72432bf9, type: 3}
|
||||
- {fileID: 102900000, guid: 8e4f1c867bdddd649a4ec682818c344a, type: 3}
|
||||
- {fileID: 102900000, guid: f3d302d1e88159b4c8f6b19d8abde49b, type: 3}
|
||||
- {fileID: 102900000, guid: 8bafa4e60c197b94385e709b2f4711d7, type: 3}
|
||||
- {fileID: 102900000, guid: 8bf3f7b925c4bce48a5b7300362e9e6d, type: 3}
|
||||
- {fileID: 102900000, guid: 225fa3890330ddf41879cc2d4479b4ef, type: 3}
|
||||
- {fileID: 102900000, guid: 59e26f25182b9ab4096182d7ee28b4b8, type: 3}
|
||||
- {fileID: 102900000, guid: 52c1b1cb19257a74ca77b711712f0a48, type: 3}
|
||||
- {fileID: 102900000, guid: 85fcdd7d70dad314bace51cea82480c4, type: 3}
|
||||
- {fileID: 102900000, guid: 94078de84bd2c9f4295cfefc1b165ce5, type: 3}
|
||||
- {fileID: 102900000, guid: 2f9f16e89240dd249891eba170aded4d, type: 3}
|
||||
- {fileID: 102900000, guid: adc7486ba94844241a6ddfcd3576c495, type: 3}
|
||||
- {fileID: 102900000, guid: ffadadb16a991d7418f45c55916c4644, type: 3}
|
||||
- {fileID: 102900000, guid: f678ad3ec5d1af145a27947116798d03, type: 3}
|
||||
- {fileID: 102900000, guid: a5b5aff4a1556924788b0e6c7e55246d, type: 3}
|
||||
- {fileID: 102900000, guid: d93e8dd99f3f6554aa8bb1e3d91a95c2, type: 3}
|
||||
- {fileID: 102900000, guid: 5ac647bea37ad2b4f92210bf43bb2ff8, type: 3}
|
||||
- {fileID: 102900000, guid: 420cb69942c397545b57ad372c40c85d, type: 3}
|
||||
- {fileID: 102900000, guid: a6b2eb3728ada3242af082881b16d696, type: 3}
|
||||
- {fileID: 102900000, guid: 31d3c109ac2d1134a9585b870808e665, type: 3}
|
||||
- {fileID: 102900000, guid: 955b8e239454aaf46bd99f45fcc436d6, type: 3}
|
||||
- {fileID: 102900000, guid: ef7846977fb96d64680b32fdb216182a, type: 3}
|
||||
- {fileID: 102900000, guid: 70ed295c85893c54688eca4f1472c046, type: 3}
|
||||
- {fileID: 102900000, guid: 3c8a7be03943cd84a8abaa6fa9a111dc, type: 3}
|
||||
- {fileID: 102900000, guid: a09307afd0105e74ab7df37961fbdf2d, type: 3}
|
||||
- {fileID: 102900000, guid: 4f98c786277280d47b152126194b1464, type: 3}
|
||||
- {fileID: 102900000, guid: ea8afc620a10e4b43863f06dbb985eca, type: 3}
|
||||
- {fileID: 102900000, guid: 6cc5d53ecf23ca640ac69fcae461ce80, type: 3}
|
||||
- {fileID: 102900000, guid: 93cdb8485d21d854b9794affe11cecac, type: 3}
|
||||
- {fileID: 102900000, guid: 3c799e83ffb450048b9710b41a96aaf0, type: 3}
|
||||
- {fileID: 102900000, guid: 1c05aaa2da0ac3c4f8046e03afcbe92c, type: 3}
|
||||
- {fileID: 102900000, guid: afbbf92f32cd4ca47862205ff5e77c64, type: 3}
|
||||
- {fileID: 102900000, guid: b42c69a468db6934ca8eecb3c28d924f, type: 3}
|
||||
- {fileID: 102900000, guid: 6d5b5ee23b75f26419edc872b7e8fc83, type: 3}
|
||||
- {fileID: 102900000, guid: b5794f16f5361a041a330aa63fca6522, type: 3}
|
||||
- {fileID: 102900000, guid: 9e9961a8847db564996bda56ce20d8bf, type: 3}
|
||||
- {fileID: 102900000, guid: 9e8f6bad770fba242a5f58c5e04a57d1, type: 3}
|
||||
- {fileID: 102900000, guid: 2477487b8813e6f4995c995280a65b17, type: 3}
|
||||
- {fileID: 102900000, guid: a0cfca71fa49c8e43b35d1817d4d8838, type: 3}
|
||||
- {fileID: 102900000, guid: 68d4cf7e8f0874d4790995bf312273ff, type: 3}
|
||||
- {fileID: 102900000, guid: 19a34e3cfafe87c4e87da54d786ff3e5, type: 3}
|
||||
- {fileID: 102900000, guid: bab5a2d8ea11a634cbb4f783e9952caf, type: 3}
|
||||
- {fileID: 102900000, guid: 4e9d454b4bba5ed47a7978a028b6f014, type: 3}
|
||||
- {fileID: 102900000, guid: 7d5494a83ddf2d14ca6d99bb4f036125, type: 3}
|
||||
- {fileID: 102900000, guid: dfcd5da246309d142bcaff7fe254eee2, type: 3}
|
||||
- {fileID: 102900000, guid: 393db9894ca151e44976b41af6fa38b3, type: 3}
|
||||
- {fileID: 102900000, guid: b2494225bf3bb3f4d9a750335e8fae12, type: 3}
|
||||
- {fileID: 102900000, guid: 8a4ec7957d415ec4785366bfee23685c, type: 3}
|
||||
- {fileID: 102900000, guid: 47cdb25f71cf2544d84c5a46b22ce4f2, type: 3}
|
||||
- {fileID: 102900000, guid: 1baeb549e433dcf4a9b4c06dcd6dfe52, type: 3}
|
||||
- {fileID: 102900000, guid: 851dd485d2bfb1a44b16acd7dbf0dd73, type: 3}
|
||||
- {fileID: 102900000, guid: 429f77b91d7d3064f8c94de540bc87a6, type: 3}
|
||||
- {fileID: 102900000, guid: 8a8df11d1a5374043bf3597a8ffae530, type: 3}
|
||||
- {fileID: 102900000, guid: 66bd835d9c760e54abdf930723358185, type: 3}
|
||||
- {fileID: 102900000, guid: f0dfa1f334a0c424eabd77f97a8a472c, type: 3}
|
||||
- {fileID: 102900000, guid: 3d67ff0fc1a77c64b8fbae49d7312424, type: 3}
|
||||
- {fileID: 102900000, guid: b8cd12776548fef47be1f1890db64d65, type: 3}
|
||||
- {fileID: 102900000, guid: d15c280e83e4cb54fa9673d93a66c385, type: 3}
|
||||
- {fileID: 102900000, guid: ac8d9d85c9cbc244290ff0506a0723e3, type: 3}
|
||||
- {fileID: 102900000, guid: 6cc5d53ecf23ca640ac69fcae461ce80, type: 3}
|
||||
- {fileID: 102900000, guid: 63a52dc41b679fa48bc40760285126ce, type: 3}
|
||||
- {fileID: 102900000, guid: f5b909d8ca168d246849a8c96fe9c0d0, type: 3}
|
||||
- {fileID: 102900000, guid: 7b370626ee32e134bbd8bfe9ba3aa863, type: 3}
|
||||
- {fileID: 102900000, guid: 8052d43071a98984e95622a701ce52d7, type: 3}
|
||||
- {fileID: 102900000, guid: f81abafecae93ef44b603bbcfa493053, type: 3}
|
||||
- GroupName: Map11
|
||||
BuildMode: 2
|
||||
OptionBundle: 1
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 1930823e283cf1e49a95dd62d926ba3a, type: 3}
|
||||
- {fileID: 102900000, guid: f74b3e7728dabb94d96842b70f359129, type: 3}
|
||||
- {fileID: 102900000, guid: f82aa53f487b5264faaab6ad32110320, type: 3}
|
||||
- {fileID: 102900000, guid: b3d808faeab384843a1c5f7f48360d39, type: 3}
|
||||
- {fileID: 102900000, guid: 2e267d9d5926edf4c859c52972bd2fe6, type: 3}
|
||||
- {fileID: 102900000, guid: a3b26420fbf9a804bbb8879a49e3c91d, type: 3}
|
||||
- GroupName: Map12
|
||||
BuildMode: 2
|
||||
OptionBundle: 1
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 4b52093608f82e442ae2aa3d134c1560, type: 3}
|
||||
- {fileID: 102900000, guid: 7c70938ad1e142540b3163534bfe5e1d, type: 3}
|
||||
- {fileID: 102900000, guid: 3ed1ed672802e284cafbcc093fedd077, type: 3}
|
||||
- {fileID: 102900000, guid: 9bbcbd9b672edfd498d88b13acd7558a, type: 3}
|
||||
- {fileID: 102900000, guid: 41704db84791af046be70f044f29956e, type: 3}
|
||||
- {fileID: 102900000, guid: e7725bf9cd58e87499b3ec589e27142a, type: 3}
|
||||
- {fileID: 102900000, guid: b746ff4786fc3544e8cb48793ea0232f, type: 3}
|
||||
- {fileID: 102900000, guid: ba072e72fcab2ce4dab97d046465a097, type: 3}
|
||||
- {fileID: 102900000, guid: 4890b32d3e8191a459f1fad916a33cd0, type: 3}
|
||||
- {fileID: 102900000, guid: 669be9dd1c8e7154dbecdfef442c39e2, type: 3}
|
||||
- {fileID: 102900000, guid: 9c31729d5d8b46a47beb46455145995a, type: 3}
|
||||
- {fileID: 102900000, guid: 7ee9e12a78e117747afaedfe978dc3fc, type: 3}
|
||||
- {fileID: 102900000, guid: 5954a42be3b439246be66c26424fd92b, type: 3}
|
||||
- {fileID: 102900000, guid: 859b820019ccff3438a73ae156736945, type: 3}
|
||||
- {fileID: 102900000, guid: 429ce37d7c87ecb40b5d8639c78fdec9, type: 3}
|
||||
- {fileID: 102900000, guid: 013570a5277f64c4eaec76e5b354af94, type: 3}
|
||||
- {fileID: 102900000, guid: d3ccf388aec642741a1147715c2a50ed, type: 3}
|
||||
- {fileID: 102900000, guid: f9a67f6a2ec369248880fc9d9f94b8c9, type: 3}
|
||||
- {fileID: 102900000, guid: a00dad7e04543454da43278676265ac0, type: 3}
|
||||
- {fileID: 102900000, guid: 27c4d8a1c4c09544582c90fadaa64bc3, type: 3}
|
||||
- {fileID: 102900000, guid: f4596b5f855bea44aa0fee8938e0fee9, type: 3}
|
||||
- {fileID: 102900000, guid: 224486d31fbc0a74c94106866e7db26d, type: 3}
|
||||
- {fileID: 102900000, guid: 01ce1825331717749b1a00e7d64a615b, type: 3}
|
||||
- {fileID: 102900000, guid: 682676c22fef8304bbb32b02028d9025, type: 3}
|
||||
- {fileID: 102900000, guid: dec90a58db56d9c4fa9ae51d65c84a8c, type: 3}
|
||||
- {fileID: 102900000, guid: e90a8d2ebc255d448bf59412ce0ba9f8, type: 3}
|
||||
- {fileID: 102900000, guid: c84d07d3dd2589d44b9718520c244f2b, type: 3}
|
||||
- {fileID: 102900000, guid: c6a5495b6b283de42b3dadc448d6275d, type: 3}
|
||||
- GroupName: Map13
|
||||
BuildMode: 2
|
||||
OptionBundle: 1
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 37417012417bb5a4c8c8cf71fc2463c6, type: 3}
|
||||
- {fileID: 102900000, guid: f535eea1ef8f88e4caa58db09094acda, type: 3}
|
||||
- {fileID: 102900000, guid: 1225adda112eeaf4987d2647a7043c6c, type: 3}
|
||||
- GroupName: Map14
|
||||
BuildMode: 2
|
||||
OptionBundle: 1
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: f483fa70791eb334aa60a420a2ac8b9d, type: 3}
|
||||
- {fileID: 102900000, guid: 018d7304663857b4c9070ce89e9a0c36, type: 3}
|
||||
- {fileID: 102900000, guid: a3f7641267bb2e742a3c4aca2a8f66d1, type: 3}
|
||||
- {fileID: 102900000, guid: af9a2fec1cd13884e9d3c165505e5966, type: 3}
|
||||
- {fileID: 102900000, guid: d5bedaf8ade1c974385634dfec760f06, type: 3}
|
||||
- {fileID: 102900000, guid: 7fbd183587df22f4bb22ed985e50549c, type: 3}
|
||||
- {fileID: 102900000, guid: 4678365a06509f94eba98f75774cf587, type: 3}
|
||||
- {fileID: 102900000, guid: 63c3cf7b8de60434abd2cac76303b3bb, type: 3}
|
||||
- {fileID: 102900000, guid: a5699b2b2e183a541b33ac14f764f099, type: 3}
|
||||
- {fileID: 102900000, guid: 928e3fa2c6d556c4b8eb207939db1cc6, type: 3}
|
||||
- {fileID: 102900000, guid: fff31e6c86502b643906a3e557ee1acd, type: 3}
|
||||
- {fileID: 102900000, guid: c4cffb10d0a4cc742bfadef22d1beea1, type: 3}
|
||||
- {fileID: 102900000, guid: 5ce76429e49edca4eaad0132842f475b, type: 3}
|
||||
- {fileID: 102900000, guid: eb6515be31a17154a86ebb84cd60eb28, type: 3}
|
||||
- {fileID: 102900000, guid: d070ac1bb86576d41853befbe4b2fcc4, type: 3}
|
||||
- {fileID: 102900000, guid: 7f7d676ece4f15c4ea3f923027f61739, type: 3}
|
||||
- GroupName: AssetsPackBG_Map1
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: e583ba16f255e9948a42455416c3e85b, type: 3}
|
||||
- {fileID: 102900000, guid: f5d1553a675ec2547bde1239dc6ea33d, type: 3}
|
||||
- {fileID: 102900000, guid: 88889b885a0ba6f4daa1f4b43f84dce5, type: 3}
|
||||
- {fileID: 102900000, guid: f2f2a7f1b44bfa94a9b64d16159ec5a4, type: 3}
|
||||
- {fileID: 102900000, guid: c744c05e14604d640a754a8a66c153de, type: 3}
|
||||
- {fileID: 102900000, guid: 44d0674a8ceffe942bf6437c9d05ce5b, type: 3}
|
||||
- {fileID: 102900000, guid: b851b023c6920ad46a2885b4e74c0d81, type: 3}
|
||||
- {fileID: 102900000, guid: 2c3784194f6f2cd40ac1b394fdbe3968, type: 3}
|
||||
- {fileID: 102900000, guid: 56694f2b45623724d8d57137e34b1ace, type: 3}
|
||||
- {fileID: 102900000, guid: 0e9aa6ba96446be4990a1e8ff8a2f52a, type: 3}
|
||||
- {fileID: 102900000, guid: f135001c40caf84498c166cf5b3cb858, type: 3}
|
||||
- {fileID: 102900000, guid: f187646c8e0e14d46aa379f20c3159bf, type: 3}
|
||||
- {fileID: 102900000, guid: 9278a313aa957054c8f2f4e1fa711c50, type: 3}
|
||||
- {fileID: 102900000, guid: 1094a233e82b4434c98485c262b7b091, type: 3}
|
||||
- {fileID: 102900000, guid: 30e53a537b0a22745b9c09cbf1e91505, type: 3}
|
||||
- {fileID: 102900000, guid: cd87fefcf3a73654aab04b9a028ed124, type: 3}
|
||||
- {fileID: 102900000, guid: 34395a1392cb68b40b8d2948b3fa617e, type: 3}
|
||||
- {fileID: 102900000, guid: 4262502f7074eca4389af1bb24f5ac4c, type: 3}
|
||||
- {fileID: 102900000, guid: 99b31c42da8ef9445a7361353f9de95c, type: 3}
|
||||
- {fileID: 102900000, guid: db226bc77a8822746a7a45249738a54e, type: 3}
|
||||
- {fileID: 102900000, guid: 155f88469f96858409487e2e6d881a27, type: 3}
|
||||
- {fileID: 102900000, guid: 85c716ebc42fe9f4b95379b84c48dd7d, type: 3}
|
||||
- {fileID: 102900000, guid: ec26d0e27e12a6d40a9f266a3d697083, type: 3}
|
||||
- {fileID: 102900000, guid: 77c488349981cd24ea22a2b2bdf5137d, type: 3}
|
||||
- {fileID: 102900000, guid: b9f0d907a9bd9b64c885f1df118e07be, type: 3}
|
||||
- {fileID: 102900000, guid: ce922627fd8ebbb4d9dfc731cb1f16a5, type: 3}
|
||||
- {fileID: 102900000, guid: 1ef1d3c9fe1e4d64ebfdf1820fc8c224, type: 3}
|
||||
- {fileID: 102900000, guid: a930e2bf7b739b84e83bf0aeb65ff0ba, type: 3}
|
||||
- {fileID: 102900000, guid: 68071b054cb0f094599db5d495819b06, type: 3}
|
||||
- {fileID: 102900000, guid: 51f88c5e2ae31c84b948986ad826fe2e, type: 3}
|
||||
- {fileID: 102900000, guid: 00f83725983d22b4bba0bd908acd0486, type: 3}
|
||||
- GroupName: AssetsPackBG_MapMap1
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 94efe407cf89280449b5f4ec9d05af76, type: 3}
|
||||
- GroupName: AssetsPackBG_MapModel1
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: cd78574e5fafd324fad58371b5d537ca, type: 3}
|
||||
- {fileID: 102900000, guid: 09851837b01640c4a8c47bcbe975f7ed, type: 3}
|
||||
- {fileID: 102900000, guid: 9d692bd6586e79b408ada7deb4a57938, type: 3}
|
||||
- {fileID: 102900000, guid: 408aa1a2a18347c4080266d05336fc38, type: 3}
|
||||
- {fileID: 102900000, guid: 8ea41d95c0101634eb9bd6779caf915c, type: 3}
|
||||
- {fileID: 102900000, guid: 1906593751b385348aec67594cb5acb4, type: 3}
|
||||
- {fileID: 102900000, guid: aa2775afcb9cef74a9cba790bcb087e1, type: 3}
|
||||
- {fileID: 102900000, guid: f921a3774abdcb54cba7c9b538612624, type: 3}
|
||||
- {fileID: 102900000, guid: 34a67da32e808934a9a3ea62d13b5094, type: 3}
|
||||
- {fileID: 102900000, guid: 212d16ad0fd35134e8e3e2a1c5d88ac6, type: 3}
|
||||
- {fileID: 102900000, guid: d2709e6c1501cbe49ae9f36a1e80ff5a, type: 3}
|
||||
- {fileID: 102900000, guid: f6e7d9fffe3c9ff47a7a857866cbddb3, type: 3}
|
||||
- {fileID: 102900000, guid: 0fd67cfd19f2fde4f833152ef655f86a, type: 3}
|
||||
- {fileID: 102900000, guid: b329b4ae18b98c4488795303c493f5b2, type: 3}
|
||||
- {fileID: 102900000, guid: fc16318f52c410843a42c89bccfee547, type: 3}
|
||||
- {fileID: 102900000, guid: a9b2da2cf5e77b84dae5c60c370f7390, type: 3}
|
||||
- {fileID: 102900000, guid: ce2b7fe614c15fc42842d6a55ab6aa61, type: 3}
|
||||
- {fileID: 102900000, guid: 336e1b58c59343649a9d7eb275e05381, type: 3}
|
||||
- {fileID: 102900000, guid: bbae100eea80fa74ca76d0e005aa7ddf, type: 3}
|
||||
- {fileID: 102900000, guid: 59b0eacfa5394a240be024df56532ccf, type: 3}
|
||||
- {fileID: 102900000, guid: de6d8bd409ecd084dbb80811b528592e, type: 3}
|
||||
- {fileID: 102900000, guid: 8fca342dd88bcc94b9012c7dc347e641, type: 3}
|
||||
- {fileID: 102900000, guid: b0d55f8f16fbdad4f950426890ed8f23, type: 3}
|
||||
- {fileID: 102900000, guid: 53c37594dd2993a4cb5710d6d70e1c06, type: 3}
|
||||
- {fileID: 102900000, guid: 964193ec42782584598c549422f02e8f, type: 3}
|
||||
- {fileID: 102900000, guid: 8815a92de9a8fd44284f1049c876131a, type: 3}
|
||||
- {fileID: 102900000, guid: a8305c89470e9734baa362d3df719cad, type: 3}
|
||||
- {fileID: 102900000, guid: 894d691c6072fad4f9272c4622d1f127, type: 3}
|
||||
- {fileID: 102900000, guid: 3c94615109016f5438a2f7ed10dc317b, type: 3}
|
||||
- {fileID: 102900000, guid: 279314438c725f24fa2d9a1e791a60ff, type: 3}
|
||||
- {fileID: 102900000, guid: ec0cb453ccee5764391a5b219ae7d4cb, type: 3}
|
||||
- {fileID: 102900000, guid: 895f6c033b4c1ea4ebf1e2a6fee9712e, type: 3}
|
||||
- {fileID: 102900000, guid: e95bedd1643ef0a4db7817a7dd544a88, type: 3}
|
||||
- {fileID: 102900000, guid: eaae18dbb20c43d4c97aa2df725043ec, type: 3}
|
||||
- {fileID: 102900000, guid: ae3ff09fcd0c50f4e84c0a3d036508a9, type: 3}
|
||||
- {fileID: 102900000, guid: 137b947db4ceb454ab6e6f70a4a588a9, type: 3}
|
||||
- {fileID: 102900000, guid: cd86f3640bfa4ee40b136e0391fd33fe, type: 3}
|
||||
- {fileID: 102900000, guid: c5b92a7f90252524b94823af8f8168d6, type: 3}
|
||||
- {fileID: 102900000, guid: 92a3603ec4a9e66438cc9c4fffe110c4, type: 3}
|
||||
- {fileID: 102900000, guid: 4c9d9a2d3edee72449a3424784aa8a2b, type: 3}
|
||||
- {fileID: 102900000, guid: 63e5dd61820bd6f4baf53e509d290b58, type: 3}
|
||||
- {fileID: 102900000, guid: 410d145367435ff4992bf389aac48afb, type: 3}
|
||||
- {fileID: 102900000, guid: 40b9dedf69883b645acf9c8f4dc336f9, type: 3}
|
||||
- {fileID: 102900000, guid: 259d62fa3a7b5bf47ab914138b0f8eef, type: 3}
|
||||
- {fileID: 102900000, guid: 21b49591d25dc8e4ca35c08ca1710b30, type: 3}
|
||||
- {fileID: 102900000, guid: 4cf916ec1e1534341aa4e13e4e6f103e, type: 3}
|
||||
- {fileID: 102900000, guid: 79b739758445a6a4c9a5f96be2fdefc4, type: 3}
|
||||
- {fileID: 102900000, guid: ac4ac316ab924cb4d97166d1700b44b7, type: 3}
|
||||
- {fileID: 102900000, guid: a0f0816c6c71aa34e819dc6eaab8e59c, type: 3}
|
||||
- {fileID: 102900000, guid: e27103f6f158d0f4584c1e33b28b6980, type: 3}
|
||||
- {fileID: 102900000, guid: d75bf6fd359cf304a82707502374fe8f, type: 3}
|
||||
- {fileID: 102900000, guid: bea48564d7071e2469cacf203fd91b1b, type: 3}
|
||||
- {fileID: 102900000, guid: e70d402a3cb6e644caefdc1d88b783a1, type: 3}
|
||||
- {fileID: 102900000, guid: e62f4843414f86a488146d6915c65876, type: 3}
|
||||
- {fileID: 102900000, guid: 799ace8883e3ee94882e5008640c05b3, type: 3}
|
||||
- {fileID: 102900000, guid: f1bc8c58f7855604089e4f3789f2571f, type: 3}
|
||||
- {fileID: 102900000, guid: c7dd39399af6e5b4b8f48c04de2983f0, type: 3}
|
||||
- {fileID: 102900000, guid: 9dd0534653ed2b14ca6ee5fb36ec9d44, type: 3}
|
||||
- {fileID: 102900000, guid: 00da62bc8ccf1dc419a33775312a67ec, type: 3}
|
||||
- {fileID: 102900000, guid: 9966632422e0f244aa3b0836d0f96464, type: 3}
|
||||
- {fileID: 102900000, guid: 67b83849eb501404d9ae29947bbfe4c5, type: 3}
|
||||
- {fileID: 102900000, guid: 9a9cf82534d598246922719c1156e4fe, type: 3}
|
||||
- {fileID: 102900000, guid: 5235130dcb9977146a0f05b633d3951b, type: 3}
|
||||
- {fileID: 102900000, guid: 2b1e23520a379df4b971d4ecd8febdd7, type: 3}
|
||||
- {fileID: 102900000, guid: bef7ccf976a42d840b82e97c2a4ac413, type: 3}
|
||||
- {fileID: 102900000, guid: dd3609f5f4e18c849b142ca1405171c1, type: 3}
|
||||
- {fileID: 102900000, guid: 100d6fd5a1312ca449757d66da663f55, type: 3}
|
||||
- {fileID: 102900000, guid: f4121a62e6afbe74eba513fe7ac0b371, type: 3}
|
||||
- {fileID: 102900000, guid: ccf0cba2298c734488c04dfd6e7f0f2c, type: 3}
|
||||
- {fileID: 102900000, guid: 9c1eb3afcb919bd4dbae979346dc8b8b, type: 3}
|
||||
- {fileID: 102900000, guid: 3c521938990185e44a3b4cd790fecf01, type: 3}
|
||||
- {fileID: 102900000, guid: 99ea9909b45341b47b9a53c8a5c0e87c, type: 3}
|
||||
- {fileID: 102900000, guid: 95688a84d22f4ad45a1589db89ed5297, type: 3}
|
||||
- GroupName: AudioBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 931ab587fc1e9274aac6db975eb8ea67, type: 3}
|
||||
- GroupName: ConfigBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: da6575161ca6d7b43a626c1af408ec0d, type: 3}
|
||||
- {fileID: 102900000, guid: a0bbf6eb1eb96f547b9aa180f9096b6d, type: 3}
|
||||
- GroupName: EffectBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: abc4bf4033063c740856ad1bc336640d, type: 3}
|
||||
- {fileID: 102900000, guid: e313c5852cfb1b64a9b3fe9838c75282, type: 3}
|
||||
- {fileID: 102900000, guid: bfe6823a95883644984293c40c7bcc50, type: 3}
|
||||
- GroupName: FontBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 9ba0b60293b080c4fa2c80fa8ace8556, type: 3}
|
||||
- GroupName: ImageBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 9d738c16c10a1db46a0fded955e79f00, type: 3}
|
||||
- GroupName: MaterialsBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 2f68a73ecd4469441801726fc9a059ea, type: 3}
|
||||
- GroupName: MiniMapBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 70b1ee3a69ff8ad448e39b1834657d20, type: 3}
|
||||
- GroupName: OtherPrefabBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: be0f6fbcae23e6443a3d406bfc467155, type: 3}
|
||||
- {fileID: 102900000, guid: aeb21bda8e1d06c4ea681795d6228637, type: 3}
|
||||
- {fileID: 102900000, guid: 86f22fddf57c0324097a29126be99e07, type: 3}
|
||||
- {fileID: 102900000, guid: 19694b7044542de4e8cff47545441ab1, type: 3}
|
||||
- GroupName: PetModelBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 1cd2cdd18f300db4b813d90ec6e1463c, type: 3}
|
||||
- GroupName: PlayerAnimBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 0a3e4a800a93f8744b82ed7380b5a0c1, type: 3}
|
||||
- {fileID: 102900000, guid: e046c95ecf49e1345944177a12133ecc, type: 3}
|
||||
- {fileID: 102900000, guid: 3a827ba7ac496084794c03c11e8a35e9, type: 3}
|
||||
- {fileID: 102900000, guid: ee75ffa33b3400542ba18c2ea415de90, type: 3}
|
||||
- {fileID: 102900000, guid: ea3c4a554465e1149ba60b447b0be19b, type: 3}
|
||||
- {fileID: 102900000, guid: f4e435785f1178a4aaee1b8ba4fff6ba, type: 3}
|
||||
- {fileID: 102900000, guid: b5272302cca82a441b9473b02af5ac6e, type: 3}
|
||||
- {fileID: 102900000, guid: ace9b5cbf3f94b04da37a144dc382cc3, type: 3}
|
||||
- {fileID: 102900000, guid: 4c613f52922845544abae8fbe53b4032, type: 3}
|
||||
- {fileID: 102900000, guid: 6bcd1d1b825cc5043ab600619472e17d, type: 3}
|
||||
- {fileID: 102900000, guid: a29947263f4f46346b34a7e49735cadf, type: 3}
|
||||
- {fileID: 102900000, guid: 35764a153f2e3d94288974de3b246071, type: 3}
|
||||
- GroupName: PlayerMatBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: afcb2d322b13ee04b847f6e656f2dc30, type: 3}
|
||||
- {fileID: 102900000, guid: cf721a4d7316e5847bdca4100beed3b6, type: 3}
|
||||
- {fileID: 102900000, guid: e4f0dcbaf60ed0542abefbc4590eb8ba, type: 3}
|
||||
- {fileID: 102900000, guid: 3dae66a1978dbec4ea81b158e1481f09, type: 3}
|
||||
- {fileID: 102900000, guid: 003c4e5993ebfdd4cb906701239f3172, type: 3}
|
||||
- {fileID: 102900000, guid: e036bebe83ebccd4f98adc8793418f4d, type: 3}
|
||||
- {fileID: 102900000, guid: fd3de8ab46698d041b3c52236f097212, type: 3}
|
||||
- {fileID: 102900000, guid: 9778578526496bf468f9e9780441bcaa, type: 3}
|
||||
- {fileID: 102900000, guid: 9acdc4088b38c45478d14caa4c187da8, type: 3}
|
||||
- {fileID: 102900000, guid: 82d4250787a5f1546b1a9054e8f348c2, type: 3}
|
||||
- {fileID: 102900000, guid: 321b1cc8ed4941d4fb582349e63990b8, type: 3}
|
||||
- {fileID: 102900000, guid: b3136c5e0e9df284fa2d7c9fabb31346, type: 3}
|
||||
- GroupName: PlayerNewBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: a9a39c1246c580641985b97e516e2909, type: 3}
|
||||
- GroupName: PlayerPrefabBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 3ed08851ce715184fa7c10adff654716, type: 3}
|
||||
- {fileID: 102900000, guid: dd735f7ab607be248abb860b6d6a3137, type: 3}
|
||||
- {fileID: 102900000, guid: 42eca25dce7cf6244b7c4d944568ec6b, type: 3}
|
||||
- {fileID: 102900000, guid: e866a33c7998cf74b82a1bebb1ba9b2d, type: 3}
|
||||
- {fileID: 102900000, guid: 67e0a2c2109cf464a9bb937624a95ea8, type: 3}
|
||||
- {fileID: 102900000, guid: 4ab8f9d9ee7827941b76745b8ddefedd, type: 3}
|
||||
- {fileID: 102900000, guid: f852635273fb0e84c939746168971080, type: 3}
|
||||
- {fileID: 102900000, guid: 68f8299c5714e384e8614ad9c0658b49, type: 3}
|
||||
- {fileID: 102900000, guid: 84cf19e3a62d87141b7e9b68c906a269, type: 3}
|
||||
- {fileID: 102900000, guid: 63fcf599cdc2cba45a2bb3d499cd9505, type: 3}
|
||||
- {fileID: 102900000, guid: 28a34f3a8b205b54cbdde731f27d15a4, type: 3}
|
||||
- {fileID: 102900000, guid: 3cb376a898b1f3449a4a1e7f8af76adb, type: 3}
|
||||
- GroupName: PlayerTextureBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: d8b9e2fb2cee8884eb0bb3026bb559d8, type: 3}
|
||||
- {fileID: 102900000, guid: 75a64fa9a3435a9488512d178c1c17ab, type: 3}
|
||||
- {fileID: 102900000, guid: a6d054d8edd0af247893cd6f16e8e3a9, type: 3}
|
||||
- {fileID: 102900000, guid: 3775b3d64f4d81249b0276003326fe38, type: 3}
|
||||
- {fileID: 102900000, guid: 370974f13558386459953b96d51c5a7b, type: 3}
|
||||
- {fileID: 102900000, guid: c9f7efd4bc2006243bdf08e56264c8d0, type: 3}
|
||||
- {fileID: 102900000, guid: cb3b633c113d4044b9dd8ff05a00c3b8, type: 3}
|
||||
- {fileID: 102900000, guid: 8cc157bf691b78544b558b990dd86841, type: 3}
|
||||
- {fileID: 102900000, guid: bbccc564000f5964088335202fbb4b89, type: 3}
|
||||
- {fileID: 102900000, guid: aa0b0315bafa3434ab9b67c471637f49, type: 3}
|
||||
- {fileID: 102900000, guid: e8af05e5bba53ef47ab29697fa0fc952, type: 3}
|
||||
- {fileID: 102900000, guid: 41fce7bf109379c4fbe42d0602c76ff8, type: 3}
|
||||
- GroupName: UIPrefabsBG
|
||||
BuildMode: 2
|
||||
OptionBundle: 0
|
||||
InstallReady: 0
|
||||
FolderList:
|
||||
- {fileID: 102900000, guid: 61783e0261911504a8b25418b35cb756, type: 3}
|
||||
SVC: {fileID: 0}
|
||||
DuplicateBundleBeInstallBundle: 0
|
||||
ShaderBundleBeInstallBundle: 0
|
||||
8
Assets/VersionFlow/Builder/Builder.asset.meta
Normal file
8
Assets/VersionFlow/Builder/Builder.asset.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d9c376c48fdca0c4db0a27b546c0e735
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/VersionFlow/Editor.meta
Normal file
8
Assets/VersionFlow/Editor.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: febb10236962e2f4582c544d255d79b7
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
516
Assets/VersionFlow/Editor/BuilderConfigEditor.cs
Normal file
516
Assets/VersionFlow/Editor/BuilderConfigEditor.cs
Normal file
@ -0,0 +1,516 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using VersionFlow.Runtime;
|
||||
|
||||
namespace VersionFlow.Editors
|
||||
{
|
||||
[CustomEditor(typeof(BuilderConfig))]
|
||||
public class BuilderConfigEditor : Editor
|
||||
{
|
||||
static private BundleManifest RemoteVersion;
|
||||
static private string UpdateVersion;
|
||||
|
||||
static public BundleManifest Report;
|
||||
static private List<BundleCompare> CompareResult;
|
||||
static private string outputPath;
|
||||
static private Dictionary<string, BundleExtraInfo> bundleExtraInfo;
|
||||
static bool FoldOutGroup;
|
||||
|
||||
|
||||
private static void ResetState()
|
||||
{
|
||||
RemoteVersion = null;
|
||||
UpdateVersion = null;
|
||||
|
||||
Report = null;
|
||||
CompareResult = null;
|
||||
outputPath = null;
|
||||
bundleExtraInfo = null;
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
base.OnInspectorGUI();
|
||||
|
||||
EditorGUILayout.Space(20);
|
||||
BuilderConfig.ShowBuilderMarker = EditorGUILayout.Toggle("在Project窗口中显示打包标记", BuilderConfig.ShowBuilderMarker);
|
||||
if (FoldOutGroup = EditorGUILayout.BeginFoldoutHeaderGroup(FoldOutGroup, "打包配置"))
|
||||
{
|
||||
DrawGroupItems();
|
||||
EditorGUILayout.EndFoldoutHeaderGroup();
|
||||
}
|
||||
|
||||
if (GUILayout.Button("获取CDN版本号"))
|
||||
{
|
||||
ResetState();
|
||||
var (remoteVersion, updateVersion) = FetchRemoteVersion((BuilderConfig)target);
|
||||
RemoteVersion = remoteVersion;
|
||||
UpdateVersion = updateVersion;
|
||||
}
|
||||
|
||||
if (RemoteVersion != null)
|
||||
{
|
||||
EditorGUILayout.LabelField($"CDN版本号:{RemoteVersion.Version}");
|
||||
if (GUILayout.Button("将CDN版本号复制到剪切板"))
|
||||
{
|
||||
EditorGUIUtility.systemCopyBuffer = RemoteVersion.Version;
|
||||
}
|
||||
if (GUILayout.Button("将CDN版本号复制到剪切板(带热更目录区分)"))
|
||||
{
|
||||
EditorGUIUtility.systemCopyBuffer = $"{((BuilderConfig)target).UploadPath}:{RemoteVersion.Version}";
|
||||
}
|
||||
UpdateVersion = EditorGUILayout.TextField($"上传版本号", UpdateVersion);
|
||||
|
||||
|
||||
if (CompareResult == null && GUILayout.Button("Build"))
|
||||
{
|
||||
var bc = (BuilderConfig)target;
|
||||
bc.OnCalcBundleHash = BuilderConfigEditor.CalcBundleHash;
|
||||
Report = bc.Build(UpdateVersion, out outputPath, out bundleExtraInfo);
|
||||
CompareResult = bc.CompareBundleManifest(Report, RemoteVersion);
|
||||
}
|
||||
|
||||
if (CompareResult != null && Report != null && outputPath != null && bundleExtraInfo != null)
|
||||
{
|
||||
DrawCompareResult(CompareResult, bundleExtraInfo);
|
||||
if (GUILayout.Button("UPLOAD"))
|
||||
{
|
||||
var bc = (BuilderConfig)target;
|
||||
var client = CDNUploader.Init(
|
||||
bc.BucketName,
|
||||
$"{bc.UploadPath}/Bundles/{VersionFlowX.PlatformFoldName}",
|
||||
bc.accessKeyId,
|
||||
bc.accessKeySecret,
|
||||
bc.endPoint,
|
||||
false
|
||||
);
|
||||
StartUpLoad(CompareResult, Report, outputPath, client);
|
||||
|
||||
ResetState();
|
||||
}
|
||||
if (GUILayout.Button("Pending UPLOAD"))
|
||||
{
|
||||
var bc = (BuilderConfig)target;
|
||||
var client = CDNUploader.Init(
|
||||
bc.BucketName,
|
||||
$"{bc.UploadPath}/Bundles/{VersionFlowX.PlatformFoldName}",
|
||||
bc.accessKeyId,
|
||||
bc.accessKeySecret,
|
||||
bc.endPoint,
|
||||
true
|
||||
);
|
||||
StartUpLoad(CompareResult, Report, outputPath, client);
|
||||
|
||||
ResetState();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void DrawGroupItems()
|
||||
{
|
||||
Undo.RecordObject(target, target.name);
|
||||
|
||||
EditorGUILayout.BeginVertical();
|
||||
|
||||
var builder = target as BuilderConfig;
|
||||
builder.DuplicateBundleBeInstallBundle = EditorGUILayout.Toggle("重复依赖资源的bundle作为随包资源", builder.DuplicateBundleBeInstallBundle);
|
||||
builder.ShaderBundleBeInstallBundle = EditorGUILayout.Toggle("shaderbundle作为随包资源", builder.ShaderBundleBeInstallBundle);
|
||||
|
||||
foreach (var group in builder.Groups)
|
||||
{
|
||||
var temp = GUI.color;
|
||||
|
||||
GUI.color = GetGroupColor(group, out var errorMsg);
|
||||
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
|
||||
{
|
||||
EditorGUILayout.LabelField(errorMsg);
|
||||
//Name And Optionnal
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
{
|
||||
group.MarkColor = EditorGUILayout.ColorField("标记颜色", group.MarkColor);
|
||||
group.GroupName = EditorGUILayout.TextField(group.GroupName, GUILayout.Width(100));
|
||||
|
||||
var groupDeleteColor = GUI.color;
|
||||
GUI.color = Color.red;
|
||||
if (GUILayout.Button("X", GUILayout.Width(30)))
|
||||
{
|
||||
builder.Groups.Remove(group);
|
||||
break;
|
||||
}
|
||||
GUI.color = groupDeleteColor;
|
||||
}
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
group.OptionBundle = EditorGUILayout.Toggle($"可选下载包", group.OptionBundle);
|
||||
group.InstallReady = EditorGUILayout.Toggle($"跟随主包", group.InstallReady);
|
||||
|
||||
//buildMode
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
{
|
||||
var EnumType = typeof(BuildEntity.EnumBuildMode);
|
||||
var values = Enum.GetValues(EnumType);
|
||||
foreach (BuildEntity.EnumBuildMode modeValue in values)
|
||||
{
|
||||
var modeName = Enum.GetName(EnumType, modeValue);
|
||||
|
||||
var tempColor = GUI.color;
|
||||
if (modeValue == group.BuildMode) GUI.color = Color.green;
|
||||
else GUI.color = Color.white;
|
||||
if (GUILayout.Button(modeName))
|
||||
{
|
||||
group.BuildMode = modeValue;
|
||||
}
|
||||
GUI.color = tempColor;
|
||||
}
|
||||
}
|
||||
EditorGUILayout.EndHorizontal();
|
||||
|
||||
EditorGUILayout.BeginVertical(new GUIStyle { padding = new RectOffset(5, 5, 5, 5) });
|
||||
{
|
||||
for (int i = 0; i < group.FolderList.Count; i++)
|
||||
{
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
{
|
||||
var foldAsset = group.FolderList[i];
|
||||
var deleteColor = GUI.color;
|
||||
GUI.color = Color.red;
|
||||
if (GUILayout.Button("-", GUILayout.Width(20)))
|
||||
{
|
||||
group.FolderList.RemoveAt(i);
|
||||
break;
|
||||
}
|
||||
GUI.color = deleteColor;
|
||||
group.FolderList[i] = (DefaultAsset)EditorGUILayout.ObjectField(foldAsset, typeof(DefaultAsset), false);
|
||||
}
|
||||
EditorGUILayout.EndHorizontal();
|
||||
}
|
||||
|
||||
//draw add Folder
|
||||
var addFolderColor = GUI.color;
|
||||
GUI.color = Color.yellow;
|
||||
if (GUILayout.Button("添加资源目录"))
|
||||
{
|
||||
group.FolderList.Add(null);
|
||||
}
|
||||
GUI.color = addFolderColor;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
GUI.color = temp;
|
||||
}
|
||||
|
||||
//Draw Add Group Button
|
||||
var addColor = GUI.color;
|
||||
GUI.color = Color.yellow;
|
||||
if (GUILayout.Button("添加组"))
|
||||
{
|
||||
builder.Groups.Add(new BuildEntity());
|
||||
}
|
||||
GUI.color = addColor;
|
||||
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
if (GUI.changed)
|
||||
{
|
||||
MarkInBundleFiles.RefreshProjectBundleMark();
|
||||
EditorUtility.SetDirty(target);
|
||||
}
|
||||
|
||||
Color GetGroupColor(BuildEntity group, out string errorMsg)
|
||||
{
|
||||
errorMsg = null;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(group.GroupName))
|
||||
{
|
||||
errorMsg = "非法名称";
|
||||
return Color.red;
|
||||
}
|
||||
if (builder.Groups.Count(item => item.GroupName == group.GroupName) > 1)
|
||||
{
|
||||
errorMsg = "名称重复";
|
||||
return Color.red;
|
||||
}
|
||||
if (group.FolderList.Count == 0)
|
||||
{
|
||||
errorMsg = "未包含任何目录";
|
||||
return Color.red;
|
||||
}
|
||||
if (group.FolderList.Count(f => f == null) > 0)
|
||||
{
|
||||
errorMsg = "存在无效目录";
|
||||
return Color.red;
|
||||
}
|
||||
|
||||
if (group.OptionBundle) return Color.cyan;
|
||||
|
||||
return Color.white;
|
||||
}
|
||||
}
|
||||
|
||||
private void DrawCompareResult(List<BundleCompare> compareResult, Dictionary<string, BundleExtraInfo> bundleExtraInfo)
|
||||
{
|
||||
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
|
||||
foreach (var item in compareResult.OrderBy(c => c.Result))
|
||||
{
|
||||
if (item.Result == BundleCompare.EnumCompare.Same) continue;
|
||||
EditorGUILayout.BeginHorizontal();
|
||||
string drawStr = null;
|
||||
Color drawColor = Color.white;
|
||||
|
||||
switch (item.Result)
|
||||
{
|
||||
case BundleCompare.EnumCompare.Same:
|
||||
drawStr = "=";
|
||||
drawColor = Color.black;
|
||||
break;
|
||||
case BundleCompare.EnumCompare.Modified:
|
||||
drawColor = Color.yellow;
|
||||
drawStr = "*";
|
||||
break;
|
||||
case BundleCompare.EnumCompare.Add:
|
||||
drawColor = Color.green;
|
||||
drawStr = "+";
|
||||
break;
|
||||
case BundleCompare.EnumCompare.Delete:
|
||||
drawColor = Color.red;
|
||||
drawStr = "-";
|
||||
break;
|
||||
}
|
||||
|
||||
drawStr += item.ToString();
|
||||
|
||||
var temp = GUI.color;
|
||||
GUI.color = drawColor;
|
||||
EditorGUILayout.LabelField($"{drawStr}");
|
||||
EditorGUILayout.EndHorizontal();
|
||||
GUI.color = temp;
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
}
|
||||
|
||||
public static (BundleManifest remoteVersion, string updateVersion) FetchRemoteVersion(BuilderConfig builder, string ossPath)
|
||||
{
|
||||
BundleManifest remoteVersion = null;
|
||||
string updateVersion = null;
|
||||
|
||||
var bc = builder;
|
||||
var client = CDNUploader.Init(
|
||||
bc.BucketName,
|
||||
ossPath,
|
||||
bc.accessKeyId,
|
||||
bc.accessKeySecret,
|
||||
bc.endPoint,
|
||||
false
|
||||
);
|
||||
|
||||
var remoteManifestData = client.DownloadFile("PatchManifest.json");
|
||||
if (remoteManifestData == null)
|
||||
{
|
||||
remoteVersion = new BundleManifest();
|
||||
remoteVersion.Version = "N/A";
|
||||
var now = DateTime.Now;
|
||||
updateVersion = $"1.0.0.{now.Year:00}{now.Month:00}{now.Day:00}{now.Hour:00}{now.Minute:00}{now.Second:00}";
|
||||
}
|
||||
else
|
||||
{
|
||||
var remoteJson = Encoding.ASCII.GetString(remoteManifestData);
|
||||
var remoteManifest = BundleManifest.FromJson(remoteJson);
|
||||
remoteVersion = remoteManifest;
|
||||
var temp = remoteVersion.Version.Substring(0, remoteVersion.Version.LastIndexOf('.'));
|
||||
var now = DateTime.Now;
|
||||
updateVersion = $"{temp}.{now.Year:00}{now.Month:00}{now.Day:00}{now.Hour:00}{now.Minute:00}{now.Second:00}";
|
||||
}
|
||||
|
||||
return (remoteVersion, updateVersion);
|
||||
}
|
||||
|
||||
public static (BundleManifest remoteVersion, string updateVersion) FetchRemoteVersion(BuilderConfig builder)
|
||||
{
|
||||
var ossPath = $"{builder.UploadPath}/Bundles/{VersionFlowX.PlatformFoldName}";
|
||||
return FetchRemoteVersion(builder, ossPath);
|
||||
}
|
||||
|
||||
public static void StartUpLoad(List<BundleCompare> compareResult, BundleManifest localManifest, string outputPath, CDNUploader client)
|
||||
{
|
||||
List<Bundle> bundlesToUpload = new List<Bundle>();
|
||||
List<Bundle> bundlesToDelete = new List<Bundle>();
|
||||
foreach (var item in compareResult)
|
||||
{
|
||||
if (item.Result == BundleCompare.EnumCompare.Same) continue;
|
||||
|
||||
if (item.Result == BundleCompare.EnumCompare.Delete)
|
||||
{
|
||||
bundlesToDelete.Add(item.Old);
|
||||
}
|
||||
else
|
||||
{
|
||||
bundlesToUpload.Add(item.New);
|
||||
}
|
||||
}
|
||||
|
||||
string tips = string.Empty;
|
||||
if (client.PendingMode) tips = "****悬垂模式*****\n";
|
||||
else tips = "****!!!谨慎:直传模式!!!*****\n";
|
||||
|
||||
if (bundlesToUpload.Count == 0 && bundlesToDelete.Count == 0)
|
||||
{
|
||||
bool confirm = EditorUtility.DisplayDialog("FBI WARNING", $"CDN上没有需要更新的Bundle,将只更新版本号\n{tips}", "ok", "cancel");
|
||||
if (confirm)
|
||||
{
|
||||
var newVersionFile = new MemoryStream(Encoding.ASCII.GetBytes(localManifest.ToJson()));
|
||||
client.UploadFile("PatchManifest.json", newVersionFile);
|
||||
|
||||
client.RefreshBundleManifestURL();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
var totalSize = bundlesToUpload.Sum(b => b.Size);
|
||||
var totalSizeStr = $"{totalSize}b";
|
||||
if (totalSize > 1024 * 1024)
|
||||
{
|
||||
totalSizeStr = $"{totalSize / 1024f / 1024f:.00}mb";
|
||||
}
|
||||
else if (totalSize > 1024)
|
||||
{
|
||||
totalSizeStr = $"{totalSize / 1024f:.00}kb";
|
||||
}
|
||||
|
||||
bool res = EditorUtility.DisplayDialog("FBI WARNING", $"本次需上传{bundlesToUpload.Count}个Bundle\n总大小为{totalSizeStr}\n{tips}", "ok", "cancel");
|
||||
if (!res) return;
|
||||
|
||||
int max = bundlesToUpload.Count + 1;
|
||||
int step = 0;
|
||||
foreach (var bundle in bundlesToUpload)
|
||||
{
|
||||
EditorUtility.DisplayProgressBar("上传", $"{bundle.BundleName}", step * 1f / max);
|
||||
|
||||
var bundleFilePath = $"{outputPath}/{bundle.BundleName}";
|
||||
client.UploadFile(bundleFilePath, bundle.Hash);
|
||||
|
||||
step++;
|
||||
}
|
||||
|
||||
EditorUtility.DisplayProgressBar("上传", $"上传PatchManifest.json", step * 1f / max);
|
||||
var st = new MemoryStream(Encoding.ASCII.GetBytes(localManifest.ToJson()));
|
||||
client.UploadFile("PatchManifest.json", st);
|
||||
client.RefreshBundleManifestURL();
|
||||
|
||||
if (bundlesToDelete.Count > 0)
|
||||
{
|
||||
max = bundlesToDelete.Count + 1;
|
||||
step = 0;
|
||||
foreach (var bundle in bundlesToDelete)
|
||||
{
|
||||
EditorUtility.DisplayProgressBar("移除冗余bundle", $"{bundle.BundleName}", step * 1f / max);
|
||||
client.DeleteFile(bundle.BundleName);
|
||||
step++;
|
||||
}
|
||||
}
|
||||
|
||||
EditorUtility.ClearProgressBar();
|
||||
}
|
||||
|
||||
public static void CalcBundleHash(string bundleOutputPath, List<AssetBundleBuild> buildInfoList, Dictionary<string, BundleExtraInfo> bundleExtraInfo, AssetBundleManifest report)
|
||||
{
|
||||
var bundleNames = report.GetAllAssetBundles();
|
||||
int total = bundleNames.Length;
|
||||
|
||||
int step = 0;
|
||||
foreach (var bundleName in bundleNames)
|
||||
{
|
||||
var hash = report.GetAssetBundleHash(bundleName);
|
||||
bundleExtraInfo[bundleName].BundleHash = hash;
|
||||
|
||||
step++;
|
||||
|
||||
EditorUtility.DisplayProgressBar("算hash", $"{step}/{total}", step / total * 1f);
|
||||
}
|
||||
|
||||
//var procedu = Parallel.ForEach(bundleNames, item =>
|
||||
//{
|
||||
// var fullPath = $"{bundleOutputPath}/{item}";
|
||||
// var hash = AssetBundleParser.ParserHash(fullPath);
|
||||
// lock (bundleExtraInfo)
|
||||
// {
|
||||
// bundleExtraInfo[item].BundleHash = hash;
|
||||
// }
|
||||
// step++;
|
||||
//});
|
||||
|
||||
//while (!procedu.IsCompleted)
|
||||
//{
|
||||
// EditorUtility.DisplayProgressBar("算hash", $"{step}/{total}", step / total * 1f);
|
||||
//}
|
||||
|
||||
EditorUtility.ClearProgressBar();
|
||||
}
|
||||
|
||||
public static void SetInstallBundles(BuilderConfig builder, bool force)
|
||||
{
|
||||
if (Directory.Exists($"{Application.streamingAssetsPath}/Bundles"))
|
||||
Directory.Delete($"{Application.streamingAssetsPath}/Bundles", true);
|
||||
|
||||
//获取oss上的bundle清单
|
||||
var remoteInfo = FetchRemoteVersion(builder);
|
||||
|
||||
//收集定义为随包资源的bundle
|
||||
List<Bundle> installBundles = new List<Bundle>();
|
||||
foreach (var bundle in remoteInfo.remoteVersion.Bundles)
|
||||
{
|
||||
if (force) installBundles.Add(bundle);
|
||||
else if (bundle.InstallBundle) installBundles.Add(bundle);
|
||||
}
|
||||
|
||||
if (installBundles.Count > 0)
|
||||
{
|
||||
Directory.CreateDirectory($"{Application.streamingAssetsPath}/Bundles");
|
||||
BundleManifest installManifest = new BundleManifest();
|
||||
installManifest.Version = remoteInfo.remoteVersion.Version;
|
||||
int i = 0;
|
||||
|
||||
var client = CDNUploader.Init(
|
||||
builder.BucketName,
|
||||
$"{builder.UploadPath}/Bundles/{VersionFlowX.PlatformFoldName}",
|
||||
builder.accessKeyId,
|
||||
builder.accessKeySecret,
|
||||
builder.endPoint,
|
||||
false
|
||||
);
|
||||
|
||||
foreach (var bundle in installBundles)
|
||||
{
|
||||
EditorUtility.DisplayProgressBar("处理随包资源", $"{bundle.BundleName}", i * 1f / installBundles.Count);
|
||||
|
||||
var ext = Path.GetExtension(bundle.BundleName);
|
||||
var fileName = Path.GetFileNameWithoutExtension(bundle.BundleName);
|
||||
var fileNameInOSS = $"{fileName}.{bundle.Hash}{ext}";
|
||||
|
||||
var bundleData = client.DownloadFile(fileNameInOSS);
|
||||
|
||||
File.WriteAllBytes($"{Application.streamingAssetsPath}/Bundles/{bundle.BundleName}", bundleData);
|
||||
installManifest.UpdateBundleData(bundle);
|
||||
i++;
|
||||
}
|
||||
|
||||
File.WriteAllText($"{Application.streamingAssetsPath}/Bundles/InstallPatchManifest.json", installManifest.ToJson());
|
||||
}
|
||||
|
||||
EditorUtility.ClearProgressBar();
|
||||
|
||||
AssetDatabase.Refresh();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
11
Assets/VersionFlow/Editor/BuilderConfigEditor.cs.meta
Normal file
11
Assets/VersionFlow/Editor/BuilderConfigEditor.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e86153c36f3af6e4099e03bfd61c47b5
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
94
Assets/VersionFlow/Editor/CDNTaskWindow.cs
Normal file
94
Assets/VersionFlow/Editor/CDNTaskWindow.cs
Normal file
@ -0,0 +1,94 @@
|
||||
using AlibabaCloud.SDK.Cdn20180510.Models;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using VersionFlow.Runtime;
|
||||
|
||||
namespace VersionFlow.Editors.Assets.Scripts.VersionFlow.Editor
|
||||
{
|
||||
public class CDNTaskWindow : EditorWindow
|
||||
{
|
||||
[MenuItem("项目工具/Builder/CDN进度查询")]
|
||||
public static void OpenWindow()
|
||||
{
|
||||
var window = GetWindow<CDNTaskWindow>();
|
||||
window.position = new Rect(window.position) { width = 500, height = 800 };
|
||||
window.titleContent = new GUIContent("CDN任务");
|
||||
window.Show();
|
||||
}
|
||||
|
||||
private float fetchCDN_TaskCooldown = 0.5f;
|
||||
private void OnEnable()
|
||||
{
|
||||
fetchCDN_TaskCooldown = 0.5f;
|
||||
cdnRefreshTasks = null;
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
cdnRefreshTasks = null;
|
||||
}
|
||||
|
||||
private void OnGUI()
|
||||
{
|
||||
FetchTaskState();
|
||||
DrawCDNTask();
|
||||
|
||||
Repaint();
|
||||
}
|
||||
|
||||
private void FetchTaskState()
|
||||
{
|
||||
if (fetchCDN_TaskCooldown <= 0)
|
||||
{
|
||||
fetchCDN_TaskCooldown += 0.5f;
|
||||
|
||||
if (cdnFetchtask == null || cdnFetchtask.IsCompleted)
|
||||
{
|
||||
var builder = AssetDatabase.LoadAssetAtPath<BuilderConfig>("Assets/Scripts/VersionFlow/Builder/Builder.asset");
|
||||
var cdnClient = builder.GetCDNClient();
|
||||
|
||||
cdnFetchtask = cdnClient.DescribeRefreshTasksAsync(new AlibabaCloud.SDK.Cdn20180510.Models.DescribeRefreshTasksRequest { PageSize = 100 });
|
||||
}
|
||||
}
|
||||
else fetchCDN_TaskCooldown -= Time.deltaTime;
|
||||
|
||||
if (cdnFetchtask != null && cdnFetchtask.IsCompleted)
|
||||
{
|
||||
cdnRefreshTasks = cdnFetchtask.Result.Body.Tasks.CDNTask;
|
||||
}
|
||||
}
|
||||
|
||||
private Task<DescribeRefreshTasksResponse> cdnFetchtask;
|
||||
private List<DescribeRefreshTasksResponseBody.DescribeRefreshTasksResponseBodyTasks.DescribeRefreshTasksResponseBodyTasksCDNTask> cdnRefreshTasks;
|
||||
private Vector2 m_pos;
|
||||
|
||||
private void DrawCDNTask()
|
||||
{
|
||||
if (cdnRefreshTasks == null) return;
|
||||
|
||||
m_pos = EditorGUILayout.BeginScrollView(m_pos);
|
||||
foreach (var task in cdnRefreshTasks)
|
||||
{
|
||||
//if (task.Process == "100%") continue;
|
||||
var temp = GUI.color;
|
||||
EditorGUILayout.LabelField(task.ObjectPath);
|
||||
using (new EditorGUILayout.HorizontalScope())
|
||||
{
|
||||
var progress = float.Parse(task.Process.Replace("%", string.Empty));
|
||||
EditorGUILayout.LabelField(string.Empty);
|
||||
var rect = GUILayoutUtility.GetLastRect();
|
||||
EditorGUI.DrawRect(rect, Color.black);
|
||||
var progressRect = new Rect(rect);
|
||||
progressRect.width *= progress / 100f;
|
||||
EditorGUI.DrawRect(progressRect, task.Process == "100%" ? Color.green : new Color(0.8f, 0.66f, 1.5f / 16f, 1));
|
||||
GUI.color = Color.cyan;
|
||||
EditorGUI.LabelField(rect, $"{task.Process}", new GUIStyle(EditorStyles.label) { alignment = TextAnchor.MiddleLeft });
|
||||
}
|
||||
GUI.color = temp;
|
||||
}
|
||||
EditorGUILayout.EndScrollView();
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/VersionFlow/Editor/CDNTaskWindow.cs.meta
Normal file
11
Assets/VersionFlow/Editor/CDNTaskWindow.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 96ea1efe47a92564aa229b8fc62f3a0f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
236
Assets/VersionFlow/Editor/CDNUploader.cs
Normal file
236
Assets/VersionFlow/Editor/CDNUploader.cs
Normal file
@ -0,0 +1,236 @@
|
||||
using Aliyun.OSS;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEditor;
|
||||
using VersionFlow.Runtime;
|
||||
|
||||
namespace VersionFlow.Editors
|
||||
{
|
||||
public class CDNUploader
|
||||
{
|
||||
private OssClient m_ossclient;
|
||||
|
||||
private string m_bucketName;
|
||||
public bool PendingMode { get; private set; }
|
||||
|
||||
public string BucketName => m_bucketName;
|
||||
public string UploadRoot { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 初始化上传器
|
||||
/// </summary>
|
||||
/// <param name="bucketName"></param>
|
||||
/// <param name="uploadPath"></param>
|
||||
/// <param name="accessKeyId"></param>
|
||||
/// <param name="accessKeySecret"></param>
|
||||
/// <param name="endPoint"></param>
|
||||
/// <param name="pendingMode"></param>
|
||||
/// <returns></returns>
|
||||
public static CDNUploader Init(string bucketName, string uploadPath, string accessKeyId, string accessKeySecret, string endPoint, bool pendingMode)
|
||||
{
|
||||
CDNUploader client = new CDNUploader();
|
||||
|
||||
client.m_bucketName = bucketName;
|
||||
client.UploadRoot = uploadPath;
|
||||
client.PendingMode = pendingMode;
|
||||
|
||||
//accessKeyId = "LTAI5tAvUTxzcs5DCyczqow2";
|
||||
//accessKeySecret = "aycbkKvNUEhAJXtuNevBi2E5BD1OVj";
|
||||
//endPoint = "oss-cn-chengdu.aliyuncs.com";
|
||||
|
||||
client.m_ossclient = new OssClient(endPoint, accessKeyId, accessKeySecret);
|
||||
|
||||
return client;
|
||||
}
|
||||
|
||||
public bool CheckFileExist(string relativePath)
|
||||
{
|
||||
relativePath = relativePath.Replace('\\', '/').TrimStart('/');
|
||||
string filePathInBucket = $"{UploadRoot}/{relativePath}";
|
||||
return m_ossclient.DoesObjectExist(m_bucketName, filePathInBucket);
|
||||
}
|
||||
|
||||
public void UploadPatches(string patchDirPath)
|
||||
{
|
||||
var allPatchFiles = Directory.EnumerateFiles(patchDirPath, "*", SearchOption.AllDirectories).ToArray();
|
||||
int step = 0;
|
||||
int maxStep = allPatchFiles.Length;
|
||||
|
||||
List<string> objToRefresh = new List<string>();
|
||||
foreach (var filePath in allPatchFiles)
|
||||
{
|
||||
var relativePath =
|
||||
filePath
|
||||
.Substring(patchDirPath.Length, filePath.Length - patchDirPath.Length)
|
||||
.Replace("\\", "/").TrimStart('/');
|
||||
string filePathInBucket = $"{UploadRoot}/{relativePath}";
|
||||
if (PendingMode) filePathInBucket = $"PendingPatch_ORG/{filePathInBucket}";
|
||||
var fileSt = new MemoryStream(File.ReadAllBytes(filePath));
|
||||
|
||||
EditorUtility.DisplayProgressBar($"上传文件", $"[{relativePath}] -> [{filePathInBucket}]", step * 1f / maxStep);
|
||||
|
||||
ObjectMetadata metadata = new ObjectMetadata() { ContentEncoding = "identity" };
|
||||
m_ossclient.PutObject(m_bucketName, filePathInBucket, fileSt, metadata);
|
||||
|
||||
objToRefresh.Add(filePathInBucket);
|
||||
step++;
|
||||
}
|
||||
|
||||
if (!PendingMode)
|
||||
{
|
||||
var builder = AssetDatabase.LoadAssetAtPath<BuilderConfig>("Assets/Scripts/VersionFlow/Builder/Builder.asset");
|
||||
builder.CDNRefresh(objToRefresh);
|
||||
}
|
||||
|
||||
EditorUtility.ClearProgressBar();
|
||||
}
|
||||
public PutObjectResult UploadFile(string filePath, string appendHash)
|
||||
{
|
||||
string filePathInBucket = null;
|
||||
var fileSt = new MemoryStream(File.ReadAllBytes(filePath));
|
||||
|
||||
if (appendHash != null)
|
||||
{
|
||||
var ext = Path.GetExtension(filePath);
|
||||
var fileName = Path.GetFileNameWithoutExtension(filePath);
|
||||
|
||||
filePathInBucket = $"{UploadRoot}/{fileName}.{appendHash}{ext}";
|
||||
}
|
||||
else
|
||||
{
|
||||
var fileName = Path.GetFileName(filePath);
|
||||
filePathInBucket = $"{UploadRoot}/{fileName}";
|
||||
}
|
||||
|
||||
if (PendingMode) filePathInBucket = $"PendingPatch_ORG/{filePathInBucket}";
|
||||
|
||||
ObjectMetadata metadata = new ObjectMetadata() { ContentEncoding = "identity" };
|
||||
var result = m_ossclient.PutObject(m_bucketName, filePathInBucket, fileSt, metadata);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void DeleteFile(string fileName)
|
||||
{
|
||||
var filePathInBucket = $"{UploadRoot}/{fileName}";
|
||||
|
||||
m_ossclient.DeleteObject(m_bucketName, filePathInBucket);
|
||||
|
||||
}
|
||||
|
||||
public PutObjectResult UploadFile(string fileName, Stream fileSt)
|
||||
{
|
||||
var filePathInBucket = $"{UploadRoot}/{fileName}";
|
||||
|
||||
if (PendingMode) filePathInBucket = $"PendingPatch_ORG/{filePathInBucket}";
|
||||
|
||||
ObjectMetadata metadata = new ObjectMetadata() { ContentEncoding = "identity" };
|
||||
var result = m_ossclient.PutObject(m_bucketName, filePathInBucket, fileSt, metadata);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public void UploadFileAsync(string fileName, Stream fileSt, Action<bool> callback)
|
||||
{
|
||||
var filePathInBucket = $"{UploadRoot}/{fileName}";
|
||||
|
||||
if (PendingMode) filePathInBucket = $"PendingPatch_ORG/{filePathInBucket}";
|
||||
|
||||
ObjectMetadata metadata = new ObjectMetadata() { ContentEncoding = "identity" };
|
||||
PutObjectRequest putObjectRequest = new PutObjectRequest(m_bucketName, filePathInBucket, fileSt, metadata);
|
||||
int? taskID = Progress.Start($"上传 \"{fileName}\"", fileName, Progress.Options.None);
|
||||
putObjectRequest.StreamTransferProgress += ReportPorgress;
|
||||
|
||||
var task = Task.Run(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
var result = m_ossclient.PutObject(putObjectRequest);
|
||||
EditorApplication.delayCall += () =>
|
||||
{
|
||||
Progress.Finish(taskID.Value);
|
||||
taskID = null;
|
||||
callback?.Invoke(true);
|
||||
};
|
||||
}
|
||||
catch
|
||||
{
|
||||
EditorApplication.delayCall += () =>
|
||||
{
|
||||
if (taskID.HasValue)
|
||||
{
|
||||
Progress.Finish(taskID.Value, Progress.Status.Failed);
|
||||
}
|
||||
callback?.Invoke(false);
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
Progress.RegisterCancelCallback(taskID.Value, CancelProgress);
|
||||
|
||||
bool CancelProgress()
|
||||
{
|
||||
fileSt.Dispose();
|
||||
Progress.Finish(taskID.Value, Progress.Status.Canceled);
|
||||
taskID = null;
|
||||
return true;
|
||||
}
|
||||
|
||||
void ReportPorgress(object sender, StreamTransferProgressArgs args)
|
||||
{
|
||||
EditorApplication.delayCall += () =>
|
||||
{
|
||||
if (taskID.HasValue)
|
||||
{
|
||||
Progress.Report(taskID.Value, args.TransferredBytes * 1f / args.TotalBytes);
|
||||
Progress.SetDescription(taskID.Value, $"{GetByteSizeString((ulong)args.TransferredBytes)}/{GetByteSizeString((ulong)args.TotalBytes)}");
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private static string GetByteSizeString(ulong byteCount)
|
||||
{
|
||||
if (byteCount < 1024) return $"{byteCount}B";
|
||||
|
||||
if (byteCount < 1024 * 1024) return $"{byteCount / (1024f):.00}KB";
|
||||
|
||||
else return $"{byteCount / (1024f * 1024):.00}MB";
|
||||
}
|
||||
|
||||
public byte[] DownloadFile(string file)
|
||||
{
|
||||
if (!CheckFileExist(file)) return null;
|
||||
|
||||
var fileObj = m_ossclient.GetObject(m_bucketName, $"{UploadRoot}/{file}");
|
||||
if (fileObj == null) return null;
|
||||
|
||||
byte[] buffer = new byte[fileObj.ContentLength];
|
||||
int readed = 0;
|
||||
while (readed < buffer.Length - 1)
|
||||
{
|
||||
int read = fileObj.Content.Read(buffer, readed, buffer.Length - readed);
|
||||
readed += read;
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
public void RefreshBundleManifestURL()
|
||||
{
|
||||
if (PendingMode) UploadRoot = $"PendingPatch_ORG/{UploadRoot}";
|
||||
|
||||
var builder = AssetDatabase.LoadAssetAtPath<BuilderConfig>("Assets/Scripts/VersionFlow/Builder/Builder.asset");
|
||||
List<string> url = new List<string>()
|
||||
{
|
||||
$"{UploadRoot}/PatchManifest.json"
|
||||
};
|
||||
if (!PendingMode) builder.CDNRefresh(url);
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/VersionFlow/Editor/CDNUploader.cs.meta
Normal file
11
Assets/VersionFlow/Editor/CDNUploader.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d0de13f8423a56f4eba5899c2483a5a6
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/VersionFlow/Editor/LoadingChainGraph.meta
Normal file
8
Assets/VersionFlow/Editor/LoadingChainGraph.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9641b36c632d6244cab19130420d7655
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
57
Assets/VersionFlow/Editor/LoadingChainGraph/ABEntityNode.cs
Normal file
57
Assets/VersionFlow/Editor/LoadingChainGraph/ABEntityNode.cs
Normal file
@ -0,0 +1,57 @@
|
||||
using UnityEditor.Experimental.GraphView;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UIElements;
|
||||
using VersionFlow.Runtime;
|
||||
|
||||
namespace VersionFlow.Editors
|
||||
{
|
||||
public class ABEntityNode : Node
|
||||
{
|
||||
public Port linkChain { get; private set; }
|
||||
public Port RefAssets { get; private set; }
|
||||
public ABEntity Entity { get; }
|
||||
|
||||
static int colorIndex = 0;
|
||||
static Color[] s_colors = new Color[]
|
||||
{
|
||||
Color.yellow,
|
||||
Color.green,
|
||||
Color.magenta,
|
||||
Color.cyan
|
||||
};
|
||||
|
||||
public ABEntityNode(ABEntity entity, LoadingChainGraphView graph)
|
||||
{
|
||||
Entity = entity;
|
||||
|
||||
this.AddManipulator(new Dragger());
|
||||
this.Q("collapse-button").RemoveFromHierarchy();
|
||||
|
||||
topContainer.Clear();
|
||||
linkChain = Port.Create<Edge>(Orientation.Horizontal, Direction.Input, Port.Capacity.Multi, typeof(bool));
|
||||
linkChain.portName = string.Empty;
|
||||
topContainer.Add(linkChain);
|
||||
|
||||
RefAssets = Port.Create<Edge>(Orientation.Horizontal, Direction.Output, Port.Capacity.Multi, typeof(bool));
|
||||
RefAssets.portName = string.Empty;
|
||||
topContainer.Add(RefAssets);
|
||||
|
||||
|
||||
if (entity.m_assetRefCount.Count > 0)
|
||||
{
|
||||
var color = s_colors[(int)Mathf.Repeat(colorIndex++, s_colors.Length)];
|
||||
this.Q<Label>("title-label").style.color = color;
|
||||
|
||||
foreach (var ab in entity.m_assetRefCount)
|
||||
{
|
||||
var assetNode = graph.GetAssetNode(ab.Key, this);
|
||||
assetNode.Q("title").style.backgroundColor = color;
|
||||
var edge = RefAssets.ConnectTo(assetNode.linkEntity);
|
||||
graph.AddElement(edge);
|
||||
}
|
||||
}
|
||||
|
||||
this.Q<Label>("title-label").text = entity.m_bundle.name;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ceb4bcfbc3f8dab4db49dab9878f586e
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
46
Assets/VersionFlow/Editor/LoadingChainGraph/AssetNode.cs
Normal file
46
Assets/VersionFlow/Editor/LoadingChainGraph/AssetNode.cs
Normal file
@ -0,0 +1,46 @@
|
||||
using UnityEditor.Experimental.GraphView;
|
||||
using UnityEditor.UIElements;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UIElements;
|
||||
using VersionFlow.Runtime;
|
||||
|
||||
namespace VersionFlow.Editors
|
||||
{
|
||||
public class AssetNode : Node
|
||||
{
|
||||
public Port linkEntity { get; private set; }
|
||||
|
||||
public AssetNode(UnityEngine.Object assetIns, ABEntityNode entityNode, LoadingChainGraphView graph)
|
||||
{
|
||||
this.AddManipulator(new Dragger());
|
||||
this.Q("collapse-button").RemoveFromHierarchy();
|
||||
this.Q<Label>("title-label").RemoveFromHierarchy();
|
||||
this.titleContainer.style.flexDirection = FlexDirection.Column;
|
||||
this.titleContainer.Add(new ObjectField("资源(0)") { name = "asset-field" });
|
||||
|
||||
topContainer.Clear();
|
||||
linkEntity = Port.Create<Edge>(Orientation.Horizontal, Direction.Input, Port.Capacity.Multi, typeof(bool));
|
||||
linkEntity.portName = string.Empty;
|
||||
topContainer.Add(linkEntity);
|
||||
|
||||
this.Q<ObjectField>("asset-field").value = assetIns;
|
||||
this.Q<ObjectField>("asset-field").label = $"引用计数:{entityNode.Entity.m_assetRefCount[assetIns]}";
|
||||
this.Q<ObjectField>("asset-field").labelElement.style.color = Color.black;
|
||||
|
||||
if (assetIns is GameObject)
|
||||
{
|
||||
var chain = VersionFlowX.BundleMgr.GetLoadChain(entityNode.Entity, entityNode.Entity.m_isShaderBundle);
|
||||
if (chain.m_prefabSrcToInstance.TryGetValue(assetIns as GameObject, out var instances))
|
||||
{
|
||||
|
||||
foreach (var instance in instances)
|
||||
{
|
||||
ObjectField instanceUI = new("实例") { value = instance };
|
||||
instanceUI.labelElement.style.color = Color.black;
|
||||
this.titleContainer.Add(instanceUI);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e35a0856b6d87ac448eef93f56f9bc60
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
43
Assets/VersionFlow/Editor/LoadingChainGraph/ChainNode.cs
Normal file
43
Assets/VersionFlow/Editor/LoadingChainGraph/ChainNode.cs
Normal file
@ -0,0 +1,43 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEditor.Experimental.GraphView;
|
||||
using UnityEngine.UIElements;
|
||||
using VersionFlow.Runtime;
|
||||
|
||||
namespace VersionFlow.Editors
|
||||
{
|
||||
public class ChainNode : Node
|
||||
{
|
||||
private LoadingChain m_chain;
|
||||
private Dictionary<ABEntity, ABEntityNode> m_existABNodes;
|
||||
|
||||
public Port linkAB { get; private set; }
|
||||
|
||||
public int EntityCount => m_chain != null ? m_chain.GetEntities().Count : 0;
|
||||
|
||||
internal ChainNode(LoadingChain chain, Dictionary<ABEntity, ABEntityNode> existAbNodes, LoadingChainGraphView graph)
|
||||
{
|
||||
m_chain = chain;
|
||||
m_existABNodes = existAbNodes;
|
||||
this.AddManipulator(new Dragger());
|
||||
this.Q("collapse-button").RemoveFromHierarchy();
|
||||
topContainer.Clear();
|
||||
linkAB = Port.Create<Edge>(Orientation.Horizontal, Direction.Output, Port.Capacity.Multi, typeof(bool));
|
||||
linkAB.portName = "Entities";
|
||||
topContainer.Add(linkAB);
|
||||
|
||||
RefreshUI(graph);
|
||||
}
|
||||
|
||||
private void RefreshUI(LoadingChainGraphView graph)
|
||||
{
|
||||
this.Q<Label>("title-label").text = EntityCount.ToString();
|
||||
|
||||
foreach (var entity in m_chain.GetEntities())
|
||||
{
|
||||
var abNode = graph.GetEntityNode(entity);
|
||||
var edge = linkAB.ConnectTo(abNode.linkChain);
|
||||
graph.AddElement(edge);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c131465b3981f2140b368a121ec22acb
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,6 @@
|
||||
GridBackground {
|
||||
--grid-background-color: #2b2b2b;
|
||||
--line-color: rgba(51,51,51,0.4);
|
||||
--thick-line-color: rgba(51,51,51,1);
|
||||
--spacing: 25;
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cbaf6570e48ba6248a61745f7f4473d4
|
||||
ScriptedImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
|
||||
disableValidation: 0
|
||||
@ -0,0 +1,22 @@
|
||||
using UnityEditor;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
namespace VersionFlow.Editors
|
||||
{
|
||||
public class LoadingChainDebugWindow : EditorWindow
|
||||
{
|
||||
[MenuItem("Tools/VersionFlow/Debug")]
|
||||
public static void Open()
|
||||
{
|
||||
var wnd = GetWindow<LoadingChainDebugWindow>();
|
||||
wnd.Show();
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
LoadingChainGraphView graphView = new();
|
||||
graphView.StretchToParentSize();
|
||||
rootVisualElement.Add(graphView);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 91e6de73b283c204f8e7f77c3970e8f3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,103 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEditor.Experimental.GraphView;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UIElements;
|
||||
using VersionFlow.Runtime;
|
||||
|
||||
namespace VersionFlow.Editors
|
||||
{
|
||||
public class LoadingChainGraphView : GraphView
|
||||
{
|
||||
public LoadingChainGraphView()
|
||||
{
|
||||
SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale);
|
||||
this.AddManipulator(new ContentDragger());
|
||||
this.AddManipulator(new ClickSelector());
|
||||
var gridbg = new GridBackground();
|
||||
gridbg.StretchToParentSize();
|
||||
Insert(0, gridbg);
|
||||
|
||||
StyleSheet styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/Scripts/VersionFlow/Editor/LoadingChainGraph/GridBackgroundStyle.uss");
|
||||
styleSheets.Add(styleSheet);
|
||||
|
||||
Repaint();
|
||||
Add(new Button(Repaint) { text = "刷新" });
|
||||
}
|
||||
|
||||
void Repaint()
|
||||
{
|
||||
edges.ForEach(e =>
|
||||
{
|
||||
e.RemoveFromHierarchy();
|
||||
});
|
||||
foreach (var node in existABNodes.Values) node.RemoveFromHierarchy();
|
||||
existABNodes = new Dictionary<ABEntity, ABEntityNode>();
|
||||
foreach (var node in chainNodes) node.RemoveFromHierarchy();
|
||||
chainNodes = new List<ChainNode>();
|
||||
foreach (var node in assetNodes.Values) node.RemoveFromHierarchy();
|
||||
assetNodes = new Dictionary<UnityEngine.Object, AssetNode>();
|
||||
|
||||
if (Application.isPlaying)
|
||||
{
|
||||
foreach (var chain in VersionFlowX.BundleMgr.GetLoadingChains())
|
||||
{
|
||||
AddChainNode(chain);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Dictionary<ABEntity, ABEntityNode> existABNodes = new Dictionary<ABEntity, ABEntityNode>();
|
||||
List<ChainNode> chainNodes = new List<ChainNode>();
|
||||
Dictionary<UnityEngine.Object, AssetNode> assetNodes = new Dictionary<UnityEngine.Object, AssetNode>();
|
||||
|
||||
void AddChainNode(LoadingChain chain)
|
||||
{
|
||||
var chainNode = new ChainNode(chain, existABNodes, this);
|
||||
AddElement(chainNode);
|
||||
chainNodes.Add(chainNode);
|
||||
|
||||
var rect = chainNode.GetPosition();
|
||||
rect.position = new Vector2(0, (80 * chainNodes.Count - 1) + 10);
|
||||
chainNode.SetPosition(rect);
|
||||
}
|
||||
|
||||
internal ABEntityNode GetEntityNode(ABEntity entity)
|
||||
{
|
||||
if (existABNodes.TryGetValue(entity, out var abNode))
|
||||
{
|
||||
return abNode;
|
||||
}
|
||||
else
|
||||
{
|
||||
abNode = new ABEntityNode(entity, this);
|
||||
existABNodes[entity] = abNode;
|
||||
this.AddElement(abNode);
|
||||
|
||||
var index = existABNodes.Values.ToList().IndexOf(abNode);
|
||||
var rect = abNode.GetPosition();
|
||||
rect.position = new Vector2(500, 80 * index + 10);
|
||||
abNode.SetPosition(rect);
|
||||
|
||||
return abNode;
|
||||
}
|
||||
}
|
||||
internal AssetNode GetAssetNode(UnityEngine.Object assetIns, ABEntityNode entityNode)
|
||||
{
|
||||
if (!assetNodes.TryGetValue(assetIns, out var assetNode))
|
||||
{
|
||||
assetNode = new AssetNode(assetIns, entityNode, this);
|
||||
assetNodes[assetIns] = assetNode;
|
||||
AddElement(assetNode);
|
||||
|
||||
var index = assetNodes.Values.ToList().IndexOf(assetNode);
|
||||
var rect = assetNode.GetPosition();
|
||||
rect.position = new Vector2(900, 80 * index + 10);
|
||||
assetNode.SetPosition(rect);
|
||||
}
|
||||
|
||||
return assetNode;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ed874d0d6c00cca4aa59df5f12c98bab
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/VersionFlow/Editor/Plugins.meta
Normal file
8
Assets/VersionFlow/Editor/Plugins.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7fdd44cbbb10c3641855905f3998ce8b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/VersionFlow/Editor/Plugins/Aliyun.meta
Normal file
8
Assets/VersionFlow/Editor/Plugins/Aliyun.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 64e2f73f176b31a4abd061bcc43f11f3
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/VersionFlow/Editor/Plugins/Aliyun/Aliyun.OSS.dll
Normal file
BIN
Assets/VersionFlow/Editor/Plugins/Aliyun/Aliyun.OSS.dll
Normal file
Binary file not shown.
33
Assets/VersionFlow/Editor/Plugins/Aliyun/Aliyun.OSS.dll.meta
Normal file
33
Assets/VersionFlow/Editor/Plugins/Aliyun/Aliyun.OSS.dll.meta
Normal file
@ -0,0 +1,33 @@
|
||||
fileFormatVersion: 2
|
||||
guid: eac8f0ba9304d79428345af1019f67f0
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/VersionFlow/Editor/Plugins/Aliyun/AliyunCDN.meta
Normal file
8
Assets/VersionFlow/Editor/Plugins/Aliyun/AliyunCDN.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9283303628963b1439d5126d1fc6d74f
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@ -0,0 +1,33 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 560814f3bed5a3b4897075ca68e207b7
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@ -0,0 +1,33 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cf0bc1a5cd6396140b4cbf647c78b4b9
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@ -0,0 +1,33 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ee67ba6b986991f438b8561c8041fe87
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@ -0,0 +1,33 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1c6d1472c03a9a340a34e81d6d4abb49
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@ -0,0 +1,33 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e3f09739f8776374ea3df6389bc1a054
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@ -0,0 +1,33 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5e6514309bb96ab4582001f0a627f383
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@ -0,0 +1,33 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d9858b953cae2a8489d808d4a201e94b
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@ -0,0 +1,33 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 191c09fee9c1ab94fbf34f973097ce9b
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/VersionFlow/Editor/Plugins/Aliyun/AliyunCDN/Tea.dll
Normal file
BIN
Assets/VersionFlow/Editor/Plugins/Aliyun/AliyunCDN/Tea.dll
Normal file
Binary file not shown.
@ -0,0 +1,33 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e0fdf6506fde8c745b9c1334cea38bd8
|
||||
PluginImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
iconMap: {}
|
||||
executionOrder: {}
|
||||
defineConstraints: []
|
||||
isPreloaded: 0
|
||||
isOverridable: 0
|
||||
isExplicitlyReferenced: 0
|
||||
validateReferences: 1
|
||||
platformData:
|
||||
- first:
|
||||
Any:
|
||||
second:
|
||||
enabled: 0
|
||||
settings: {}
|
||||
- first:
|
||||
Editor: Editor
|
||||
second:
|
||||
enabled: 1
|
||||
settings:
|
||||
DefaultValueInitialized: true
|
||||
- first:
|
||||
Windows Store Apps: WindowsStoreApps
|
||||
second:
|
||||
enabled: 0
|
||||
settings:
|
||||
CPU: AnyCPU
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/VersionFlow/Editor/ShaderVariantCollector.meta
Normal file
8
Assets/VersionFlow/Editor/ShaderVariantCollector.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fdf2190140bce214f911410656454b89
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
672
Assets/VersionFlow/Editor/ShaderVariantCollector/EditorTools.cs
Normal file
672
Assets/VersionFlow/Editor/ShaderVariantCollector/EditorTools.cs
Normal file
@ -0,0 +1,672 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using UnityEditor;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEngine;
|
||||
|
||||
namespace VersionFlow.Editors
|
||||
{
|
||||
/// <summary>
|
||||
/// 资源搜索类型
|
||||
/// </summary>
|
||||
public enum EAssetSearchType
|
||||
{
|
||||
All,
|
||||
RuntimeAnimatorController,
|
||||
AnimationClip,
|
||||
AudioClip,
|
||||
AudioMixer,
|
||||
Font,
|
||||
Material,
|
||||
Mesh,
|
||||
Model,
|
||||
PhysicMaterial,
|
||||
Prefab,
|
||||
Scene,
|
||||
Script,
|
||||
Shader,
|
||||
Sprite,
|
||||
Texture,
|
||||
VideoClip,
|
||||
}
|
||||
/// <summary>
|
||||
/// 编辑器工具类
|
||||
/// </summary>
|
||||
public static class EditorTools
|
||||
{
|
||||
static EditorTools()
|
||||
{
|
||||
InitAssembly();
|
||||
}
|
||||
|
||||
#region Assembly
|
||||
#if UNITY_2019_4_OR_NEWER
|
||||
private static void InitAssembly()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取带继承关系的所有类的类型
|
||||
/// </summary>
|
||||
public static List<Type> GetAssignableTypes(System.Type parentType)
|
||||
{
|
||||
TypeCache.TypeCollection collection = TypeCache.GetTypesDerivedFrom(parentType);
|
||||
return collection.ToList();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取带有指定属性的所有类的类型
|
||||
/// </summary>
|
||||
public static List<Type> GetTypesWithAttribute(System.Type attrType)
|
||||
{
|
||||
TypeCache.TypeCollection collection = TypeCache.GetTypesWithAttribute(attrType);
|
||||
return collection.ToList();
|
||||
}
|
||||
#else
|
||||
private static readonly List<Type> _cacheTypes = new List<Type>(10000);
|
||||
private static void InitAssembly()
|
||||
{
|
||||
_cacheTypes.Clear();
|
||||
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
|
||||
foreach (Assembly assembly in assemblies)
|
||||
{
|
||||
List<Type> types = assembly.GetTypes().ToList();
|
||||
_cacheTypes.AddRange(types);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取带继承关系的所有类的类型
|
||||
/// </summary>
|
||||
public static List<Type> GetAssignableTypes(System.Type parentType)
|
||||
{
|
||||
List<Type> result = new List<Type>();
|
||||
for (int i = 0; i < _cacheTypes.Count; i++)
|
||||
{
|
||||
Type type = _cacheTypes[i];
|
||||
if (parentType.IsAssignableFrom(type))
|
||||
{
|
||||
if (type.Name == parentType.Name)
|
||||
continue;
|
||||
result.Add(type);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取带有指定属性的所有类的类型
|
||||
/// </summary>
|
||||
public static List<Type> GetTypesWithAttribute(System.Type attrType)
|
||||
{
|
||||
List<Type> result = new List<Type>();
|
||||
for (int i = 0; i < _cacheTypes.Count; i++)
|
||||
{
|
||||
Type type = _cacheTypes[i];
|
||||
if (type.GetCustomAttribute(attrType) != null)
|
||||
{
|
||||
result.Add(type);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// 调用私有的静态方法
|
||||
/// </summary>
|
||||
/// <param name="type">类的类型</param>
|
||||
/// <param name="method">类里要调用的方法名</param>
|
||||
/// <param name="parameters">调用方法传入的参数</param>
|
||||
public static object InvokeNonPublicStaticMethod(System.Type type, string method, params object[] parameters)
|
||||
{
|
||||
var methodInfo = type.GetMethod(method, BindingFlags.NonPublic | BindingFlags.Static);
|
||||
if (methodInfo == null)
|
||||
{
|
||||
UnityEngine.Debug.LogError($"{type.FullName} not found method : {method}");
|
||||
return null;
|
||||
}
|
||||
return methodInfo.Invoke(null, parameters);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 调用公开的静态方法
|
||||
/// </summary>
|
||||
/// <param name="type">类的类型</param>
|
||||
/// <param name="method">类里要调用的方法名</param>
|
||||
/// <param name="parameters">调用方法传入的参数</param>
|
||||
public static object InvokePublicStaticMethod(System.Type type, string method, params object[] parameters)
|
||||
{
|
||||
var methodInfo = type.GetMethod(method, BindingFlags.Public | BindingFlags.Static);
|
||||
if (methodInfo == null)
|
||||
{
|
||||
UnityEngine.Debug.LogError($"{type.FullName} not found method : {method}");
|
||||
return null;
|
||||
}
|
||||
return methodInfo.Invoke(null, parameters);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region EditorUtility
|
||||
/// <summary>
|
||||
/// 搜集资源
|
||||
/// </summary>
|
||||
/// <param name="searchType">搜集的资源类型</param>
|
||||
/// <param name="searchInFolders">指定搜索的文件夹列表</param>
|
||||
/// <returns>返回搜集到的资源路径列表</returns>
|
||||
public static string[] FindAssets(EAssetSearchType searchType, string[] searchInFolders)
|
||||
{
|
||||
// 注意:AssetDatabase.FindAssets()不支持末尾带分隔符的文件夹路径
|
||||
for (int i = 0; i < searchInFolders.Length; i++)
|
||||
{
|
||||
string folderPath = searchInFolders[i];
|
||||
searchInFolders[i] = folderPath.TrimEnd('/');
|
||||
}
|
||||
|
||||
// 注意:获取指定目录下的所有资源对象(包括子文件夹)
|
||||
string[] guids;
|
||||
if (searchType == EAssetSearchType.All)
|
||||
guids = AssetDatabase.FindAssets(string.Empty, searchInFolders);
|
||||
else
|
||||
guids = AssetDatabase.FindAssets($"t:{searchType}", searchInFolders);
|
||||
|
||||
// 注意:AssetDatabase.FindAssets()可能会获取到重复的资源
|
||||
HashSet<string> result = new HashSet<string>();
|
||||
for (int i = 0; i < guids.Length; i++)
|
||||
{
|
||||
string guid = guids[i];
|
||||
string assetPath = AssetDatabase.GUIDToAssetPath(guid);
|
||||
if (result.Contains(assetPath) == false)
|
||||
{
|
||||
result.Add(assetPath);
|
||||
}
|
||||
}
|
||||
|
||||
// 返回结果
|
||||
return result.ToArray();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 搜集资源
|
||||
/// </summary>
|
||||
/// <param name="searchType">搜集的资源类型</param>
|
||||
/// <param name="searchInFolder">指定搜索的文件夹</param>
|
||||
/// <returns>返回搜集到的资源路径列表</returns>
|
||||
public static string[] FindAssets(EAssetSearchType searchType, string searchInFolder)
|
||||
{
|
||||
return FindAssets(searchType, new string[] { searchInFolder });
|
||||
}
|
||||
|
||||
public static bool IsTypeAsset(EAssetSearchType searchType, string resPath)
|
||||
{
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 打开搜索面板
|
||||
/// </summary>
|
||||
/// <param name="title">标题名称</param>
|
||||
/// <param name="defaultPath">默认搜索路径</param>
|
||||
/// <returns>返回选择的文件夹绝对路径,如果无效返回NULL</returns>
|
||||
public static string OpenFolderPanel(string title, string defaultPath, string defaultName = "")
|
||||
{
|
||||
string openPath = EditorUtility.OpenFolderPanel(title, defaultPath, defaultName);
|
||||
if (string.IsNullOrEmpty(openPath))
|
||||
return null;
|
||||
|
||||
if (openPath.Contains("/Assets") == false)
|
||||
{
|
||||
Debug.LogWarning("Please select unity assets folder.");
|
||||
return null;
|
||||
}
|
||||
return openPath;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 打开搜索面板
|
||||
/// </summary>
|
||||
/// <param name="title">标题名称</param>
|
||||
/// <param name="defaultPath">默认搜索路径</param>
|
||||
/// <returns>返回选择的文件绝对路径,如果无效返回NULL</returns>
|
||||
public static string OpenFilePath(string title, string defaultPath, string extension = "")
|
||||
{
|
||||
string openPath = EditorUtility.OpenFilePanel(title, defaultPath, extension);
|
||||
if (string.IsNullOrEmpty(openPath))
|
||||
return null;
|
||||
|
||||
if (openPath.Contains("/Assets") == false)
|
||||
{
|
||||
Debug.LogWarning("Please select unity assets file.");
|
||||
return null;
|
||||
}
|
||||
return openPath;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 显示进度框
|
||||
/// </summary>
|
||||
public static void DisplayProgressBar(string tips, int progressValue, int totalValue)
|
||||
{
|
||||
EditorUtility.DisplayProgressBar("进度", $"{tips} : {progressValue}/{totalValue}", (float)progressValue / totalValue);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 隐藏进度框
|
||||
/// </summary>
|
||||
public static void ClearProgressBar()
|
||||
{
|
||||
EditorUtility.ClearProgressBar();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region EditorWindow
|
||||
public static void FocusUnitySceneWindow()
|
||||
{
|
||||
EditorWindow.FocusWindowIfItsOpen<SceneView>();
|
||||
}
|
||||
public static void CloseUnityGameWindow()
|
||||
{
|
||||
System.Type T = Assembly.Load("UnityEditor").GetType("UnityEditor.GameView");
|
||||
EditorWindow.GetWindow(T, false, "GameView", true).Close();
|
||||
}
|
||||
public static void FocusUnityGameWindow()
|
||||
{
|
||||
System.Type T = Assembly.Load("UnityEditor").GetType("UnityEditor.GameView");
|
||||
EditorWindow.GetWindow(T, false, "GameView", true);
|
||||
}
|
||||
public static void FocueUnityProjectWindow()
|
||||
{
|
||||
System.Type T = Assembly.Load("UnityEditor").GetType("UnityEditor.ProjectBrowser");
|
||||
EditorWindow.GetWindow(T, false, "Project", true);
|
||||
}
|
||||
public static void FocusUnityHierarchyWindow()
|
||||
{
|
||||
System.Type T = Assembly.Load("UnityEditor").GetType("UnityEditor.SceneHierarchyWindow");
|
||||
EditorWindow.GetWindow(T, false, "Hierarchy", true);
|
||||
}
|
||||
public static void FocusUnityInspectorWindow()
|
||||
{
|
||||
System.Type T = Assembly.Load("UnityEditor").GetType("UnityEditor.InspectorWindow");
|
||||
EditorWindow.GetWindow(T, false, "Inspector", true);
|
||||
}
|
||||
public static void FocusUnityConsoleWindow()
|
||||
{
|
||||
System.Type T = Assembly.Load("UnityEditor").GetType("UnityEditor.ConsoleWindow");
|
||||
EditorWindow.GetWindow(T, false, "Console", true);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region EditorConsole
|
||||
private static MethodInfo _clearConsoleMethod;
|
||||
private static MethodInfo ClearConsoleMethod
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_clearConsoleMethod == null)
|
||||
{
|
||||
Assembly assembly = Assembly.GetAssembly(typeof(SceneView));
|
||||
System.Type logEntries = assembly.GetType("UnityEditor.LogEntries");
|
||||
_clearConsoleMethod = logEntries.GetMethod("Clear");
|
||||
}
|
||||
return _clearConsoleMethod;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清空控制台
|
||||
/// </summary>
|
||||
public static void ClearUnityConsole()
|
||||
{
|
||||
ClearConsoleMethod.Invoke(new object(), null);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region SceneUtility
|
||||
public static bool HasDirtyScenes()
|
||||
{
|
||||
var sceneCount = EditorSceneManager.sceneCount;
|
||||
for (var i = 0; i < sceneCount; ++i)
|
||||
{
|
||||
var scene = EditorSceneManager.GetSceneAt(i);
|
||||
if (scene.isDirty)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region StringUtility
|
||||
public static string RemoveFirstChar(string str)
|
||||
{
|
||||
if (string.IsNullOrEmpty(str))
|
||||
return str;
|
||||
return str.Substring(1);
|
||||
}
|
||||
public static string RemoveLastChar(string str)
|
||||
{
|
||||
if (string.IsNullOrEmpty(str))
|
||||
return str;
|
||||
return str.Substring(0, str.Length - 1);
|
||||
}
|
||||
public static List<string> StringToStringList(string str, char separator)
|
||||
{
|
||||
List<string> result = new List<string>();
|
||||
if (!String.IsNullOrEmpty(str))
|
||||
{
|
||||
string[] splits = str.Split(separator);
|
||||
foreach (string split in splits)
|
||||
{
|
||||
string value = split.Trim(); //移除首尾空格
|
||||
if (!String.IsNullOrEmpty(value))
|
||||
{
|
||||
result.Add(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
public static T NameToEnum<T>(string name)
|
||||
{
|
||||
if (Enum.IsDefined(typeof(T), name) == false)
|
||||
{
|
||||
throw new ArgumentException($"Enum {typeof(T)} is not defined name {name}");
|
||||
}
|
||||
return (T)Enum.Parse(typeof(T), name);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 文件
|
||||
/// <summary>
|
||||
/// 创建文件所在的目录
|
||||
/// </summary>
|
||||
/// <param name="filePath">文件路径</param>
|
||||
public static void CreateFileDirectory(string filePath)
|
||||
{
|
||||
string destDirectory = Path.GetDirectoryName(filePath);
|
||||
CreateDirectory(destDirectory);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建文件夹
|
||||
/// </summary>
|
||||
public static bool CreateDirectory(string directory)
|
||||
{
|
||||
if (Directory.Exists(directory) == false)
|
||||
{
|
||||
Directory.CreateDirectory(directory);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除文件夹及子目录
|
||||
/// </summary>
|
||||
public static bool DeleteDirectory(string directory)
|
||||
{
|
||||
if (Directory.Exists(directory))
|
||||
{
|
||||
Directory.Delete(directory, true);
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 文件重命名
|
||||
/// </summary>
|
||||
public static void FileRename(string filePath, string newName)
|
||||
{
|
||||
string dirPath = Path.GetDirectoryName(filePath);
|
||||
string destPath;
|
||||
if (Path.HasExtension(filePath))
|
||||
{
|
||||
string extentsion = Path.GetExtension(filePath);
|
||||
destPath = $"{dirPath}/{newName}{extentsion}";
|
||||
}
|
||||
else
|
||||
{
|
||||
destPath = $"{dirPath}/{newName}";
|
||||
}
|
||||
FileInfo fileInfo = new FileInfo(filePath);
|
||||
fileInfo.MoveTo(destPath);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 移动文件
|
||||
/// </summary>
|
||||
public static void MoveFile(string filePath, string destPath)
|
||||
{
|
||||
if (File.Exists(destPath))
|
||||
File.Delete(destPath);
|
||||
|
||||
FileInfo fileInfo = new FileInfo(filePath);
|
||||
fileInfo.MoveTo(destPath);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 拷贝文件夹
|
||||
/// 注意:包括所有子目录的文件
|
||||
/// </summary>
|
||||
public static void CopyDirectory(string sourcePath, string destPath)
|
||||
{
|
||||
sourcePath = EditorTools.GetRegularPath(sourcePath);
|
||||
|
||||
// If the destination directory doesn't exist, create it.
|
||||
if (Directory.Exists(destPath) == false)
|
||||
Directory.CreateDirectory(destPath);
|
||||
|
||||
string[] fileList = Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories);
|
||||
foreach (string file in fileList)
|
||||
{
|
||||
string temp = EditorTools.GetRegularPath(file);
|
||||
string savePath = temp.Replace(sourcePath, destPath);
|
||||
CopyFile(file, savePath, true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 拷贝文件
|
||||
/// </summary>
|
||||
public static void CopyFile(string sourcePath, string destPath, bool overwrite)
|
||||
{
|
||||
if (File.Exists(sourcePath) == false)
|
||||
throw new FileNotFoundException(sourcePath);
|
||||
|
||||
// 创建目录
|
||||
CreateFileDirectory(destPath);
|
||||
|
||||
// 复制文件
|
||||
File.Copy(sourcePath, destPath, overwrite);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 清空文件夹
|
||||
/// </summary>
|
||||
/// <param name="folderPath">要清理的文件夹路径</param>
|
||||
public static void ClearFolder(string directoryPath)
|
||||
{
|
||||
if (Directory.Exists(directoryPath) == false)
|
||||
return;
|
||||
|
||||
// 删除文件
|
||||
string[] allFiles = Directory.GetFiles(directoryPath);
|
||||
for (int i = 0; i < allFiles.Length; i++)
|
||||
{
|
||||
File.Delete(allFiles[i]);
|
||||
}
|
||||
|
||||
// 删除文件夹
|
||||
string[] allFolders = Directory.GetDirectories(directoryPath);
|
||||
for (int i = 0; i < allFolders.Length; i++)
|
||||
{
|
||||
Directory.Delete(allFolders[i], true);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取文件字节大小
|
||||
/// </summary>
|
||||
public static long GetFileSize(string filePath)
|
||||
{
|
||||
FileInfo fileInfo = new FileInfo(filePath);
|
||||
return fileInfo.Length;
|
||||
}
|
||||
/// <summary>
|
||||
/// 读取文件的所有文本内容
|
||||
/// </summary>
|
||||
public static string ReadFileAllText(string filePath)
|
||||
{
|
||||
if (File.Exists(filePath) == false)
|
||||
return string.Empty;
|
||||
|
||||
return File.ReadAllText(filePath, Encoding.UTF8);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 读取文本的所有文本内容
|
||||
/// </summary>
|
||||
public static string[] ReadFileAllLine(string filePath)
|
||||
{
|
||||
if (File.Exists(filePath) == false)
|
||||
return null;
|
||||
|
||||
return File.ReadAllLines(filePath, Encoding.UTF8);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检测AssetBundle文件是否合法
|
||||
/// </summary>
|
||||
public static bool CheckBundleFileValid(byte[] fileData)
|
||||
{
|
||||
string signature = ReadStringToNull(fileData, 20);
|
||||
if (signature == "UnityFS" || signature == "UnityRaw" || signature == "UnityWeb" || signature == "\xFA\xFA\xFA\xFA\xFA\xFA\xFA\xFA")
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
private static string ReadStringToNull(byte[] data, int maxLength)
|
||||
{
|
||||
List<byte> bytes = new List<byte>();
|
||||
for (int i = 0; i < data.Length; i++)
|
||||
{
|
||||
if (i >= maxLength)
|
||||
break;
|
||||
|
||||
byte bt = data[i];
|
||||
if (bt == 0)
|
||||
break;
|
||||
|
||||
bytes.Add(bt);
|
||||
}
|
||||
|
||||
if (bytes.Count == 0)
|
||||
return string.Empty;
|
||||
else
|
||||
return Encoding.UTF8.GetString(bytes.ToArray());
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 路径
|
||||
/// <summary>
|
||||
/// 获取规范的路径
|
||||
/// </summary>
|
||||
public static string GetRegularPath(string path)
|
||||
{
|
||||
return path.Replace('\\', '/').Replace("\\", "/"); //替换为Linux路径格式
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取项目工程路径
|
||||
/// </summary>
|
||||
public static string GetProjectPath()
|
||||
{
|
||||
string projectPath = Path.GetDirectoryName(Application.dataPath);
|
||||
return GetRegularPath(projectPath);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 转换文件的绝对路径为Unity资源路径
|
||||
/// 例如 D:\\YourPorject\\Assets\\Works\\file.txt 替换为 Assets/Works/file.txt
|
||||
/// </summary>
|
||||
public static string AbsolutePathToAssetPath(string absolutePath)
|
||||
{
|
||||
string content = GetRegularPath(absolutePath);
|
||||
return Substring(content, "Assets/", true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 转换Unity资源路径为文件的绝对路径
|
||||
/// 例如:Assets/Works/file.txt 替换为 D:\\YourPorject/Assets/Works/file.txt
|
||||
/// </summary>
|
||||
public static string AssetPathToAbsolutePath(string assetPath)
|
||||
{
|
||||
string projectPath = GetProjectPath();
|
||||
return $"{projectPath}/{assetPath}";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 递归查找目标文件夹路径
|
||||
/// </summary>
|
||||
/// <param name="root">搜索的根目录</param>
|
||||
/// <param name="folderName">目标文件夹名称</param>
|
||||
/// <returns>返回找到的文件夹路径,如果没有找到返回空字符串</returns>
|
||||
public static string FindFolder(string root, string folderName)
|
||||
{
|
||||
DirectoryInfo rootInfo = new DirectoryInfo(root);
|
||||
DirectoryInfo[] infoList = rootInfo.GetDirectories();
|
||||
for (int i = 0; i < infoList.Length; i++)
|
||||
{
|
||||
string fullPath = infoList[i].FullName;
|
||||
if (infoList[i].Name == folderName)
|
||||
return fullPath;
|
||||
|
||||
string result = FindFolder(fullPath, folderName);
|
||||
if (string.IsNullOrEmpty(result) == false)
|
||||
return result;
|
||||
}
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 截取字符串
|
||||
/// 获取匹配到的后面内容
|
||||
/// </summary>
|
||||
/// <param name="content">内容</param>
|
||||
/// <param name="key">关键字</param>
|
||||
/// <param name="includeKey">分割的结果里是否包含关键字</param>
|
||||
/// <param name="searchBegin">是否使用初始匹配的位置,否则使用末尾匹配的位置</param>
|
||||
public static string Substring(string content, string key, bool includeKey, bool firstMatch = true)
|
||||
{
|
||||
if (string.IsNullOrEmpty(key))
|
||||
return content;
|
||||
|
||||
int startIndex = -1;
|
||||
if (firstMatch)
|
||||
startIndex = content.IndexOf(key); //返回子字符串第一次出现位置
|
||||
else
|
||||
startIndex = content.LastIndexOf(key); //返回子字符串最后出现的位置
|
||||
|
||||
// 如果没有找到匹配的关键字
|
||||
if (startIndex == -1)
|
||||
return content;
|
||||
|
||||
if (includeKey)
|
||||
return content.Substring(startIndex);
|
||||
else
|
||||
return content.Substring(startIndex + key.Length);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e45c006cbda1bbe428d5f8287d9c1976
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,35 @@
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace VersionFlow.Editors
|
||||
{
|
||||
public static class ShaderVariantCollectionHelper
|
||||
{
|
||||
public static void ClearCurrentShaderVariantCollection()
|
||||
{
|
||||
EditorTools.InvokeNonPublicStaticMethod(typeof(ShaderUtil), "ClearCurrentShaderVariantCollection");
|
||||
}
|
||||
public static void SaveCurrentShaderVariantCollection(string savePath)
|
||||
{
|
||||
EditorTools.InvokeNonPublicStaticMethod(typeof(ShaderUtil), "SaveCurrentShaderVariantCollection", savePath);
|
||||
}
|
||||
public static int GetCurrentShaderVariantCollectionShaderCount()
|
||||
{
|
||||
return (int)EditorTools.InvokeNonPublicStaticMethod(typeof(ShaderUtil), "GetCurrentShaderVariantCollectionShaderCount");
|
||||
}
|
||||
public static int GetCurrentShaderVariantCollectionVariantCount()
|
||||
{
|
||||
return (int)EditorTools.InvokeNonPublicStaticMethod(typeof(ShaderUtil), "GetCurrentShaderVariantCollectionVariantCount");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取着色器的变种总数量
|
||||
/// </summary>
|
||||
public static string GetShaderVariantCount(string assetPath)
|
||||
{
|
||||
Shader shader = AssetDatabase.LoadAssetAtPath<Shader>(assetPath);
|
||||
var variantCount = EditorTools.InvokeNonPublicStaticMethod(typeof(ShaderUtil), "GetVariantCount", shader, true);
|
||||
return variantCount.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cdb86310e5aeb9f4493fa349cc9ffdb4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,336 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using UnityEditor;
|
||||
using UnityEditor.SceneManagement;
|
||||
using UnityEngine;
|
||||
using VersionFlow.Runtime;
|
||||
using Debug = UnityEngine.Debug;
|
||||
|
||||
namespace VersionFlow.Editors
|
||||
{
|
||||
public class CollectAsset
|
||||
{
|
||||
public string assetPath;
|
||||
public string folderName;
|
||||
public string groupName;
|
||||
public string dependName;
|
||||
}
|
||||
public static class ShaderVariantCollector
|
||||
{
|
||||
private enum ESteps
|
||||
{
|
||||
None,
|
||||
Prepare,
|
||||
CollectAllMaterial,
|
||||
CollectVariants,
|
||||
CollectSleeping,
|
||||
WaitingDone,
|
||||
}
|
||||
|
||||
private const float WaitMilliseconds = 1000f;
|
||||
private const float SleepMilliseconds = 100f;
|
||||
private static string savePath = "Assets/GameAssets/Shaders/ShaderCollection/unity_collected.shadervariants";
|
||||
private static int _processMaxNum = 1000;
|
||||
private static Action _completedCallback;
|
||||
|
||||
private static ESteps _steps = ESteps.None;
|
||||
private static Stopwatch _elapsedTime;
|
||||
private static List<string> _allMaterials;
|
||||
private static List<GameObject> _allSpheres = new List<GameObject>(1000);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 开始收集
|
||||
/// </summary>
|
||||
public static void Run(Action completedCallback)
|
||||
{
|
||||
if (_steps != ESteps.None)
|
||||
return;
|
||||
|
||||
if (Path.HasExtension(savePath) == false)
|
||||
savePath = $"{savePath}.shadervariants";
|
||||
if (Path.GetExtension(savePath) != ".shadervariants")
|
||||
throw new System.Exception("Shader variant file extension is invalid.");
|
||||
|
||||
// 注意:先删除再保存,否则ShaderVariantCollection内容将无法及时刷新
|
||||
AssetDatabase.DeleteAsset(savePath);
|
||||
EditorTools.CreateFileDirectory(savePath);
|
||||
_completedCallback = completedCallback;
|
||||
|
||||
// 聚焦到游戏窗口
|
||||
EditorTools.FocusUnityGameWindow();
|
||||
|
||||
// 创建临时测试场景
|
||||
CreateTempScene();
|
||||
|
||||
_steps = ESteps.Prepare;
|
||||
EditorApplication.update += EditorUpdate;
|
||||
}
|
||||
|
||||
private static void EditorUpdate()
|
||||
{
|
||||
if (_steps == ESteps.None)
|
||||
return;
|
||||
|
||||
if (_steps == ESteps.Prepare)
|
||||
{
|
||||
ShaderVariantCollectionHelper.ClearCurrentShaderVariantCollection();
|
||||
_steps = ESteps.CollectAllMaterial;
|
||||
return; //等待一帧
|
||||
}
|
||||
|
||||
if (_steps == ESteps.CollectAllMaterial)
|
||||
{
|
||||
_allMaterials = GetAllMaterials();
|
||||
_steps = ESteps.CollectVariants;
|
||||
return; //等待一帧
|
||||
}
|
||||
|
||||
if (_steps == ESteps.CollectVariants)
|
||||
{
|
||||
int count = Mathf.Min(_processMaxNum, _allMaterials.Count);
|
||||
List<string> range = _allMaterials.GetRange(0, count);
|
||||
_allMaterials.RemoveRange(0, count);
|
||||
CollectVariants(range);
|
||||
|
||||
if (_allMaterials.Count > 0)
|
||||
{
|
||||
_elapsedTime = Stopwatch.StartNew();
|
||||
_steps = ESteps.CollectSleeping;
|
||||
}
|
||||
else
|
||||
{
|
||||
_elapsedTime = Stopwatch.StartNew();
|
||||
_steps = ESteps.WaitingDone;
|
||||
}
|
||||
}
|
||||
|
||||
if (_steps == ESteps.CollectSleeping)
|
||||
{
|
||||
if (_elapsedTime.ElapsedMilliseconds > SleepMilliseconds)
|
||||
{
|
||||
DestroyAllSpheres();
|
||||
_elapsedTime.Stop();
|
||||
_steps = ESteps.CollectVariants;
|
||||
}
|
||||
}
|
||||
|
||||
if (_steps == ESteps.WaitingDone)
|
||||
{
|
||||
// 注意:一定要延迟保存才会起效
|
||||
if (_elapsedTime.ElapsedMilliseconds > WaitMilliseconds)
|
||||
{
|
||||
_elapsedTime.Stop();
|
||||
_steps = ESteps.None;
|
||||
|
||||
ShaderVariantCollection svc = AssetDatabase.LoadAssetAtPath<ShaderVariantCollection>(savePath);
|
||||
if (svc == null) EditorTools.CreateFileDirectory(savePath);
|
||||
// 保存结果并创建清单
|
||||
ShaderVariantCollectionHelper.SaveCurrentShaderVariantCollection(savePath);
|
||||
|
||||
Debug.Log($"搜集SVC完毕!收集到shader {ShaderVariantCollectionHelper.GetCurrentShaderVariantCollectionShaderCount()} 变体 {ShaderVariantCollectionHelper.GetCurrentShaderVariantCollectionVariantCount()}");
|
||||
EditorApplication.update -= EditorUpdate;
|
||||
|
||||
var builder = AssetDatabase.LoadAssetAtPath<BuilderConfig>("Assets/Scripts/VersionFlow/Builder/Builder.asset");
|
||||
if (builder != null)
|
||||
{
|
||||
builder.SVC = AssetDatabase.LoadAssetAtPath<ShaderVariantCollection>(savePath);
|
||||
}
|
||||
_completedCallback?.Invoke();
|
||||
}
|
||||
}
|
||||
}
|
||||
private static void CreateTempScene()
|
||||
{
|
||||
EditorSceneManager.NewScene(NewSceneSetup.DefaultGameObjects);
|
||||
}
|
||||
private static List<CollectAsset> CollectAsset()
|
||||
{
|
||||
List<CollectAsset> assetList = new List<CollectAsset>(10000);
|
||||
string[] guids = AssetDatabase.FindAssets($"t:{typeof(BuilderConfig)}");
|
||||
|
||||
if (guids.Length == 0)
|
||||
{
|
||||
Debug.LogWarning($"No assets of type {typeof(BuilderConfig).Name} found.");
|
||||
return assetList;
|
||||
}
|
||||
string path = AssetDatabase.GUIDToAssetPath(guids[0]);
|
||||
BuilderConfig build = AssetDatabase.LoadAssetAtPath<BuilderConfig>(path);
|
||||
|
||||
if (build == null)
|
||||
{
|
||||
Debug.LogError($"Failed to load asset of type {typeof(BuilderConfig).Name} at path {path}.");
|
||||
return assetList;
|
||||
}
|
||||
foreach (var group in build.Groups)
|
||||
{
|
||||
foreach (var folder in group.FolderList)
|
||||
{
|
||||
var rootPath = UnityEditor.AssetDatabase.GetAssetPath(folder);
|
||||
var foldRes = UnityEditor.AssetDatabase.FindAssets(string.Empty, new string[] { rootPath });
|
||||
|
||||
foreach (var guid in foldRes)
|
||||
{
|
||||
var guidPath = UnityEditor.AssetDatabase.GUIDToAssetPath(guid);
|
||||
var guidAsset = UnityEditor.AssetDatabase.LoadAssetAtPath(path, typeof(UnityEngine.Object));
|
||||
if (guidAsset is UnityEditor.DefaultAsset) continue;
|
||||
assetList.Add(new CollectAsset()
|
||||
{
|
||||
assetPath = guidPath,
|
||||
folderName = rootPath,
|
||||
groupName = group.GroupName
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
return assetList;
|
||||
}
|
||||
private static List<string> GetAllMaterials()
|
||||
{
|
||||
int progressValue = 0;
|
||||
List<CollectAsset> allAssets = new List<CollectAsset>(1000);
|
||||
|
||||
// 获取所有打包的资源
|
||||
var collectResult = CollectAsset();
|
||||
foreach (var assetInfo in collectResult)
|
||||
{
|
||||
string[] depends = AssetDatabase.GetDependencies(assetInfo.assetPath, true);
|
||||
foreach (var dependAsset in depends)
|
||||
{
|
||||
if (allAssets.FindIndex((x) => x.assetPath == dependAsset) == -1)
|
||||
{
|
||||
if (dependAsset.StartsWith("Packages/com.unity.render-pipelines.universal"))
|
||||
{
|
||||
System.Type assetType = AssetDatabase.GetMainAssetTypeAtPath(dependAsset);
|
||||
if (assetType == typeof(UnityEngine.Material))
|
||||
{
|
||||
Debug.LogWarning($"{assetInfo.assetPath} 用到了urp默认资产 {dependAsset},是否需要提剔除 ??");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
allAssets.Add(new Editors.CollectAsset()
|
||||
{
|
||||
assetPath = dependAsset,
|
||||
dependName = assetInfo.assetPath,
|
||||
folderName = assetInfo.folderName,
|
||||
groupName = assetInfo.groupName
|
||||
});
|
||||
}
|
||||
}
|
||||
EditorTools.DisplayProgressBar("收集资源依赖", ++progressValue, collectResult.Count);
|
||||
}
|
||||
EditorTools.ClearProgressBar();
|
||||
// 搜集所有材质球
|
||||
progressValue = 0;
|
||||
List<string> allMaterial = new List<string>(1000);
|
||||
foreach (var assetPath in allAssets)
|
||||
{
|
||||
System.Type assetType = AssetDatabase.GetMainAssetTypeAtPath(assetPath.assetPath);
|
||||
if (assetType == typeof(UnityEngine.Material))
|
||||
{
|
||||
allMaterial.Add(assetPath.assetPath);
|
||||
}
|
||||
EditorTools.DisplayProgressBar("搜集所有材质球", ++progressValue, allAssets.Count);
|
||||
}
|
||||
EditorTools.ClearProgressBar();
|
||||
|
||||
// 返回结果
|
||||
return allMaterial;
|
||||
}
|
||||
private static void CollectVariants(List<string> materials)
|
||||
{
|
||||
Camera camera = Camera.main;
|
||||
if (camera == null)
|
||||
throw new System.Exception("Not found main camera.");
|
||||
|
||||
// 设置主相机
|
||||
float aspect = camera.aspect;
|
||||
int totalMaterials = materials.Count;
|
||||
float height = Mathf.Sqrt(totalMaterials / aspect) + 1;
|
||||
float width = Mathf.Sqrt(totalMaterials / aspect) * aspect + 1;
|
||||
float halfHeight = Mathf.CeilToInt(height / 2f);
|
||||
float halfWidth = Mathf.CeilToInt(width / 2f);
|
||||
camera.orthographic = true;
|
||||
camera.orthographicSize = halfHeight;
|
||||
camera.transform.position = new Vector3(0f, 0f, -10f);
|
||||
|
||||
// 创建测试球体
|
||||
int xMax = (int)(width - 1);
|
||||
int x = 0, y = 0;
|
||||
int progressValue = 0;
|
||||
for (int i = 0; i < materials.Count; i++)
|
||||
{
|
||||
var material = materials[i];
|
||||
var position = new Vector3(x - halfWidth + 1f, y - halfHeight + 1f, 0f);
|
||||
var go = CreateSphere(material, position, i);
|
||||
if (go != null)
|
||||
_allSpheres.Add(go);
|
||||
if (x == xMax)
|
||||
{
|
||||
x = 0;
|
||||
y++;
|
||||
}
|
||||
else
|
||||
{
|
||||
x++;
|
||||
}
|
||||
EditorTools.DisplayProgressBar("照射所有材质球", ++progressValue, materials.Count);
|
||||
}
|
||||
EditorTools.ClearProgressBar();
|
||||
}
|
||||
private static GameObject CreateSphere(string assetPath, Vector3 position, int index)
|
||||
{
|
||||
var material = GameObject.Instantiate(AssetDatabase.LoadAssetAtPath<Material>(assetPath));
|
||||
var shader = material.shader;
|
||||
if (shader == null)
|
||||
return null;
|
||||
//设置材质单面渲染
|
||||
if (material.HasProperty("_Cull") && material.GetInt("_Cull") == (int)UnityEngine.Rendering.CullMode.Off)
|
||||
{
|
||||
// 将 Cull 参数设置为 Off
|
||||
//material.SetInt("_Cull", (int)UnityEngine.Rendering.CullMode.Back);
|
||||
Debug.LogError($"材质启用了双面渲染,请美术同学注意 {material.name}");
|
||||
//EditorUtility.SetDirty(material);
|
||||
//AssetDatabase.SaveAssets();
|
||||
}
|
||||
var go = GameObject.CreatePrimitive(PrimitiveType.Sphere);
|
||||
go.GetComponent<Renderer>().material = material;
|
||||
go.transform.position = position;
|
||||
go.name = $"Sphere_{index} | {material.name}";
|
||||
if (shader.name.Contains("RoleShader"))
|
||||
{
|
||||
material.EnableKeyword("_ALPHATEST_ON");
|
||||
}
|
||||
return go;
|
||||
}
|
||||
private static void DestroyAllSpheres()
|
||||
{
|
||||
foreach (var go in _allSpheres)
|
||||
{
|
||||
GameObject.DestroyImmediate(go);
|
||||
}
|
||||
_allSpheres.Clear();
|
||||
|
||||
// 尝试释放编辑器加载的资源
|
||||
EditorUtility.UnloadUnusedAssetsImmediate(true);
|
||||
}
|
||||
//private static void CreateManifest()
|
||||
//{
|
||||
// AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
|
||||
|
||||
// ShaderVariantCollection svc = AssetDatabase.LoadAssetAtPath<ShaderVariantCollection>(_savePath);
|
||||
// if (svc != null)
|
||||
// {
|
||||
// var wrapper = ShaderVariantCollectionManifest.Extract(svc);
|
||||
// string jsonData = JsonUtility.ToJson(wrapper, true);
|
||||
// string savePath = _savePath.Replace(".shadervariants", ".json");
|
||||
// File.WriteAllText(savePath, jsonData);
|
||||
// }
|
||||
|
||||
// AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
|
||||
//}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cfa102ef4979c6142a81dccd45f66531
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
18
Assets/VersionFlow/Editor/VersionFlow.Editor.asmdef
Normal file
18
Assets/VersionFlow/Editor/VersionFlow.Editor.asmdef
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "VersionFlow.Editor",
|
||||
"rootNamespace": "VersionFlow.Editors",
|
||||
"references": [
|
||||
"GUID:dbf69c06d7c710748a2c96ac4e81ba19"
|
||||
],
|
||||
"includePlatforms": [
|
||||
"Editor"
|
||||
],
|
||||
"excludePlatforms": [],
|
||||
"allowUnsafeCode": true,
|
||||
"overrideReferences": false,
|
||||
"precompiledReferences": [],
|
||||
"autoReferenced": true,
|
||||
"defineConstraints": [],
|
||||
"versionDefines": [],
|
||||
"noEngineReferences": false
|
||||
}
|
||||
7
Assets/VersionFlow/Editor/VersionFlow.Editor.asmdef.meta
Normal file
7
Assets/VersionFlow/Editor/VersionFlow.Editor.asmdef.meta
Normal file
@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8d93e4ce22278cd4a805354c55c61670
|
||||
AssemblyDefinitionImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
138
Assets/VersionFlow/Editor/VersionFlowSettingEditor.cs
Normal file
138
Assets/VersionFlow/Editor/VersionFlowSettingEditor.cs
Normal file
@ -0,0 +1,138 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using VersionFlow.Runtime;
|
||||
|
||||
namespace VersionFlow.Editors
|
||||
{
|
||||
[CustomEditor(typeof(VersionFlowSetting))]
|
||||
public class VersionFlowSettingEditor : Editor
|
||||
{
|
||||
[MenuItem("项目工具/打开VersionFlow设置 &4")]
|
||||
public static void OpenSettingInspector()
|
||||
{
|
||||
var setting = AssetDatabase.LoadAssetAtPath<VersionFlowSetting>("Assets/Scripts/VersionFlow/Resources/VersionFlowSettings.asset");
|
||||
var builder = AssetDatabase.LoadAssetAtPath<BuilderConfig>("Assets/Scripts/VersionFlow/Builder/Builder.asset");
|
||||
|
||||
EditorApplication.delayCall += () =>
|
||||
{
|
||||
OpenPropertyEditor(setting);
|
||||
EditorApplication.delayCall += () =>
|
||||
{
|
||||
OpenPropertyEditor(builder);
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
public static dynamic OpenPropertyEditor(UnityEngine.Object obj, bool showWindow = true)
|
||||
{
|
||||
var ass = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(ass => ass.FullName.Contains("UnityEditor.CoreModule"));
|
||||
if (ass == null) return null;
|
||||
|
||||
var t = ass.GetType("UnityEditor.PropertyEditor");
|
||||
Type[] parameterTypes = { typeof(UnityEngine.Object), typeof(bool) };
|
||||
var method = t.GetMethod("OpenPropertyEditor", BindingFlags.Static | BindingFlags.NonPublic, null, parameterTypes, null);
|
||||
return method.Invoke(null, new object[] { obj, showWindow });
|
||||
}
|
||||
|
||||
private bool foldBundleLoadingInfo;
|
||||
private bool foldOptionDownloader;
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
var target = this.target as VersionFlowSetting;
|
||||
target.EnableInEditor = EditorGUILayout.Toggle("在编辑器中开启VersionFlow", target.EnableInEditor);
|
||||
|
||||
base.OnInspectorGUI();
|
||||
|
||||
EditorGUILayout.LabelField("DownloadURL", target.GetDownloadUrl());
|
||||
|
||||
if (GUILayout.Button("打开Bundle下载目录"))
|
||||
{
|
||||
System.Diagnostics.Process p = new System.Diagnostics.Process();
|
||||
p.StartInfo.FileName = "explorer.exe";
|
||||
p.StartInfo.Arguments = @" /select, " + VersionFlowX.LocalBundlePath.Replace("/", "\\");
|
||||
p.Start();
|
||||
}
|
||||
|
||||
foldBundleLoadingInfo = EditorGUILayout.BeginFoldoutHeaderGroup(foldBundleLoadingInfo, "Bundle加载信息");
|
||||
if (foldBundleLoadingInfo) DrawBundloadLoadingInfo();
|
||||
EditorGUILayout.EndFoldoutHeaderGroup();
|
||||
|
||||
foldOptionDownloader = EditorGUILayout.BeginFoldoutHeaderGroup(foldOptionDownloader, "可选Group下载信息");
|
||||
if (foldOptionDownloader) DrawOptionalGroupInfo();
|
||||
EditorGUILayout.EndFoldoutHeaderGroup();
|
||||
}
|
||||
|
||||
private void DrawOptionalGroupInfo()
|
||||
{
|
||||
if (VersionFlowX.BundleMgr == null) return;
|
||||
|
||||
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
|
||||
foreach (var downloader in VersionFlowX.BundleMgr.GetAllOptionBundleDownloader())
|
||||
{
|
||||
using (new EditorGUILayout.HorizontalScope())
|
||||
{
|
||||
var downloadedBytesStr = OptionalBundleDownloader.GetByteSizeString(downloader.DownloadedBytes);
|
||||
var totalSizeStr = OptionalBundleDownloader.GetByteSizeString(downloader.TotalSize);
|
||||
EditorGUILayout.LabelField(string.Empty);
|
||||
var rect = GUILayoutUtility.GetLastRect();
|
||||
EditorGUI.DrawRect(rect, Color.black);
|
||||
var progressRect = new Rect(rect);
|
||||
progressRect.width *= (downloader.DownloadedBytes * 1f) / (downloader.TotalSize);
|
||||
EditorGUI.DrawRect(progressRect, Color.cyan);
|
||||
|
||||
EditorGUI.LabelField(rect, $"{downloader.Group}", new GUIStyle(EditorStyles.label) { alignment = TextAnchor.MiddleLeft });
|
||||
EditorGUI.LabelField(rect, $"{downloadedBytesStr}/{totalSizeStr}", new GUIStyle(EditorStyles.label) { alignment = TextAnchor.MiddleCenter });
|
||||
}
|
||||
|
||||
if (downloader.State == OptionalBundleDownloader.EnumDownloadState.Idle)
|
||||
{
|
||||
if (GUILayout.Button("Download")) downloader.BeginDownload();
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorGUILayout.LabelField(downloader.State.ToString());
|
||||
}
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
Repaint();
|
||||
}
|
||||
|
||||
private static void DrawBundloadLoadingInfo()
|
||||
{
|
||||
var loadedBundles = AssetBundle.GetAllLoadedAssetBundles().ToList();
|
||||
if (loadedBundles.Count > 0)
|
||||
{
|
||||
EditorGUILayout.LabelField($"当前已加载Bundle数量:{loadedBundles.Count}");
|
||||
EditorGUILayout.BeginVertical(EditorStyles.helpBox);
|
||||
foreach (var ab in loadedBundles)
|
||||
{
|
||||
EditorGUILayout.ObjectField(ab, typeof(UnityEngine.AssetBundle), false);
|
||||
var abEntity = VersionFlowX.BundleMgr.GetABEntity(ab.name);
|
||||
foreach (var item in abEntity.m_assetRefCount)
|
||||
{
|
||||
EditorGUILayout.BeginHorizontal(new GUIStyle(GUIStyle.none) { margin = new RectOffset(10, 0, 2, 2) });
|
||||
EditorGUILayout.LabelField(item.Value.ToString(), GUILayout.Width(30));
|
||||
var rect = GUILayoutUtility.GetLastRect();
|
||||
rect.position -= new Vector2(7, 4);
|
||||
rect.width = 2;
|
||||
rect.height += 7;
|
||||
EditorGUI.DrawRect(rect, Color.cyan);
|
||||
EditorGUILayout.ObjectField(item.Key, item.Key.GetType(), false);
|
||||
EditorGUILayout.EndHorizontal();
|
||||
}
|
||||
}
|
||||
EditorGUILayout.EndVertical();
|
||||
|
||||
if (GUILayout.Button("清理未使用Bundle"))
|
||||
{
|
||||
VersionFlowX.BundleMgr.TryUnLoadBundles();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/VersionFlow/Editor/VersionFlowSettingEditor.cs.meta
Normal file
11
Assets/VersionFlow/Editor/VersionFlowSettingEditor.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b5358457a0a4cf54eab2d713b8945eac
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/VersionFlow/Resources.meta
Normal file
8
Assets/VersionFlow/Resources.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b029a1108666348489b34511f4487d97
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
18
Assets/VersionFlow/Resources/VersionFlowSettings.asset
Normal file
18
Assets/VersionFlow/Resources/VersionFlowSettings.asset
Normal file
@ -0,0 +1,18 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 7dc52158fc454554abe766cf83fc6e1b, type: 3}
|
||||
m_Name: VersionFlowSettings
|
||||
m_EditorClassIdentifier:
|
||||
PendingPatch: PendingPatch_ORG
|
||||
RootPath: https://update.2020yoyo.com
|
||||
SubPath: HXORG
|
||||
AutoReleaseBundle: 1
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b304f98f44ccac546969282b7054a052
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/VersionFlow/Runtime.meta
Normal file
8
Assets/VersionFlow/Runtime.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dbf8531b91e6f5149a6d751e88e6acec
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
264
Assets/VersionFlow/Runtime/ABEntity.cs
Normal file
264
Assets/VersionFlow/Runtime/ABEntity.cs
Normal file
@ -0,0 +1,264 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
using UnityEngine.AI;
|
||||
using UnityEngine.Assertions;
|
||||
using UnityEngine.Networking;
|
||||
using Object = UnityEngine.Object;
|
||||
|
||||
namespace VersionFlow.Runtime
|
||||
{
|
||||
public class ABEntity
|
||||
{
|
||||
internal Bundle m_manifestBundleInfo;
|
||||
internal string m_path;
|
||||
internal string m_packagePath;
|
||||
internal bool m_isDownloaded;
|
||||
internal bool m_isShaderBundle;
|
||||
/// <summary> 此AB依赖的AB清单 </summary>
|
||||
internal HashSet<ABEntity> m_dependencyAB = new HashSet<ABEntity>();
|
||||
/// <summary> Unity AsssetBundle对象 </summary>
|
||||
internal AssetBundle m_bundle;
|
||||
/// <summary> 此AB包含的所有Assets </summary>
|
||||
public List<string> Assets { get; private set; }
|
||||
/// <summary> 此AB所在Chain </summary>
|
||||
internal HashSet<LoadingChain> m_inChains = new HashSet<LoadingChain>();
|
||||
|
||||
public ABEntity(Bundle bundle, bool isDownloaded)
|
||||
{
|
||||
m_manifestBundleInfo = bundle;
|
||||
m_path = $"{VersionFlowX.LocalBundlePath}/{bundle.BundleName}";
|
||||
#if UNITY_IOS
|
||||
m_packagePath = $"file://{Application.streamingAssetsPath}/Bundles/{bundle.BundleName}";
|
||||
#else
|
||||
m_packagePath = $"{Application.streamingAssetsPath}/Bundles/{bundle.BundleName}";
|
||||
#endif
|
||||
m_isDownloaded = isDownloaded;
|
||||
Assets = new List<string>(bundle.Assets);
|
||||
m_isShaderBundle = bundle.ShaderBundle;
|
||||
}
|
||||
|
||||
internal void UnLoadAB()
|
||||
{
|
||||
if (m_bundle != null)
|
||||
{
|
||||
m_bundle.Unload(true);
|
||||
m_bundle = null;
|
||||
}
|
||||
}
|
||||
|
||||
internal void LoadAB()
|
||||
{
|
||||
if (m_bundle != null) return;
|
||||
|
||||
if (abAsyncDownloader != null && !m_isDownloaded)
|
||||
{
|
||||
while (abAsyncDownloader.keepWaiting)
|
||||
{
|
||||
} //等待下载完成
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!m_isDownloaded)
|
||||
{
|
||||
VersionFlowX.Log($"检测到未下载的AB:[{this.m_manifestBundleInfo.BundleName}],现在开始下载");
|
||||
var res = VersionFlowX.DownloadBundle(m_manifestBundleInfo);
|
||||
|
||||
if (res) m_isDownloaded = true;
|
||||
else throw new System.Exception($"下载 AB {this} 失败");
|
||||
}
|
||||
}
|
||||
|
||||
if (abAsyncLoader != null)
|
||||
{
|
||||
while (!abAsyncLoader.isDone)
|
||||
{
|
||||
//当访问assetBundle属性时,会驱动unity的异步加载逻辑
|
||||
//https://zhuanlan.zhihu.com/p/543948360
|
||||
var temp = abAsyncLoader.assetBundle;
|
||||
}
|
||||
m_bundle = abAsyncLoader.assetBundle;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (File.Exists(m_path))
|
||||
{
|
||||
m_bundle = AssetBundle.LoadFromFile(m_path);
|
||||
}
|
||||
else //如果外部bundle文件不存在,则尝试从StreamingAssets中加载
|
||||
{
|
||||
var request = UnityWebRequestAssetBundle.GetAssetBundle(m_packagePath);
|
||||
var op = request.SendWebRequest();
|
||||
while (!op.isDone) { } //同步等待读取完成
|
||||
|
||||
if (request.result == UnityWebRequest.Result.Success)
|
||||
{
|
||||
m_bundle = DownloadHandlerAssetBundle.GetContent(request);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsLoading => (abAsyncLoader != null || abAsyncLoaderStreaming != null);
|
||||
public bool IsDownloading => abAsyncDownloader != null && !abAsyncDownloader.m_isDone;
|
||||
internal AssetBundleCreateRequest abAsyncLoader;
|
||||
internal UnityWebRequest abAsyncLoaderStreaming;
|
||||
internal BundleDownloadAsyncOpeation abAsyncDownloader;
|
||||
|
||||
internal IEnumerator LoadABAsync()
|
||||
{
|
||||
if (m_bundle != null) yield break;
|
||||
|
||||
if (!m_isDownloaded)
|
||||
{
|
||||
if (!IsDownloading)
|
||||
{
|
||||
VersionFlowX.Log($"检测到未下载的AB:[{this.m_manifestBundleInfo.BundleName}],现在开始下载");
|
||||
abAsyncDownloader = VersionFlowX.DownloadBundleAsync(m_manifestBundleInfo);
|
||||
|
||||
yield return abAsyncDownloader;
|
||||
if (abAsyncDownloader.Success)
|
||||
{
|
||||
m_isDownloaded = true;
|
||||
abAsyncDownloader = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
abAsyncDownloader = null;
|
||||
|
||||
throw new System.Exception($"下载 AB {this} 失败");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
yield return abAsyncDownloader;
|
||||
}
|
||||
}
|
||||
|
||||
if (!IsLoading)
|
||||
{
|
||||
if (File.Exists(m_path))
|
||||
{
|
||||
abAsyncLoader = AssetBundle.LoadFromFileAsync(m_path);
|
||||
yield return abAsyncLoader;
|
||||
m_bundle = abAsyncLoader.assetBundle;
|
||||
|
||||
abAsyncLoader = null;
|
||||
}
|
||||
else //如果外部bundle文件不存在,则尝试从StreamingAssets中加载
|
||||
{
|
||||
abAsyncLoaderStreaming = UnityWebRequestAssetBundle.GetAssetBundle(m_packagePath);
|
||||
var op = abAsyncLoaderStreaming.SendWebRequest();
|
||||
yield return op;
|
||||
|
||||
if (abAsyncLoaderStreaming.result == UnityWebRequest.Result.Success)
|
||||
{
|
||||
m_bundle = DownloadHandlerAssetBundle.GetContent(abAsyncLoaderStreaming);
|
||||
}
|
||||
|
||||
abAsyncLoaderStreaming = null;
|
||||
}
|
||||
|
||||
yield break;
|
||||
}
|
||||
else
|
||||
{
|
||||
yield return new WaitUntil(() => !IsLoading);
|
||||
|
||||
yield break;
|
||||
}
|
||||
}
|
||||
|
||||
public event Action<ABEntity, UnityEngine.Object> OnAssetLoad;
|
||||
public event Action<ABEntity, UnityEngine.Object> OnAssetUnLoad;
|
||||
internal Dictionary<UnityEngine.Object, int> m_assetRefCount = new Dictionary<UnityEngine.Object, int>();
|
||||
|
||||
internal T LoadAsset<T>(string path) where T : UnityEngine.Object
|
||||
{
|
||||
VersionFlowX.Log($"bundle loadasset {path}");
|
||||
|
||||
var result = m_bundle.LoadAsset<T>(path);
|
||||
|
||||
if (result != null)
|
||||
VersionFlowX.Log($"bundle loadasset finish {result.GetType()}");
|
||||
else
|
||||
VersionFlowX.Log($"bundle loadasset finish but null");
|
||||
|
||||
if (!m_assetRefCount.ContainsKey(result))
|
||||
{
|
||||
m_assetRefCount[result] = 1;
|
||||
OnAssetLoad?.Invoke(this, result);
|
||||
}
|
||||
else m_assetRefCount[result]++;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
internal IEnumerator LoadAssetAsync<T>(string path, Stopwatch sw, StringBuilder logSb) where T : UnityEngine.Object
|
||||
#else
|
||||
internal IEnumerator LoadAssetAsync<T>(string path) where T : UnityEngine.Object
|
||||
#endif
|
||||
{
|
||||
var request = m_bundle.LoadAssetAsync<T>(path);
|
||||
|
||||
yield return request;
|
||||
#if UNITY_EDITOR
|
||||
logSb.AppendLine($"UnityAPI Load:{sw.Elapsed.TotalMilliseconds}ms");
|
||||
#endif
|
||||
|
||||
var result = request.asset;
|
||||
|
||||
if (result == null)
|
||||
{
|
||||
yield break;
|
||||
}
|
||||
|
||||
if (!m_assetRefCount.ContainsKey(result))
|
||||
{
|
||||
m_assetRefCount[result] = 1;
|
||||
OnAssetLoad?.Invoke(this, result);
|
||||
|
||||
#if UNITY_EDITOR
|
||||
logSb.AppendLine($"OnAssetLoadCallback :{sw.Elapsed.TotalMilliseconds}ms");
|
||||
#endif
|
||||
}
|
||||
else m_assetRefCount[result]++;
|
||||
|
||||
yield return result;
|
||||
}
|
||||
|
||||
internal void UnLoadAsset(UnityEngine.Object asset)
|
||||
{
|
||||
Assert.IsTrue(m_assetRefCount.ContainsKey(asset));
|
||||
|
||||
var refCount = m_assetRefCount[asset];
|
||||
|
||||
Assert.IsTrue(refCount > 0);
|
||||
refCount--;
|
||||
m_assetRefCount[asset] = refCount;
|
||||
if (refCount == 0)
|
||||
{
|
||||
m_assetRefCount.Remove(asset);
|
||||
OnAssetUnLoad?.Invoke(this, asset);
|
||||
|
||||
if (asset is not GameObject)
|
||||
Resources.UnloadAsset(asset);
|
||||
else
|
||||
{
|
||||
//Resources.UnloadAsset(asset);
|
||||
//Object.DestroyImmediate(asset);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Path.GetFileName(m_path);
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/VersionFlow/Runtime/ABEntity.cs.meta
Normal file
11
Assets/VersionFlow/Runtime/ABEntity.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ab461a51379583e42864cc6170a037bd
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
597
Assets/VersionFlow/Runtime/BuilderConfig.cs
Normal file
597
Assets/VersionFlow/Runtime/BuilderConfig.cs
Normal file
@ -0,0 +1,597 @@
|
||||
#if UNITY_EDITOR
|
||||
using AlibabaCloud.OpenApiClient.Models;
|
||||
using AlibabaCloud.SDK.Cdn20180510;
|
||||
using AlibabaCloud.SDK.Cdn20180510.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using static UnityEditor.ObjectChangeEventStream;
|
||||
using static VersionFlow.Runtime.MarkInBundleFiles;
|
||||
|
||||
namespace VersionFlow.Runtime
|
||||
{
|
||||
[CreateAssetMenu(fileName = "Builder", menuName = "CreateBuilder")]
|
||||
public class BuilderConfig : ScriptableObject
|
||||
{
|
||||
public static bool ShowBuilderMarker
|
||||
{
|
||||
get => EditorPrefs.GetBool("ShowBuilderMarker", true);
|
||||
set => EditorPrefs.SetBool("ShowBuilderMarker", value);
|
||||
}
|
||||
|
||||
public string ConfigUploadPath;
|
||||
public string BucketName;
|
||||
public string UploadPath;
|
||||
public string accessKeyId;
|
||||
public string accessKeySecret;
|
||||
public string endPoint;
|
||||
|
||||
public BuildAssetBundleOptions Options;
|
||||
[HideInInspector]
|
||||
public List<BuildEntity> Groups;
|
||||
public ShaderVariantCollection SVC;
|
||||
|
||||
[HideInInspector]
|
||||
public bool DuplicateBundleBeInstallBundle;
|
||||
[HideInInspector]
|
||||
public bool ShaderBundleBeInstallBundle;
|
||||
|
||||
public delegate void OnCalcBundleHashHandle(string bundleOutputPath, List<AssetBundleBuild> buildInfoList, Dictionary<string, BundleExtraInfo> bundleExtraInfo, AssetBundleManifest report);
|
||||
public OnCalcBundleHashHandle OnCalcBundleHash;
|
||||
|
||||
public Client GetCDNClient()
|
||||
{
|
||||
var config = new Config
|
||||
{
|
||||
AccessKeyId = accessKeyId,
|
||||
AccessKeySecret = accessKeySecret
|
||||
};
|
||||
var cndClient = new Client(config);
|
||||
|
||||
return cndClient;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 刷新CDN对象缓存
|
||||
/// </summary>
|
||||
public void CDNRefresh(List<string> refreshObjPath)
|
||||
{
|
||||
var client = GetCDNClient();
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
var vfSetting = UnityEditor.AssetDatabase.LoadAssetAtPath<VersionFlowSetting>("Assets/Scripts/VersionFlow/Resources/VersionFlowSettings.asset");
|
||||
|
||||
var refreshFileUrls = refreshObjPath.Select(path => $"{vfSetting.RootPath}/{path}").ToList();
|
||||
var refreshDirectoryUrls = PathHelper.GetSameRoot(refreshFileUrls);
|
||||
|
||||
var response = client.DescribeRefreshQuota(new DescribeRefreshQuotaRequest());
|
||||
int dirRemian = int.Parse(response.Body.DirRemain);
|
||||
int fileUrlRemain = int.Parse(response.Body.UrlQuota);
|
||||
|
||||
Debug.Log($"目录刷新配额剩余:[{dirRemian},本次目录刷新数量:[{refreshDirectoryUrls.Count}]");
|
||||
Debug.Log($"URL刷新配额剩余:[{fileUrlRemain},本次URL刷新数量:[{refreshFileUrls.Count}]");
|
||||
|
||||
var request = new RefreshObjectCachesRequest { Force = true };
|
||||
|
||||
if (dirRemian >= refreshDirectoryUrls.Count)
|
||||
{
|
||||
Debug.Log($"以目录形式刷新");
|
||||
foreach (var path in refreshDirectoryUrls)
|
||||
{
|
||||
sb.Append($"{path}/\n");
|
||||
}
|
||||
request.ObjectPath = sb.ToString();
|
||||
request.ObjectType = "Directory";
|
||||
}
|
||||
else if (fileUrlRemain >= refreshFileUrls.Count)
|
||||
{
|
||||
Debug.Log($"以URL形式刷新");
|
||||
foreach (var path in refreshFileUrls)
|
||||
{
|
||||
sb.Append($"{path}\n");
|
||||
}
|
||||
request.ObjectPath = sb.ToString();
|
||||
request.ObjectType = "File";
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("刷新配额不足,无法刷新CDN资源");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
request.ObjectPath = request.ObjectPath.Remove(request.ObjectPath.Length - 1);
|
||||
|
||||
Debug.Log($"刷新CDN资源:\n{request.ObjectPath}");
|
||||
var refreshResponse = client.RefreshObjectCaches(request);
|
||||
|
||||
ShowRefreshTask(refreshResponse.Body.RefreshTaskId);
|
||||
}
|
||||
|
||||
[InitializeOnLoadMethod]
|
||||
public static void CheckRefreshTask()
|
||||
{
|
||||
foreach (var taskID in RefreshTasks.GetTasks())
|
||||
{
|
||||
ShowRefreshTask(taskID);
|
||||
}
|
||||
}
|
||||
|
||||
private static async void ShowRefreshTask(string refreshCDNTaskID)
|
||||
{
|
||||
RefreshTasks.SaveTask(refreshCDNTaskID);
|
||||
|
||||
var builder = AssetDatabase.LoadAssetAtPath<BuilderConfig>("Assets/Scripts/VersionFlow/Builder/Builder.asset");
|
||||
var cdnClient = builder.GetCDNClient();
|
||||
Dictionary<string, int> subTaskMap = new Dictionary<string, int>();
|
||||
|
||||
refetch:
|
||||
var cdnFetchtask = cdnClient.DescribeRefreshTaskByIdAsync(new DescribeRefreshTaskByIdRequest { TaskId = refreshCDNTaskID });
|
||||
await cdnFetchtask;
|
||||
|
||||
foreach (var task in cdnFetchtask.Result.Body.Tasks)
|
||||
{
|
||||
if (!subTaskMap.TryGetValue(task.ObjectPath, out var subTaskID))
|
||||
{
|
||||
subTaskID = Progress.Start($"刷新中", description: task.ObjectPath, options: Progress.Options.Sticky);
|
||||
subTaskMap[task.ObjectPath] = subTaskID;
|
||||
}
|
||||
|
||||
var progress = float.Parse(task.Process.Replace("%", string.Empty)) / 100;
|
||||
Progress.Report(subTaskID, progress);
|
||||
if (task.Status == "Complete")
|
||||
{
|
||||
Progress.Finish(subTaskID);
|
||||
subTaskMap.Remove(task.ObjectPath);
|
||||
}
|
||||
else if (task.Status == "Failed")
|
||||
{
|
||||
var describ = Progress.GetDescription(subTaskID);
|
||||
Progress.Report(subTaskID, progress, $"{describ}_{task.Description}");
|
||||
Progress.Finish(subTaskID, Progress.Status.Failed);
|
||||
subTaskMap.Remove(task.ObjectPath);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (subTaskMap.Count == 0)
|
||||
{
|
||||
RefreshTasks.DeleteTask(refreshCDNTaskID);
|
||||
return;
|
||||
}
|
||||
else goto refetch;
|
||||
}
|
||||
|
||||
public BundleManifest Build(string version, out string outputPath, out Dictionary<string, BundleExtraInfo> bundleExtraInfo)
|
||||
{
|
||||
Dictionary<string, Asset> assetsToBuild = CollectAssetsToBuild(out var shaderGroup);
|
||||
bundleExtraInfo = new Dictionary<string, BundleExtraInfo>();
|
||||
var duplicateBuilds = CalcDuplicateBuild(assetsToBuild, shaderGroup, ref bundleExtraInfo, DuplicateBundleBeInstallBundle);
|
||||
List<AssetBundleBuild> buildInfoList = CalcNormalBuild(assetsToBuild, ref bundleExtraInfo);
|
||||
|
||||
buildInfoList.AddRange(duplicateBuilds);
|
||||
|
||||
|
||||
outputPath = $"./Output/Bundles/{VersionFlowX.PlatformFoldName}";
|
||||
Directory.CreateDirectory(outputPath);
|
||||
|
||||
var report = BuildPipeline.BuildAssetBundles(outputPath, buildInfoList.ToArray(), Options, EditorUserBuildSettings.activeBuildTarget);
|
||||
|
||||
OnCalcBundleHash.Invoke(outputPath, buildInfoList, bundleExtraInfo, report);
|
||||
|
||||
var manifest = BundleManifest.Create(version, bundleExtraInfo, report, outputPath);
|
||||
|
||||
return manifest;
|
||||
}
|
||||
|
||||
public List<BundleCompare> CompareBundleManifest(BundleManifest @new, BundleManifest old)
|
||||
{
|
||||
List<BundleCompare> result = new List<BundleCompare>();
|
||||
foreach (var bundle in @new.Bundles)
|
||||
{
|
||||
var oldBundle = old?.GetBundleByName(bundle.BundleName);
|
||||
result.Add(new BundleCompare(bundle, oldBundle));
|
||||
}
|
||||
//收集被移除的bundle
|
||||
if (old != null && old.Bundles != null)
|
||||
{
|
||||
foreach (var oldBundle in old.Bundles)
|
||||
{
|
||||
var newBundle = @new.GetBundleByName(oldBundle.BundleName);
|
||||
if (newBundle == null)
|
||||
result.Add(new BundleCompare(null, oldBundle));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static List<AssetBundleBuild> CalcNormalBuild(Dictionary<string, Asset> assetsToBuild, ref Dictionary<string, BundleExtraInfo> bundleExtraInfo)
|
||||
{
|
||||
Dictionary<string, HashSet<string>> willBuilds = new Dictionary<string, HashSet<string>>();
|
||||
foreach (var item in assetsToBuild)
|
||||
{
|
||||
var assetInfo = item.Value;
|
||||
if (!willBuilds.ContainsKey(assetInfo.BundleName))
|
||||
{
|
||||
willBuilds[assetInfo.BundleName] = new HashSet<string>();
|
||||
}
|
||||
|
||||
BundleExtraInfo info = new BundleExtraInfo();
|
||||
if (!bundleExtraInfo.TryGetValue(assetInfo.BundleName, out info))
|
||||
{
|
||||
info = new BundleExtraInfo();
|
||||
bundleExtraInfo[assetInfo.BundleName] = info;
|
||||
//记录Bundle所属Group
|
||||
info.GroupName = assetInfo.Group.GroupName;
|
||||
//如果资源所属Group设置了可选Bundle,则标记Asset所在Bundle为可选下载Bundle
|
||||
info.IsOptionBundle = assetInfo.Group.OptionBundle;
|
||||
//如果资源所属Group设置了ShaderOnly,则标记Asset所在Bundle为ShaderBundle
|
||||
info.ShaderBundle = assetInfo.Group.ShaderBundle;
|
||||
//如果资源所属Group设置了随包资源标记,则标记Asset所在Bundle为随包资源
|
||||
info.IsInstallBundle = assetInfo.Group.InstallReady;
|
||||
}
|
||||
|
||||
willBuilds[assetInfo.BundleName].Add(assetInfo.FullName);
|
||||
}
|
||||
|
||||
List<AssetBundleBuild> buildInfoList = new List<AssetBundleBuild>();
|
||||
foreach (var item in willBuilds)
|
||||
{
|
||||
var buildInfo = new AssetBundleBuild { assetBundleName = item.Key };
|
||||
List<string> assetPaths = new List<string>();
|
||||
foreach (var assetPath in item.Value)
|
||||
{
|
||||
assetPaths.Add(assetPath);
|
||||
}
|
||||
buildInfo.assetNames = assetPaths.ToArray();
|
||||
buildInfoList.Add(buildInfo);
|
||||
}
|
||||
|
||||
return buildInfoList;
|
||||
}
|
||||
|
||||
private static List<AssetBundleBuild> CalcDuplicateBuild(Dictionary<string, Asset> assetsToBuild, BuildEntity shaderGroup, ref Dictionary<string, BundleExtraInfo> bundleExtraInfo, bool DuplicateBundleBeInstallBundle)
|
||||
{
|
||||
Dictionary<string, int> dependencyAssetsNotBuild = new Dictionary<string, int>();
|
||||
foreach (var asset in assetsToBuild.Values)
|
||||
{
|
||||
foreach (var depAsset in asset.dependencyAssets)
|
||||
{
|
||||
if (assetsToBuild.ContainsKey(depAsset)) continue;//跳过原本就会打包的Asset
|
||||
|
||||
if (dependencyAssetsNotBuild.ContainsKey(depAsset))
|
||||
dependencyAssetsNotBuild[depAsset]++;
|
||||
else
|
||||
dependencyAssetsNotBuild[depAsset] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
AssetBundleBuild duplicateBuild = new AssetBundleBuild { assetBundleName = "duplicate.bundle" };
|
||||
|
||||
bundleExtraInfo[duplicateBuild.assetBundleName] = new BundleExtraInfo
|
||||
{
|
||||
BundleName = duplicateBuild.assetBundleName.ToLower(),
|
||||
GroupName = null,
|
||||
IsOptionBundle = false,
|
||||
ShaderBundle = false,
|
||||
IsInstallBundle = DuplicateBundleBeInstallBundle,
|
||||
};
|
||||
|
||||
List<string> duplicateAssets = new List<string>();
|
||||
|
||||
//重复依赖资源生成打包配置
|
||||
foreach (var item in dependencyAssetsNotBuild)
|
||||
{
|
||||
var assetPath = item.Key;
|
||||
var assetType = AssetDatabase.GetMainAssetTypeAtPath(assetPath);
|
||||
|
||||
//shader类型资源进shaderbundle,而不进duplicate.bundle
|
||||
if (assetType == typeof(Shader) || assetType == typeof(ShaderVariantCollection))
|
||||
{
|
||||
var shaderAsset = new Asset(assetPath);
|
||||
shaderAsset.Group = shaderGroup;
|
||||
shaderAsset.BundleName = "ShaderFromSVC_Together.bundle".ToLower();
|
||||
assetsToBuild[assetPath] = shaderAsset;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (item.Value == 1) continue; //只有一次依赖的跳过
|
||||
duplicateAssets.Add(assetPath);
|
||||
}
|
||||
duplicateBuild.assetNames = duplicateAssets.ToArray();
|
||||
return new List<AssetBundleBuild> { duplicateBuild };
|
||||
}
|
||||
|
||||
private Dictionary<string, Asset> CollectAssetsToBuild(out BuildEntity shaderGroup)
|
||||
{
|
||||
Dictionary<string, Asset> assetsToBuild = new Dictionary<string, Asset>();
|
||||
int totalCount = Groups.Count;
|
||||
int step = 0;
|
||||
foreach (var group in Groups)
|
||||
{
|
||||
EditorUtility.DisplayProgressBar($"收集打包资源{step}/{totalCount}", $"{group.GroupName}", step * 1f / totalCount);
|
||||
group.OnHandleAsset = (asset) =>
|
||||
{
|
||||
EditorUtility.DisplayProgressBar($"收集打包资源{step}/{totalCount}", $"{asset.FullName}@{group.GroupName}", step * 1f / totalCount);
|
||||
};
|
||||
group.CollectionAsset(assetsToBuild);
|
||||
step++;
|
||||
}
|
||||
|
||||
shaderGroup = new BuildEntity();
|
||||
shaderGroup.OptionBundle = false;
|
||||
shaderGroup.FolderList = new List<DefaultAsset>();
|
||||
shaderGroup.BuildMode = BuildEntity.EnumBuildMode.PackTogether;
|
||||
shaderGroup.GroupName = "ShaderFromSVC";
|
||||
shaderGroup.ShaderBundle = true;
|
||||
shaderGroup.InstallReady = ShaderBundleBeInstallBundle;
|
||||
if (SVC != null)
|
||||
{
|
||||
var path = AssetDatabase.GetAssetPath(SVC);
|
||||
foreach (var depPath in AssetDatabase.GetDependencies(path))
|
||||
{
|
||||
var depAssetType = AssetDatabase.GetMainAssetTypeAtPath(depPath);
|
||||
if (depAssetType == typeof(Shader) || depAssetType == typeof(ShaderVariantCollection))
|
||||
{
|
||||
var asset = new Asset(depPath);
|
||||
asset.Group = shaderGroup;
|
||||
asset.BundleName = "ShaderFromSVC_Together.bundle".ToLower();
|
||||
assetsToBuild[depPath] = asset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return assetsToBuild;
|
||||
}
|
||||
}
|
||||
|
||||
public class BundleExtraInfo
|
||||
{
|
||||
public string BundleName { get; internal set; }
|
||||
public bool IsOptionBundle { get; internal set; }
|
||||
public string GroupName { get; internal set; }
|
||||
public bool ShaderBundle { get; internal set; }
|
||||
public Hash128 BundleHash { get; internal set; }
|
||||
public bool IsInstallBundle { get; internal set; }
|
||||
}
|
||||
|
||||
public class BundleCompare
|
||||
{
|
||||
public BundleCompare(Bundle @new, Bundle old)
|
||||
{
|
||||
New = @new;
|
||||
Old = old;
|
||||
}
|
||||
|
||||
public Bundle New { get; private set; }
|
||||
public Bundle Old { get; private set; }
|
||||
|
||||
public EnumCompare Result
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Old == null) return EnumCompare.Add;
|
||||
if (New == null) return EnumCompare.Delete;
|
||||
if (Old.Hash == New.Hash) return EnumCompare.Same;
|
||||
|
||||
return EnumCompare.Modified;
|
||||
}
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
var bundleName = New == null ? Old.BundleName : New.BundleName;
|
||||
|
||||
switch (Result)
|
||||
{
|
||||
case EnumCompare.Same: return $"{bundleName} [{Old.Hash}]->[{New.Hash}]";
|
||||
case EnumCompare.Modified: return $"{bundleName} [{Old.Hash}]->[{New.Hash}]";
|
||||
case EnumCompare.Add: return $"{bundleName} []->[{New.Hash}]";
|
||||
case EnumCompare.Delete: return $"{bundleName} [{Old.Hash}]->[]";
|
||||
default: return $"{bundleName} []->[]";
|
||||
}
|
||||
}
|
||||
|
||||
public enum EnumCompare
|
||||
{
|
||||
Delete,
|
||||
Add,
|
||||
Modified,
|
||||
Same,
|
||||
}
|
||||
}
|
||||
|
||||
public class Asset
|
||||
{
|
||||
public string FullName;
|
||||
public HashSet<string> dependencyAssets;
|
||||
public string BundleName { get; internal set; }
|
||||
public BuildEntity Group { get; internal set; }
|
||||
public Asset(string path)
|
||||
{
|
||||
FullName = path;
|
||||
|
||||
dependencyAssets = new HashSet<string>();
|
||||
foreach (var dependPath in AssetDatabase.GetDependencies(FullName))
|
||||
{
|
||||
if (dependPath == FullName) continue;
|
||||
if (dependPath.EndsWith(".cs")) continue;
|
||||
|
||||
dependencyAssets.Add(dependPath);
|
||||
}
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return FullName.GetHashCode();
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
return GetHashCode() == obj.GetHashCode();
|
||||
}
|
||||
}
|
||||
|
||||
public static class MarkInBundleFiles
|
||||
{
|
||||
public struct FileInfo
|
||||
{
|
||||
public BuildEntity Group;
|
||||
public bool OptionBundle => Group.OptionBundle;
|
||||
public Color color => Group.MarkColor;
|
||||
public string Name;
|
||||
|
||||
public FileInfo(BuildEntity group, string assetName)
|
||||
{
|
||||
Name = assetName;
|
||||
Group = group;
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return HashCode.Combine(Group, Name);
|
||||
}
|
||||
}
|
||||
|
||||
[InitializeOnLoadMethod]
|
||||
static void Setup()
|
||||
{
|
||||
#if UNITY_2018_1_OR_NEWER
|
||||
EditorApplication.projectChanged += OnProjectChanged;
|
||||
#endif
|
||||
EditorApplication.projectWindowItemOnGUI += OnGUI;
|
||||
}
|
||||
|
||||
private static Dictionary<string, HashSet<FileInfo>> s_caches = new Dictionary<string, HashSet<FileInfo>>();
|
||||
|
||||
public static void RefreshProjectBundleMark()
|
||||
{
|
||||
s_caches.Clear();
|
||||
}
|
||||
|
||||
private static void OnGUI(string guid, Rect selectionRect)
|
||||
{
|
||||
if (string.IsNullOrEmpty(guid)) return;
|
||||
|
||||
var builder = AssetDatabase.LoadAssetAtPath<BuilderConfig>("Assets/Scripts/VersionFlow/Builder/Builder.asset");
|
||||
if (builder == null) return;
|
||||
|
||||
if (!BuilderConfig.ShowBuilderMarker) return;
|
||||
//if (selectionRect.height > 16) return; //非最小模式时,跳过
|
||||
|
||||
if (!s_caches.TryGetValue(guid, out var info))
|
||||
{
|
||||
info = new HashSet<FileInfo>();
|
||||
s_caches[guid] = info;
|
||||
|
||||
var path = AssetDatabase.GUIDToAssetPath(guid);
|
||||
|
||||
foreach (var group in builder.Groups)
|
||||
{
|
||||
foreach (var folder in group.FolderList)
|
||||
{
|
||||
if (folder == null) continue;
|
||||
|
||||
var folderPath = AssetDatabase.GetAssetPath(folder);
|
||||
if (folderPath == null) continue;
|
||||
|
||||
var folderPathSp = folderPath.Split('/');
|
||||
var pathSp = path.Split('/');
|
||||
|
||||
if (folderPathSp.Length > pathSp.Length) continue;
|
||||
|
||||
bool isSubPath = true;
|
||||
for (int i = 0; i < folderPathSp.Length; i++)
|
||||
{
|
||||
if (folderPathSp[i] != pathSp[i])
|
||||
{
|
||||
isSubPath = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isSubPath)
|
||||
{
|
||||
info.Add(new FileInfo(group, Path.GetFileName(path)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
if (info.Count > 1) //重复配置了Bundle,显示警告颜色
|
||||
{
|
||||
EditorGUI.DrawRect(selectionRect, new Color(1, 0, 0, 0.5f));
|
||||
sb.AppendLine($"<b>重复配置了资源Bundle</b>");
|
||||
}
|
||||
int index = 0;
|
||||
foreach (var buildInfo in info)
|
||||
{
|
||||
var rect = new Rect(selectionRect);
|
||||
var offset = rect.width - 5 - index * 5;
|
||||
rect.width = 5;
|
||||
rect.x += offset;
|
||||
EditorGUI.DrawRect(rect, buildInfo.color);
|
||||
if (index == 0) sb.AppendLine($"<b>{buildInfo.Name}</b>");
|
||||
sb.AppendLine($"{buildInfo.Group.GroupName}\n<i>{(buildInfo.OptionBundle ? "可选包" : "强制包")}</i>");
|
||||
index++;
|
||||
}
|
||||
|
||||
GUI.Label(selectionRect, new GUIContent() { tooltip = sb.ToString().TrimEnd('\n') });
|
||||
}
|
||||
|
||||
private static void OnProjectChanged()
|
||||
{
|
||||
s_caches.Clear();
|
||||
}
|
||||
|
||||
public static class RefreshTasks
|
||||
{
|
||||
public static void SaveTask(string taskID)
|
||||
{
|
||||
var raw = EditorPrefs.GetString("RefreshTaskIds", string.Empty);
|
||||
var hash = raw.Split(';').ToHashSet();
|
||||
if (hash.Add(taskID))
|
||||
{
|
||||
raw = string.Empty;
|
||||
foreach (var k in hash)
|
||||
{
|
||||
raw += $"{k};";
|
||||
}
|
||||
raw.Remove(raw.Length - 1);
|
||||
EditorPrefs.SetString("RefreshTaskIds", raw);
|
||||
}
|
||||
}
|
||||
|
||||
public static void DeleteTask(string taskID)
|
||||
{
|
||||
var raw = EditorPrefs.GetString("RefreshTaskIds", string.Empty);
|
||||
var hash = raw.Split(';').ToHashSet();
|
||||
if (hash.Remove(taskID))
|
||||
{
|
||||
raw = string.Empty;
|
||||
foreach (var k in hash)
|
||||
{
|
||||
raw += $"{k};";
|
||||
}
|
||||
raw.Remove(raw.Length - 1);
|
||||
EditorPrefs.SetString("RefreshTaskIds", raw);
|
||||
}
|
||||
}
|
||||
|
||||
public static List<string> GetTasks()
|
||||
{
|
||||
var raw = EditorPrefs.GetString("RefreshTaskIds", string.Empty);
|
||||
var hash = raw.Split(';').Where(i => !string.IsNullOrEmpty(i)).ToList();
|
||||
return hash;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
11
Assets/VersionFlow/Runtime/BuilderConfig.cs.meta
Normal file
11
Assets/VersionFlow/Runtime/BuilderConfig.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c3028a02f45639447a8cf4f6fa36bff2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
483
Assets/VersionFlow/Runtime/BundleManager.cs
Normal file
483
Assets/VersionFlow/Runtime/BundleManager.cs
Normal file
@ -0,0 +1,483 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
namespace VersionFlow.Runtime
|
||||
{
|
||||
public class BundleManager
|
||||
{
|
||||
/// <summary> Bundle名:ABEntity </summary>
|
||||
private readonly Dictionary<string, ABEntity> m_entities = new Dictionary<string, ABEntity>();
|
||||
/// <summary> 资源路径:ABEntity </summary>
|
||||
private readonly Dictionary<string, ABEntity> m_assetPathToAB = new Dictionary<string, ABEntity>();
|
||||
/// <summary> 组名:ABEntity </summary>
|
||||
private readonly Dictionary<string, List<ABEntity>> m_groupToAB = new Dictionary<string, List<ABEntity>>();
|
||||
/// <summary> Shader专属Bundle </summary>
|
||||
private readonly List<ABEntity> m_shaderBundles = new List<ABEntity>();
|
||||
/// <summary> 全部已加载shader </summary>
|
||||
private readonly Dictionary<string, Shader> m_shaders = new Dictionary<string, Shader>();
|
||||
/// <summary> shader变体收集器 </summary>
|
||||
public ShaderVariantCollection SVC { get; private set; }
|
||||
|
||||
private readonly HashSet<LoadingChain> m_loadingChains = new HashSet<LoadingChain>();
|
||||
private readonly Type m_gameObjectType = typeof(GameObject);
|
||||
/// <summary> 可选Bundle组:ABEntity </summary>
|
||||
private readonly Dictionary<string, OptionalBundleDownloader> m_optionGroupDownloader = new Dictionary<string, OptionalBundleDownloader>();
|
||||
|
||||
public string Version { get; set; } = "N/A";
|
||||
|
||||
internal HashSet<LoadingChain> GetLoadingChains() => m_loadingChains;
|
||||
|
||||
internal BundleManager(BundleManifest local, BundleManifest remote)
|
||||
{
|
||||
//初始化BundleManager
|
||||
Stopwatch sw = Stopwatch.StartNew();
|
||||
|
||||
//创建Bundle对象和资源清单
|
||||
foreach (var remoteBundle in remote.Bundles)
|
||||
{
|
||||
var localBundle = local.GetBundleByName(remoteBundle.BundleName);
|
||||
var createBundle = new ABEntity(remoteBundle, localBundle != null && localBundle.Hash == remoteBundle.Hash);
|
||||
m_entities[remoteBundle.BundleName] = createBundle;
|
||||
|
||||
//建立AssetPath到AB的缓存
|
||||
foreach (var path in createBundle.Assets)
|
||||
{
|
||||
m_assetPathToAB[path] = createBundle;
|
||||
}
|
||||
//建立Group到AB的缓存
|
||||
if (remoteBundle.Group != null)
|
||||
{
|
||||
if (!m_groupToAB.ContainsKey(remoteBundle.Group)) m_groupToAB[remoteBundle.Group] = new List<ABEntity>();
|
||||
m_groupToAB[remoteBundle.Group].Add(createBundle);
|
||||
|
||||
if (remoteBundle.OptionBundle)
|
||||
{
|
||||
if (!m_optionGroupDownloader.ContainsKey(remoteBundle.Group)) m_optionGroupDownloader[remoteBundle.Group] = new OptionalBundleDownloader(remoteBundle.Group);
|
||||
m_optionGroupDownloader[remoteBundle.Group].CollectAB(createBundle);
|
||||
}
|
||||
}
|
||||
|
||||
//记录shader专用bundle
|
||||
if (createBundle.m_isShaderBundle)
|
||||
m_shaderBundles.Add(createBundle);
|
||||
}
|
||||
//创建引用关系和资源清单
|
||||
foreach (var remoteBundle in remote.Bundles)
|
||||
{
|
||||
var abEntity = m_entities[remoteBundle.BundleName];
|
||||
foreach (var bundleName in remoteBundle.Dependencies)
|
||||
{
|
||||
var depAB = m_entities[bundleName];
|
||||
abEntity.m_dependencyAB.Add(depAB);
|
||||
}
|
||||
}
|
||||
|
||||
//计算可选组下载状态
|
||||
foreach (var optionDownloader in m_optionGroupDownloader.Values)
|
||||
{
|
||||
optionDownloader.CalcState();
|
||||
}
|
||||
|
||||
sw.Stop();
|
||||
|
||||
VersionFlowX.Log($"创建资源清单耗时:{sw.Elapsed.Milliseconds}ms");
|
||||
}
|
||||
|
||||
internal BundleManager() { }
|
||||
|
||||
internal ABEntity GetEntityByAssetPath(string assetPath)
|
||||
{
|
||||
m_assetPathToAB.TryGetValue(assetPath, out var bundle);
|
||||
return bundle;
|
||||
}
|
||||
internal IEnumerator Internal_LoadAssetAsync<T>(string path) where T : UnityEngine.Object
|
||||
{
|
||||
if (!VersionFlowX.Setting.Enable)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
yield return UnityEditor.AssetDatabase.LoadAssetAtPath<T>(path);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
path = path.ToLower();
|
||||
|
||||
LoadingChain targetChain = GetLoadChain(path);
|
||||
if (targetChain == null)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
var itor = targetChain.LoadAssetAsync<T>(path);
|
||||
while (itor.MoveNext()) yield return itor.Current;
|
||||
|
||||
yield return itor.Current;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal ABEntity GetABEntity(string abName)
|
||||
{
|
||||
m_entities.TryGetValue(abName, out var aBEntity);
|
||||
return aBEntity;
|
||||
}
|
||||
|
||||
internal LoadingChain GetLoadChain(string path)
|
||||
{
|
||||
m_assetPathToAB.TryGetValue(path, out var ab);
|
||||
if (ab == null)
|
||||
{
|
||||
VersionFlowX.Error($"没有任何AssetBundle包含<color=cyan>{path}</color>");
|
||||
return null;
|
||||
}
|
||||
|
||||
LoadingChain targetChain = GetLoadChain(ab, false);
|
||||
|
||||
return targetChain;
|
||||
}
|
||||
|
||||
internal LoadingChain GetLoadChain(ABEntity ab, bool shaderOnly)
|
||||
{
|
||||
LoadingChain targetChain = null;
|
||||
foreach (var chain in m_loadingChains)
|
||||
{
|
||||
if (chain.m_topEntity == ab)
|
||||
{
|
||||
targetChain = chain;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (targetChain == null)
|
||||
{
|
||||
targetChain = LoadingChain.Create(ab, shaderOnly);
|
||||
m_loadingChains.Add(targetChain);
|
||||
}
|
||||
|
||||
return targetChain;
|
||||
}
|
||||
|
||||
internal void LoadShaderBundles()
|
||||
{
|
||||
return;
|
||||
VersionFlowX.Log("开始加载所有的ShaderBundle");
|
||||
|
||||
UnityResourceAPIOverride overrideAPI = new UnityResourceAPIOverride();
|
||||
ResourcesAPI.overrideAPI = overrideAPI;
|
||||
|
||||
foreach (var shaderBundle in m_shaderBundles)
|
||||
{
|
||||
var chain = GetLoadChain(shaderBundle, true);
|
||||
chain.LoadAllBundle();
|
||||
|
||||
foreach (var shaderPath in shaderBundle.Assets)
|
||||
{
|
||||
var shaderAsset = LoadAsset<UnityEngine.Object>(shaderPath);
|
||||
if (shaderAsset == null) continue;
|
||||
VersionFlowX.Log($"加载Shader:<color=cyan>{shaderAsset.name}</color>");
|
||||
if (shaderAsset is Shader shader)
|
||||
m_shaders[shader.name] = shader;
|
||||
else if (shaderAsset is ShaderVariantCollection svc)
|
||||
SVC = svc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal Shader GetShader(string name)
|
||||
{
|
||||
m_shaders.TryGetValue(name, out var shader);
|
||||
|
||||
return shader;
|
||||
}
|
||||
|
||||
public void LoadScene(string path)
|
||||
{
|
||||
if (!VersionFlowX.Setting.Enable)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
UnityEditor.SceneManagement.EditorSceneManager.LoadSceneInPlayMode(path, new LoadSceneParameters(LoadSceneMode.Single));
|
||||
#else
|
||||
throw new Exception("不可能!");
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
//找到已加载场景的loadchain
|
||||
LoadingChain hasSceneChain = null;
|
||||
|
||||
foreach (var chain in m_loadingChains)
|
||||
{
|
||||
if (chain.m_currentLoadScenePath != null)
|
||||
{
|
||||
hasSceneChain = chain;
|
||||
break;
|
||||
}
|
||||
}
|
||||
var targetChain = GetLoadChain(path);
|
||||
if (targetChain == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
targetChain.LoadScene(path);
|
||||
|
||||
if (hasSceneChain != null) hasSceneChain.m_currentLoadScenePath = null;
|
||||
}
|
||||
}
|
||||
|
||||
public AsyncOperation LoadSceneAsync(string path)
|
||||
{
|
||||
if (!VersionFlowX.Setting.Enable)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
return UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(path, new LoadSceneParameters(LoadSceneMode.Single));
|
||||
#else
|
||||
throw new Exception("不可能!");
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
//找到已加载场景的loadchain
|
||||
LoadingChain hasSceneChain = null;
|
||||
|
||||
foreach (var chain in m_loadingChains)
|
||||
{
|
||||
if (chain.m_currentLoadScenePath != null)
|
||||
{
|
||||
hasSceneChain = chain;
|
||||
break;
|
||||
}
|
||||
}
|
||||
var targetChain = GetLoadChain(path);
|
||||
if (targetChain == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var req = targetChain.LoadSceneAsync(path);
|
||||
req.completed += (asyncop) =>
|
||||
{
|
||||
targetChain.m_currentLoadScenePath = path;
|
||||
if (hasSceneChain != null) hasSceneChain.m_currentLoadScenePath = null;
|
||||
};
|
||||
|
||||
return req;
|
||||
}
|
||||
}
|
||||
|
||||
public T LoadAsset<T>(string path) where T : UnityEngine.Object
|
||||
{
|
||||
if (!VersionFlowX.Setting.Enable)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
return UnityEditor.AssetDatabase.LoadAssetAtPath<T>(path);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (typeof(T) == m_gameObjectType)
|
||||
{
|
||||
VersionFlowX.Log("GameObject类型Asset不可以使用LoadAsset的方式,请使用Instantiate的方式");
|
||||
return null;
|
||||
}
|
||||
|
||||
path = path.ToLower();
|
||||
LoadingChain targetChain = GetLoadChain(path);
|
||||
if (targetChain == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var asset = targetChain.LoadAsset<T>(path);
|
||||
|
||||
return asset;
|
||||
}
|
||||
|
||||
public GameObject Instantiate(string path, Transform parent = null)
|
||||
{
|
||||
if (!VersionFlowX.Setting.Enable)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
var go = UnityEditor.AssetDatabase.LoadAssetAtPath<GameObject>(path);
|
||||
if (go == null)
|
||||
{
|
||||
VersionFlowX.Error($"没有找到<color=cyan>{path}</color>的资源");
|
||||
return null;
|
||||
}
|
||||
return GameObject.Instantiate(go, parent);
|
||||
#endif
|
||||
}
|
||||
|
||||
path = path.ToLower();
|
||||
LoadingChain targetChain = GetLoadChain(path);
|
||||
if (targetChain == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var prefabInstance = targetChain.Instantiate(path, parent);
|
||||
|
||||
return prefabInstance;
|
||||
}
|
||||
|
||||
public InstantiateRequest InstantiateAsync(string path)
|
||||
{
|
||||
var request = new InstantiateRequest(Internal_InstantiateAsync(path));
|
||||
request.Start();
|
||||
|
||||
return request;
|
||||
}
|
||||
|
||||
internal IEnumerator Internal_InstantiateAsync(string path)
|
||||
{
|
||||
if (!VersionFlowX.Setting.Enable)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
var go = UnityEditor.AssetDatabase.LoadAssetAtPath<GameObject>(path);
|
||||
if (go == null)
|
||||
{
|
||||
VersionFlowX.Error($"没有找到<color=cyan>{path}</color>的资源");
|
||||
yield break;
|
||||
}
|
||||
else yield return GameObject.Instantiate(go);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
path = path.ToLower();
|
||||
LoadingChain targetChain = GetLoadChain(path);
|
||||
if (targetChain == null)
|
||||
{
|
||||
VersionFlowX.Error($"没有找到<color=cyan>{path}</color>的资源");
|
||||
yield break;
|
||||
}
|
||||
|
||||
var itor = targetChain.InstantiateAsync(path);
|
||||
while (itor.MoveNext()) yield return itor.Current;
|
||||
|
||||
yield return itor.Current;
|
||||
}
|
||||
}
|
||||
|
||||
public LoadAssetRequest<T> LoadAssetAsync<T>(string path) where T : UnityEngine.Object
|
||||
{
|
||||
if (typeof(T) == m_gameObjectType)
|
||||
{
|
||||
VersionFlowX.Error("GameObject类型Asset不可以使用LoadAsset的方式,请使用Instantiate的方式");
|
||||
return null;
|
||||
}
|
||||
|
||||
var request = new LoadAssetRequest<T>(Internal_LoadAssetAsync<T>(path));
|
||||
request.Start();
|
||||
|
||||
return request;
|
||||
}
|
||||
|
||||
public void ReleaseAsset<T>(ref T asset) where T : UnityEngine.Object
|
||||
{
|
||||
if (!VersionFlowX.Setting.Enable)
|
||||
{
|
||||
asset = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var chain in m_loadingChains)
|
||||
{
|
||||
chain.UnLoadAsset(asset);
|
||||
}
|
||||
|
||||
asset = null;
|
||||
|
||||
if (VersionFlowX.Setting.AutoReleaseBundle)
|
||||
TryUnLoadBundles();
|
||||
}
|
||||
}
|
||||
public void ReleaseAsset<T>(IList<T> assetList) where T : UnityEngine.Object
|
||||
{
|
||||
foreach (var item in assetList)
|
||||
{
|
||||
var temp = item;
|
||||
ReleaseAsset(ref temp);
|
||||
}
|
||||
|
||||
assetList.Clear();
|
||||
}
|
||||
|
||||
HashSet<LoadingChain> m_needRemoveChains = new HashSet<LoadingChain>();
|
||||
/// <summary>
|
||||
/// 检查已加载的Bundle的引用计数为0并且没有任何依赖bundle被加载
|
||||
/// 然后移除它
|
||||
/// </summary>
|
||||
public void TryUnLoadBundles()
|
||||
{
|
||||
if (!VersionFlowX.Setting.Enable)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_needRemoveChains.Clear();
|
||||
|
||||
foreach (var chain in m_loadingChains)
|
||||
{
|
||||
if (chain.TryDispose())
|
||||
m_needRemoveChains.Add(chain);
|
||||
}
|
||||
|
||||
m_loadingChains.ExceptWith(m_needRemoveChains);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 指定GroupName,获得可选Bundle组的下载器,无论该组是否已完成下载,或是正在下载,或没有下载
|
||||
/// </summary>
|
||||
/// <param name="groupName">在builder中配置的Group名称,并且该Group需要设置为OptionBundle</param>
|
||||
/// <returns></returns>
|
||||
public OptionalBundleDownloader GetDownloaderByGroup(string groupName)
|
||||
{
|
||||
m_optionGroupDownloader.TryGetValue(groupName, out var downloader);
|
||||
return downloader;
|
||||
}
|
||||
|
||||
/// <summary> 获得所有设置为OptionBundle的组的下载器,无论该组是否已完成下载,或是正在下载,或没有下载 </summary>
|
||||
/// <returns></returns>
|
||||
public List<OptionalBundleDownloader> GetAllOptionBundleDownloader()
|
||||
{
|
||||
return m_optionGroupDownloader.Values.ToList();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[Serializable]
|
||||
public class Bundle
|
||||
{
|
||||
public string BundleName;
|
||||
public List<string> Assets;
|
||||
public List<string> Dependencies;
|
||||
public string Hash;
|
||||
public long Size;
|
||||
/// <summary> 所属Group </summary>
|
||||
public string Group;
|
||||
/// <summary> 可选资源包 </summary>
|
||||
public bool OptionBundle;
|
||||
/// <summary> Shader专属bundle </summary>
|
||||
public bool ShaderBundle;
|
||||
/// <summary> 随包资源包 </summary>
|
||||
public bool InstallBundle;
|
||||
|
||||
internal void CopyFrom(Bundle bundle)
|
||||
{
|
||||
BundleName = bundle.BundleName;
|
||||
Assets = bundle.Assets;
|
||||
Dependencies = bundle.Dependencies;
|
||||
Hash = bundle.Hash;
|
||||
Size = bundle.Size;
|
||||
OptionBundle = bundle.OptionBundle;
|
||||
Group = bundle.Group;
|
||||
ShaderBundle = bundle.ShaderBundle;
|
||||
InstallBundle = bundle.InstallBundle;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/VersionFlow/Runtime/BundleManager.cs.meta
Normal file
11
Assets/VersionFlow/Runtime/BundleManager.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9db77ccd8d94e0f48b66163000632233
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
226
Assets/VersionFlow/Runtime/BundleManifest.cs
Normal file
226
Assets/VersionFlow/Runtime/BundleManifest.cs
Normal file
@ -0,0 +1,226 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
|
||||
namespace VersionFlow.Runtime
|
||||
{
|
||||
|
||||
[Serializable]
|
||||
public class BundleManifest
|
||||
{
|
||||
public string Version;
|
||||
|
||||
public List<Bundle> Bundles;
|
||||
|
||||
private Dictionary<string, Bundle> m_bundleQuickSearchCaches = null;
|
||||
internal void UpdateBundleData(Bundle bundle)
|
||||
{
|
||||
if (Bundles == null) Bundles = new List<Bundle>();
|
||||
|
||||
var selfBundle = GetBundleByName(bundle.BundleName);
|
||||
if (selfBundle == null)
|
||||
{
|
||||
Bundles.Add(bundle);
|
||||
m_bundleQuickSearchCaches[bundle.BundleName] = bundle;
|
||||
}
|
||||
else
|
||||
{
|
||||
selfBundle.CopyFrom(bundle);
|
||||
}
|
||||
}
|
||||
internal Bundle GetBundleByName(string bundleName)
|
||||
{
|
||||
if (Bundles == null) return null;
|
||||
|
||||
if (m_bundleQuickSearchCaches == null)
|
||||
{
|
||||
m_bundleQuickSearchCaches = new Dictionary<string, Bundle>();
|
||||
foreach (var bundle in Bundles)
|
||||
{
|
||||
m_bundleQuickSearchCaches[bundle.BundleName] = bundle;
|
||||
}
|
||||
}
|
||||
|
||||
m_bundleQuickSearchCaches.TryGetValue(bundleName, out Bundle value);
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
public static BundleManifest Create(string version, Dictionary<string, BundleExtraInfo> bundleExtraInfo, AssetBundleManifest report, string outputPath)
|
||||
{
|
||||
AssetBundle.UnloadAllAssetBundles(true);
|
||||
|
||||
var result = new BundleManifest() { Version = version };
|
||||
|
||||
result.Bundles = new List<Bundle>();
|
||||
foreach (var bundleName in report.GetAllAssetBundles())
|
||||
{
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.BundleName = bundleName;
|
||||
|
||||
bundle.Dependencies = report.GetDirectDependencies(bundleName).ToList();
|
||||
bundle.Assets = new List<string>();
|
||||
var extraInfo = bundleExtraInfo[bundleName];
|
||||
|
||||
if (extraInfo.ShaderBundle)
|
||||
bundle.Dependencies.Clear();
|
||||
|
||||
bundle.Hash = extraInfo.BundleHash.ToString();
|
||||
bundle.OptionBundle = extraInfo.IsOptionBundle;
|
||||
bundle.ShaderBundle = extraInfo.ShaderBundle;
|
||||
bundle.InstallBundle = extraInfo.IsInstallBundle;
|
||||
bundle.Group = extraInfo.GroupName;
|
||||
var bundlePath = $"{outputPath}/{bundleName}";
|
||||
var ab = AssetBundle.LoadFromFile(bundlePath);
|
||||
List<string> allAssets = new List<string>();
|
||||
allAssets.AddRange(ab.GetAllAssetNames());
|
||||
allAssets.AddRange(ab.GetAllScenePaths());
|
||||
|
||||
ab.Unload(true);
|
||||
foreach (var asset in allAssets)
|
||||
{
|
||||
bundle.Assets.Add(asset);
|
||||
}
|
||||
bundle.Size = new FileInfo(bundlePath).Length;
|
||||
|
||||
result.Bundles.Add(bundle);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
public static BundleManifest FromJson(string json)
|
||||
{
|
||||
return JsonUtility.FromJson<BundleManifest>(json);
|
||||
}
|
||||
|
||||
public string ToJson()
|
||||
{
|
||||
return JsonUtility.ToJson(this);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
#if UNITY_EDITOR
|
||||
[Serializable]
|
||||
public class BuildEntity
|
||||
{
|
||||
public string GroupName;
|
||||
|
||||
public Color MarkColor
|
||||
{
|
||||
get => markColor.HasValue ? markColor.Value : (OptionBundle ? Color.green : Color.cyan);
|
||||
set
|
||||
{
|
||||
var defaultValue = (OptionBundle ? Color.green : Color.cyan);
|
||||
if (markColor.HasValue && markColor.Value == defaultValue) markColor = null;
|
||||
else markColor = value;
|
||||
}
|
||||
}
|
||||
[SerializeField]
|
||||
private Color? markColor;
|
||||
public EnumBuildMode BuildMode;
|
||||
public bool OptionBundle;
|
||||
public bool InstallReady;
|
||||
public List<UnityEditor.DefaultAsset> FolderList = new List<DefaultAsset>();
|
||||
public bool ShaderBundle { get; set; }
|
||||
|
||||
public Action<Asset> OnHandleAsset;
|
||||
public void CollectionAsset(Dictionary<string, Asset> map)
|
||||
{
|
||||
foreach (var folder in FolderList)
|
||||
{
|
||||
Internal_CollectionAsset(folder, map);
|
||||
}
|
||||
}
|
||||
private void Internal_CollectionAsset(UnityEditor.DefaultAsset Folder, Dictionary<string, Asset> map)
|
||||
{
|
||||
var rootPath = UnityEditor.AssetDatabase.GetAssetPath(Folder);
|
||||
var guids = UnityEditor.AssetDatabase.FindAssets(string.Empty, new string[] { rootPath });
|
||||
|
||||
foreach (var guid in guids)
|
||||
{
|
||||
var path = UnityEditor.AssetDatabase.GUIDToAssetPath(guid);
|
||||
|
||||
var assetType = UnityEditor.AssetDatabase.GetMainAssetTypeAtPath(path);
|
||||
if (assetType == typeof(DefaultAsset)) continue;
|
||||
|
||||
|
||||
bool isShader = (assetType == typeof(Shader) || assetType == typeof(ShaderVariantCollection));
|
||||
if (isShader) continue;
|
||||
|
||||
var assetInfo = new Asset(path);
|
||||
OnHandleAsset?.Invoke(assetInfo);
|
||||
|
||||
assetInfo.Group = this;
|
||||
|
||||
if (BuildMode == EnumBuildMode.PackTogether)
|
||||
assetInfo.BundleName = $"Together";
|
||||
else if (BuildMode == EnumBuildMode.OneAssetOnePack)
|
||||
assetInfo.BundleName = $"{assetInfo.FullName.Replace("/", "_")}";
|
||||
else if (BuildMode == EnumBuildMode.SubTopPack)
|
||||
{
|
||||
var relativePath = assetInfo.FullName.Replace($"{rootPath}/", string.Empty);
|
||||
var firstSplit = relativePath.IndexOf('/');
|
||||
if (firstSplit == -1)
|
||||
assetInfo.BundleName = $"{Folder.name}";
|
||||
else
|
||||
{
|
||||
var subtopFold = relativePath.Substring(0, firstSplit);
|
||||
assetInfo.BundleName = $"{Folder.name}_{subtopFold}";
|
||||
}
|
||||
}
|
||||
|
||||
//Unity不允许场景和资源打包到一个bundle中,所以如果该资源是场景,则Bundle名称添加一个后缀
|
||||
if (assetType == typeof(SceneAsset))
|
||||
assetInfo.BundleName += "_Scene";
|
||||
|
||||
assetInfo.BundleName += ".bundle";
|
||||
|
||||
//添加Group前缀
|
||||
if (string.IsNullOrWhiteSpace(GroupName))
|
||||
{
|
||||
throw new Exception("填写正确的Group名称");
|
||||
}
|
||||
assetInfo.BundleName = $"{GroupName}___{assetInfo.BundleName}".ToLower();
|
||||
|
||||
map[path] = assetInfo;
|
||||
}
|
||||
}
|
||||
|
||||
public string ConvertPath(string path)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
var parts = path.Split('/');
|
||||
if (parts.Length == 1)
|
||||
{
|
||||
return parts[0];
|
||||
}
|
||||
|
||||
return $"{parts[0]}_{parts[1]}";
|
||||
}
|
||||
|
||||
public enum EnumBuildMode
|
||||
{
|
||||
/// <summary> 将文件夹下所有Asset打包到一个bundle </summary>
|
||||
PackTogether,
|
||||
/// <summary> 将文件夹下每个Asset打包成一个Bundle </summary>
|
||||
OneAssetOnePack,
|
||||
/// <summary> 将文件夹下一级文件打包为一个Bundle </summary>
|
||||
SubTopPack
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
}
|
||||
11
Assets/VersionFlow/Runtime/BundleManifest.cs.meta
Normal file
11
Assets/VersionFlow/Runtime/BundleManifest.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f03ef2f985977254ca87ac226318de41
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
17
Assets/VersionFlow/Runtime/IVersionFlowVisual.cs
Normal file
17
Assets/VersionFlow/Runtime/IVersionFlowVisual.cs
Normal file
@ -0,0 +1,17 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace VersionFlow.Runtime
|
||||
{
|
||||
public interface IVersionFlowVisual
|
||||
{
|
||||
void StateChange(EnumVersionFlowState state);
|
||||
void ShowDownloadProgress(ulong downloadBytes, ulong totalBytes);
|
||||
void HideDownloadProgress();
|
||||
void DownloadConfirm(ulong totalSize, Action<bool> confirm);
|
||||
void OnError(string msg, string btnTxt, Action callback,string title = "错误");
|
||||
void SetVersion(string localVer, string remoteVer);
|
||||
}
|
||||
}
|
||||
11
Assets/VersionFlow/Runtime/IVersionFlowVisual.cs.meta
Normal file
11
Assets/VersionFlow/Runtime/IVersionFlowVisual.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1bfeb9a354d35954aac07363d59423dc
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
116
Assets/VersionFlow/Runtime/LoadAssetRequest.cs
Normal file
116
Assets/VersionFlow/Runtime/LoadAssetRequest.cs
Normal file
@ -0,0 +1,116 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using UnityEngine;
|
||||
|
||||
namespace VersionFlow.Runtime
|
||||
{
|
||||
public abstract class LoadAssetRequest
|
||||
{
|
||||
protected IEnumerator enumerator;
|
||||
protected Coroutine coroutine;
|
||||
IEnumerator TaskItor;
|
||||
public bool IsDone { get; protected set; }
|
||||
public bool Error => IsDone && asset == null;
|
||||
|
||||
internal UnityEngine.Object asset;
|
||||
public event Action OnComplete;
|
||||
#if UNITY_EDITOR
|
||||
public string StackInfoInEditor;
|
||||
#endif
|
||||
public LoadAssetRequest(IEnumerator enumerator)
|
||||
{
|
||||
this.enumerator = enumerator;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
StackInfoInEditor = string.Empty;
|
||||
var st = new System.Diagnostics.StackTrace(true);
|
||||
System.Text.StringBuilder sb = new System.Text.StringBuilder();
|
||||
foreach (var frame in st.GetFrames())
|
||||
{
|
||||
sb.Append(frame.GetFileName() + ":");
|
||||
sb.Append(frame.GetMethod().Name);
|
||||
sb.AppendLine(":" + frame.GetFileLineNumber());
|
||||
}
|
||||
StackInfoInEditor = sb.ToString();
|
||||
#endif
|
||||
}
|
||||
|
||||
protected void RaiseOnComplete()
|
||||
{
|
||||
OnComplete?.Invoke();
|
||||
}
|
||||
|
||||
internal void Start()
|
||||
{
|
||||
if (IsDone) return;
|
||||
if (coroutine != null) return;
|
||||
|
||||
TaskItor = Task();
|
||||
coroutine = VersionFlowX.BeginCoroutine(TaskItor);
|
||||
}
|
||||
|
||||
public void Stop()
|
||||
{
|
||||
if (coroutine != null)
|
||||
{
|
||||
VersionFlowX.Stop(coroutine);
|
||||
coroutine = null;
|
||||
}
|
||||
|
||||
asset = null;
|
||||
IsDone = false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
internal virtual IEnumerator Task()
|
||||
{
|
||||
while (enumerator.MoveNext()) yield return enumerator.Current;
|
||||
#if UNITY_EDITOR
|
||||
if (enumerator.Current == null)
|
||||
{
|
||||
VersionFlowX.Error(StackInfoInEditor);
|
||||
}
|
||||
#endif
|
||||
asset = enumerator.Current as UnityEngine.Object;
|
||||
IsDone = true;
|
||||
coroutine = null;
|
||||
|
||||
OnComplete?.Invoke();
|
||||
}
|
||||
}
|
||||
|
||||
public class LoadAssetRequest<T> : LoadAssetRequest where T : UnityEngine.Object
|
||||
{
|
||||
public T Asset => asset as T;
|
||||
|
||||
|
||||
public LoadAssetRequest(IEnumerator enumerator) : base(enumerator)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public class InstantiateRequest : LoadAssetRequest<GameObject>
|
||||
{
|
||||
public InstantiateRequest(IEnumerator enumerator) : base(enumerator) { }
|
||||
|
||||
internal override IEnumerator Task()
|
||||
{
|
||||
yield return null;//等待一帧
|
||||
|
||||
while (enumerator.MoveNext()) yield return enumerator.Current;
|
||||
#if UNITY_EDITOR
|
||||
if (enumerator.Current == null)
|
||||
{
|
||||
VersionFlowX.Error(StackInfoInEditor);
|
||||
}
|
||||
#endif
|
||||
asset = enumerator.Current as UnityEngine.Object;
|
||||
IsDone = true;
|
||||
coroutine = null;
|
||||
|
||||
RaiseOnComplete();
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/VersionFlow/Runtime/LoadAssetRequest.cs.meta
Normal file
11
Assets/VersionFlow/Runtime/LoadAssetRequest.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4bb4f22dc8bdb5f448ce322749f9e834
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/VersionFlow/Runtime/LoadingChain.meta
Normal file
8
Assets/VersionFlow/Runtime/LoadingChain.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 450df7453751e8149afb5004d55bbfd9
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
286
Assets/VersionFlow/Runtime/LoadingChain/LoadingChain.cs
Normal file
286
Assets/VersionFlow/Runtime/LoadingChain/LoadingChain.cs
Normal file
@ -0,0 +1,286 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
namespace VersionFlow.Runtime
|
||||
{
|
||||
internal class LoadingChain
|
||||
{
|
||||
internal string m_currentLoadScenePath;
|
||||
readonly HashSet<ABEntity> m_entities = new();
|
||||
readonly Dictionary<Object, ABEntity> m_loadedAssets = new();
|
||||
bool m_loading;
|
||||
readonly HashSet<GameObject> m_prefabSrcNeedRemove = new();
|
||||
internal readonly Dictionary<GameObject, List<GameObject>> m_prefabSrcToInstance = new();
|
||||
readonly WaitUntil m_working;
|
||||
|
||||
internal ABEntity m_topEntity;
|
||||
|
||||
public LoadingChain(ABEntity entity, bool shaderOnly)
|
||||
{
|
||||
m_topEntity = entity;
|
||||
CollectDependency(entity, m_entities, shaderOnly);
|
||||
m_working = new WaitUntil(predicate: () => !m_loading);
|
||||
}
|
||||
|
||||
internal static LoadingChain Create(ABEntity entity, bool shaderOnly)
|
||||
{
|
||||
var chain = new LoadingChain(entity, shaderOnly);
|
||||
|
||||
return chain;
|
||||
}
|
||||
|
||||
internal void CollectDependency(ABEntity entity, HashSet<ABEntity> result, bool shaderOnly)
|
||||
{
|
||||
if (result.Contains(entity)) return;
|
||||
result.Add(entity);
|
||||
|
||||
entity.OnAssetLoad += Entity_OnAssetLoad;
|
||||
entity.OnAssetUnLoad += Entity_OnAssetUnLoad;
|
||||
entity.m_inChains.Add(this);
|
||||
|
||||
foreach (var depAB in entity.m_dependencyAB)
|
||||
{
|
||||
if (shaderOnly && !depAB.m_isShaderBundle) continue;
|
||||
|
||||
CollectDependency(depAB, result, shaderOnly);
|
||||
}
|
||||
}
|
||||
|
||||
void Entity_OnAssetLoad(ABEntity sender, Object asset) => m_loadedAssets[asset] = sender;
|
||||
void Entity_OnAssetUnLoad(ABEntity sender, Object asset) => m_loadedAssets.Remove(asset);
|
||||
|
||||
internal ABEntity GetEntityByAssetPath(string assetPath)
|
||||
{
|
||||
var ab = VersionFlowX.BundleMgr.GetEntityByAssetPath(assetPath);
|
||||
if (ab == null || !m_entities.Contains(ab))
|
||||
{
|
||||
VersionFlowX.Error($"未找到<color=cyan>{assetPath}</color>所在的AB,或者LoadingChain中不包含该AB");
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
return ab;
|
||||
}
|
||||
|
||||
internal HashSet<ABEntity> GetEntities() => m_entities;
|
||||
|
||||
internal T LoadAsset<T>(string assetPath) where T : Object
|
||||
{
|
||||
foreach (var entity in m_entities) entity.LoadAB();
|
||||
|
||||
var ab = GetEntityByAssetPath(assetPath);
|
||||
|
||||
if (ab == null) return null;
|
||||
|
||||
var result = ab.LoadAsset<T>(assetPath);
|
||||
|
||||
if (result is T tResult) return tResult;
|
||||
VersionFlowX.Error($"资源<color=cyan>{assetPath}</color>并不属于类型<color=cyan>{typeof(T).Name}</color>");
|
||||
VersionFlowX.BundleMgr.ReleaseAsset(ref result);
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
internal void LoadAllBundle()
|
||||
{
|
||||
foreach (var entity in m_entities) entity.LoadAB();
|
||||
}
|
||||
|
||||
internal GameObject Instantiate(string assetPath, Transform parent = null)
|
||||
{
|
||||
var prefabSrc = LoadAsset<GameObject>(assetPath);
|
||||
|
||||
if (prefabSrc == null) return null;
|
||||
|
||||
m_prefabSrcToInstance.TryGetValue(prefabSrc, out var list);
|
||||
if (list == null)
|
||||
{
|
||||
list = new List<GameObject>();
|
||||
m_prefabSrcToInstance[prefabSrc] = list;
|
||||
}
|
||||
|
||||
var instance = GameObject.Instantiate(prefabSrc, parent);
|
||||
list.Add(instance);
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
internal IEnumerator InstantiateAsync(string assetPath)
|
||||
{
|
||||
var itor = LoadAssetAsync<GameObject>(assetPath);
|
||||
|
||||
while (itor.MoveNext()) yield return itor.Current;
|
||||
|
||||
var prefabSrc = itor.Current as GameObject;
|
||||
|
||||
if (prefabSrc == null) yield break;
|
||||
|
||||
m_prefabSrcToInstance.TryGetValue(prefabSrc, out var list);
|
||||
if (list == null)
|
||||
{
|
||||
list = new List<GameObject>();
|
||||
m_prefabSrcToInstance[prefabSrc] = list;
|
||||
}
|
||||
|
||||
var instance = GameObject.Instantiate(prefabSrc);
|
||||
list.Add(instance);
|
||||
|
||||
yield return instance;
|
||||
}
|
||||
|
||||
internal void LoadScene(string scenePath)
|
||||
{
|
||||
foreach (var entity in m_entities) entity.LoadAB();
|
||||
|
||||
SceneManager.LoadScene(scenePath);
|
||||
m_currentLoadScenePath = scenePath;
|
||||
}
|
||||
|
||||
internal AsyncOperation LoadSceneAsync(string scenePath)
|
||||
{
|
||||
m_loading = true;
|
||||
foreach (var entity in m_entities) entity.LoadAB();
|
||||
|
||||
var asyncOp = SceneManager.LoadSceneAsync(scenePath);
|
||||
asyncOp.completed += async => { m_loading = false; };
|
||||
|
||||
return asyncOp;
|
||||
}
|
||||
|
||||
internal IEnumerator LoadAssetAsync<T>(string assetPath) where T : Object
|
||||
{
|
||||
if (m_loading) yield return m_working;
|
||||
|
||||
m_loading = true;
|
||||
|
||||
#if UNITY_EDITOR
|
||||
var sw = Stopwatch.StartNew();
|
||||
StringBuilder debugString = new StringBuilder();
|
||||
#endif
|
||||
|
||||
foreach (var entity in m_entities)
|
||||
{
|
||||
var asyncItor = entity.LoadABAsync();
|
||||
|
||||
while (asyncItor.MoveNext()) yield return asyncItor.Current;
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
debugString.AppendLine($"加载依赖AB耗时:{sw.Elapsed.TotalMilliseconds}ms");
|
||||
#endif
|
||||
|
||||
var ab = GetEntityByAssetPath(assetPath);
|
||||
if (ab == null)
|
||||
{
|
||||
yield return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
var itor = ab.LoadAssetAsync<T>(assetPath, sw, debugString);
|
||||
#else
|
||||
var itor = ab.LoadAssetAsync<T>(assetPath);
|
||||
#endif
|
||||
|
||||
while (itor.MoveNext())
|
||||
{
|
||||
if (itor.Current is Object) break;
|
||||
|
||||
yield return itor.Current;
|
||||
}
|
||||
#if UNITY_EDITOR
|
||||
debugString.AppendLine($"LoadComplete:{sw.Elapsed.TotalMilliseconds}ms");
|
||||
#endif
|
||||
|
||||
m_loading = false;
|
||||
|
||||
var result = itor.Current as Object;
|
||||
|
||||
if (result is T tResult)
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
sw.Stop();
|
||||
debugString.Insert(0, $"Load Start: {assetPath} {sw.Elapsed.TotalMilliseconds}ms\n");
|
||||
VersionFlowX.Log(debugString.ToString());
|
||||
#endif
|
||||
|
||||
yield return tResult;
|
||||
}
|
||||
else
|
||||
{
|
||||
VersionFlowX.Error($"资源<color=cyan>{assetPath}</color>并不属于类型<color=cyan>{typeof(T).Name}</color>");
|
||||
VersionFlowX.BundleMgr.ReleaseAsset(ref result);
|
||||
|
||||
yield return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal void UnLoadAsset(Object asset)
|
||||
{
|
||||
if (m_loadedAssets.TryGetValue(asset, out var ab) && ab != null) ab.UnLoadAsset(asset);
|
||||
}
|
||||
|
||||
internal bool HasEntity(ABEntity ab) => m_entities.Contains(ab);
|
||||
|
||||
internal bool TryDispose()
|
||||
{
|
||||
if (m_loading) return false;
|
||||
|
||||
var hasPrefabInstance = CheckPrefabInstanceRef(out var needRemovePrefabSrcList);
|
||||
|
||||
foreach (var loadedPrefab in needRemovePrefabSrcList) //检测到可以Unload的Asset
|
||||
UnLoadAsset(loadedPrefab);
|
||||
|
||||
if (hasPrefabInstance) return false;
|
||||
|
||||
if (m_currentLoadScenePath != null) //还有场景,无法回收
|
||||
return false;
|
||||
|
||||
if (m_loadedAssets.Count > 0) //还有资源引用未回收
|
||||
return false;
|
||||
|
||||
foreach (var entity in m_entities)
|
||||
{
|
||||
entity.m_inChains.Remove(this);
|
||||
if (entity.m_inChains.Count == 0) entity.UnLoadAB(); //将不属于任何链的AB实例卸载
|
||||
}
|
||||
m_entities.Clear();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool CheckPrefabInstanceRef(out HashSet<GameObject> needRemovePrefabSrc)
|
||||
{
|
||||
needRemovePrefabSrc = m_prefabSrcNeedRemove;
|
||||
needRemovePrefabSrc.Clear();
|
||||
|
||||
var hasExistPrefabInstance = false;
|
||||
|
||||
foreach (var item in m_prefabSrcToInstance)
|
||||
{
|
||||
var prefabSrc = item.Key;
|
||||
var prefabInstanceList = item.Value;
|
||||
for (var i = 0; i < prefabInstanceList.Count; i++)
|
||||
{
|
||||
var instance = prefabInstanceList[i];
|
||||
if (instance == null)
|
||||
{
|
||||
prefabInstanceList.RemoveAt(i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
if (prefabInstanceList.Count == 0) //已经没有存在的Prefab副本
|
||||
needRemovePrefabSrc.Add(prefabSrc);
|
||||
else if (!hasExistPrefabInstance) hasExistPrefabInstance = true;
|
||||
}
|
||||
|
||||
return hasExistPrefabInstance;
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/VersionFlow/Runtime/LoadingChain/LoadingChain.cs.meta
Normal file
11
Assets/VersionFlow/Runtime/LoadingChain/LoadingChain.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c3625cd5aa10b1142a2ab1c854678f7f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
168
Assets/VersionFlow/Runtime/OptionalBundleDownloader.cs
Normal file
168
Assets/VersionFlow/Runtime/OptionalBundleDownloader.cs
Normal file
@ -0,0 +1,168 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
|
||||
namespace VersionFlow.Runtime
|
||||
{
|
||||
public class OptionalBundleDownloader
|
||||
{
|
||||
/// <summary> 总体积,字节数 </summary>
|
||||
public ulong TotalSize { get; private set; }
|
||||
|
||||
private ulong m_downloadedBytes;
|
||||
/// <summary> 已下载字节数 </summary>
|
||||
public ulong DownloadedBytes
|
||||
{
|
||||
get
|
||||
{
|
||||
ulong downloadingBytes = 0;
|
||||
|
||||
if (m_downloadingAB != null && m_downloadingAB.IsDownloading)
|
||||
{
|
||||
downloadingBytes = m_downloadingAB.abAsyncDownloader.downloadingBytes;
|
||||
}
|
||||
|
||||
return m_downloadedBytes + downloadingBytes;
|
||||
}
|
||||
set => m_downloadedBytes = value;
|
||||
}
|
||||
|
||||
private ABEntity m_downloadingAB;
|
||||
|
||||
EnumDownloadState m_state;
|
||||
/// <summary> 下载器状态 </summary>
|
||||
public EnumDownloadState State
|
||||
{
|
||||
get => m_state;
|
||||
set
|
||||
{
|
||||
if (m_state == value) return;
|
||||
|
||||
m_state = value;
|
||||
OnStateChange?.Invoke();
|
||||
}
|
||||
}
|
||||
public string Group { get; private set; }
|
||||
private List<ABEntity> entities = new List<ABEntity>();
|
||||
|
||||
public Action OnStateChange;
|
||||
|
||||
public OptionalBundleDownloader(string group)
|
||||
{
|
||||
Group = group;
|
||||
}
|
||||
|
||||
public void CollectAB(ABEntity abEntity)
|
||||
{
|
||||
entities.Add(abEntity);
|
||||
}
|
||||
|
||||
internal void CalcState()
|
||||
{
|
||||
//收集依赖的AB
|
||||
HashSet<ABEntity> temp = new HashSet<ABEntity>(entities);
|
||||
foreach (var entity in entities)
|
||||
{
|
||||
foreach (var depAB in entity.m_dependencyAB)
|
||||
temp.Add(depAB);
|
||||
}
|
||||
entities = temp.ToList();
|
||||
|
||||
foreach (var entity in entities)
|
||||
{
|
||||
TotalSize += (ulong)entity.m_manifestBundleInfo.Size;
|
||||
if (entity.m_isDownloaded)
|
||||
DownloadedBytes += (ulong)entity.m_manifestBundleInfo.Size;
|
||||
}
|
||||
|
||||
if (DownloadedBytes == TotalSize)
|
||||
State = EnumDownloadState.Complete;
|
||||
else
|
||||
State = EnumDownloadState.Idle;
|
||||
}
|
||||
|
||||
private Coroutine m_downloadingFlow;
|
||||
public void BeginDownload()
|
||||
{
|
||||
if (State == EnumDownloadState.Downloading || State == EnumDownloadState.Complete) return;
|
||||
|
||||
m_downloadingFlow = VersionFlowX.BeginCoroutine(DownloadFlow());
|
||||
}
|
||||
|
||||
public void CancelDownload()
|
||||
{
|
||||
if (State != EnumDownloadState.Downloading) return;
|
||||
if (m_downloadingFlow == null) return;
|
||||
|
||||
VersionFlowX.Stop(m_downloadingFlow);
|
||||
if (m_downloadingAB != null && m_downloadingAB.IsDownloading)
|
||||
{
|
||||
m_downloadingAB.abAsyncDownloader.Cancel();
|
||||
}
|
||||
}
|
||||
|
||||
private IEnumerator DownloadFlow()
|
||||
{
|
||||
State = EnumDownloadState.Downloading;
|
||||
|
||||
while (true)
|
||||
{
|
||||
m_downloadingAB = entities.FirstOrDefault(ab => !ab.m_isDownloaded);
|
||||
if (m_downloadingAB == null)
|
||||
{
|
||||
State = EnumDownloadState.Complete;
|
||||
yield break;
|
||||
}
|
||||
|
||||
if (m_downloadingAB.IsDownloading)
|
||||
yield return new WaitUntil(() => {
|
||||
return !m_downloadingAB.IsDownloading;
|
||||
});
|
||||
else
|
||||
{
|
||||
m_downloadingAB.abAsyncDownloader = VersionFlowX.DownloadBundleAsync(m_downloadingAB.m_manifestBundleInfo);
|
||||
yield return m_downloadingAB.abAsyncDownloader;
|
||||
if (m_downloadingAB.abAsyncDownloader.Success)
|
||||
{
|
||||
m_downloadingAB.m_isDownloaded = true;
|
||||
m_downloadingAB.abAsyncDownloader = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
var msg = m_downloadingAB.abAsyncDownloader.Error;
|
||||
m_downloadingAB.abAsyncDownloader = null;
|
||||
State = EnumDownloadState.Idle;
|
||||
m_downloadingAB = null;
|
||||
m_downloadingFlow = null;
|
||||
|
||||
throw new System.Exception($"下载 AB {this} 失败 \n {msg}");
|
||||
}
|
||||
}
|
||||
|
||||
DownloadedBytes += (ulong)m_downloadingAB.m_manifestBundleInfo.Size;
|
||||
m_downloadingAB = null;
|
||||
}
|
||||
}
|
||||
|
||||
public static string GetByteSizeString(ulong byteCount)
|
||||
{
|
||||
if (byteCount < 1024) return $"{byteCount}B";
|
||||
|
||||
if (byteCount < 1024 * 1024) return $"{byteCount / (1024f):.00}KB";
|
||||
|
||||
else return $"{byteCount / (1024f * 1024):.00}MB";
|
||||
}
|
||||
|
||||
|
||||
public enum EnumDownloadState
|
||||
{
|
||||
Idle,
|
||||
Downloading,
|
||||
Complete
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/VersionFlow/Runtime/OptionalBundleDownloader.cs.meta
Normal file
11
Assets/VersionFlow/Runtime/OptionalBundleDownloader.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1db43c05de112df4c8ca00f06ce7c851
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
76
Assets/VersionFlow/Runtime/PathHelper.cs
Normal file
76
Assets/VersionFlow/Runtime/PathHelper.cs
Normal file
@ -0,0 +1,76 @@
|
||||
#if UNITY_EDITOR
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace VersionFlow
|
||||
{
|
||||
public static class PathHelper
|
||||
{
|
||||
public static List<string> GetSameRoot(List<string> urls)
|
||||
{
|
||||
// 处理空列表或单个URL的情况
|
||||
if (urls == null || urls.Count == 0)
|
||||
return new List<string>();
|
||||
if (urls.Count == 1)
|
||||
return new List<string> { GetParentUrl(urls[0]) ?? "" };
|
||||
|
||||
// 解析URL并验证基本组件
|
||||
var uriData = urls.Select(url => new
|
||||
{
|
||||
Uri = new Uri(url),
|
||||
PathSegments = new Uri(url).Segments
|
||||
}).ToList();
|
||||
|
||||
// 验证协议+域名+端口是否一致
|
||||
var first = uriData.First();
|
||||
if (uriData.Any(data =>
|
||||
data.Uri.Scheme != first.Uri.Scheme ||
|
||||
data.Uri.Authority != first.Uri.Authority))
|
||||
{
|
||||
return new List<string>();
|
||||
}
|
||||
|
||||
// 提取所有URL的目录部分(排除文件名)
|
||||
var allDirectories = uriData
|
||||
.Select(data => data.PathSegments.Take(data.PathSegments.Length - 1).ToArray())
|
||||
.ToList();
|
||||
|
||||
// 计算公共路径层级
|
||||
int maxDepth = allDirectories.Min(path => path.Length);
|
||||
int commonDepth = 0;
|
||||
for (int level = 0; level < maxDepth; level++)
|
||||
{
|
||||
if (allDirectories.All(dir => dir[level] == allDirectories[0][level]))
|
||||
commonDepth++;
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
// 处理无共同路径的情况(返回根目录)
|
||||
if (commonDepth == 0)
|
||||
return new List<string> { $"{first.Uri.Scheme}://{first.Uri.Authority}/" };
|
||||
|
||||
// 构建共同路径
|
||||
var commonSegments = allDirectories[0].Take(commonDepth).ToArray();
|
||||
string commonPath = string.Join("", commonSegments).TrimEnd('/');
|
||||
|
||||
return new List<string> {
|
||||
$"{first.Uri.Scheme}://{first.Uri.Authority}{commonPath}"
|
||||
};
|
||||
}
|
||||
|
||||
private static string GetParentUrl(string url)
|
||||
{
|
||||
var uri = new Uri(url);
|
||||
if (uri.Segments.Length <= 1) // 根目录文件
|
||||
return $"{uri.Scheme}://{uri.Authority}/";
|
||||
|
||||
// 移除非目录的尾随部分
|
||||
var parentSegments = uri.Segments.Take(uri.Segments.Length - 1).ToArray();
|
||||
string parentPath = string.Join("", parentSegments);
|
||||
return $"{uri.Scheme}://{uri.Authority}{parentPath.TrimEnd('/')}";
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
11
Assets/VersionFlow/Runtime/PathHelper.cs.meta
Normal file
11
Assets/VersionFlow/Runtime/PathHelper.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dd7b38cac05d5ca4fa0057d8d9c94be6
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
31
Assets/VersionFlow/Runtime/UnityResourceAPIOverride.cs
Normal file
31
Assets/VersionFlow/Runtime/UnityResourceAPIOverride.cs
Normal file
@ -0,0 +1,31 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
|
||||
namespace VersionFlow.Runtime
|
||||
{
|
||||
internal class UnityResourceAPIOverride : ResourcesAPI
|
||||
{
|
||||
protected override Shader FindShaderByName(string name)
|
||||
{
|
||||
if (VersionFlowX.Setting == null || !VersionFlowX.Setting.Enable)
|
||||
return base.FindShaderByName(name);
|
||||
else
|
||||
{
|
||||
var shader = VersionFlowX.BundleMgr.GetShader(name);
|
||||
if (shader == null)
|
||||
shader = base.FindShaderByName(name);
|
||||
|
||||
if (shader == null)
|
||||
{
|
||||
VersionFlowX.Error($"动态加载Shader:{name}失败,没有找到该shader");
|
||||
}
|
||||
|
||||
return shader;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user