Added Unity project files
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3bc7afd8ab8c5374bbe5d4e93adac463
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,138 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: BlueprintCam
|
||||
m_Shader: {fileID: 10752, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_ShaderKeywords:
|
||||
m_LightmapFlags: 5
|
||||
m_CustomRenderQueue: 2000
|
||||
stringTagMap: {}
|
||||
m_SavedProperties:
|
||||
serializedVersion: 2
|
||||
m_TexEnvs:
|
||||
data:
|
||||
first:
|
||||
name: _MainTex
|
||||
second:
|
||||
m_Texture: {fileID: 8400000, guid: 94b649c2bd1ac4cac95049605dc5333d, type: 2}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
data:
|
||||
first:
|
||||
name: _BumpMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
data:
|
||||
first:
|
||||
name: _DetailNormalMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
data:
|
||||
first:
|
||||
name: _ParallaxMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
data:
|
||||
first:
|
||||
name: _OcclusionMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
data:
|
||||
first:
|
||||
name: _EmissionMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
data:
|
||||
first:
|
||||
name: _DetailMask
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
data:
|
||||
first:
|
||||
name: _DetailAlbedoMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
data:
|
||||
first:
|
||||
name: _MetallicGlossMap
|
||||
second:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
data:
|
||||
first:
|
||||
name: _SrcBlend
|
||||
second: 1
|
||||
data:
|
||||
first:
|
||||
name: _DstBlend
|
||||
second: 0
|
||||
data:
|
||||
first:
|
||||
name: _Cutoff
|
||||
second: .5
|
||||
data:
|
||||
first:
|
||||
name: _Parallax
|
||||
second: .0199999996
|
||||
data:
|
||||
first:
|
||||
name: _ZWrite
|
||||
second: 1
|
||||
data:
|
||||
first:
|
||||
name: _Glossiness
|
||||
second: .5
|
||||
data:
|
||||
first:
|
||||
name: _BumpScale
|
||||
second: 1
|
||||
data:
|
||||
first:
|
||||
name: _OcclusionStrength
|
||||
second: 1
|
||||
data:
|
||||
first:
|
||||
name: _DetailNormalMapScale
|
||||
second: 1
|
||||
data:
|
||||
first:
|
||||
name: _UVSec
|
||||
second: 0
|
||||
data:
|
||||
first:
|
||||
name: _Mode
|
||||
second: 0
|
||||
data:
|
||||
first:
|
||||
name: _Metallic
|
||||
second: 0
|
||||
m_Colors:
|
||||
data:
|
||||
first:
|
||||
name: _EmissionColor
|
||||
second: {r: 0, g: 0, b: 0, a: 1}
|
||||
data:
|
||||
first:
|
||||
name: _Color
|
||||
second: {r: 1, g: 1, b: 1, a: 1}
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: da07ab9b78cb0432e95e11e2cb619ea7
|
||||
timeCreated: 1445225813
|
||||
licenseType: Free
|
||||
NativeFormatImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,24 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!84 &8400000
|
||||
RenderTexture:
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: BlueprintCam
|
||||
m_ImageContentsHash:
|
||||
serializedVersion: 2
|
||||
Hash: 00000000000000000000000000000000
|
||||
m_Width: 400
|
||||
m_Height: 300
|
||||
m_AntiAliasing: 1
|
||||
m_DepthFormat: 2
|
||||
m_ColorFormat: 0
|
||||
m_MipMap: 0
|
||||
m_GenerateMips: 1
|
||||
m_SRGB: 0
|
||||
m_TextureSettings:
|
||||
m_FilterMode: 1
|
||||
m_Aniso: 0
|
||||
m_MipBias: 0
|
||||
m_WrapMode: 1
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 94b649c2bd1ac4cac95049605dc5333d
|
||||
timeCreated: 1445225748
|
||||
licenseType: Free
|
||||
NativeFormatImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,73 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: damageGrey
|
||||
m_Shader: {fileID: 10723, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_ShaderKeywords: _EMISSION
|
||||
m_LightmapFlags: 1
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: 3000
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 2800000, guid: 3a9d01385a8b0af4880d46484c7054ce, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: 8d95767408d35544c98f92ef7279b8db, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _Glossiness: 0
|
||||
- _InvFade: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 0, g: 0, b: 0, a: 1}
|
||||
- _EmissionColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2166f6bbfce69594fad494087eca58e8
|
||||
timeCreated: 1478890084
|
||||
licenseType: Pro
|
||||
NativeFormatImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0fa6989a5986bc84fac94157c0aa6511
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cbcda5ce84b6ad34d9fab76dabff48ad
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,76 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 6
|
||||
m_ObjectHideFlags: 0
|
||||
m_PrefabParentObject: {fileID: 0}
|
||||
m_PrefabInternal: {fileID: 0}
|
||||
m_Name: lambert2
|
||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_ShaderKeywords: _EMISSION
|
||||
m_LightmapFlags: 1
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 0.5, g: 0.5, b: 0.5, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 841c3ce718e8b61408005c1cfce6b7de
|
||||
timeCreated: 1478890084
|
||||
licenseType: Pro
|
||||
NativeFormatImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,77 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e13e96301b7c8214dac6883be5b82bfa
|
||||
timeCreated: 1478890084
|
||||
licenseType: Pro
|
||||
ModelImporter:
|
||||
serializedVersion: 19
|
||||
fileIDToRecycleName:
|
||||
100000: //RootNode
|
||||
400000: //RootNode
|
||||
2300000: //RootNode
|
||||
3300000: //RootNode
|
||||
4300000: damageSphere
|
||||
9500000: //RootNode
|
||||
materials:
|
||||
importMaterials: 1
|
||||
materialName: 0
|
||||
materialSearch: 1
|
||||
animations:
|
||||
legacyGenerateAnimations: 4
|
||||
bakeSimulation: 0
|
||||
resampleRotations: 1
|
||||
optimizeGameObjects: 0
|
||||
motionNodeName:
|
||||
animationImportErrors:
|
||||
animationImportWarnings:
|
||||
animationRetargetingWarnings:
|
||||
animationDoRetargetingWarnings: 0
|
||||
animationCompression: 1
|
||||
animationRotationError: 0.5
|
||||
animationPositionError: 0.5
|
||||
animationScaleError: 0.5
|
||||
animationWrapMode: 0
|
||||
extraExposedTransformPaths: []
|
||||
clipAnimations: []
|
||||
isReadable: 1
|
||||
meshes:
|
||||
lODScreenPercentages: []
|
||||
globalScale: 1
|
||||
meshCompression: 0
|
||||
addColliders: 0
|
||||
importBlendShapes: 1
|
||||
swapUVChannels: 0
|
||||
generateSecondaryUV: 0
|
||||
useFileUnits: 1
|
||||
optimizeMeshForGPU: 1
|
||||
keepQuads: 0
|
||||
weldVertices: 1
|
||||
secondaryUVAngleDistortion: 8
|
||||
secondaryUVAreaDistortion: 15.000001
|
||||
secondaryUVHardAngle: 88
|
||||
secondaryUVPackMargin: 4
|
||||
useFileScale: 1
|
||||
tangentSpace:
|
||||
normalSmoothAngle: 60
|
||||
normalImportMode: 0
|
||||
tangentImportMode: 3
|
||||
importAnimation: 1
|
||||
copyAvatar: 0
|
||||
humanDescription:
|
||||
human: []
|
||||
skeleton: []
|
||||
armTwist: 0.5
|
||||
foreArmTwist: 0.5
|
||||
upperLegTwist: 0.5
|
||||
legTwist: 0.5
|
||||
armStretch: 0.05
|
||||
legStretch: 0.05
|
||||
feetSpacing: 0
|
||||
rootMotionBoneName:
|
||||
hasTranslationDoF: 0
|
||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
||||
animationType: 2
|
||||
humanoidOversampling: 1
|
||||
additionalBone: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9b019af4714b4bf4d9e0683084234391
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8cdc6e04f0d11184d8acb16c27cc3695
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 13 KiB |
@ -0,0 +1,154 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 43066d8a73c579048891e3c123e252a0
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 9
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: -1
|
||||
mipBias: -100
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: -1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 2
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: tvOS
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Windows Store Apps
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 7f6b62176e469f949be9e9b79373a013
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f078e90486dd8684784c5e47c473fe95
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 12 KiB |
@ -0,0 +1,154 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f310c3dbad3125d4e8fc2e00bdc2acb4
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 9
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: -1
|
||||
mipBias: -100
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: -1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 2
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: tvOS
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Windows Store Apps
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 6c7cf76d4c1786f49a3ceb1031f37c7b
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 4.1 KiB |
@ -0,0 +1,154 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 36349feed06587e479724a1a09c0b267
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 9
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: -1
|
||||
mipBias: -100
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: -1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 2
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: iPhone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: tvOS
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Windows Store Apps
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 7b0b16a8026d32f43b3992d38a892a83
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1330d5ad3ec8cb343a18f4a2dbc148c0
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@ -0,0 +1,110 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 53f9c1f34eb97ec4196ff26de5e242f7
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 9
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 0
|
||||
aniso: 1
|
||||
mipBias: -100
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: -1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 2
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 2
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bad6d2f46b6209f4e94b6a2fab7bcbb4
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 12 KiB |
@ -0,0 +1,110 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4109d4977ddfb6548b458318e220ac70
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 9
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 2
|
||||
aniso: 16
|
||||
mipBias: -100
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 2
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Android
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: baf621c415cae4e44a8bd5c0a5153bbb
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 9.8 KiB |
@ -0,0 +1,110 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 644caf5607820c7418cf0d248b12f33b
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 9
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 2
|
||||
aniso: 16
|
||||
mipBias: -100
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 2
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Android
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 35821de39f3ce454cb1997a05350b1ac
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 16 KiB |
@ -0,0 +1,110 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2886eb1248200a94d9eaec82336fbbad
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 9
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 2
|
||||
aniso: 16
|
||||
mipBias: -100
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 2
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Android
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 19f5799c16616894fb9d40c371a3421b
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 15 KiB |
@ -0,0 +1,110 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9296abd40c7c1934cb668aae07b41c69
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 9
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 2
|
||||
aniso: 16
|
||||
mipBias: -100
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 2
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Android
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: d22a8feddc754e04489c4b00925e38b3
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 14 KiB |
@ -0,0 +1,110 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e561d0406779ab948b7f155498d101ee
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 9
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 2
|
||||
aniso: 16
|
||||
mipBias: -100
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 2
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Android
|
||||
maxTextureSize: 32
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 4dca2da27f51ad64d8e65a535134449f
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,72 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &125948
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 474528}
|
||||
- component: {fileID: 11496614}
|
||||
m_Layer: 0
|
||||
m_Name: VRCProjectSettings
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &474528
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 125948}
|
||||
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!114 &11496614
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 125948}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: -826769915, guid: 4ecd63eff847044b68db9453ce219299, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
layers:
|
||||
- Default
|
||||
- TransparentFX
|
||||
- Ignore Raycast
|
||||
- Item
|
||||
- Water
|
||||
- UI
|
||||
- reserved6
|
||||
- reserved7
|
||||
- Interactive
|
||||
- Player
|
||||
- PlayerLocal
|
||||
- Environment
|
||||
- UiMenu
|
||||
- Pickup
|
||||
- PickupNoEnvironment
|
||||
- StereoLeft
|
||||
- StereoRight
|
||||
- Walkthrough
|
||||
- MirrorReflection
|
||||
- InternalUI
|
||||
- HardwareObjects
|
||||
- reserved4
|
||||
numLayers: 22
|
||||
layerCollisionArr: 01010100010001010101010100010001010101000101010101010101010101010101010001000101010101010001000101010100010101010101010101010101010101000100010101010101000100010101010001010101010101010101010100000001000000000000000000000000000000000000000000000000000000000101010001000101010101010001000101010100010101010101010101010101000000000000010100000000000000000000000000000000000000000000000001010100010101010101010101010101010101010101010101010101010101010101010001010101010101010101010101010101010101010101010101010101010101000100010101010101000100010101010001010101010101010101010101010100010001010100000100000000000001000101010101010101010101010101010001000101010000010000000000000100010101010101010101010101010101000100010101010101000100010101010001010101010101010101010100000000000001010000000000000000000000000000000000000000000000000101010001000101010000010001010101010000000001010101010101010101000000000000010100000000000100000000000000000101010101010101010101010100010001010100000100010001010101000101000000000000000000000101010001000101010000010001000101010100010100000000000000000000010101000100010101000001000100010101010001010101010101010101010101010100010001010101010100000001010101000101010101010101010101010000000000000101000000000000000000000000000000000000000000000000010101000100010101010101000000010101010001010101010101010101010101010100010001010101010100000001010101000101010101010101010101010101010001000101010101010001010000010100010101010101010101010101010101000100010101010101000101000001010001010101010101010101010101010100010001010101010100010100000101000101010101010101010101010101010001000101010101010001010000010100010101010101010101010101010101000100010101010101000101000001010001010101010101010101010101010100010001010101010100010100000101000101010101010101010101010101010001000101010101010001010000010100010101010101010101010101010101000100010101010101000101000001010001010101010101010101010101010100010001010101010100010100000101000101010101010101010101010101010001000101010101010001010000010100010101010101010101010101
|
||||
queriesHitTriggers: 0
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dce0dda226bd1f147a34f9b4660f5992
|
||||
timeCreated: 1469565980
|
||||
licenseType: Pro
|
||||
NativeFormatImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4d7d57371bad74d4c95276138d127122
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6ee7e01bfeee81d46967673023437f22
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 67affaa038c4a84418ef9af616482b14
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c8ef787823eaa004085621533241a424
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -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: 1357539684, guid: db48663b319a020429e3b1265f97aff1, type: 3}
|
||||
m_Name: AvatarPerformanceStatLevels_Quest
|
||||
m_EditorClassIdentifier:
|
||||
excellent: {fileID: 11400000, guid: e750436d0bab192489da0debe67ee879, type: 2}
|
||||
good: {fileID: 11400000, guid: b25db21b17fba3d49a7248568fdb9870, type: 2}
|
||||
medium: {fileID: 11400000, guid: 31feb7417182a80469408649071d10ac, type: 2}
|
||||
poor: {fileID: 11400000, guid: 171503e8193e15447967be1e3ca1e714, type: 2}
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f0f530dea3891c04e8ab37831627e702
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,46 @@
|
||||
%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: 1734077097, guid: db48663b319a020429e3b1265f97aff1, type: 3}
|
||||
m_Name: Excellent_Quest
|
||||
m_EditorClassIdentifier:
|
||||
polyCount: 7500
|
||||
aabb:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 1.25, y: 1.25, z: 1.25}
|
||||
skinnedMeshCount: 1
|
||||
meshCount: 1
|
||||
materialCount: 1
|
||||
animatorCount: 1
|
||||
boneCount: 75
|
||||
lightCount: 0
|
||||
particleSystemCount: 0
|
||||
particleTotalCount: 0
|
||||
particleMaxMeshPolyCount: 0
|
||||
particleTrailsEnabled: 0
|
||||
particleCollisionEnabled: 0
|
||||
trailRendererCount: 0
|
||||
lineRendererCount: 0
|
||||
clothCount: 0
|
||||
clothMaxVertices: 0
|
||||
physicsColliderCount: 0
|
||||
physicsRigidbodyCount: 0
|
||||
audioSourceCount: 0
|
||||
textureMegabytes: 10
|
||||
physBone:
|
||||
componentCount: 0
|
||||
transformCount: 0
|
||||
colliderCount: 0
|
||||
collisionCheckCount: 0
|
||||
contactCount: 2
|
||||
constraintsCount: 30
|
||||
constraintDepth: 5
|
||||
raycastCount: 1
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e750436d0bab192489da0debe67ee879
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,46 @@
|
||||
%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: 1734077097, guid: db48663b319a020429e3b1265f97aff1, type: 3}
|
||||
m_Name: Good_Quest
|
||||
m_EditorClassIdentifier:
|
||||
polyCount: 10000
|
||||
aabb:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 2, y: 2, z: 2}
|
||||
skinnedMeshCount: 1
|
||||
meshCount: 1
|
||||
materialCount: 1
|
||||
animatorCount: 1
|
||||
boneCount: 90
|
||||
lightCount: 0
|
||||
particleSystemCount: 0
|
||||
particleTotalCount: 0
|
||||
particleMaxMeshPolyCount: 0
|
||||
particleTrailsEnabled: 0
|
||||
particleCollisionEnabled: 0
|
||||
trailRendererCount: 0
|
||||
lineRendererCount: 0
|
||||
clothCount: 0
|
||||
clothMaxVertices: 0
|
||||
physicsColliderCount: 0
|
||||
physicsRigidbodyCount: 0
|
||||
audioSourceCount: 0
|
||||
textureMegabytes: 18
|
||||
physBone:
|
||||
componentCount: 4
|
||||
transformCount: 16
|
||||
colliderCount: 4
|
||||
collisionCheckCount: 16
|
||||
contactCount: 4
|
||||
constraintsCount: 60
|
||||
constraintDepth: 15
|
||||
raycastCount: 2
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b25db21b17fba3d49a7248568fdb9870
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,46 @@
|
||||
%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: 1734077097, guid: db48663b319a020429e3b1265f97aff1, type: 3}
|
||||
m_Name: Medium_Quest
|
||||
m_EditorClassIdentifier:
|
||||
polyCount: 15000
|
||||
aabb:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 2.5, y: 3, z: 2.5}
|
||||
skinnedMeshCount: 2
|
||||
meshCount: 2
|
||||
materialCount: 2
|
||||
animatorCount: 1
|
||||
boneCount: 150
|
||||
lightCount: 0
|
||||
particleSystemCount: 0
|
||||
particleTotalCount: 0
|
||||
particleMaxMeshPolyCount: 0
|
||||
particleTrailsEnabled: 0
|
||||
particleCollisionEnabled: 0
|
||||
trailRendererCount: 0
|
||||
lineRendererCount: 0
|
||||
clothCount: 0
|
||||
clothMaxVertices: 0
|
||||
physicsColliderCount: 0
|
||||
physicsRigidbodyCount: 0
|
||||
audioSourceCount: 0
|
||||
textureMegabytes: 25
|
||||
physBone:
|
||||
componentCount: 6
|
||||
transformCount: 32
|
||||
colliderCount: 8
|
||||
collisionCheckCount: 32
|
||||
contactCount: 8
|
||||
constraintsCount: 120
|
||||
constraintDepth: 35
|
||||
raycastCount: 4
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 31feb7417182a80469408649071d10ac
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,46 @@
|
||||
%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: 1734077097, guid: db48663b319a020429e3b1265f97aff1, type: 3}
|
||||
m_Name: Poor_Quest
|
||||
m_EditorClassIdentifier:
|
||||
polyCount: 20000
|
||||
aabb:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 2.5, y: 3, z: 2.5}
|
||||
skinnedMeshCount: 2
|
||||
meshCount: 2
|
||||
materialCount: 4
|
||||
animatorCount: 2
|
||||
boneCount: 150
|
||||
lightCount: 0
|
||||
particleSystemCount: 2
|
||||
particleTotalCount: 200
|
||||
particleMaxMeshPolyCount: 400
|
||||
particleTrailsEnabled: 1
|
||||
particleCollisionEnabled: 1
|
||||
trailRendererCount: 1
|
||||
lineRendererCount: 1
|
||||
clothCount: 0
|
||||
clothMaxVertices: 0
|
||||
physicsColliderCount: 0
|
||||
physicsRigidbodyCount: 0
|
||||
audioSourceCount: 0
|
||||
textureMegabytes: 40
|
||||
physBone:
|
||||
componentCount: 8
|
||||
transformCount: 64
|
||||
colliderCount: 16
|
||||
collisionCheckCount: 64
|
||||
contactCount: 16
|
||||
constraintsCount: 150
|
||||
constraintDepth: 50
|
||||
raycastCount: 8
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 171503e8193e15447967be1e3ca1e714
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 08d4ef81e522ab244bb72f5b8638a351
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -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: 1357539684, guid: db48663b319a020429e3b1265f97aff1, type: 3}
|
||||
m_Name: AvatarPerformanceStatLevels_Windows
|
||||
m_EditorClassIdentifier:
|
||||
excellent: {fileID: 11400000, guid: 88c46902276e7624e8adda9020bef28b, type: 2}
|
||||
good: {fileID: 11400000, guid: 38957d57ab5a7f145b954d20fc24b1d4, type: 2}
|
||||
medium: {fileID: 11400000, guid: 65edaefdc2f87414594559cb89383b5b, type: 2}
|
||||
poor: {fileID: 11400000, guid: 595049d4e162571489f2437524d98a31, type: 2}
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 438f83f183e95f740877d4c22ed91af2
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,46 @@
|
||||
%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: 1734077097, guid: db48663b319a020429e3b1265f97aff1, type: 3}
|
||||
m_Name: Excellent_Windows
|
||||
m_EditorClassIdentifier:
|
||||
polyCount: 32000
|
||||
aabb:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 1.25, y: 1.25, z: 1.25}
|
||||
skinnedMeshCount: 1
|
||||
meshCount: 4
|
||||
materialCount: 4
|
||||
animatorCount: 1
|
||||
boneCount: 75
|
||||
lightCount: 0
|
||||
particleSystemCount: 0
|
||||
particleTotalCount: 0
|
||||
particleMaxMeshPolyCount: 0
|
||||
particleTrailsEnabled: 0
|
||||
particleCollisionEnabled: 0
|
||||
trailRendererCount: 1
|
||||
lineRendererCount: 1
|
||||
clothCount: 0
|
||||
clothMaxVertices: 0
|
||||
physicsColliderCount: 0
|
||||
physicsRigidbodyCount: 0
|
||||
audioSourceCount: 1
|
||||
textureMegabytes: 40
|
||||
physBone:
|
||||
componentCount: 4
|
||||
transformCount: 16
|
||||
colliderCount: 4
|
||||
collisionCheckCount: 32
|
||||
contactCount: 8
|
||||
constraintsCount: 100
|
||||
constraintDepth: 20
|
||||
raycastCount: 1
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 88c46902276e7624e8adda9020bef28b
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,46 @@
|
||||
%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: 1734077097, guid: db48663b319a020429e3b1265f97aff1, type: 3}
|
||||
m_Name: Good_Windows
|
||||
m_EditorClassIdentifier:
|
||||
polyCount: 70000
|
||||
aabb:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 2, y: 2, z: 2}
|
||||
skinnedMeshCount: 2
|
||||
meshCount: 8
|
||||
materialCount: 8
|
||||
animatorCount: 4
|
||||
boneCount: 150
|
||||
lightCount: 0
|
||||
particleSystemCount: 4
|
||||
particleTotalCount: 300
|
||||
particleMaxMeshPolyCount: 1000
|
||||
particleTrailsEnabled: 0
|
||||
particleCollisionEnabled: 0
|
||||
trailRendererCount: 2
|
||||
lineRendererCount: 2
|
||||
clothCount: 1
|
||||
clothMaxVertices: 50
|
||||
physicsColliderCount: 1
|
||||
physicsRigidbodyCount: 1
|
||||
audioSourceCount: 4
|
||||
textureMegabytes: 75
|
||||
physBone:
|
||||
componentCount: 8
|
||||
transformCount: 64
|
||||
colliderCount: 8
|
||||
collisionCheckCount: 128
|
||||
contactCount: 16
|
||||
constraintsCount: 250
|
||||
constraintDepth: 50
|
||||
raycastCount: 4
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 38957d57ab5a7f145b954d20fc24b1d4
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,46 @@
|
||||
%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: 1734077097, guid: db48663b319a020429e3b1265f97aff1, type: 3}
|
||||
m_Name: Medium_Windows
|
||||
m_EditorClassIdentifier:
|
||||
polyCount: 70000
|
||||
aabb:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 2.5, y: 3, z: 2.5}
|
||||
skinnedMeshCount: 8
|
||||
meshCount: 16
|
||||
materialCount: 16
|
||||
animatorCount: 16
|
||||
boneCount: 256
|
||||
lightCount: 0
|
||||
particleSystemCount: 8
|
||||
particleTotalCount: 1000
|
||||
particleMaxMeshPolyCount: 2000
|
||||
particleTrailsEnabled: 1
|
||||
particleCollisionEnabled: 1
|
||||
trailRendererCount: 4
|
||||
lineRendererCount: 4
|
||||
clothCount: 1
|
||||
clothMaxVertices: 100
|
||||
physicsColliderCount: 8
|
||||
physicsRigidbodyCount: 8
|
||||
audioSourceCount: 8
|
||||
textureMegabytes: 110
|
||||
physBone:
|
||||
componentCount: 16
|
||||
transformCount: 128
|
||||
colliderCount: 16
|
||||
collisionCheckCount: 256
|
||||
contactCount: 24
|
||||
constraintsCount: 300
|
||||
constraintDepth: 80
|
||||
raycastCount: 8
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 65edaefdc2f87414594559cb89383b5b
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,46 @@
|
||||
%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: 1734077097, guid: db48663b319a020429e3b1265f97aff1, type: 3}
|
||||
m_Name: Poor_Windows
|
||||
m_EditorClassIdentifier:
|
||||
polyCount: 70000
|
||||
aabb:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 2.5, y: 3, z: 2.5}
|
||||
skinnedMeshCount: 16
|
||||
meshCount: 24
|
||||
materialCount: 32
|
||||
animatorCount: 32
|
||||
boneCount: 400
|
||||
lightCount: 1
|
||||
particleSystemCount: 16
|
||||
particleTotalCount: 2500
|
||||
particleMaxMeshPolyCount: 5000
|
||||
particleTrailsEnabled: 1
|
||||
particleCollisionEnabled: 1
|
||||
trailRendererCount: 8
|
||||
lineRendererCount: 8
|
||||
clothCount: 1
|
||||
clothMaxVertices: 200
|
||||
physicsColliderCount: 8
|
||||
physicsRigidbodyCount: 8
|
||||
audioSourceCount: 8
|
||||
textureMegabytes: 150
|
||||
physBone:
|
||||
componentCount: 32
|
||||
transformCount: 256
|
||||
colliderCount: 32
|
||||
collisionCheckCount: 512
|
||||
contactCount: 32
|
||||
constraintsCount: 350
|
||||
constraintDepth: 100
|
||||
raycastCount: 15
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 595049d4e162571489f2437524d98a31
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<aws
|
||||
correctForClockSkew="true">
|
||||
|
||||
<logging
|
||||
logTo="UnityLogger"
|
||||
logResponses="Always"
|
||||
logMetrics="true"
|
||||
logMetricsFormat="JSON" />
|
||||
|
||||
<s3 useSignatureVersion4="true" />
|
||||
|
||||
<mobileAnalytics
|
||||
sessionTimeout = "5"
|
||||
maxDBSize = "5242880"
|
||||
dbWarningThreshold = "0.9"
|
||||
maxRequestSize = "102400"
|
||||
allowUseDataNetwork = "false"
|
||||
/>
|
||||
|
||||
</aws>
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4acdf7b3eb426480bb5acf58638bd493
|
||||
timeCreated: 1448068597
|
||||
licenseType: Free
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,49 @@
|
||||
{
|
||||
"endpoints": {
|
||||
"*/sts": {
|
||||
"endpoint": "sts.amazonaws.com"
|
||||
},
|
||||
"*/route53": {
|
||||
"endpoint": "route53.amazonaws.com"
|
||||
},
|
||||
"*/route53domains": {
|
||||
"endpoint": "route53domains.us-east-1.amazonaws.com"
|
||||
},
|
||||
"us-east-1/s3": {
|
||||
"endpoint": "s3.amazonaws.com",
|
||||
"signature-version" : "2"
|
||||
},
|
||||
"us-west-1/s3": {
|
||||
"endpoint": "s3-us-west-1.amazonaws.com",
|
||||
"signature-version" : "2"
|
||||
},
|
||||
"us-west-2/s3": {
|
||||
"endpoint": "s3-us-west-2.amazonaws.com",
|
||||
"signature-version" : "2"
|
||||
},
|
||||
"ap-northeast-1/s3": {
|
||||
"endpoint": "s3-ap-northeast-1.amazonaws.com",
|
||||
"signature-version" : "2"
|
||||
},
|
||||
"ap-southeast-1/s3": {
|
||||
"endpoint": "s3-ap-southeast-1.amazonaws.com",
|
||||
"signature-version" : "2"
|
||||
},
|
||||
"ap-southeast-2/s3": {
|
||||
"endpoint": "s3-ap-southeast-2.amazonaws.com",
|
||||
"signature-version" : "2"
|
||||
},
|
||||
"sa-east-1/s3": {
|
||||
"endpoint": "s3-sa-east-1.amazonaws.com",
|
||||
"signature-version" : "2"
|
||||
},
|
||||
"eu-west-1/s3": {
|
||||
"endpoint": "s3-eu-west-1.amazonaws.com",
|
||||
"signature-version" : "2"
|
||||
},
|
||||
"us-gov-west-1/s3": {
|
||||
"endpoint": "s3-us-gov-west-1.amazonaws.com",
|
||||
"signature-version" : "2"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dd5614b710e774040ab715161f7dfaca
|
||||
timeCreated: 1448068597
|
||||
licenseType: Free
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,57 @@
|
||||
{
|
||||
"version": 2,
|
||||
"endpoints": {
|
||||
"*/*": {
|
||||
"endpoint": "{service}.{region}.amazonaws.com"
|
||||
},
|
||||
"cn-north-1/*": {
|
||||
"endpoint": "{service}.{region}.amazonaws.com.cn",
|
||||
"signatureVersion": "v4"
|
||||
},
|
||||
"us-gov-west-1/iam": {
|
||||
"endpoint": "iam.us-gov.amazonaws.com"
|
||||
},
|
||||
"us-gov-west-1/s3": {
|
||||
"endpoint": "s3-{region}.amazonaws.com"
|
||||
},
|
||||
"*/cloudfront": {
|
||||
"endpoint": "cloudfront.amazonaws.com"
|
||||
},
|
||||
"*/iam": {
|
||||
"endpoint": "iam.amazonaws.com"
|
||||
},
|
||||
"*/importexport": {
|
||||
"endpoint": "importexport.amazonaws.com"
|
||||
},
|
||||
"*/route53": {
|
||||
"endpoint": "route53.amazonaws.com"
|
||||
},
|
||||
"us-east-1/sdb": {
|
||||
"endpoint": "sdb.amazonaws.com"
|
||||
},
|
||||
"us-east-1/s3": {
|
||||
"endpoint": "s3.amazonaws.com"
|
||||
},
|
||||
"us-west-1/s3": {
|
||||
"endpoint": "s3-{region}.amazonaws.com"
|
||||
},
|
||||
"us-west-2/s3": {
|
||||
"endpoint": "s3-{region}.amazonaws.com"
|
||||
},
|
||||
"eu-west-1/s3": {
|
||||
"endpoint": "s3-{region}.amazonaws.com"
|
||||
},
|
||||
"ap-southeast-1/s3": {
|
||||
"endpoint": "s3-{region}.amazonaws.com"
|
||||
},
|
||||
"ap-southeast-2/s3": {
|
||||
"endpoint": "s3-{region}.amazonaws.com"
|
||||
},
|
||||
"ap-northeast-1/s3": {
|
||||
"endpoint": "s3-{region}.amazonaws.com"
|
||||
},
|
||||
"sa-east-1/s3": {
|
||||
"endpoint": "s3-{region}.amazonaws.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 37b4abef7420c4c7ea71dbe76757498a
|
||||
timeCreated: 1448068597
|
||||
licenseType: Free
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8b377688f9256ef409a6e02ace3605ab
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 36c0d886a26373c46be857f2fc441071
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,20 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace VRC.SDKBase
|
||||
{
|
||||
public class AudioManagerSettings
|
||||
{
|
||||
public const float MinVoiceSendDistance = 25.0f; // meters
|
||||
public const float MaxVoiceSendDistancePctOfFarRange = 0.5f;
|
||||
public const float VoiceFadeOutDistancePctOfFarRange = 0.25f;
|
||||
public const float RoomAudioGain = 10f; // dB
|
||||
public const float RoomAudioMaxRange = 80f; // meters
|
||||
public const float VoiceGain = 15f; // dB
|
||||
public const float VoiceMaxRange = 25f; // meters, this is half the oculus inv sq max range
|
||||
public const float LipsyncGain = 1f; // multiplier, not dB!
|
||||
public const float AvatarAudioMaxGain = 10f; // dB
|
||||
public const float AvatarAudioMaxRange = 40f; // meters
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: acadc6659c5ab3446ad0d5de2563f95f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,20 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace VRCSDK2
|
||||
{
|
||||
public class CommunityLabsConstants
|
||||
{
|
||||
public const string COMMUNITY_LABS_DOCUMENTATION_URL = "https://docs.vrchat.com/docs/vrchat-community-labs";
|
||||
|
||||
public const string MANAGE_WORLD_IN_BROWSER_STRING = "Manage World in Browser";
|
||||
public const string READ_COMMUNITY_LABS_DOCS_STRING = "Read Community Labs Docs";
|
||||
|
||||
public const string UPLOADED_CONTENT_SUCCESSFULLY_MESSAGE = "Content Successfully Uploaded!";
|
||||
|
||||
public const string UPLOADED_NEW_PRIVATE_WORLD_CONFIRMATION_MESSAGE = "You've uploaded a private world. You can find it on the \"Mine\" row in your worlds menu.";
|
||||
public const string UPDATED_PRIVATE_WORLD_CONFIRMATION_MESSAGE = "You've updated your private world. You can find it on the \"Mine\" row in your worlds menu.";
|
||||
public const string PUBLISHED_WORLD_TO_COMMUNITY_LABS_CONFIRMATION_MESSAGE = "You've uploaded and published a world to Community Labs.";
|
||||
public const string UPDATED_COMMUNITY_LABS_WORLD_CONFIRMATION_MESSAGE = "You've updated your Community Labs world.";
|
||||
public const string UPDATED_PUBLIC_WORLD_CONFIRMATION_MESSAGE = "You've updated your public world.";
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8d047eaa3325d654aa62ccad6f73eb93
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,49 @@
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
namespace VRC. SDKBase
|
||||
{
|
||||
public static class GameViewMethods
|
||||
{
|
||||
private static readonly Type GameViewType = System.Type.GetType("UnityEditor.GameView,UnityEditor");
|
||||
private static readonly Type PlayModeViewType = System.Type.GetType("UnityEditor.PlayModeView, UnityEditor");
|
||||
|
||||
public static int GetSelectedSizeIndex()
|
||||
{
|
||||
return (int) GetSelectedSizeProperty().GetValue(GetPlayModeViewObject());
|
||||
}
|
||||
|
||||
public static void SetSelectedSizeIndex(int value)
|
||||
{
|
||||
var selectedSizeIndexProp = GetSelectedSizeProperty();
|
||||
selectedSizeIndexProp.SetValue(GetPlayModeViewObject(), value, null);
|
||||
}
|
||||
|
||||
// Set it to something else just to force a refresh
|
||||
public static void ResizeGameView()
|
||||
{
|
||||
int current = GetSelectedSizeIndex();
|
||||
SetSelectedSizeIndex(current == 0 ? 1 : 0);
|
||||
}
|
||||
|
||||
private static PropertyInfo GetSelectedSizeProperty()
|
||||
{
|
||||
return GameViewType.GetProperty("selectedSizeIndex",
|
||||
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
|
||||
}
|
||||
|
||||
private static Object GetPlayModeViewObject()
|
||||
{
|
||||
MethodInfo GetMainPlayModeView = PlayModeViewType.GetMethod("GetMainPlayModeView",
|
||||
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
|
||||
return GetMainPlayModeView.Invoke(null, null);
|
||||
}
|
||||
|
||||
public static void Repaint()
|
||||
{
|
||||
MethodInfo RepaintAll = PlayModeViewType.GetMethod("RepaintAll", BindingFlags.NonPublic | BindingFlags.Static);
|
||||
RepaintAll.Invoke(GetPlayModeViewObject(), null);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d0c461e358764cd1ab95544e34b0346c
|
||||
timeCreated: 1627603592
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c0f7ad406aeb6f64ab5c36b429a466b7
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,51 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
public class FallbackMaterialCache
|
||||
{
|
||||
private readonly Dictionary<Material, Material> _fallbackMaterialCache = new Dictionary<Material, Material>();
|
||||
|
||||
public void AddFallbackMaterial(Material material, Material fallbackMaterial)
|
||||
{
|
||||
if(!_fallbackMaterialCache.ContainsKey(material))
|
||||
{
|
||||
_fallbackMaterialCache.Add(material, fallbackMaterial);
|
||||
}
|
||||
else
|
||||
{
|
||||
#pragma warning disable RS0030 // Banned APIs
|
||||
Debug.LogError($"Attempted to add a duplicate fallback material '{fallbackMaterial.name}' for original material '{material.name}'.");
|
||||
#pragma warning restore RS0030
|
||||
}
|
||||
}
|
||||
|
||||
public bool TryGetFallbackMaterial(Material material, out Material fallbackMaterial)
|
||||
{
|
||||
if(material != null)
|
||||
{
|
||||
return _fallbackMaterialCache.TryGetValue(material, out fallbackMaterial);
|
||||
}
|
||||
|
||||
fallbackMaterial = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
Material[] cachedFallbackMaterials = _fallbackMaterialCache.Values.ToArray();
|
||||
for(int i = cachedFallbackMaterials.Length - 1; i >= 0; i--)
|
||||
{
|
||||
if (Application.isPlaying)
|
||||
{
|
||||
Object.Destroy(cachedFallbackMaterials[i]);
|
||||
}
|
||||
else
|
||||
{
|
||||
Object.DestroyImmediate(cachedFallbackMaterials[i]);
|
||||
}
|
||||
}
|
||||
|
||||
_fallbackMaterialCache.Clear();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 10121679f780956408f9a434a526f553
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,325 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.IO;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.SceneManagement;
|
||||
using VRC.Core;
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
#endif
|
||||
|
||||
namespace VRCSDK2
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
|
||||
[Obsolete("Runtime uploads are deprecated. Use methods provided by the VRC.SDKBase.Editor.Api.VRCApi class for uploads")]
|
||||
public class RuntimeAPICreation : MonoBehaviour
|
||||
{
|
||||
public VRC.Core.PipelineManager pipelineManager;
|
||||
|
||||
protected bool forceNewFileCreation = false;
|
||||
protected bool useFileApi = false;
|
||||
|
||||
protected bool isUploading = false;
|
||||
protected float uploadProgress = 0f;
|
||||
protected string uploadMessage;
|
||||
protected string uploadTitle;
|
||||
|
||||
protected string uploadVrcPath;
|
||||
protected string uploadUnityPackagePath;
|
||||
|
||||
protected string cloudFrontAssetUrl;
|
||||
protected string cloudFrontImageUrl;
|
||||
protected string cloudFrontUnityPackageUrl;
|
||||
|
||||
protected CameraImageCapture imageCapture;
|
||||
|
||||
private bool cancelRequested = false;
|
||||
|
||||
public static bool publishingToCommunityLabs = false;
|
||||
|
||||
private Dictionary<string, string> mRetryState = new Dictionary<string, string>();
|
||||
|
||||
protected bool isUpdate { get { return pipelineManager.completedSDKPipeline; } }
|
||||
|
||||
protected void Start()
|
||||
{
|
||||
if (!Application.isEditor || !Application.isPlaying)
|
||||
return;
|
||||
|
||||
PipelineSaver ps = GameObject.FindFirstObjectByType<PipelineSaver>();
|
||||
pipelineManager = ps.gameObject.GetComponent<PipelineManager>();
|
||||
|
||||
imageCapture = GetComponent<CameraImageCapture>();
|
||||
imageCapture.shotCamera = GameObject.Find("VRCCam").GetComponent<Camera>();
|
||||
|
||||
LoadUploadRetryStateFromCache();
|
||||
|
||||
forceNewFileCreation = UnityEditor.EditorPrefs.GetBool("forceNewFileCreation", true);
|
||||
useFileApi = UnityEditor.EditorPrefs.GetBool("useFileApi", false);
|
||||
|
||||
API.SetOnlineMode(true);
|
||||
}
|
||||
|
||||
protected void Update()
|
||||
{
|
||||
if (isUploading)
|
||||
{
|
||||
bool cancelled = UnityEditor.EditorUtility.DisplayCancelableProgressBar(uploadTitle, uploadMessage, uploadProgress);
|
||||
if (cancelled)
|
||||
{
|
||||
cancelRequested = true;
|
||||
}
|
||||
|
||||
if (EditorApplication.isPaused)
|
||||
EditorApplication.isPaused = false;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
protected void LoadUploadRetryStateFromCache()
|
||||
{
|
||||
try
|
||||
{
|
||||
string json = File.ReadAllText(GetUploadRetryStateFilePath());
|
||||
mRetryState = VRC.Tools.ObjDictToStringDict(VRC.Tools.JsonDecode(json) as Dictionary<string, object>);
|
||||
|
||||
Debug.LogFormat("<color=yellow> loaded retry state: {0}</color>", json);
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
// normal case
|
||||
return;
|
||||
}
|
||||
|
||||
Debug.Log("Loaded upload retry state from: " + GetUploadRetryStateFilePath());
|
||||
}
|
||||
|
||||
protected void SaveUploadRetryState(string key, string val)
|
||||
{
|
||||
if (string.IsNullOrEmpty(val))
|
||||
return;
|
||||
mRetryState[key] = val;
|
||||
SaveUploadRetryState();
|
||||
}
|
||||
|
||||
protected void SaveUploadRetryState()
|
||||
{
|
||||
try
|
||||
{
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(GetUploadRetryStateFilePath()));
|
||||
string json = VRC.Tools.JsonEncode(mRetryState);
|
||||
File.WriteAllText(GetUploadRetryStateFilePath(), json);
|
||||
|
||||
Debug.LogFormat("<color=yellow> wrote retry state: {0}</color>", json);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogError("Couldn't save upload retry state: " + GetUploadRetryStateFilePath() + "\n" + e.Message);
|
||||
return;
|
||||
}
|
||||
|
||||
Debug.Log("Saved upload retry state to: " + GetUploadRetryStateFilePath());
|
||||
}
|
||||
|
||||
protected void ClearUploadRetryState()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!File.Exists(GetUploadRetryStateFilePath()))
|
||||
return;
|
||||
|
||||
File.Delete(GetUploadRetryStateFilePath());
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogError("Couldn't delete upload retry state: " + GetUploadRetryStateFilePath() + "\n" + e.Message);
|
||||
return;
|
||||
}
|
||||
|
||||
Debug.Log("Cleared upload retry state at: " + GetUploadRetryStateFilePath());
|
||||
}
|
||||
|
||||
protected string GetUploadRetryStateFilePath()
|
||||
{
|
||||
string id = UnityEditor.AssetDatabase.AssetPathToGUID(SceneManager.GetActiveScene().path);
|
||||
return Path.Combine(VRC.Tools.GetTempFolderPath(id), "upload_retry.dat");
|
||||
}
|
||||
|
||||
protected string GetUploadRetryStateValue(string key)
|
||||
{
|
||||
return mRetryState.ContainsKey(key) ? mRetryState[key] : "";
|
||||
}
|
||||
|
||||
protected virtual void DisplayUpdateCompletedDialog(string contentUrl=null)
|
||||
{
|
||||
if (UnityEditor.EditorUtility.DisplayDialog("VRChat SDK", "Update Complete! Launch VRChat to see your uploaded content." + (null==contentUrl ? "" : "\n\nManage content at: " + contentUrl ), (null == contentUrl) ? "Okay" : CommunityLabsConstants.MANAGE_WORLD_IN_BROWSER_STRING, (null == contentUrl) ? "" : "Done" ))
|
||||
{
|
||||
if (null!=contentUrl)
|
||||
{
|
||||
Application.OpenURL(contentUrl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void OnSDKPipelineComplete(string contentUrl=null)
|
||||
{
|
||||
VRC.Core.Logger.Log("OnSDKPipelineComplete", API.LOG_CATEGORY);
|
||||
isUploading = false;
|
||||
pipelineManager.completedSDKPipeline = true;
|
||||
ClearUploadRetryState();
|
||||
UnityEditor.EditorPrefs.SetBool("forceNewFileCreation", false);
|
||||
UnityEditor.EditorApplication.isPaused = false;
|
||||
UnityEditor.EditorApplication.isPlaying = false;
|
||||
UnityEditor.EditorUtility.ClearProgressBar();
|
||||
DisplayUpdateCompletedDialog(contentUrl);
|
||||
}
|
||||
|
||||
protected void OnSDKPipelineError(string error, string details)
|
||||
{
|
||||
VRC.Core.Logger.Log("OnSDKPipelineError: " + error + " - " + details, API.LOG_CATEGORY);
|
||||
isUploading = false;
|
||||
pipelineManager.completedSDKPipeline = true;
|
||||
UnityEditor.EditorApplication.isPaused = false;
|
||||
UnityEditor.EditorApplication.isPlaying = false;
|
||||
UnityEditor.EditorUtility.ClearProgressBar();
|
||||
if (cancelRequested)
|
||||
UnityEditor.EditorUtility.DisplayDialog("VRChat SDK", "The update was cancelled.", "Okay");
|
||||
else
|
||||
UnityEditor.EditorUtility.DisplayDialog("VRChat SDK", "Error updating content. " + error + "\n" + details, "Okay");
|
||||
}
|
||||
|
||||
protected void SetUploadProgress(string title, string message, float progress)
|
||||
{
|
||||
uploadTitle = title;
|
||||
uploadMessage = message;
|
||||
uploadProgress = progress;
|
||||
}
|
||||
|
||||
protected bool WasCancelRequested(ApiFile apiFile)
|
||||
{
|
||||
return cancelRequested;
|
||||
}
|
||||
|
||||
protected void PrepareUnityPackageForS3(string packagePath, string blueprintId, int version, AssetVersion assetVersion)
|
||||
{
|
||||
uploadUnityPackagePath = Application.temporaryCachePath + "/" + blueprintId + "_" + version.ToString() + "_" + Application.unityVersion + "_" + assetVersion.ApiVersion + "_" + VRC.Tools.Platform +
|
||||
"_" + API.GetServerEnvironmentForApiUrl() + ".unitypackage";
|
||||
uploadUnityPackagePath.Trim();
|
||||
uploadUnityPackagePath.Replace(' ', '_');
|
||||
|
||||
if (System.IO.File.Exists(uploadUnityPackagePath))
|
||||
System.IO.File.Delete(uploadUnityPackagePath);
|
||||
|
||||
System.IO.File.Copy(packagePath, uploadUnityPackagePath);
|
||||
}
|
||||
|
||||
protected void PrepareVRCPathForS3(string abPath, string blueprintId, int version, AssetVersion assetVersion)
|
||||
{
|
||||
uploadVrcPath = Application.temporaryCachePath + "/" + blueprintId + "_" + version.ToString() + "_" + Application.unityVersion + "_" + assetVersion.ApiVersion + "_" + VRC.Tools.Platform + "_" + API.GetServerEnvironmentForApiUrl() + System.IO.Path.GetExtension(abPath);
|
||||
uploadVrcPath.Trim();
|
||||
uploadVrcPath.Replace(' ', '_');
|
||||
|
||||
if (System.IO.File.Exists(uploadVrcPath))
|
||||
System.IO.File.Delete(uploadVrcPath);
|
||||
|
||||
System.IO.File.Copy(abPath, uploadVrcPath);
|
||||
}
|
||||
|
||||
protected IEnumerator UploadFile(string filename, string existingFileUrl, string friendlyFilename, string fileType, Action<string> onSuccess)
|
||||
{
|
||||
if (string.IsNullOrEmpty(filename))
|
||||
yield break;
|
||||
VRC.Core.Logger.Log("Uploading " + fileType + "(" + filename + ") ...", API.LOG_CATEGORY);
|
||||
SetUploadProgress("Uploading " + fileType + "...", "", 0.0f);
|
||||
|
||||
string fileId = GetUploadRetryStateValue(filename);
|
||||
if (string.IsNullOrEmpty(fileId))
|
||||
fileId = isUpdate ? ApiFile.ParseFileIdFromFileAPIUrl(existingFileUrl) : "";
|
||||
string errorStr = "";
|
||||
string newFileUrl = "";
|
||||
|
||||
|
||||
yield return StartCoroutine(ApiFileHelper.Instance.UploadFile(filename, forceNewFileCreation ? "" : fileId, friendlyFilename,
|
||||
delegate (ApiFile apiFile, string message)
|
||||
{
|
||||
newFileUrl = apiFile.GetFileURL();
|
||||
if (VRC.Core.Logger.CategoryIsEnabled(API.LOG_CATEGORY))
|
||||
VRC.Core.Logger.Log(fileType + " upload succeeded: " + message + " (" + filename +
|
||||
") => " + apiFile.ToString(), API.LOG_CATEGORY);
|
||||
else
|
||||
VRC.Core.Logger.Log(fileType + " upload succeeded ");
|
||||
},
|
||||
delegate (ApiFile apiFile, string error)
|
||||
{
|
||||
SaveUploadRetryState(filename, apiFile.id);
|
||||
|
||||
errorStr = error;
|
||||
Debug.LogError(fileType + " upload failed: " + error + " (" + filename +
|
||||
") => " + apiFile.ToString());
|
||||
},
|
||||
delegate (ApiFile apiFile, string status, string subStatus, float pct)
|
||||
{
|
||||
SetUploadProgress("Uploading " + fileType + "...", status + (!string.IsNullOrEmpty(subStatus) ? " (" + subStatus + ")" : ""), pct);
|
||||
},
|
||||
WasCancelRequested
|
||||
));
|
||||
|
||||
if (!string.IsNullOrEmpty(errorStr))
|
||||
{
|
||||
OnSDKPipelineError(fileType + " upload failed.", errorStr);
|
||||
yield break;
|
||||
}
|
||||
|
||||
if (onSuccess != null)
|
||||
onSuccess(newFileUrl);
|
||||
}
|
||||
|
||||
protected IEnumerator UpdateImage(string existingFileUrl, string friendlyFileName)
|
||||
{
|
||||
string imagePath = imageCapture.TakePicture();
|
||||
|
||||
if (!string.IsNullOrEmpty(imagePath))
|
||||
{
|
||||
yield return StartCoroutine(UploadFile(imagePath, existingFileUrl, friendlyFileName, "Image",
|
||||
delegate (string fileUrl)
|
||||
{
|
||||
cloudFrontImageUrl = fileUrl;
|
||||
}
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual IEnumerator CreateBlueprint()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected virtual IEnumerator UpdateBlueprint()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected bool ValidateNameInput(InputField nameInput)
|
||||
{
|
||||
bool isValid = true;
|
||||
if (string.IsNullOrEmpty(nameInput.text))
|
||||
{
|
||||
isUploading = false;
|
||||
UnityEditor.EditorUtility.DisplayDialog("Invalid Input", "Cannot leave the name field empty.", "OK");
|
||||
isValid = false;
|
||||
}
|
||||
return isValid;
|
||||
}
|
||||
|
||||
protected bool ValidateAssetBundleBlueprintID(string blueprintID)
|
||||
{
|
||||
string lastBuiltID = UnityEditor.EditorPrefs.GetString("lastBuiltAssetBundleBlueprintID", "");
|
||||
return !string.IsNullOrEmpty(lastBuiltID) && lastBuiltID == blueprintID;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a3132e0ab7e16494a9d492087a1ca447
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,421 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using VRC.Core;
|
||||
using VRC.SDKBase;
|
||||
using VRC.SDK3.Image;
|
||||
|
||||
namespace VRCSDK2
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
[Obsolete("Runtime uploads are deprecated. Use methods provided by the VRC.SDKBase.Editor.Api.VRCApi class for uploads")]
|
||||
public class RuntimeBlueprintCreation : RuntimeAPICreation
|
||||
{
|
||||
public GameObject waitingPanel;
|
||||
public GameObject blueprintPanel;
|
||||
public GameObject errorPanel;
|
||||
|
||||
public Text titleText;
|
||||
public InputField blueprintName;
|
||||
public InputField blueprintDescription;
|
||||
public RawImage bpImage;
|
||||
public Image liveBpImage;
|
||||
public Toggle shouldUpdateImageToggle;
|
||||
public Toggle contentSex;
|
||||
public Toggle contentViolence;
|
||||
public Toggle contentGore;
|
||||
public Toggle contentOther;
|
||||
public Toggle developerAvatar;
|
||||
public Toggle sharePrivate;
|
||||
public Toggle sharePublic;
|
||||
public Toggle tagFallback;
|
||||
|
||||
public UnityEngine.UI.Button uploadButton;
|
||||
|
||||
private ApiAvatar apiAvatar;
|
||||
|
||||
new void Start()
|
||||
{
|
||||
if (!Application.isEditor || !Application.isPlaying)
|
||||
return;
|
||||
|
||||
base.Start();
|
||||
|
||||
var desc = pipelineManager.GetComponent<VRC.SDKBase.VRC_AvatarDescriptor>();
|
||||
desc.PositionPortraitCamera(imageCapture.shotCamera.transform);
|
||||
|
||||
Application.runInBackground = true;
|
||||
UnityEngine.XR.XRSettings.enabled = false;
|
||||
|
||||
uploadButton.onClick.AddListener(SetupUpload);
|
||||
|
||||
shouldUpdateImageToggle.onValueChanged.AddListener(ToggleUpdateImage);
|
||||
|
||||
Login();
|
||||
}
|
||||
|
||||
void LoginErrorCallback(string obj)
|
||||
{
|
||||
VRC.Core.Logger.LogError("Could not log in - " + obj);
|
||||
blueprintPanel.SetActive(false);
|
||||
errorPanel.SetActive(true);
|
||||
}
|
||||
|
||||
void Login()
|
||||
{
|
||||
if (!ApiCredentials.Load())
|
||||
LoginErrorCallback("Not logged in");
|
||||
else
|
||||
APIUser.InitialFetchCurrentUser(
|
||||
delegate (ApiModelContainer<APIUser> c)
|
||||
{
|
||||
pipelineManager.user = c.Model as APIUser;
|
||||
|
||||
ApiAvatar av = new ApiAvatar() { id = pipelineManager.blueprintId };
|
||||
av.Get(false,
|
||||
(c2) =>
|
||||
{
|
||||
VRC.Core.Logger.Log("<color=magenta>Updating an existing avatar.</color>", API.LOG_CATEGORY);
|
||||
apiAvatar = c2.Model as ApiAvatar;
|
||||
pipelineManager.completedSDKPipeline = !string.IsNullOrEmpty(apiAvatar.authorId);
|
||||
SetupUI();
|
||||
},
|
||||
(c2) =>
|
||||
{
|
||||
VRC.Core.Logger.Log("<color=magenta>Creating a new avatar.</color>", API.LOG_CATEGORY);
|
||||
apiAvatar = new ApiAvatar();
|
||||
apiAvatar.id = pipelineManager.blueprintId;
|
||||
pipelineManager.completedSDKPipeline = !string.IsNullOrEmpty(apiAvatar.authorId);
|
||||
SetupUI();
|
||||
});
|
||||
}, (c) => {
|
||||
LoginErrorCallback(c.Error);
|
||||
});
|
||||
}
|
||||
|
||||
void SetupUI()
|
||||
{
|
||||
if (!ValidateAssetBundleBlueprintID(apiAvatar.id))
|
||||
{
|
||||
blueprintPanel.SetActive(false);
|
||||
errorPanel.SetActive(true);
|
||||
OnSDKPipelineError("The asset bundle is out of date. Please rebuild the scene using 'New Build'.", "The blueprint ID in the scene does not match the id in the asset bundle.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (APIUser.Exists(pipelineManager.user))
|
||||
{
|
||||
waitingPanel.SetActive(false);
|
||||
blueprintPanel.SetActive(true);
|
||||
errorPanel.SetActive(false);
|
||||
|
||||
if (isUpdate)
|
||||
{
|
||||
// bp update
|
||||
if (apiAvatar.authorId == pipelineManager.user.id)
|
||||
{
|
||||
titleText.text = "Update Avatar";
|
||||
// apiAvatar = pipelineManager.user.GetBlueprint(pipelineManager.blueprintId) as ApiAvatar;
|
||||
blueprintName.text = apiAvatar.name;
|
||||
contentSex.isOn = apiAvatar.tags.Contains("content_sex");
|
||||
contentViolence.isOn = apiAvatar.tags.Contains("content_violence");
|
||||
contentGore.isOn = apiAvatar.tags.Contains("content_gore");
|
||||
contentOther.isOn = apiAvatar.tags.Contains("content_other");
|
||||
developerAvatar.isOn = apiAvatar.tags.Contains("developer");
|
||||
sharePrivate.isOn = apiAvatar.releaseStatus.Contains("private");
|
||||
sharePublic.isOn = apiAvatar.releaseStatus.Contains("public");
|
||||
|
||||
tagFallback.isOn = apiAvatar.tags.Contains("author_quest_fallback");
|
||||
tagFallback.transform.parent.gameObject.SetActive(true);
|
||||
|
||||
switch (pipelineManager.fallbackStatus)
|
||||
{
|
||||
case PipelineManager.FallbackStatus.Valid:
|
||||
#if UNITY_ANDROID || UNITY_IOS
|
||||
tagFallback.interactable = true;
|
||||
tagFallback.GetComponentInChildren<Text>().text = "Use for Fallback";
|
||||
#else
|
||||
tagFallback.interactable = false;
|
||||
tagFallback.GetComponentInChildren<Text>().text = "Use for Fallback (change only with Android upload)";
|
||||
#endif
|
||||
break;
|
||||
case PipelineManager.FallbackStatus.InvalidPerformance:
|
||||
case PipelineManager.FallbackStatus.InvalidRig:
|
||||
tagFallback.isOn = false; // need to remove tag on this upload, the updated version is not up-to-spec
|
||||
tagFallback.interactable = false;
|
||||
tagFallback.GetComponentInChildren<Text>().text = "Use for Fallback (avatar not valid, tag will be cleared)";
|
||||
break;
|
||||
}
|
||||
|
||||
blueprintDescription.text = apiAvatar.description;
|
||||
shouldUpdateImageToggle.interactable = true;
|
||||
shouldUpdateImageToggle.isOn = false;
|
||||
liveBpImage.enabled = false;
|
||||
bpImage.enabled = true;
|
||||
|
||||
ImageDownloader.DownloadImage(apiAvatar.imageUrl, 0, (Texture2D obj) => bpImage.texture = obj, null);
|
||||
}
|
||||
else // user does not own apiAvatar id associated with descriptor
|
||||
{
|
||||
Debug.LogErrorFormat("{0} is not an owner of {1}", apiAvatar.authorId, pipelineManager.user.id);
|
||||
blueprintPanel.SetActive(false);
|
||||
errorPanel.SetActive(true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
titleText.text = "New Avatar";
|
||||
shouldUpdateImageToggle.interactable = false;
|
||||
shouldUpdateImageToggle.isOn = true;
|
||||
liveBpImage.enabled = true;
|
||||
bpImage.enabled = false;
|
||||
tagFallback.isOn = false;
|
||||
|
||||
// Janky fix for an avatar's blueprint image not showing up the very first time you press publish in a project until you resize the window
|
||||
// can remove if we fix the underlying issue or move publishing out of Play Mode
|
||||
string firstTimeResize = $"{Application.identifier}-firstTimeResize";
|
||||
if (!PlayerPrefs.HasKey(firstTimeResize))
|
||||
{
|
||||
GameViewMethods.ResizeGameView();
|
||||
PlayerPrefs.SetInt(firstTimeResize, 1);
|
||||
}
|
||||
|
||||
tagFallback.transform.parent.gameObject.SetActive(true);
|
||||
switch (pipelineManager.fallbackStatus)
|
||||
{
|
||||
case PipelineManager.FallbackStatus.Valid:
|
||||
#if UNITY_ANDROID || UNITY_IOS
|
||||
tagFallback.interactable = true;
|
||||
tagFallback.GetComponentInChildren<Text>().text = "Use for Fallback";
|
||||
#else
|
||||
tagFallback.interactable = false;
|
||||
tagFallback.GetComponentInChildren<Text>().text = "Use for Fallback (change only with Android upload)";
|
||||
#endif
|
||||
break;
|
||||
case PipelineManager.FallbackStatus.InvalidPerformance:
|
||||
case PipelineManager.FallbackStatus.InvalidRig:
|
||||
tagFallback.transform.parent.gameObject.SetActive(true);
|
||||
tagFallback.interactable = false;
|
||||
tagFallback.GetComponentInChildren<Text>().text = "Use for Fallback (avatar not valid, tag will be cleared)";
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
waitingPanel.SetActive(true);
|
||||
blueprintPanel.SetActive(false);
|
||||
errorPanel.SetActive(false);
|
||||
}
|
||||
|
||||
if (APIUser.CurrentUser != null && APIUser.CurrentUser.hasSuperPowers)
|
||||
developerAvatar.gameObject.SetActive(true);
|
||||
else
|
||||
developerAvatar.gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
public void SetupUpload()
|
||||
{
|
||||
uploadTitle = "Preparing For Upload";
|
||||
isUploading = true;
|
||||
|
||||
string abPath = UnityEditor.EditorPrefs.GetString("currentBuildingAssetBundlePath");
|
||||
|
||||
string unityPackagePath = UnityEditor.EditorPrefs.GetString("VRC_exportedUnityPackagePath");
|
||||
|
||||
UnityEditor.EditorPrefs.SetBool("VRCSDK2_scene_changed", true);
|
||||
UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_sex", contentSex.isOn);
|
||||
UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_violence", contentViolence.isOn);
|
||||
UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_gore", contentGore.isOn);
|
||||
UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_other", contentOther.isOn);
|
||||
|
||||
if (string.IsNullOrEmpty(apiAvatar.id))
|
||||
{
|
||||
pipelineManager.AssignId(PipelineManager.ContentType.avatar);
|
||||
apiAvatar.id = pipelineManager.blueprintId;
|
||||
}
|
||||
|
||||
string avatarId = apiAvatar.id;
|
||||
int version = isUpdate ? apiAvatar.version + 1 : 1;
|
||||
PrepareVRCPathForS3(abPath, avatarId, version, ApiAvatar.VERSION);
|
||||
|
||||
if (!string.IsNullOrEmpty(unityPackagePath) && System.IO.File.Exists(unityPackagePath))
|
||||
{
|
||||
VRC.Core.Logger.Log("Found unity package path. Preparing to upload!", API.LOG_CATEGORY);
|
||||
PrepareUnityPackageForS3(unityPackagePath, avatarId, version, ApiAvatar.VERSION);
|
||||
}
|
||||
|
||||
StartCoroutine(UploadNew());
|
||||
}
|
||||
|
||||
IEnumerator UploadNew()
|
||||
{
|
||||
bool caughtInvalidInput = false;
|
||||
if (!ValidateNameInput(blueprintName))
|
||||
caughtInvalidInput = true;
|
||||
|
||||
if (caughtInvalidInput)
|
||||
yield break;
|
||||
|
||||
VRC.Core.Logger.Log("Starting upload");
|
||||
|
||||
// upload unity package
|
||||
if (!string.IsNullOrEmpty(uploadUnityPackagePath))
|
||||
{
|
||||
yield return StartCoroutine(UploadFile(uploadUnityPackagePath, "", GetFriendlyAvatarFileName("Unity package"), "Unity package",
|
||||
delegate (string fileUrl)
|
||||
{
|
||||
cloudFrontUnityPackageUrl = fileUrl;
|
||||
}
|
||||
));
|
||||
}
|
||||
|
||||
// upload asset bundle
|
||||
if (!string.IsNullOrEmpty(uploadVrcPath))
|
||||
{
|
||||
yield return StartCoroutine(UploadFile(uploadVrcPath, isUpdate ? apiAvatar.assetUrl : "", GetFriendlyAvatarFileName("Asset bundle"), "Asset bundle",
|
||||
delegate (string fileUrl)
|
||||
{
|
||||
cloudFrontAssetUrl = fileUrl;
|
||||
}
|
||||
));
|
||||
}
|
||||
|
||||
if (isUpdate)
|
||||
yield return StartCoroutine(UpdateBlueprint());
|
||||
else
|
||||
yield return StartCoroutine(CreateBlueprint());
|
||||
|
||||
OnSDKPipelineComplete();
|
||||
}
|
||||
|
||||
private string GetFriendlyAvatarFileName(string type)
|
||||
{
|
||||
return "Avatar - " + blueprintName.text + " - " + type + " - " + Application.unityVersion + "_" + ApiWorld.VERSION.ApiVersion +
|
||||
"_" + VRC.Tools.Platform + "_" + API.GetServerEnvironmentForApiUrl();
|
||||
}
|
||||
|
||||
List<string> BuildTags()
|
||||
{
|
||||
var tags = new List<string>();
|
||||
if (contentSex.isOn)
|
||||
tags.Add("content_sex");
|
||||
if (contentViolence.isOn)
|
||||
tags.Add("content_violence");
|
||||
if (contentGore.isOn)
|
||||
tags.Add("content_gore");
|
||||
if (contentOther.isOn)
|
||||
tags.Add("content_other");
|
||||
|
||||
if (APIUser.CurrentUser.hasSuperPowers)
|
||||
{
|
||||
if (developerAvatar.isOn)
|
||||
tags.Add("developer");
|
||||
}
|
||||
|
||||
if (tagFallback.isOn)
|
||||
tags.Add("author_quest_fallback");
|
||||
|
||||
return tags;
|
||||
}
|
||||
|
||||
protected override IEnumerator CreateBlueprint()
|
||||
{
|
||||
yield return StartCoroutine(UpdateImage(isUpdate ? apiAvatar.imageUrl : "", GetFriendlyAvatarFileName("Image")));
|
||||
|
||||
ApiAvatar avatar = new ApiAvatar
|
||||
{
|
||||
id = pipelineManager.blueprintId,
|
||||
authorName = pipelineManager.user.displayName,
|
||||
authorId = pipelineManager.user.id,
|
||||
name = blueprintName.text,
|
||||
imageUrl = cloudFrontImageUrl,
|
||||
assetUrl = cloudFrontAssetUrl,
|
||||
description = blueprintDescription.text,
|
||||
tags = BuildTags(),
|
||||
releaseStatus = sharePublic.isOn ? "public" : "private"
|
||||
};
|
||||
|
||||
bool doneUploading = false;
|
||||
bool wasError = false;
|
||||
|
||||
avatar.Post(
|
||||
(c) =>
|
||||
{
|
||||
ApiAvatar savedBP = (ApiAvatar)c.Model;
|
||||
pipelineManager.blueprintId = savedBP.id;
|
||||
UnityEditor.EditorPrefs.SetString("blueprintID-" + pipelineManager.GetInstanceID().ToString(), savedBP.id);
|
||||
|
||||
doneUploading = true;
|
||||
},
|
||||
(c) =>
|
||||
{
|
||||
Debug.LogError(c.Error);
|
||||
SetUploadProgress("Saving Avatar", "Error saving blueprint.", 0.0f);
|
||||
doneUploading = true;
|
||||
wasError = true;
|
||||
});
|
||||
|
||||
while (!doneUploading)
|
||||
yield return null;
|
||||
|
||||
if (wasError)
|
||||
yield return new WaitUntil(() => UnityEditor.EditorUtility.DisplayDialog("VRChat SDK", "Error saving blueprint.", "Okay"));
|
||||
}
|
||||
|
||||
protected override IEnumerator UpdateBlueprint()
|
||||
{
|
||||
bool doneUploading = false;
|
||||
|
||||
apiAvatar.name = blueprintName.text;
|
||||
apiAvatar.description = blueprintDescription.text;
|
||||
apiAvatar.assetUrl = cloudFrontAssetUrl;
|
||||
apiAvatar.releaseStatus = sharePublic.isOn ? "public" : "private";
|
||||
apiAvatar.tags = BuildTags();
|
||||
|
||||
if (shouldUpdateImageToggle.isOn)
|
||||
{
|
||||
yield return StartCoroutine(UpdateImage(isUpdate ? apiAvatar.imageUrl : "", GetFriendlyAvatarFileName("Image")));
|
||||
apiAvatar.imageUrl = cloudFrontImageUrl;
|
||||
}
|
||||
|
||||
SetUploadProgress("Saving Avatar", "Almost finished!!", 0.8f);
|
||||
apiAvatar.Save(
|
||||
(c) => {doneUploading = true; },
|
||||
(c) => {
|
||||
Debug.LogError(c.Error);
|
||||
SetUploadProgress("Saving Avatar", "Error saving blueprint.", 0.0f);
|
||||
doneUploading = true;
|
||||
});
|
||||
|
||||
while (!doneUploading)
|
||||
yield return null;
|
||||
}
|
||||
|
||||
void ToggleUpdateImage(bool isOn)
|
||||
{
|
||||
if (isOn)
|
||||
{
|
||||
bpImage.enabled = false;
|
||||
liveBpImage.enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
bpImage.enabled = true;
|
||||
liveBpImage.enabled = false;
|
||||
ImageDownloader.DownloadImage(apiAvatar.imageUrl, 0, obj => bpImage.texture = obj, null);
|
||||
}
|
||||
}
|
||||
|
||||
void OnDestroy()
|
||||
{
|
||||
UnityEditor.EditorUtility.ClearProgressBar();
|
||||
UnityEditor.EditorPrefs.DeleteKey("currentBuildingAssetBundlePath");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1e5ebf65c5dceeb4c909aa7812bd2999
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,669 @@
|
||||
#define COMMUNITY_LABS_SDK
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityEngine.SceneManagement;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Resources;
|
||||
using VRC.Core;
|
||||
using System;
|
||||
using System.IO;
|
||||
using VRC.SDK3.Image;
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
using VRC.SDKBase;
|
||||
#endif
|
||||
|
||||
namespace VRCSDK2
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
[Obsolete("Runtime uploads are deprecated. Use methods provided by the VRC.SDKBase.Editor.Api.VRCApi class for uploads")]
|
||||
public class RuntimeWorldCreation : RuntimeAPICreation
|
||||
{
|
||||
public VRC_SceneDescriptor descriptor;
|
||||
|
||||
public GameObject waitingPanel;
|
||||
public GameObject blueprintPanel;
|
||||
public GameObject errorPanel;
|
||||
|
||||
public Text titleText;
|
||||
public InputField blueprintName;
|
||||
public InputField blueprintDescription;
|
||||
public InputField worldCapacity;
|
||||
public RawImage bpImage;
|
||||
public Image liveBpImage;
|
||||
public Toggle shouldUpdateImageToggle;
|
||||
public Toggle releasePublic;
|
||||
public Toggle contentNsfw;
|
||||
|
||||
public Toggle contentSex;
|
||||
public Toggle contentViolence;
|
||||
public Toggle contentGore;
|
||||
public Toggle contentOther;
|
||||
|
||||
public Toggle contentFeatured;
|
||||
public Toggle contentSDKExample;
|
||||
|
||||
public Image showInWorldsMenuGroup;
|
||||
public Toggle showInActiveWorlds;
|
||||
public Toggle showInPopularWorlds;
|
||||
public Toggle showInNewWorlds;
|
||||
|
||||
public InputField userTags;
|
||||
|
||||
public UnityEngine.UI.Button uploadButton;
|
||||
|
||||
public UnityEngine.UI.Button openCommunityLabsDocsButton;
|
||||
|
||||
public GameObject publishToCommunityLabsPanel;
|
||||
|
||||
private Toggle publishToCommLabsToggle;
|
||||
|
||||
private ApiWorld worldRecord;
|
||||
|
||||
private const int MAX_USER_TAGS_FOR_WORLD = 5;
|
||||
private const int MAX_CHARACTERS_ALLOWED_IN_USER_TAG = 20;
|
||||
List<String> customTags;
|
||||
|
||||
public static bool IsCurrentWorldInCommunityLabs = false;
|
||||
public static bool IsCurrentWorldUploaded = false;
|
||||
public static bool IsCurrentWorldPubliclyPublished = false;
|
||||
public static bool HasExceededPublishLimit = false;
|
||||
|
||||
new void Start()
|
||||
{
|
||||
if (!Application.isEditor || !Application.isPlaying)
|
||||
return;
|
||||
|
||||
base.Start();
|
||||
|
||||
IsCurrentWorldInCommunityLabs = false;
|
||||
IsCurrentWorldUploaded = false;
|
||||
IsCurrentWorldPubliclyPublished = false;
|
||||
|
||||
|
||||
descriptor = pipelineManager.GetComponent<VRC.SDKBase.VRC_SceneDescriptor>();
|
||||
descriptor.PositionPortraitCamera(imageCapture.shotCamera.transform);
|
||||
|
||||
Application.runInBackground = true;
|
||||
UnityEngine.XR.XRSettings.enabled = false;
|
||||
|
||||
uploadButton.onClick.AddListener(SetupUpload);
|
||||
|
||||
openCommunityLabsDocsButton.onClick.AddListener(OpenCommunityLabsDocumentation);
|
||||
|
||||
shouldUpdateImageToggle.onValueChanged.AddListener(ToggleUpdateImage);
|
||||
|
||||
releasePublic.gameObject.SetActive(false);
|
||||
|
||||
System.Action<string> onError = (err) => {
|
||||
VRC.Core.Logger.LogError("Could not authenticate - " + err);
|
||||
blueprintPanel.SetActive(false);
|
||||
errorPanel.SetActive(true);
|
||||
};
|
||||
|
||||
if (!ApiCredentials.Load())
|
||||
onError("Not logged in");
|
||||
else
|
||||
APIUser.InitialFetchCurrentUser(
|
||||
delegate (ApiModelContainer<APIUser> c)
|
||||
{
|
||||
UserLoggedInCallback(c.Model as APIUser);
|
||||
},
|
||||
delegate (ApiModelContainer<APIUser> c)
|
||||
{
|
||||
onError(c.Error);
|
||||
}
|
||||
);
|
||||
|
||||
#if !COMMUNITY_LABS_SDK
|
||||
publishToCommunityLabsPanel.gameObject.SetActive(false);
|
||||
#endif
|
||||
}
|
||||
|
||||
void UserLoggedInCallback(APIUser user)
|
||||
{
|
||||
pipelineManager.user = user;
|
||||
|
||||
ApiWorld model = new ApiWorld();
|
||||
model.id = pipelineManager.blueprintId;
|
||||
model.Fetch(null,
|
||||
(c) =>
|
||||
{
|
||||
VRC.Core.Logger.Log("<color=magenta>Updating an existing world.</color>", API.LOG_CATEGORY);
|
||||
worldRecord = c.Model as ApiWorld;
|
||||
pipelineManager.completedSDKPipeline = !string.IsNullOrEmpty(worldRecord.authorId);
|
||||
GetUserUploadInformationAndSetupUI(model.id);
|
||||
},
|
||||
(c) =>
|
||||
{
|
||||
VRC.Core.Logger.Log("<color=magenta>World record not found, creating a new world.</color>", API.LOG_CATEGORY);
|
||||
worldRecord = new ApiWorld { capacity = 16 };
|
||||
pipelineManager.completedSDKPipeline = false;
|
||||
worldRecord.id = pipelineManager.blueprintId;
|
||||
GetUserUploadInformationAndSetupUI(model.id);
|
||||
});
|
||||
}
|
||||
|
||||
void CheckWorldStatus(string worldId, Action onCheckComplete)
|
||||
{
|
||||
// check if world has been previously uploaded, and if world is in community labs
|
||||
ApiWorld.FetchUploadedWorlds(
|
||||
delegate (IEnumerable<ApiWorld> worlds)
|
||||
{
|
||||
ApiWorld selectedWorld = worlds.FirstOrDefault(w => w.id == worldId);
|
||||
if (null!=selectedWorld)
|
||||
{
|
||||
IsCurrentWorldInCommunityLabs = selectedWorld.IsCommunityLabsWorld;
|
||||
IsCurrentWorldPubliclyPublished = selectedWorld.IsPublicPublishedWorld;
|
||||
IsCurrentWorldUploaded = true;
|
||||
}
|
||||
if (onCheckComplete != null) onCheckComplete();
|
||||
|
||||
},
|
||||
delegate (string err)
|
||||
{
|
||||
IsCurrentWorldInCommunityLabs = false;
|
||||
IsCurrentWorldUploaded = false;
|
||||
IsCurrentWorldPubliclyPublished = false;
|
||||
Debug.Log("CheckWorldStatus error:" + err);
|
||||
if (onCheckComplete != null) onCheckComplete();
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
void GetUserUploadInformationAndSetupUI(string worldId)
|
||||
{
|
||||
CheckWorldStatus(worldId, delegate()
|
||||
{
|
||||
bool hasSufficientTrustLevelToPublishToCommunityLabs = APIUser.CurrentUser.hasKnownTrustLevel;
|
||||
APIUser.FetchPublishWorldsInformation(
|
||||
(c) =>
|
||||
{
|
||||
try
|
||||
{
|
||||
if (c["canPublish"].Type == BestHTTP.JSON.Json.TokenType.Boolean)
|
||||
{
|
||||
HasExceededPublishLimit = !(bool)(c["canPublish"]);
|
||||
}
|
||||
else
|
||||
HasExceededPublishLimit = true;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
HasExceededPublishLimit = true;
|
||||
}
|
||||
|
||||
if(Application.isPlaying)
|
||||
{
|
||||
SetupUI(hasSufficientTrustLevelToPublishToCommunityLabs, HasExceededPublishLimit);
|
||||
}
|
||||
},
|
||||
(c) =>
|
||||
{
|
||||
if(Application.isPlaying)
|
||||
{
|
||||
SetupUI(hasSufficientTrustLevelToPublishToCommunityLabs, HasExceededPublishLimit);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
void SetupUI(bool hasEnoughTrustToPublishToCL = false, bool hasExceededWeeklyPublishLimit = false)
|
||||
{
|
||||
#if COMMUNITY_LABS_SDK
|
||||
// do not display community labs panel if updating an existing CL world or updating a public world
|
||||
publishToCommunityLabsPanel.gameObject.SetActive(!IsCurrentWorldUploaded);
|
||||
#endif
|
||||
|
||||
if (!ValidateAssetBundleBlueprintID(worldRecord.id))
|
||||
{
|
||||
blueprintPanel.SetActive(false);
|
||||
errorPanel.SetActive(true);
|
||||
OnSDKPipelineError("The asset bundle is out of date. Please rebuild the scene using 'New Build'.", "The blueprint ID in the scene does not match the id in the asset bundle.");
|
||||
return;
|
||||
}
|
||||
|
||||
contentFeatured.gameObject.SetActive(APIUser.CurrentUser.hasSuperPowers);
|
||||
contentSDKExample.gameObject.SetActive(APIUser.CurrentUser.hasSuperPowers);
|
||||
|
||||
if (APIUser.Exists(pipelineManager.user))
|
||||
{
|
||||
waitingPanel.SetActive(false);
|
||||
blueprintPanel.SetActive(true);
|
||||
errorPanel.SetActive(false);
|
||||
|
||||
if (string.IsNullOrEmpty(worldRecord.authorId) || worldRecord.authorId == pipelineManager.user.id)
|
||||
{
|
||||
titleText.text = "Configure World";
|
||||
blueprintName.text = worldRecord.name;
|
||||
worldCapacity.text = worldRecord.capacity.ToString();
|
||||
contentSex.isOn = worldRecord.tags.Contains("content_sex");
|
||||
contentViolence.isOn = worldRecord.tags.Contains("content_violence");
|
||||
contentGore.isOn = worldRecord.tags.Contains("content_gore");
|
||||
contentOther.isOn = worldRecord.tags.Contains("content_other");
|
||||
shouldUpdateImageToggle.interactable = isUpdate;
|
||||
shouldUpdateImageToggle.isOn = !isUpdate;
|
||||
liveBpImage.enabled = !isUpdate;
|
||||
bpImage.enabled = isUpdate;
|
||||
|
||||
if (!APIUser.CurrentUser.hasSuperPowers)
|
||||
{
|
||||
releasePublic.gameObject.SetActive(false);
|
||||
releasePublic.isOn = false;
|
||||
releasePublic.interactable = false;
|
||||
|
||||
contentFeatured.isOn = contentSDKExample.isOn = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
contentFeatured.isOn = worldRecord.tags.Contains("content_featured");
|
||||
contentSDKExample.isOn = worldRecord.tags.Contains("content_sdk_example");
|
||||
|
||||
releasePublic.isOn = worldRecord.releaseStatus == "public";
|
||||
releasePublic.gameObject.SetActive(true);
|
||||
}
|
||||
|
||||
// "show in worlds menu"
|
||||
if (APIUser.CurrentUser.hasSuperPowers)
|
||||
{
|
||||
showInWorldsMenuGroup.gameObject.SetActive(true);
|
||||
showInActiveWorlds.isOn = !worldRecord.tags.Contains("admin_hide_active");
|
||||
showInPopularWorlds.isOn = !worldRecord.tags.Contains("admin_hide_popular");
|
||||
showInNewWorlds.isOn = !worldRecord.tags.Contains("admin_hide_new");
|
||||
}
|
||||
else
|
||||
{
|
||||
showInWorldsMenuGroup.gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
blueprintDescription.text = worldRecord.description;
|
||||
|
||||
userTags.text = "";
|
||||
foreach (var tag in worldRecord.publicTags)
|
||||
{
|
||||
userTags.text = userTags.text + tag.Replace("author_tag_", "");
|
||||
userTags.text = userTags.text + " ";
|
||||
}
|
||||
|
||||
ImageDownloader.DownloadImage(worldRecord.imageUrl, 0, obj => bpImage.texture = obj, null);
|
||||
}
|
||||
else // user does not own world id associated with descriptor
|
||||
{
|
||||
Debug.LogErrorFormat("{0} is not an owner of {1}", worldRecord.authorId, pipelineManager.user.id);
|
||||
blueprintPanel.SetActive(false);
|
||||
errorPanel.SetActive(true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
waitingPanel.SetActive(true);
|
||||
blueprintPanel.SetActive(false);
|
||||
errorPanel.SetActive(false);
|
||||
|
||||
if (!APIUser.CurrentUser.hasSuperPowers)
|
||||
{
|
||||
releasePublic.gameObject.SetActive(false);
|
||||
releasePublic.isOn = false;
|
||||
releasePublic.interactable = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
releasePublic.gameObject.SetActive(true);
|
||||
releasePublic.isOn = false;
|
||||
}
|
||||
}
|
||||
|
||||
// set up publish to Community Labs checkbox and text
|
||||
int worldsPublishedThisWeek = hasExceededWeeklyPublishLimit ? 1 : 0;
|
||||
int maximumWorldsAllowedToPublishPerWeek = 1;
|
||||
publishToCommLabsToggle = publishToCommunityLabsPanel.GetComponentInChildren<Toggle>();
|
||||
|
||||
if (null != publishToCommLabsToggle)
|
||||
{
|
||||
// disable publishing to CL checkbox if not enough trust or exceeded publish limit
|
||||
publishToCommLabsToggle.interactable = hasEnoughTrustToPublishToCL && !hasExceededWeeklyPublishLimit;
|
||||
|
||||
Text publishText = publishToCommLabsToggle.gameObject.GetComponentInChildren<Text>();
|
||||
if (null != publishText)
|
||||
{
|
||||
if (!hasEnoughTrustToPublishToCL)
|
||||
{
|
||||
publishText.text = "Not enough Trust to Publish to Community Labs";
|
||||
}
|
||||
else
|
||||
{
|
||||
if (hasExceededWeeklyPublishLimit)
|
||||
{
|
||||
publishText.text = "Publish limit for Community Labs Exceeded\n" + "(" + worldsPublishedThisWeek + "/" + maximumWorldsAllowedToPublishPerWeek + " Published this week)";
|
||||
}
|
||||
else
|
||||
{
|
||||
publishText.text = "Publish to Community Labs\n" + "(" + worldsPublishedThisWeek + "/" + maximumWorldsAllowedToPublishPerWeek + " Published this week)";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void SetupUpload()
|
||||
{
|
||||
if (!ParseUserTags())
|
||||
return;
|
||||
|
||||
publishingToCommunityLabs = (publishToCommLabsToggle != null) && (publishToCommLabsToggle.isActiveAndEnabled) && (publishToCommLabsToggle.isOn);
|
||||
|
||||
uploadTitle = "Preparing For Upload";
|
||||
isUploading = true;
|
||||
|
||||
string abPath = UnityEditor.EditorPrefs.GetString("currentBuildingAssetBundlePath");
|
||||
|
||||
|
||||
string unityPackagePath = UnityEditor.EditorPrefs.GetString("VRC_exportedUnityPackagePath");
|
||||
|
||||
UnityEditor.EditorPrefs.SetBool("VRCSDK2_scene_changed", true);
|
||||
UnityEditor.EditorPrefs.SetInt("VRCSDK2_capacity", System.Convert.ToInt16(worldCapacity.text));
|
||||
UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_sex", contentSex.isOn);
|
||||
UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_violence", contentViolence.isOn);
|
||||
UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_gore", contentGore.isOn);
|
||||
UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_other", contentOther.isOn);
|
||||
UnityEditor.EditorPrefs.SetBool("VRCSDK2_release_public", releasePublic.isOn);
|
||||
UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_featured", contentFeatured.isOn);
|
||||
UnityEditor.EditorPrefs.SetBool("VRCSDK2_content_sdk_example", contentSDKExample.isOn);
|
||||
|
||||
if (string.IsNullOrEmpty(worldRecord.id))
|
||||
{
|
||||
pipelineManager.AssignId(PipelineManager.ContentType.world);
|
||||
worldRecord.id = pipelineManager.blueprintId;
|
||||
}
|
||||
|
||||
string blueprintId = worldRecord.id;
|
||||
int version = Mathf.Max(1, worldRecord.version + 1);
|
||||
PrepareVRCPathForS3(abPath, blueprintId, version, ApiWorld.VERSION);
|
||||
|
||||
if (!string.IsNullOrEmpty(unityPackagePath) && System.IO.File.Exists(unityPackagePath))
|
||||
{
|
||||
VRC.Core.Logger.Log("Found unity package path. Preparing to upload!", API.LOG_CATEGORY);
|
||||
PrepareUnityPackageForS3(unityPackagePath, blueprintId, version, ApiWorld.VERSION);
|
||||
}
|
||||
|
||||
StartCoroutine(UploadNew());
|
||||
}
|
||||
|
||||
void OnUploadedWorld()
|
||||
{
|
||||
const string devUrl = "https://dev-api.vrchat.cloud";
|
||||
const string releaseUrl = "https://vrchat.com";
|
||||
|
||||
string uploadedWorldURL = (API.IsDevApi() ? devUrl : releaseUrl) + "/home/world/" + pipelineManager.blueprintId;
|
||||
OnSDKPipelineComplete(uploadedWorldURL);
|
||||
}
|
||||
|
||||
IEnumerator UploadNew()
|
||||
{
|
||||
bool caughtInvalidInput = false;
|
||||
if (!ValidateNameInput(blueprintName))
|
||||
caughtInvalidInput = true;
|
||||
|
||||
if (caughtInvalidInput)
|
||||
yield break;
|
||||
|
||||
VRC.Core.Logger.Log("Starting upload");
|
||||
|
||||
// upload unity package
|
||||
if (!string.IsNullOrEmpty(uploadUnityPackagePath))
|
||||
{
|
||||
yield return StartCoroutine(UploadFile(uploadUnityPackagePath, isUpdate ? worldRecord.unityPackageUrl : "", GetFriendlyWorldFileName("Unity package"), "Unity package",
|
||||
delegate (string fileUrl)
|
||||
{
|
||||
cloudFrontUnityPackageUrl = fileUrl;
|
||||
}
|
||||
));
|
||||
}
|
||||
|
||||
// upload asset bundle
|
||||
if (!string.IsNullOrEmpty(uploadVrcPath))
|
||||
{
|
||||
yield return StartCoroutine(UploadFile(uploadVrcPath, isUpdate ? worldRecord.assetUrl : "", GetFriendlyWorldFileName("Asset bundle"), "Asset bundle",
|
||||
delegate (string fileUrl)
|
||||
{
|
||||
cloudFrontAssetUrl = fileUrl;
|
||||
}
|
||||
));
|
||||
}
|
||||
|
||||
if (isUpdate)
|
||||
yield return StartCoroutine(UpdateBlueprint());
|
||||
else
|
||||
yield return StartCoroutine(CreateBlueprint());
|
||||
|
||||
if (publishingToCommunityLabs)
|
||||
{
|
||||
ApiWorld.PublishWorldToCommunityLabs(pipelineManager.blueprintId,
|
||||
(world) => OnUploadedWorld(),
|
||||
(err) =>
|
||||
{
|
||||
Debug.LogError("PublishWorldToCommunityLabs error:" + err);
|
||||
OnUploadedWorld();
|
||||
}
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
OnUploadedWorld();
|
||||
}
|
||||
}
|
||||
|
||||
private string GetFriendlyWorldFileName(string type)
|
||||
{
|
||||
return "World - " + blueprintName.text + " - " + type + " - " + Application.unityVersion + "_" + ApiWorld.VERSION.ApiVersion +
|
||||
"_" + VRC.Tools.Platform + "_" + API.GetServerEnvironmentForApiUrl();
|
||||
}
|
||||
|
||||
List<string> BuildTags()
|
||||
{
|
||||
var tags = new List<string>();
|
||||
if (contentSex.isOn)
|
||||
tags.Add("content_sex");
|
||||
if (contentViolence.isOn)
|
||||
tags.Add("content_violence");
|
||||
if (contentGore.isOn)
|
||||
tags.Add("content_gore");
|
||||
if (contentOther.isOn)
|
||||
tags.Add("content_other");
|
||||
|
||||
if (APIUser.CurrentUser.hasSuperPowers)
|
||||
{
|
||||
if (contentFeatured.isOn)
|
||||
tags.Add("content_featured");
|
||||
if (contentSDKExample.isOn)
|
||||
tags.Add("content_sdk_example");
|
||||
if(releasePublic.isOn)
|
||||
tags.Add("admin_approved");
|
||||
}
|
||||
|
||||
// "show in worlds menu"
|
||||
if (APIUser.CurrentUser.hasSuperPowers)
|
||||
{
|
||||
if (!showInActiveWorlds.isOn)
|
||||
tags.Add("admin_hide_active");
|
||||
if (!showInPopularWorlds.isOn)
|
||||
tags.Add("admin_hide_popular");
|
||||
if (!showInNewWorlds.isOn)
|
||||
tags.Add("admin_hide_new");
|
||||
}
|
||||
|
||||
// add any author tags
|
||||
foreach (var word in customTags)
|
||||
{
|
||||
// add all custom tags with "author_tag_" prefix
|
||||
tags.Add("author_tag_" + word);
|
||||
}
|
||||
|
||||
return tags;
|
||||
}
|
||||
|
||||
bool ParseUserTags()
|
||||
{
|
||||
bool validTags = true;
|
||||
customTags = new List<string>();
|
||||
char[] delimiterChars = { ' ', ',', '.', ':', '\t', '\n', '"', '#' };
|
||||
|
||||
// split user tags into individual words
|
||||
string[] words = userTags.text.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
foreach (var word in words)
|
||||
{
|
||||
customTags.Add(word.ToLower());
|
||||
}
|
||||
|
||||
// check that number of tags is within tag limit
|
||||
if (words.Count() > MAX_USER_TAGS_FOR_WORLD)
|
||||
{
|
||||
validTags = false;
|
||||
UnityEditor.EditorUtility.DisplayDialog("Tags are limited to a maximum of " + MAX_USER_TAGS_FOR_WORLD + " per world.", "Please remove excess tags before uploading!", "OK");
|
||||
}
|
||||
else
|
||||
{
|
||||
// check that no tags exceed maximum tag length
|
||||
int maximumTagLength = 0;
|
||||
foreach (string item in words)
|
||||
{
|
||||
if (item.Length > maximumTagLength)
|
||||
{
|
||||
maximumTagLength = item.Length;
|
||||
}
|
||||
}
|
||||
|
||||
if (maximumTagLength > MAX_CHARACTERS_ALLOWED_IN_USER_TAG)
|
||||
{
|
||||
validTags = false;
|
||||
UnityEditor.EditorUtility.DisplayDialog("Tags are limited to a maximum of " + MAX_CHARACTERS_ALLOWED_IN_USER_TAG + " characters per tag.", "One or more of your tags exceeds the maximum " + MAX_CHARACTERS_ALLOWED_IN_USER_TAG + " character limit.\n\n" + "Please shorten tags before uploading!", "OK");
|
||||
}
|
||||
else
|
||||
{
|
||||
// make sure tags are all alphanumeric
|
||||
foreach (var word in words)
|
||||
{
|
||||
if (!word.All(char.IsLetterOrDigit))
|
||||
{
|
||||
validTags = false;
|
||||
UnityEditor.EditorUtility.DisplayDialog("Tags should consist of alphanumeric characters only.", "Please remove any non-alphanumeric characters from tags before uploading!", "OK");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return validTags;
|
||||
}
|
||||
|
||||
protected override IEnumerator CreateBlueprint()
|
||||
{
|
||||
yield return StartCoroutine(UpdateImage(isUpdate ? worldRecord.imageUrl : "", GetFriendlyWorldFileName("Image")));
|
||||
|
||||
SetUploadProgress("Saving Blueprint to user", "Almost finished!!", 0.0f);
|
||||
ApiWorld world = new ApiWorld
|
||||
{
|
||||
id = worldRecord.id,
|
||||
authorName = pipelineManager.user.displayName,
|
||||
authorId = pipelineManager.user.id,
|
||||
name = blueprintName.text,
|
||||
imageUrl = cloudFrontImageUrl,
|
||||
assetUrl = cloudFrontAssetUrl,
|
||||
unityPackageUrl = cloudFrontUnityPackageUrl,
|
||||
description = blueprintDescription.text,
|
||||
tags = BuildTags(),
|
||||
releaseStatus = (releasePublic.isOn) ? ("public") : ("private"),
|
||||
capacity = System.Convert.ToInt16(worldCapacity.text),
|
||||
occupants = 0,
|
||||
shouldAddToAuthor = true,
|
||||
udonProducts = descriptor.udonProducts
|
||||
};
|
||||
|
||||
if (APIUser.CurrentUser.hasSuperPowers)
|
||||
world.isCurated = contentFeatured.isOn || contentSDKExample.isOn;
|
||||
else
|
||||
world.isCurated = false;
|
||||
|
||||
bool doneUploading = false;
|
||||
world.Post(
|
||||
(c) =>
|
||||
{
|
||||
ApiWorld savedBP = (ApiWorld)c.Model;
|
||||
pipelineManager.blueprintId = savedBP.id;
|
||||
UnityEditor.EditorPrefs.SetString("blueprintID-" + pipelineManager.GetInstanceID().ToString(), savedBP.id);
|
||||
VRC.Core.Logger.Log("Setting blueprintID on pipeline manager and editor prefs", API.LOG_CATEGORY);
|
||||
doneUploading = true;
|
||||
},
|
||||
(c) => { doneUploading = true; Debug.LogError(c.Error); });
|
||||
|
||||
while (!doneUploading)
|
||||
yield return null;
|
||||
}
|
||||
|
||||
protected override IEnumerator UpdateBlueprint()
|
||||
{
|
||||
bool doneUploading = false;
|
||||
|
||||
worldRecord.name = blueprintName.text;
|
||||
worldRecord.description = blueprintDescription.text;
|
||||
worldRecord.capacity = System.Convert.ToInt16(worldCapacity.text);
|
||||
worldRecord.assetUrl = cloudFrontAssetUrl;
|
||||
worldRecord.tags = BuildTags();
|
||||
worldRecord.releaseStatus = (releasePublic.isOn) ? ("public") : ("private");
|
||||
worldRecord.unityPackageUrl = cloudFrontUnityPackageUrl;
|
||||
worldRecord.isCurated = contentFeatured.isOn || contentSDKExample.isOn;
|
||||
worldRecord.udonProducts = descriptor.udonProducts;
|
||||
|
||||
if (shouldUpdateImageToggle.isOn)
|
||||
{
|
||||
yield return StartCoroutine(UpdateImage(isUpdate ? worldRecord.imageUrl : "", GetFriendlyWorldFileName("Image")));
|
||||
|
||||
worldRecord.imageUrl = cloudFrontImageUrl;
|
||||
}
|
||||
|
||||
SetUploadProgress("Saving Blueprint", "Almost finished!!", 0.0f);
|
||||
worldRecord.Save((c) => doneUploading = true, (c) => { doneUploading = true; Debug.LogError(c.Error); });
|
||||
|
||||
while (!doneUploading)
|
||||
yield return null;
|
||||
}
|
||||
|
||||
void ToggleUpdateImage(bool isOn)
|
||||
{
|
||||
if (isOn)
|
||||
{
|
||||
bpImage.enabled = false;
|
||||
liveBpImage.enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
bpImage.enabled = true;
|
||||
liveBpImage.enabled = false;
|
||||
ImageDownloader.DownloadImage(worldRecord.imageUrl, 0, obj => bpImage.texture = obj, null);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void DisplayUpdateCompletedDialog(string contentUrl = null)
|
||||
{
|
||||
}
|
||||
|
||||
private void OpenCommunityLabsDocumentation()
|
||||
{
|
||||
Application.OpenURL(CommunityLabsConstants.COMMUNITY_LABS_DOCUMENTATION_URL);
|
||||
}
|
||||
|
||||
void OnDestroy()
|
||||
{
|
||||
UnityEditor.EditorUtility.ClearProgressBar();
|
||||
UnityEditor.EditorPrefs.DeleteKey("currentBuildingAssetBundlePath");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2bd5ee5d69ee0f3449bf2f81fcb7f4e3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,18 @@
|
||||
using System.Collections;
|
||||
using UnityEngine;
|
||||
|
||||
public class SceneSaver
|
||||
{
|
||||
static public void SaveScene()
|
||||
{
|
||||
#if UNITY_EDITOR
|
||||
var activeScene = UnityEditor.SceneManagement.EditorSceneManager.GetActiveScene();
|
||||
UnityEditor.SceneManagement.EditorSceneManager.SaveScene(activeScene);
|
||||
|
||||
UnityEditor.EditorApplication.isPaused = false;
|
||||
UnityEditor.EditorApplication.isPlaying = false;
|
||||
|
||||
UnityEditor.SceneManagement.EditorSceneManager.OpenScene(activeScene.name);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0d49300ad532d4ae6b569b28de5b7dac
|
||||
timeCreated: 1446917779
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 48829de75cd107e4a94337ca7cc3dd3c
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,132 @@
|
||||
|
||||
namespace VRC.SDKBase.Validation
|
||||
{
|
||||
public static partial class AvatarValidation
|
||||
{
|
||||
public static readonly string[] ComponentTypeWhiteListCommon = new string[]
|
||||
{
|
||||
#if UNITY_STANDALONE
|
||||
#if VRC_CLIENT
|
||||
"DynamicBone", // Deprecated, whitelisted in the client only for backwards compatibility
|
||||
"DynamicBoneCollider", // Deprecated, whitelisted in the client only for backwards compatibility
|
||||
#endif // VRC_CLIENT
|
||||
"RootMotion.FinalIK.IKExecutionOrder",
|
||||
"RootMotion.FinalIK.VRIK",
|
||||
"RootMotion.FinalIK.FullBodyBipedIK",
|
||||
"RootMotion.FinalIK.LimbIK",
|
||||
"RootMotion.FinalIK.AimIK",
|
||||
"RootMotion.FinalIK.BipedIK",
|
||||
"RootMotion.FinalIK.GrounderIK",
|
||||
"RootMotion.FinalIK.GrounderFBBIK",
|
||||
"RootMotion.FinalIK.GrounderVRIK",
|
||||
"RootMotion.FinalIK.GrounderQuadruped",
|
||||
"RootMotion.FinalIK.TwistRelaxer",
|
||||
"RootMotion.FinalIK.ShoulderRotator",
|
||||
"RootMotion.FinalIK.FBBIKArmBending",
|
||||
"RootMotion.FinalIK.FBBIKHeadEffector",
|
||||
"RootMotion.FinalIK.FABRIK",
|
||||
"RootMotion.FinalIK.FABRIKChain",
|
||||
"RootMotion.FinalIK.FABRIKRoot",
|
||||
"RootMotion.FinalIK.CCDIK",
|
||||
"RootMotion.FinalIK.RotationLimit",
|
||||
"RootMotion.FinalIK.RotationLimitHinge",
|
||||
"RootMotion.FinalIK.RotationLimitPolygonal",
|
||||
"RootMotion.FinalIK.RotationLimitSpline",
|
||||
"UnityEngine.Cloth",
|
||||
"UnityEngine.Light",
|
||||
"UnityEngine.BoxCollider",
|
||||
"UnityEngine.SphereCollider",
|
||||
"UnityEngine.CapsuleCollider",
|
||||
"UnityEngine.Rigidbody",
|
||||
"UnityEngine.Joint",
|
||||
"UnityEngine.Animations.AimConstraint",
|
||||
"UnityEngine.Animations.LookAtConstraint",
|
||||
"UnityEngine.Animations.ParentConstraint",
|
||||
"UnityEngine.Animations.PositionConstraint",
|
||||
"UnityEngine.Animations.RotationConstraint",
|
||||
"UnityEngine.Animations.ScaleConstraint",
|
||||
"UnityEngine.Camera",
|
||||
"UnityEngine.AudioSource",
|
||||
"ONSPAudioSource",
|
||||
#endif // UNITY_STANDALONE
|
||||
#if !VRC_CLIENT
|
||||
"VRC.Core.PipelineSaver",
|
||||
#endif
|
||||
"VRC.Core.PipelineManager",
|
||||
"UnityEngine.Transform",
|
||||
"UnityEngine.Animator",
|
||||
"UnityEngine.SkinnedMeshRenderer",
|
||||
"LimbIK", // our limbik based on Unity ik
|
||||
"LoadingAvatarTextureAnimation",
|
||||
"UnityEngine.MeshFilter",
|
||||
"UnityEngine.MeshRenderer",
|
||||
"UnityEngine.Animation",
|
||||
"UnityEngine.ParticleSystem",
|
||||
"UnityEngine.ParticleSystemRenderer",
|
||||
"UnityEngine.TrailRenderer",
|
||||
"UnityEngine.FlareLayer",
|
||||
"UnityEngine.GUILayer",
|
||||
"UnityEngine.LineRenderer",
|
||||
"RealisticEyeMovements.EyeAndHeadAnimator",
|
||||
"RealisticEyeMovements.LookTargetController",
|
||||
};
|
||||
|
||||
public static readonly string[] ComponentTypeWhiteListSdk2 = new string[]
|
||||
{
|
||||
#if UNITY_STANDALONE
|
||||
"VRCSDK2.VRC_SpatialAudioSource",
|
||||
#endif
|
||||
"VRCSDK2.VRC_AvatarDescriptor",
|
||||
"VRCSDK2.VRC_AvatarVariations",
|
||||
"VRCSDK2.VRC_IKFollower",
|
||||
"VRCSDK2.VRC_Station",
|
||||
};
|
||||
|
||||
public static readonly string[] ComponentTypeWhiteListSdk3 = new string[]
|
||||
{
|
||||
#if UNITY_STANDALONE
|
||||
"VRC.SDK3.Avatars.Components.VRCSpatialAudioSource",
|
||||
#endif
|
||||
"VRC.SDK3.VRCTestMarker",
|
||||
"VRC.SDK3.Avatars.Components.VRCAvatarDescriptor",
|
||||
"VRC.SDK3.Avatars.Components.VRCStation",
|
||||
"VRC.SDK3.Avatars.Components.VRCImpostorSettings",
|
||||
"VRC.SDK3.Avatars.Components.VRCImpostorEnvironment",
|
||||
"VRC.SDK3.Avatars.Components.VRCHeadChop",
|
||||
"VRC.SDK3.Avatars.Components.VRCRaycast",
|
||||
"VRC.SDK3.Dynamics.PhysBone.Components.VRCPhysBone",
|
||||
"VRC.SDK3.Dynamics.PhysBone.Components.VRCPhysBoneCollider",
|
||||
"VRC.SDK3.Dynamics.Constraint.Components.VRCAimConstraint",
|
||||
"VRC.SDK3.Dynamics.Constraint.Components.VRCLookAtConstraint",
|
||||
"VRC.SDK3.Dynamics.Constraint.Components.VRCParentConstraint",
|
||||
"VRC.SDK3.Dynamics.Constraint.Components.VRCPositionConstraint",
|
||||
"VRC.SDK3.Dynamics.Constraint.Components.VRCRotationConstraint",
|
||||
"VRC.SDK3.Dynamics.Constraint.Components.VRCScaleConstraint",
|
||||
"VRC.SDK3.Dynamics.Contact.Components.VRCContactSender",
|
||||
"VRC.SDK3.Dynamics.Contact.Components.VRCContactReceiver",
|
||||
};
|
||||
|
||||
public static readonly string[] ShaderWhiteList = new string[]
|
||||
{
|
||||
"VRChat/Mobile/Standard Lite",
|
||||
"VRChat/Mobile/Diffuse",
|
||||
"VRChat/Mobile/Bumped Diffuse",
|
||||
"VRChat/Mobile/Bumped Mapped Specular",
|
||||
"VRChat/Mobile/Toon Lit",
|
||||
"VRChat/Mobile/MatCap Lit",
|
||||
|
||||
"VRChat/Mobile/Particles/Additive",
|
||||
"VRChat/Mobile/Particles/Multiply",
|
||||
|
||||
"VRChat/Mobile/Toon Standard",
|
||||
"VRChat/Mobile/Toon Standard (Outline)", // not in client whitelist, will fall back to non-outline variant on mobile
|
||||
};
|
||||
|
||||
public const int MAX_RAYCAST_COMPONENTS_PER_AVATAR = 80; // VRCRaycast + FinalIK
|
||||
|
||||
public const int MAX_AVD_PHYSBONES_PER_AVATAR = 256;
|
||||
public const int MAX_AVD_COLLIDERS_PER_AVATAR = 256;
|
||||
public const int MAX_AVD_CONTACTS_PER_AVATAR = 256;
|
||||
public const int MAX_AVD_CONSTRAINTS_PER_AVATAR = 2000;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 65a0b1106808685488e7287333ef73e9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,805 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using JetBrains.Annotations;
|
||||
#if TextMeshPro
|
||||
using TMPro;
|
||||
#endif
|
||||
using UnityEngine;
|
||||
using UnityEngine.Audio;
|
||||
using UnityEngine.Playables;
|
||||
using UnityEngine.Timeline;
|
||||
using UnityEngine.UI;
|
||||
|
||||
#if VRC_CLIENT
|
||||
using ZLinq;
|
||||
#else
|
||||
using System.Linq;
|
||||
#endif
|
||||
|
||||
namespace VRC.SDKBase.Validation
|
||||
{
|
||||
public static class WorldValidation
|
||||
{
|
||||
private static readonly Lazy<string> _debugCategoryName = new Lazy<string>(InitializeLogging);
|
||||
private static string DebugCategoryName => _debugCategoryName.Value;
|
||||
|
||||
private static string InitializeLogging()
|
||||
{
|
||||
const string categoryName = "WorldValidation";
|
||||
VRC.Core.Logger.DescribeCategory(categoryName, VRC.Core.Logger.Color.red);
|
||||
VRC.Core.Logger.EnableCategory(categoryName);
|
||||
return categoryName;
|
||||
}
|
||||
|
||||
static string[] ComponentTypeWhiteList = null;
|
||||
|
||||
public enum WhiteListConfiguration
|
||||
{
|
||||
None,
|
||||
VRCSDK2,
|
||||
VRCSDK3,
|
||||
Unchanged
|
||||
}
|
||||
|
||||
static WhiteListConfiguration ComponentTypeWhiteListConfiguration = WhiteListConfiguration.None;
|
||||
|
||||
static readonly string[] ComponentTypeWhiteListCommon = new string[]
|
||||
{
|
||||
#if UNITY_STANDALONE
|
||||
"UnityEngine.Rendering.PostProcessing.PostProcessDebug",
|
||||
"UnityEngine.Rendering.PostProcessing.PostProcessLayer",
|
||||
"UnityEngine.Rendering.PostProcessing.PostProcessVolume",
|
||||
#endif
|
||||
"VRC.Core.PipelineManager",
|
||||
"UiInputField",
|
||||
"VRCProjectSettings",
|
||||
"DynamicBone",
|
||||
"DynamicBoneCollider",
|
||||
"TMPro.TMP_Dropdown",
|
||||
"TMPro.TMP_InputField",
|
||||
"TMPro.TMP_ScrollbarEventHandler",
|
||||
"TMPro.TMP_SelectionCaret",
|
||||
"TMPro.TMP_SpriteAnimator",
|
||||
"TMPro.TMP_SubMesh",
|
||||
"TMPro.TMP_SubMeshUI",
|
||||
"TMPro.TMP_Text",
|
||||
"TMPro.TextMeshPro",
|
||||
"TMPro.TextMeshProUGUI",
|
||||
"TMPro.TextContainer",
|
||||
"TMPro.TMP_Dropdown+DropdownItem",
|
||||
"UnityEngine.EventSystems.EventSystem",
|
||||
"UnityEngine.EventSystems.EventTrigger",
|
||||
"UnityEngine.EventSystems.UIBehaviour",
|
||||
"UnityEngine.EventSystems.BaseInput",
|
||||
"UnityEngine.EventSystems.BaseInputModule",
|
||||
"UnityEngine.EventSystems.PointerInputModule",
|
||||
"UnityEngine.EventSystems.StandaloneInputModule",
|
||||
"UnityEngine.EventSystems.TouchInputModule",
|
||||
"UnityEngine.EventSystems.BaseRaycaster",
|
||||
"UnityEngine.EventSystems.PhysicsRaycaster",
|
||||
"UnityEngine.UI.Button",
|
||||
"UnityEngine.UI.Dropdown",
|
||||
"UnityEngine.UI.Dropdown+DropdownItem",
|
||||
"UnityEngine.UI.Graphic",
|
||||
"UnityEngine.UI.GraphicRaycaster",
|
||||
"UnityEngine.UI.Image",
|
||||
"UnityEngine.UI.InputField",
|
||||
"UnityEngine.UI.Mask",
|
||||
"UnityEngine.UI.MaskableGraphic",
|
||||
"UnityEngine.UI.RawImage",
|
||||
"UnityEngine.UI.RectMask2D",
|
||||
"UnityEngine.UI.Scrollbar",
|
||||
"UnityEngine.UI.ScrollRect",
|
||||
"UnityEngine.UI.Selectable",
|
||||
"UnityEngine.UI.Slider",
|
||||
"UnityEngine.UI.Text",
|
||||
"UnityEngine.UI.Toggle",
|
||||
"UnityEngine.UI.ToggleGroup",
|
||||
"UnityEngine.UI.AspectRatioFitter",
|
||||
"UnityEngine.UI.CanvasScaler",
|
||||
"UnityEngine.UI.ContentSizeFitter",
|
||||
"UnityEngine.UI.GridLayoutGroup",
|
||||
"UnityEngine.UI.HorizontalLayoutGroup",
|
||||
"UnityEngine.UI.HorizontalOrVerticalLayoutGroup",
|
||||
"UnityEngine.UI.LayoutElement",
|
||||
"UnityEngine.UI.LayoutGroup",
|
||||
"UnityEngine.UI.VerticalLayoutGroup",
|
||||
"UnityEngine.UI.BaseMeshEffect",
|
||||
"UnityEngine.UI.Outline",
|
||||
"UnityEngine.UI.PositionAsUV1",
|
||||
"UnityEngine.UI.Shadow",
|
||||
"OVRLipSync",
|
||||
"OVRLipSyncContext",
|
||||
"OVRLipSyncContextBase",
|
||||
"OVRLipSyncContextCanned",
|
||||
"OVRLipSyncContextMorphTarget",
|
||||
"OVRLipSyncContextTextureFlip",
|
||||
"ONSPReflectionZone",
|
||||
"OculusSpatializerUnity",
|
||||
"ONSPAmbisonicsNative",
|
||||
"ONSPAudioSource",
|
||||
"RootMotion.FinalIK.BipedIK",
|
||||
"RootMotion.FinalIK.FingerRig",
|
||||
"RootMotion.FinalIK.Grounder",
|
||||
"RootMotion.FinalIK.GrounderBipedIK",
|
||||
"RootMotion.FinalIK.GrounderFBBIK",
|
||||
"RootMotion.FinalIK.GrounderIK",
|
||||
"RootMotion.FinalIK.GrounderQuadruped",
|
||||
"RootMotion.FinalIK.GrounderVRIK",
|
||||
"RootMotion.FinalIK.AimIK",
|
||||
"RootMotion.FinalIK.CCDIK",
|
||||
"RootMotion.FinalIK.FABRIK",
|
||||
"RootMotion.FinalIK.FABRIKRoot",
|
||||
"RootMotion.FinalIK.FullBodyBipedIK",
|
||||
"RootMotion.FinalIK.IK",
|
||||
"RootMotion.FinalIK.IKExecutionOrder",
|
||||
"RootMotion.FinalIK.LegIK",
|
||||
"RootMotion.FinalIK.LimbIK",
|
||||
"RootMotion.FinalIK.LookAtIK",
|
||||
"RootMotion.FinalIK.TrigonometricIK",
|
||||
"RootMotion.FinalIK.VRIK",
|
||||
"RootMotion.FinalIK.FBBIKArmBending",
|
||||
"RootMotion.FinalIK.FBBIKHeadEffector",
|
||||
"RootMotion.FinalIK.TwistRelaxer",
|
||||
"RootMotion.FinalIK.InteractionObject",
|
||||
"RootMotion.FinalIK.InteractionSystem",
|
||||
"RootMotion.FinalIK.InteractionTarget",
|
||||
"RootMotion.FinalIK.InteractionTrigger",
|
||||
"RootMotion.FinalIK.GenericPoser",
|
||||
"RootMotion.FinalIK.HandPoser",
|
||||
"RootMotion.FinalIK.Poser",
|
||||
"RootMotion.FinalIK.RagdollUtility",
|
||||
"RootMotion.FinalIK.RotationLimit",
|
||||
"RootMotion.FinalIK.RotationLimitAngle",
|
||||
"RootMotion.FinalIK.RotationLimitHinge",
|
||||
"RootMotion.FinalIK.RotationLimitPolygonal",
|
||||
"RootMotion.FinalIK.RotationLimitSpline",
|
||||
"RootMotion.FinalIK.AimPoser",
|
||||
"RootMotion.FinalIK.Amplifier",
|
||||
"RootMotion.FinalIK.BodyTilt",
|
||||
"RootMotion.FinalIK.HitReaction",
|
||||
"RootMotion.FinalIK.HitReactionVRIK",
|
||||
"RootMotion.FinalIK.Inertia",
|
||||
"RootMotion.FinalIK.OffsetModifier",
|
||||
"RootMotion.FinalIK.OffsetModifierVRIK",
|
||||
"RootMotion.FinalIK.OffsetPose",
|
||||
"RootMotion.FinalIK.Recoil",
|
||||
"RootMotion.FinalIK.ShoulderRotator",
|
||||
"RootMotion.Dynamics.AnimationBlocker",
|
||||
"RootMotion.Dynamics.BehaviourBase",
|
||||
"RootMotion.Dynamics.BehaviourFall",
|
||||
"RootMotion.Dynamics.BehaviourPuppet",
|
||||
"RootMotion.Dynamics.JointBreakBroadcaster",
|
||||
"RootMotion.Dynamics.MuscleCollisionBroadcaster",
|
||||
"RootMotion.Dynamics.PressureSensor",
|
||||
"RootMotion.Dynamics.Prop",
|
||||
"RootMotion.Dynamics.PropRoot",
|
||||
"RootMotion.Dynamics.PuppetMaster",
|
||||
"RootMotion.Dynamics.PuppetMasterSettings",
|
||||
// TODO: remove these if they are only needed in editor
|
||||
"RootMotion.Dynamics.BipedRagdollCreator",
|
||||
"RootMotion.Dynamics.RagdollCreator",
|
||||
"RootMotion.Dynamics.RagdollEditor",
|
||||
//
|
||||
"RootMotion.SolverManager",
|
||||
"RootMotion.TriggerEventBroadcaster",
|
||||
"UnityEngine.WindZone",
|
||||
"UnityEngine.Tilemaps.Tilemap",
|
||||
"UnityEngine.Tilemaps.TilemapRenderer",
|
||||
"UnityEngine.Terrain",
|
||||
"UnityEngine.Tree",
|
||||
"UnityEngine.SpriteMask",
|
||||
"UnityEngine.Grid",
|
||||
"UnityEngine.GridLayout",
|
||||
"UnityEngine.AudioSource",
|
||||
"UnityEngine.AudioReverbZone",
|
||||
"UnityEngine.AudioLowPassFilter",
|
||||
"UnityEngine.AudioHighPassFilter",
|
||||
"UnityEngine.AudioDistortionFilter",
|
||||
"UnityEngine.AudioEchoFilter",
|
||||
"UnityEngine.AudioChorusFilter",
|
||||
"UnityEngine.AudioReverbFilter",
|
||||
"UnityEngine.AudioListener", // will be force-disabled on load, but can't be removed since it's a dependency for some of the above
|
||||
"UnityEngine.Playables.PlayableDirector",
|
||||
"UnityEngine.TerrainCollider",
|
||||
"UnityEngine.Canvas",
|
||||
"UnityEngine.CanvasGroup",
|
||||
"UnityEngine.CanvasRenderer",
|
||||
"UnityEngine.TextMesh",
|
||||
"UnityEngine.Animator",
|
||||
"UnityEngine.AI.NavMeshAgent",
|
||||
"UnityEngine.AI.NavMeshObstacle",
|
||||
#if UNITY_6000_0_OR_NEWER
|
||||
"Unity.AI.Navigation.NavMeshLink",
|
||||
#else
|
||||
"UnityEngine.AI.OffMeshLink",
|
||||
#endif
|
||||
"UnityEngine.Cloth",
|
||||
"UnityEngine.WheelCollider",
|
||||
"UnityEngine.Rigidbody",
|
||||
"UnityEngine.Joint",
|
||||
"UnityEngine.HingeJoint",
|
||||
"UnityEngine.SpringJoint",
|
||||
"UnityEngine.FixedJoint",
|
||||
"UnityEngine.CharacterJoint",
|
||||
"UnityEngine.ConfigurableJoint",
|
||||
"UnityEngine.ConstantForce",
|
||||
"UnityEngine.Collider",
|
||||
"UnityEngine.BoxCollider",
|
||||
"UnityEngine.SphereCollider",
|
||||
"UnityEngine.MeshCollider",
|
||||
"UnityEngine.CapsuleCollider",
|
||||
"UnityEngine.CharacterController",
|
||||
"UnityEngine.ParticleSystem",
|
||||
"UnityEngine.ParticleSystemRenderer",
|
||||
"UnityEngine.BillboardRenderer",
|
||||
"UnityEngine.Camera",
|
||||
"UnityEngine.FlareLayer",
|
||||
"UnityEngine.SkinnedMeshRenderer",
|
||||
"UnityEngine.Renderer",
|
||||
"UnityEngine.TrailRenderer",
|
||||
"UnityEngine.LineRenderer",
|
||||
"UnityEngine.GUIElement",
|
||||
"UnityEngine.GUILayer",
|
||||
"UnityEngine.Light",
|
||||
"UnityEngine.LightProbeGroup",
|
||||
"UnityEngine.LightProbeProxyVolume",
|
||||
"UnityEngine.LODGroup",
|
||||
"UnityEngine.ReflectionProbe",
|
||||
"UnityEngine.SpriteRenderer",
|
||||
"UnityEngine.Transform",
|
||||
"UnityEngine.RectTransform",
|
||||
"UnityEngine.Rendering.SortingGroup",
|
||||
"UnityEngine.Projector",
|
||||
"UnityEngine.OcclusionPortal",
|
||||
"UnityEngine.OcclusionArea",
|
||||
"UnityEngine.LensFlare",
|
||||
"UnityEngine.Skybox",
|
||||
"UnityEngine.MeshFilter",
|
||||
"UnityEngine.Halo",
|
||||
"UnityEngine.MeshRenderer",
|
||||
"UnityEngine.Collider2D",
|
||||
"UnityEngine.Rigidbody2D",
|
||||
"UnityEngine.CompositeCollider2D",
|
||||
"UnityEngine.ConstantForce2D",
|
||||
"UnityEngine.AreaEffector2D",
|
||||
"UnityEngine.CapsuleCollider2D",
|
||||
"UnityEngine.DistanceJoint2D",
|
||||
"UnityEngine.EdgeCollider2D",
|
||||
"UnityEngine.Effector2D",
|
||||
"UnityEngine.BoxCollider2D",
|
||||
"UnityEngine.CircleCollider2D",
|
||||
"UnityEngine.FixedJoint2D",
|
||||
"UnityEngine.HingeJoint2D",
|
||||
"UnityEngine.FrictionJoint2D",
|
||||
"UnityEngine.PlatformEffector2D",
|
||||
"UnityEngine.PointEffector2D",
|
||||
"UnityEngine.PolygonCollider2D",
|
||||
"UnityEngine.SliderJoint2D",
|
||||
"UnityEngine.SurfaceEffector2D",
|
||||
"UnityEngine.RelativeJoint2D",
|
||||
"UnityEngine.TargetJoint2D",
|
||||
"UnityEngine.WheelJoint2D",
|
||||
"UnityEngine.Joint2D",
|
||||
"UnityEngine.ParticleSystemForceField"
|
||||
};
|
||||
|
||||
static readonly string[] ComponentTypeWhiteListSdk2 = new string[]
|
||||
{
|
||||
#if UNITY_STANDALONE
|
||||
"VRCSDK2.VRC_CustomRendererBehaviour",
|
||||
"VRCSDK2.VRC_MidiNoteIn",
|
||||
"VRCSDK2.scripts.Scenes.VRC_Panorama",
|
||||
"VRCSDK2.VRC_Water",
|
||||
"UnityStandardAssets.Water.WaterBasic",
|
||||
"UnityStandardAssets.Water.Displace",
|
||||
"UnityStandardAssets.Water.GerstnerDisplace",
|
||||
"UnityStandardAssets.Water.PlanarReflection",
|
||||
"UnityStandardAssets.Water.SpecularLighting",
|
||||
"UnityStandardAssets.Water.Water",
|
||||
"UnityStandardAssets.Water.WaterBase",
|
||||
"UnityStandardAssets.Water.WaterTile",
|
||||
#endif
|
||||
"VRCSDK2.VRCTriggerRelay",
|
||||
"VRCSDK2.VRC_AudioBank",
|
||||
"VRCSDK2.VRC_DataStorage",
|
||||
"VRCSDK2.VRC_EventHandler",
|
||||
"VRCSDK2.VRC_IKFollower",
|
||||
"VRCSDK2.VRC_Label",
|
||||
"VRCSDK2.VRC_KeyEvents",
|
||||
"VRCSDK2.VRC_PhysicsRoot",
|
||||
"VRCSDK2.VRC_CombatSystem",
|
||||
"VRCSDK2.VRC_DestructibleStandard",
|
||||
"VRC_VisualDamage",
|
||||
"VRCSDK2.VRC_OscButtonIn",
|
||||
"VRCSDK2.VRC_GunStats",
|
||||
"VRCSDK2.VRC_JukeBox",
|
||||
"VRCSDK2.VRC_AddDamage",
|
||||
"VRCSDK2.VRC_AddHealth",
|
||||
"VRCSDK2.VRC_AvatarCalibrator",
|
||||
"VRCSDK2.VRC_AvatarPedestal",
|
||||
"VRCSDK2.VRC_NPCSpawn",
|
||||
"VRCSDK2.VRC_ObjectSpawn",
|
||||
"VRCSDK2.VRC_ObjectSync",
|
||||
"VRCSDK2.VRC_Pickup",
|
||||
"VRCSDK2.VRC_PortalMarker",
|
||||
"VRCSDK2.VRC_SlideShow",
|
||||
"VRCSDK2.VRC_SpatialAudioSource",
|
||||
"VRCSDK2.VRC_StationInput",
|
||||
"VRCSDK2.VRC_SyncAnimation",
|
||||
"VRCSDK2.VRC_SyncVideoPlayer",
|
||||
"VRCSDK2.VRC_SyncVideoStream",
|
||||
"VRCSDK2.VRC_VideoScreen",
|
||||
"VRCSDK2.VRC_VideoSpeaker",
|
||||
"VRCSDK2.VRC_PlayerAudioOverride",
|
||||
"VRCSDK2.VRC_MirrorReflection",
|
||||
"VRCSDK2.VRC_PlayerMods",
|
||||
"VRCSDK2.VRC_SceneDescriptor",
|
||||
"VRCSDK2.VRC_SceneResetPosition",
|
||||
"VRCSDK2.VRC_SceneSmoothShift",
|
||||
"VRCSDK2.VRC_SpecialLayer",
|
||||
"VRCSDK2.VRC_Station",
|
||||
"VRCSDK2.VRC_StereoObject",
|
||||
"VRCSDK2.VRC_TimedEvents",
|
||||
"VRCSDK2.VRC_Trigger",
|
||||
"VRCSDK2.VRC_TriggerColliderEventTrigger",
|
||||
"VRCSDK2.VRC_UseEvents",
|
||||
"VRCSDK2.VRC_UiShape",
|
||||
"UnityEngine.Animation",
|
||||
#if !UNITY_2019_4_OR_NEWER
|
||||
"UnityEngine.GUIText",
|
||||
"UnityEngine.GUITexture",
|
||||
#endif
|
||||
"UnityEngine.Video.VideoPlayer",
|
||||
"PhysSound.PhysSoundBase",
|
||||
"PhysSound.PhysSoundObject",
|
||||
"PhysSound.PhysSoundTempAudio",
|
||||
"PhysSound.PhysSoundTempAudioPool",
|
||||
"PhysSound.PhysSoundTerrain",
|
||||
"RealisticEyeMovements.EyeAndHeadAnimator",
|
||||
"RealisticEyeMovements.LookTargetController",
|
||||
"UnityStandardAssets.Cameras.AbstractTargetFollower",
|
||||
"UnityStandardAssets.Cameras.AutoCam",
|
||||
"UnityStandardAssets.Cameras.FreeLookCam",
|
||||
"UnityStandardAssets.Cameras.HandHeldCam",
|
||||
"UnityStandardAssets.Cameras.LookatTarget",
|
||||
"UnityStandardAssets.Cameras.PivotBasedCameraRig",
|
||||
"UnityStandardAssets.Cameras.ProtectCameraFromWallClip",
|
||||
"UnityStandardAssets.Cameras.TargetFieldOfView",
|
||||
"UnityStandardAssets.Characters.FirstPerson.FirstPersonController",
|
||||
"UnityStandardAssets.Characters.FirstPerson.HeadBob",
|
||||
"UnityStandardAssets.Characters.FirstPerson.RigidbodyFirstPersonController",
|
||||
"UnityStandardAssets.Vehicles.Ball.Ball",
|
||||
"UnityStandardAssets.Vehicles.Ball.BallUserControl",
|
||||
"UnityStandardAssets.Characters.ThirdPerson.AICharacterControl",
|
||||
"UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter",
|
||||
"UnityStandardAssets.Characters.ThirdPerson.ThirdPersonUserControl",
|
||||
"UnityStandardAssets.CrossPlatformInput.AxisTouchButton",
|
||||
"UnityStandardAssets.CrossPlatformInput.ButtonHandler",
|
||||
"UnityStandardAssets.CrossPlatformInput.InputAxisScrollbar",
|
||||
"UnityStandardAssets.CrossPlatformInput.Joystick",
|
||||
"UnityStandardAssets.CrossPlatformInput.MobileControlRig",
|
||||
"UnityStandardAssets.CrossPlatformInput.TiltInput",
|
||||
"UnityStandardAssets.CrossPlatformInput.TouchPad",
|
||||
"UnityStandardAssets.Effects.AfterburnerPhysicsForce",
|
||||
"UnityStandardAssets.Effects.ExplosionFireAndDebris",
|
||||
"UnityStandardAssets.Effects.ExplosionPhysicsForce",
|
||||
"UnityStandardAssets.Effects.Explosive",
|
||||
"UnityStandardAssets.Effects.ExtinguishableParticleSystem",
|
||||
"UnityStandardAssets.Effects.FireLight",
|
||||
"UnityStandardAssets.Effects.Hose",
|
||||
"UnityStandardAssets.Effects.ParticleSystemMultiplier",
|
||||
"UnityStandardAssets.Effects.SmokeParticles",
|
||||
"UnityStandardAssets.Effects.WaterHoseParticles",
|
||||
"UnityStandardAssets.Utility.ActivateTrigger",
|
||||
"UnityStandardAssets.Utility.AutoMoveAndRotate",
|
||||
"UnityStandardAssets.Utility.DragRigidbody",
|
||||
"UnityStandardAssets.Utility.DynamicShadowSettings",
|
||||
"UnityStandardAssets.Utility.FollowTarget",
|
||||
"UnityStandardAssets.Utility.FPSCounter",
|
||||
"UnityStandardAssets.Utility.ObjectResetter",
|
||||
"UnityStandardAssets.Utility.ParticleSystemDestroyer",
|
||||
#if !UNITY_2019_4_OR_NEWER
|
||||
"UnityStandardAssets.Utility.SimpleActivatorMenu",
|
||||
#endif
|
||||
"UnityStandardAssets.Utility.SimpleMouseRotator",
|
||||
"UnityStandardAssets.Utility.SmoothFollow",
|
||||
"UnityStandardAssets.Utility.TimedObjectActivator",
|
||||
"UnityStandardAssets.Utility.TimedObjectDestructor",
|
||||
"UnityStandardAssets.Utility.WaypointCircuit",
|
||||
"UnityStandardAssets.Utility.WaypointProgressTracker",
|
||||
"UnityStandardAssets.Vehicles.Aeroplane.AeroplaneAiControl",
|
||||
"UnityStandardAssets.Vehicles.Aeroplane.AeroplaneAudio",
|
||||
"UnityStandardAssets.Vehicles.Aeroplane.AeroplaneController",
|
||||
"UnityStandardAssets.Vehicles.Aeroplane.AeroplaneControlSurfaceAnimator",
|
||||
"UnityStandardAssets.Vehicles.Aeroplane.AeroplanePropellerAnimator",
|
||||
"UnityStandardAssets.Vehicles.Aeroplane.AeroplaneUserControl2Axis",
|
||||
"UnityStandardAssets.Vehicles.Aeroplane.AeroplaneUserControl4Axis",
|
||||
"UnityStandardAssets.Vehicles.Aeroplane.JetParticleEffect",
|
||||
"UnityStandardAssets.Vehicles.Aeroplane.LandingGear",
|
||||
"UnityStandardAssets.Vehicles.Car.BrakeLight",
|
||||
"UnityStandardAssets.Vehicles.Car.CarAIControl",
|
||||
"UnityStandardAssets.Vehicles.Car.CarAudio",
|
||||
"UnityStandardAssets.Vehicles.Car.CarController",
|
||||
"UnityStandardAssets.Vehicles.Car.CarSelfRighting",
|
||||
"UnityStandardAssets.Vehicles.Car.CarUserControl",
|
||||
"UnityStandardAssets.Vehicles.Car.Mudguard",
|
||||
"UnityStandardAssets.Vehicles.Car.SkidTrail",
|
||||
"UnityStandardAssets.Vehicles.Car.Suspension",
|
||||
"UnityStandardAssets.Vehicles.Car.WheelEffects",
|
||||
"RenderHeads.Media.AVProVideo.ApplyToMaterial",
|
||||
"RenderHeads.Media.AVProVideo.ApplyToMesh",
|
||||
"RenderHeads.Media.AVProVideo.AudioOutput",
|
||||
"RenderHeads.Media.AVProVideo.DisplayIMGUI",
|
||||
"RenderHeads.Media.AVProVideo.DisplayUGUI",
|
||||
"RenderHeads.Media.AVProVideo.MediaPlayer",
|
||||
"RenderHeads.Media.AVProVideo.SubtitlesUGUI",
|
||||
"AlphaButtonClickMask",
|
||||
"EventSystemChecker"
|
||||
};
|
||||
|
||||
static readonly string[] ComponentTypeWhiteListSdk3 = new string[]
|
||||
{
|
||||
"VRC.SDK3.VRCDestructibleStandard",
|
||||
"VRC.SDK3.Components.VRCVisualDamage",
|
||||
"VRC.SDK3.Components.VRCAvatarPedestal",
|
||||
"VRC.SDK3.Components.VRCPickup",
|
||||
"VRC.SDK3.Components.VRCPortalMarker",
|
||||
"VRC.SDK3.Components.VRCSpatialAudioSource",
|
||||
"VRC.SDK3.Components.VRCMirrorReflection",
|
||||
"VRC.SDK3.Components.VRCSceneDescriptor",
|
||||
"VRC.SDK3.Components.VRCStation",
|
||||
"VRC.SDK3.Components.VRCUiShape",
|
||||
"VRC.SDK3.Components.VRCObjectSync",
|
||||
"VRC.SDK3.Components.VRCObjectPool",
|
||||
"VRC.SDK3.Components.VRCInputFieldKeyboardOverride",
|
||||
#if VRC_ENABLE_PLAYER_PERSISTENCE
|
||||
"VRC.SDK3.Components.VRCPlayerObject",
|
||||
#endif
|
||||
#if VRC_ENABLE_PLAYER_PERSISTENCE || VRC_ENABLE_INSTANCE_PERSISTENCE
|
||||
"VRC.SDK3.Components.VRCEnablePersistence",
|
||||
#endif
|
||||
"VRC.SDK3.Video.Components.VRCUnityVideoPlayer",
|
||||
"VRC.SDK3.Video.Components.AVPro.VRCAVProVideoPlayer",
|
||||
"VRC.SDK3.Video.Components.AVPro.VRCAVProVideoScreen",
|
||||
"VRC.SDK3.Video.Components.AVPro.VRCAVProVideoSpeaker",
|
||||
"VRC.SDK3.Midi.VRCMidiListener",
|
||||
"VRC.SDK3.Midi.VRCMidiPlayer",
|
||||
"VRC.SDK3.Components.VRCCameraDollyAnimation",
|
||||
"VRC.SDK3.Components.VRCCameraDollyPath",
|
||||
"VRC.SDK3.Components.VRCCameraDollyPathPoint",
|
||||
"VRC.Udon.UdonBehaviour",
|
||||
"VRC.Udon.AbstractUdonBehaviourEventProxy",
|
||||
"VRC.SDK3.Dynamics.PhysBone.Components.VRCPhysBone",
|
||||
"VRC.SDK3.Dynamics.PhysBone.Components.VRCPhysBoneCollider",
|
||||
"VRC.SDK3.Dynamics.PhysBone.Components.VRCPhysBoneRoot",
|
||||
"VRC.SDK3.Dynamics.Constraint.Components.VRCAimConstraint",
|
||||
"VRC.SDK3.Dynamics.Constraint.Components.VRCLookAtConstraint",
|
||||
"VRC.SDK3.Dynamics.Constraint.Components.VRCParentConstraint",
|
||||
"VRC.SDK3.Dynamics.Constraint.Components.VRCPositionConstraint",
|
||||
"VRC.SDK3.Dynamics.Constraint.Components.VRCRotationConstraint",
|
||||
"VRC.SDK3.Dynamics.Constraint.Components.VRCScaleConstraint",
|
||||
"VRC.SDK3.Dynamics.Contact.Components.VRCContactSender",
|
||||
"VRC.SDK3.Dynamics.Contact.Components.VRCContactReceiver",
|
||||
"UnityEngine.Animations.AimConstraint",
|
||||
"UnityEngine.Animations.LookAtConstraint",
|
||||
"UnityEngine.Animations.ParentConstraint",
|
||||
"UnityEngine.Animations.PositionConstraint",
|
||||
"UnityEngine.Animations.RotationConstraint",
|
||||
"UnityEngine.Animations.ScaleConstraint",
|
||||
"UnityEngine.ParticleSystemForceField",
|
||||
"Unity.AI.Navigation.NavMeshSurface",
|
||||
"Unity.AI.Navigation.NavMeshLink",
|
||||
"Unity.AI.Navigation.NavMeshModifier",
|
||||
"Unity.AI.Navigation.NavMeshModifierVolume",
|
||||
"Cinemachine.Cinemachine3rdPersonAim",
|
||||
"Cinemachine.CinemachineBlendListCamera",
|
||||
"Cinemachine.CinemachineBrain",
|
||||
"Cinemachine.CinemachineCameraOffset",
|
||||
"Cinemachine.CinemachineClearShot",
|
||||
"Cinemachine.CinemachineCollider",
|
||||
"Cinemachine.CinemachineConfiner",
|
||||
"Cinemachine.CinemachineDollyCart",
|
||||
"Cinemachine.CinemachineExternalCamera",
|
||||
"Cinemachine.CinemachineFollowZoom",
|
||||
"Cinemachine.CinemachineFreeLook",
|
||||
"Cinemachine.CinemachineMixingCamera",
|
||||
"Cinemachine.CinemachinePath",
|
||||
"Cinemachine.CinemachinePipeline",
|
||||
"Cinemachine.CinemachinePixelPerfect",
|
||||
"Cinemachine.CinemachineRecomposer",
|
||||
"Cinemachine.CinemachineSmoothPath",
|
||||
"Cinemachine.CinemachineStateDrivenCamera",
|
||||
"Cinemachine.CinemachineStoryboard",
|
||||
"Cinemachine.CinemachineTargetGroup",
|
||||
"Cinemachine.CinemachineVirtualCamera",
|
||||
"Cinemachine.Cinemachine3rdPersonFollow",
|
||||
"Cinemachine.CinemachineBasicMultiChannelPerlin",
|
||||
"Cinemachine.CinemachineComposer",
|
||||
"Cinemachine.CinemachineFramingTransposer",
|
||||
"Cinemachine.CinemachineGroupComposer",
|
||||
"Cinemachine.CinemachineHardLockToTarget",
|
||||
"Cinemachine.CinemachineHardLookAt",
|
||||
"Cinemachine.CinemachineOrbitalTransposer",
|
||||
"Cinemachine.CinemachinePOV",
|
||||
"Cinemachine.CinemachineSameAsFollowTarget",
|
||||
"Cinemachine.CinemachineTrackedDolly",
|
||||
"Cinemachine.CinemachineTransposer",
|
||||
"Cinemachine.CinemachineCore",
|
||||
};
|
||||
|
||||
public static readonly string[] ShaderWhiteList = new string[]
|
||||
{
|
||||
"VRChat/Mobile/Standard Lite",
|
||||
"VRChat/Mobile/Diffuse",
|
||||
"VRChat/Mobile/Bumped Diffuse",
|
||||
"VRChat/Mobile/Bumped Mapped Specular",
|
||||
"VRChat/Mobile/Toon Lit",
|
||||
"VRChat/Mobile/MatCap Lit",
|
||||
"VRChat/Mobile/Lightmapped",
|
||||
"VRChat/Mobile/Skybox",
|
||||
"VRChat/Mobile/Particles/Additive",
|
||||
"VRChat/Mobile/Particles/Multiply",
|
||||
"VRChat/Mobile/World/Supersampled UI",
|
||||
"FX/MirrorReflection",
|
||||
"UI/Default",
|
||||
};
|
||||
|
||||
private static readonly HashSet<int> scannedObjects = new HashSet<int>();
|
||||
|
||||
private static void ConfigureWhiteList(WhiteListConfiguration config)
|
||||
{
|
||||
if(ComponentTypeWhiteListConfiguration == config ||
|
||||
config == WhiteListConfiguration.Unchanged)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
List<string> concatenation = new List<string>();
|
||||
concatenation.AddRange(ComponentTypeWhiteListCommon);
|
||||
|
||||
switch(config)
|
||||
{
|
||||
case WhiteListConfiguration.VRCSDK2:
|
||||
concatenation.AddRange(ComponentTypeWhiteListSdk2);
|
||||
break;
|
||||
case WhiteListConfiguration.VRCSDK3:
|
||||
concatenation.AddRange(ComponentTypeWhiteListSdk3);
|
||||
break;
|
||||
}
|
||||
|
||||
ComponentTypeWhiteListConfiguration = config;
|
||||
ComponentTypeWhiteList = concatenation.ToArray();
|
||||
}
|
||||
|
||||
[PublicAPI]
|
||||
public static void RemoveIllegalComponents(List<GameObject> targets, WhiteListConfiguration config, bool retry = true, HashSet<Type> tagWhitelistedTypes = null)
|
||||
{
|
||||
ConfigureWhiteList(config);
|
||||
|
||||
HashSet<Type> whitelist = ValidationUtils.WhitelistedTypes($"world{config}", ComponentTypeWhiteList);
|
||||
|
||||
// combine whitelist types from world tags with cached whitelist
|
||||
tagWhitelistedTypes?.UnionWith(whitelist);
|
||||
|
||||
foreach(GameObject target in targets)
|
||||
{
|
||||
#if VRC_CLIENT
|
||||
ValidationUtils.RemoveIllegalComponents(target, tagWhitelistedTypes ?? whitelist, retry, true);
|
||||
#else
|
||||
ValidationUtils.RemoveIllegalComponents(target, tagWhitelistedTypes ?? whitelist, retry, true, excludeEditorOnly:true, allowRemovingAssets:false);
|
||||
#endif
|
||||
|
||||
SecurityScan(target);
|
||||
AddScanned(target);
|
||||
|
||||
// Must be called after AddScanned to avoid infinite recursion.
|
||||
ScanDropdownTemplates(target, whitelist, config == WhiteListConfiguration.VRCSDK3);
|
||||
}
|
||||
}
|
||||
|
||||
private static void AddScanned(GameObject obj)
|
||||
{
|
||||
if(obj == null)
|
||||
return;
|
||||
|
||||
if(!scannedObjects.Contains(obj.GetInstanceID()))
|
||||
scannedObjects.Add(obj.GetInstanceID());
|
||||
|
||||
for(int idx = 0; idx < obj.transform.childCount; ++idx)
|
||||
AddScanned(obj.transform.GetChild(idx)?.gameObject);
|
||||
}
|
||||
|
||||
private static bool WasScanned(GameObject obj)
|
||||
{
|
||||
return scannedObjects.Contains(obj.GetInstanceID());
|
||||
}
|
||||
|
||||
[PublicAPI]
|
||||
public static void ScanGameObject(GameObject target, WhiteListConfiguration config)
|
||||
{
|
||||
if(WasScanned(target))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
ConfigureWhiteList(config);
|
||||
HashSet<Type> whitelist = ValidationUtils.WhitelistedTypes("world" + config, ComponentTypeWhiteList);
|
||||
ScanGameObject(target, whitelist, config == WhiteListConfiguration.VRCSDK3);
|
||||
}
|
||||
|
||||
private static void ScanGameObject(GameObject target, HashSet<Type> whitelist, bool isSDK3)
|
||||
{
|
||||
if(WasScanned(target))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
#if VRC_CLIENT
|
||||
ValidationUtils.RemoveIllegalComponents(target, whitelist);
|
||||
#else
|
||||
ValidationUtils.RemoveIllegalComponents(target, whitelist, excludeEditorOnly:true, allowRemovingAssets:false);
|
||||
#endif
|
||||
|
||||
SecurityScan(target);
|
||||
#if VRC_CLIENT && UDON
|
||||
if (isSDK3)
|
||||
{
|
||||
Core.UnityEventFilter.FilterEvents(target);
|
||||
}
|
||||
#endif
|
||||
AddScanned(target);
|
||||
|
||||
// Must be called after AddScanned to avoid infinite recursion.
|
||||
ScanDropdownTemplates(target, whitelist, isSDK3);
|
||||
}
|
||||
|
||||
[PublicAPI]
|
||||
public static void ClearScannedGameObjectCache()
|
||||
{
|
||||
scannedObjects.Clear();
|
||||
}
|
||||
|
||||
[PublicAPI]
|
||||
public static IEnumerable<Shader> FindIllegalShaders(GameObject target)
|
||||
{
|
||||
return ValidationUtils.FindIllegalShaders(target, ShaderWhiteList);
|
||||
}
|
||||
|
||||
private static void SecurityScan(GameObject target)
|
||||
{
|
||||
PlayableDirector[] playableDirectors = target.GetComponentsInChildren<PlayableDirector>(true);
|
||||
foreach(PlayableDirector playableDirector in playableDirectors)
|
||||
{
|
||||
StripPlayableDirectorWithPrefabs(playableDirector);
|
||||
}
|
||||
|
||||
UnityEngine.Video.VideoPlayer[] videoPlayers = target.GetComponentsInChildren<UnityEngine.Video.VideoPlayer>(true);
|
||||
foreach (UnityEngine.Video.VideoPlayer videoPlayer in videoPlayers)
|
||||
{
|
||||
AddAudioSourceToVideoPlayer(videoPlayer);
|
||||
}
|
||||
}
|
||||
|
||||
private static void ScanDropdownTemplates(GameObject target, HashSet<Type> whitelist, bool isSDK3)
|
||||
{
|
||||
Dropdown[] dropdowns = target.GetComponentsInChildren<Dropdown>(true);
|
||||
foreach(Dropdown dropdown in dropdowns)
|
||||
{
|
||||
if(dropdown == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
RectTransform dropdownTemplate = dropdown.template;
|
||||
if(dropdownTemplate == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
ScanGameObject(dropdownTemplate.transform.root.gameObject, whitelist, isSDK3);
|
||||
}
|
||||
|
||||
#if TextMeshPro
|
||||
TMP_Dropdown[] tmpDropdowns = target.GetComponentsInChildren<TMP_Dropdown>(true);
|
||||
foreach(TMP_Dropdown textMeshProDropdown in tmpDropdowns)
|
||||
{
|
||||
if(textMeshProDropdown == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
RectTransform dropdownTemplate = textMeshProDropdown.template;
|
||||
if(dropdownTemplate == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
ScanGameObject(dropdownTemplate.transform.root.gameObject, whitelist, isSDK3);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
private static void StripPlayableDirectorWithPrefabs(PlayableDirector playableDirector)
|
||||
{
|
||||
if(!(playableDirector.playableAsset is UnityEngine.Timeline.TimelineAsset timelineAsset))
|
||||
return;
|
||||
|
||||
var tracks = timelineAsset.GetOutputTracks().Concat(timelineAsset.GetRootTracks());
|
||||
foreach(TrackAsset track in tracks)
|
||||
{
|
||||
if(!(track is ControlTrack))
|
||||
continue;
|
||||
|
||||
IEnumerable<TimelineClip> clips = track.GetClips();
|
||||
foreach(TimelineClip clip in clips)
|
||||
{
|
||||
if(clip.asset is ControlPlayableAsset controlPlayableAsset && controlPlayableAsset.prefabGameObject != null)
|
||||
{
|
||||
UnityEngine.Object.Destroy(playableDirector);
|
||||
VRC.Core.Logger.LogWarning("PlayableDirector containing prefab removed", DebugCategoryName, playableDirector.gameObject);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!playableDirector.playableGraph.IsValid())
|
||||
return;
|
||||
|
||||
var audioOutputCount = playableDirector.playableGraph.GetOutputCountByType<AudioPlayableOutput>();
|
||||
for (int i = 0; i < audioOutputCount; i++)
|
||||
{
|
||||
var output = (AudioPlayableOutput)playableDirector.playableGraph.GetOutputByType<AudioPlayableOutput>(i);
|
||||
if (!output.IsOutputValid()) continue;
|
||||
if (output.GetTarget() == null)
|
||||
{
|
||||
// AudioPlayableOutput without a target source will bypass client volume controls.
|
||||
VRC.Core.Logger.LogWarning("Fixing up AudioPlayableOutput without a target source.", DebugCategoryName, playableDirector.gameObject);
|
||||
var addedObj = new GameObject("AudioSource_For_" + playableDirector.name);
|
||||
var addedSrc = addedObj.AddComponent<AudioSource>();
|
||||
addedSrc.spatialize = false;
|
||||
addedSrc.bypassEffects = true;
|
||||
addedSrc.bypassListenerEffects = true;
|
||||
addedSrc.bypassReverbZones = true;
|
||||
addedSrc.spatialBlend = 0.0f;
|
||||
addedSrc.dopplerLevel = 0.0f;
|
||||
addedSrc.rolloffMode = AudioRolloffMode.Custom;
|
||||
addedSrc.SetCustomCurve(AudioSourceCurveType.CustomRolloff, AnimationCurve.Constant(0, 1, 1));
|
||||
#if VRC_CLIENT
|
||||
addedSrc.outputAudioMixerGroup = VRCAudioManager.GetGameGroup();
|
||||
#endif
|
||||
output.SetTarget(addedSrc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void AddAudioSourceToVideoPlayer(UnityEngine.Video.VideoPlayer videoPlayer)
|
||||
{
|
||||
// VideoPlayer objects with output mode set to "Direct" bypass client volume controls.
|
||||
|
||||
if (videoPlayer.audioOutputMode == UnityEngine.Video.VideoAudioOutputMode.Direct)
|
||||
{
|
||||
//if playback is happening (or will) you have to Stop() before you attach an AudioSource.
|
||||
bool play_state = (videoPlayer.isPlaying || videoPlayer.playOnAwake);
|
||||
if (play_state)
|
||||
{
|
||||
videoPlayer.Stop();
|
||||
}
|
||||
|
||||
AudioSource vp_src = videoPlayer.gameObject.AddComponent<AudioSource>();
|
||||
videoPlayer.audioOutputMode = UnityEngine.Video.VideoAudioOutputMode.AudioSource;
|
||||
for (ushort i = 0; i < videoPlayer.audioTrackCount; i++)
|
||||
{
|
||||
videoPlayer.SetTargetAudioSource(i,vp_src);
|
||||
}
|
||||
|
||||
if (play_state)
|
||||
{
|
||||
videoPlayer.Play();
|
||||
}
|
||||
VRC.Core.Logger.LogWarning("VideoPlayer using DIRECT audio output fixed.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9b03724cd556cb047b2da80492ea28a5
|
||||
timeCreated: 1504829091
|
||||
licenseType: Pro
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -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: 862234372, guid: f994bcaaf4690ab4e953545d40789022, type: 3}
|
||||
m_Name: Settings
|
||||
m_EditorClassIdentifier:
|
||||
activeWindowPanel: 0
|
||||
polygonLimits: e80300008813000010270000
|
||||
DisplayAdvancedSettings: 0
|
||||
DisplayHelpBoxes: 1
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d471b09e7f06a69458457ec63d3532b8
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c858de3dd293d29438abd1b260bed681
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 133 KiB |
@ -0,0 +1,110 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 861bc2dd35aa1534d89330ffa4434b61
|
||||
TextureImporter:
|
||||
fileIDToRecycleName: {}
|
||||
externalObjects: {}
|
||||
serializedVersion: 9
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 0
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: -1
|
||||
aniso: -1
|
||||
mipBias: -100
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: -1
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 0
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 2
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
- serializedVersion: 2
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: a0c65038ff8c0624ea8e378f0bda371d
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
spritePackingTag:
|
||||
pSDRemoveMatte: 0
|
||||
pSDShowRemoveMatteOption: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
|
After Width: | Height: | Size: 293 KiB |