first commit

This commit is contained in:
ALIENJACK\alien 2025-08-08 10:33:30 +08:00
commit 2a326cb7f4
135 changed files with 11685 additions and 0 deletions

8
Assets/Scenes.meta Normal file
View File

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

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

View File

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

8
Assets/Settings.meta Normal file
View File

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

View 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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ab09877e2e707104187f6f83e2f62510
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 5e6cbd92db86f4b18aec3ed561671858
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 65bc7dbf4170f435aa868c779acfb082
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 4b83569d67af61e458304325a23e5dfd
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: f288ae1f4751b564a96ac7587541f7a2
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View 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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 10fc4df2da32a41aaa32d77bc913491c
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 0
userData:
assetBundleName:
assetBundleVariant:

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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 18dc0cd2c080841dea60987a38ce93fa
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

8
Assets/VersionFlow.meta Normal file
View File

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

View File

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

View 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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: d9c376c48fdca0c4db0a27b546c0e735
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

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

View 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();
}
}
}

View File

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

View 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();
}
}
}

View File

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

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

View File

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

View File

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

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

View File

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

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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:

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8d93e4ce22278cd4a805354c55c61670
AssemblyDefinitionImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View 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();
}
}
}
}
}

View File

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

View File

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

View 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

View File

@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b304f98f44ccac546969282b7054a052
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

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

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

View File

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

View 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

View File

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

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

View File

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

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

View File

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

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

View File

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

View 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();
}
}
}

View File

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

View File

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

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

View File

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

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

View File

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

View 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

View File

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

View 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