HUD and Height Changes
This commit is contained in:
+21025
-500
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1,117 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 85632fd8b2052f048ab191bf8b7f8a83
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
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
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
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: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 4
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
customData:
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spriteCustomMetadata:
|
||||
entries: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,117 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 09afebdec88af1646820da653de71e9f
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
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
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
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: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 4
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
customData:
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spriteCustomMetadata:
|
||||
entries: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,117 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8bea1161a6580104b85e362974f14c24
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
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
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
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: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 4
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
customData:
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spriteCustomMetadata:
|
||||
entries: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,117 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 02b24470657cf114395232745e3ca5df
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
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
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
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: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 4
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
customData:
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spriteCustomMetadata:
|
||||
entries: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,117 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4cad04019b84fcd47a3e799bb72e8db2
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
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
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
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: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 4
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
customData:
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spriteCustomMetadata:
|
||||
entries: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,117 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 38a2d28339e1c3f48ab441d371ad44cd
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
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
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
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: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 4
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
customData:
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spriteCustomMetadata:
|
||||
entries: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
+5
-1
@@ -33,7 +33,8 @@ Material:
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap:
|
||||
RenderType: Opaque
|
||||
disabledShaderPasses: []
|
||||
disabledShaderPasses:
|
||||
- MOTIONVECTORS
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
@@ -96,6 +97,7 @@ Material:
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _AddPrecomputedVelocity: 0
|
||||
- _AlphaClip: 0
|
||||
- _AlphaToMask: 0
|
||||
- _Blend: 0
|
||||
@@ -127,6 +129,7 @@ Material:
|
||||
- _Surface: 0
|
||||
- _UVSec: 0
|
||||
- _WorkflowMode: 1
|
||||
- _XRMotionVectorsPass: 1
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
@@ -134,3 +137,4 @@ Material:
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
|
||||
+7
-3
@@ -33,7 +33,8 @@ Material:
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap:
|
||||
RenderType: Opaque
|
||||
disabledShaderPasses: []
|
||||
disabledShaderPasses:
|
||||
- MOTIONVECTORS
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
@@ -63,8 +64,8 @@ Material:
|
||||
m_Scale: {x: 2, y: 2}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Texture: {fileID: 2800000, guid: 6064e4e3e79a3a1408ee2059beaa066b, type: 3}
|
||||
m_Scale: {x: 2, y: 2}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
@@ -96,6 +97,7 @@ Material:
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _AddPrecomputedVelocity: 0
|
||||
- _AlphaClip: 0
|
||||
- _AlphaToMask: 0
|
||||
- _Blend: 0
|
||||
@@ -127,6 +129,7 @@ Material:
|
||||
- _Surface: 0
|
||||
- _UVSec: 0
|
||||
- _WorkflowMode: 1
|
||||
- _XRMotionVectorsPass: 1
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
@@ -134,3 +137,4 @@ Material:
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
|
||||
@@ -18,15 +18,15 @@ MonoBehaviour:
|
||||
m_RenderMode: 0
|
||||
m_ColliderUpdateMode: 0
|
||||
m_ColliderIsTrigger: 1
|
||||
m_ScaleMode: 1
|
||||
m_ScaleMode: 2
|
||||
m_ReferenceSpritePixelsPerUnit: 100
|
||||
m_PixelsPerUnit: 100
|
||||
m_Scale: 1
|
||||
m_ReferenceDpi: 96
|
||||
m_FallbackDpi: 96
|
||||
m_ReferenceResolution: {x: 1200, y: 800}
|
||||
m_ReferenceResolution: {x: 1920, y: 1080}
|
||||
m_ScreenMatchMode: 0
|
||||
m_Match: 0
|
||||
m_Match: 0.5
|
||||
m_SortingOrder: 0
|
||||
m_TargetDisplay: 0
|
||||
m_BindingLogLevel: 0
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
using ProjectM.Simulation;
|
||||
using Unity.Entities;
|
||||
using UnityEngine;
|
||||
|
||||
namespace ProjectM.Authoring
|
||||
{
|
||||
/// <summary>
|
||||
/// Drop one instance into the Gameplay subscene. Bakes <see cref="WorldCollisionConfig"/> capturing the
|
||||
/// "Environment" physics layer's BelongsTo mask (the layer the boundary-ring + landmark colliders live on).
|
||||
/// The baker runs on the main thread, so the managed <see cref="LayerMask.NameToLayer"/> lookup is fine here —
|
||||
/// this exists precisely so the Bursted server EnemyAISystem can read the mask as a plain uint at runtime.
|
||||
/// </summary>
|
||||
[DisallowMultipleComponent]
|
||||
public class WorldCollisionAuthoring : MonoBehaviour
|
||||
{
|
||||
[Tooltip("Name of the Unity layer carrying the static world colliders (boundary ring + landmarks).")]
|
||||
public string EnvironmentLayerName = "Environment";
|
||||
|
||||
private class WorldCollisionBaker : Baker<WorldCollisionAuthoring>
|
||||
{
|
||||
public override void Bake(WorldCollisionAuthoring authoring)
|
||||
{
|
||||
int layer = LayerMask.NameToLayer(authoring.EnvironmentLayerName);
|
||||
uint mask = layer >= 0 ? 1u << layer : 0u;
|
||||
var entity = GetEntity(TransformUsageFlags.None);
|
||||
AddComponent(entity, new WorldCollisionConfig { EnvironmentMask = mask });
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ab1c895817ca4b64db74215f13abb5e3
|
||||
@@ -4,6 +4,7 @@ using Unity.Collections;
|
||||
using Unity.Entities;
|
||||
using Unity.Mathematics;
|
||||
using Unity.NetCode;
|
||||
using Unity.Physics;
|
||||
using Unity.Transforms;
|
||||
|
||||
namespace ProjectM.Server
|
||||
@@ -61,6 +62,11 @@ namespace ProjectM.Server
|
||||
var serverTick = SystemAPI.GetSingleton<NetworkTime>().ServerTick;
|
||||
uint now = serverTick.TickIndexForValidTick;
|
||||
var ecb = new EntityCommandBuffer(Allocator.Temp);
|
||||
bool havePhysics = SystemAPI.TryGetSingleton<PhysicsWorldSingleton>(out var physics);
|
||||
uint envMask = SystemAPI.TryGetSingleton<WorldCollisionConfig>(out var worldCol) ? worldCol.EnvironmentMask : 0u;
|
||||
var envFilter = new CollisionFilter { BelongsTo = ~0u, CollidesWith = envMask, GroupIndex = 0 };
|
||||
bool sweep = havePhysics && envMask != 0u;
|
||||
const float SweepRadius = 0.5f; // collide-and-slide sphere radius for Husk movement
|
||||
|
||||
foreach (var (xform, stats, cooldown, knockback, windup) in
|
||||
SystemAPI.Query<RefRW<LocalTransform>, RefRO<EnemyStats>, RefRW<EnemyAttackCooldown>,
|
||||
@@ -78,6 +84,8 @@ namespace ProjectM.Server
|
||||
{
|
||||
float3 kpos = pos + new float3(kb.Dir.x, 0f, kb.Dir.y) * (kb.Speed * dt);
|
||||
kpos.y = pos.y;
|
||||
if (sweep)
|
||||
kpos = SweptMove(in physics, pos, kpos, SweepRadius, envFilter);
|
||||
xform.ValueRW.Position = kpos;
|
||||
windup.ValueRW.WindUpUntilTick = 0; // a recoiling Husk does not wind up
|
||||
continue; // recoiling: skip seek + strike this tick
|
||||
@@ -106,6 +114,8 @@ namespace ProjectM.Server
|
||||
float3 vel = EnemyAIMath.SeekVelocity(pos, targetPos, stats.ValueRO.MoveSpeed, stopDistance);
|
||||
float3 newPos = pos + vel * dt;
|
||||
newPos.y = pos.y; // hold the movement plane
|
||||
if (sweep)
|
||||
newPos = SweptMove(in physics, pos, newPos, SweepRadius, envFilter);
|
||||
xform.ValueRW.Position = newPos;
|
||||
|
||||
// Face the target (planar) for presentation.
|
||||
@@ -166,5 +176,38 @@ namespace ProjectM.Server
|
||||
playerEntities.Dispose();
|
||||
playerPositions.Dispose();
|
||||
}
|
||||
|
||||
// Swept collide-and-slide for server-authoritative Husk movement: sphere-cast the intended step against
|
||||
// the static environment (boundary ring + landmarks) and stop at / glance along the first wall hit. Closest-
|
||||
// hit SphereCast is non-generic -> Burst-safe (CLAUDE.md generic-collector hazard avoided). Y is held flat.
|
||||
static float3 SweptMove(in PhysicsWorldSingleton physics, float3 from, float3 to, float radius, CollisionFilter filter)
|
||||
{
|
||||
float3 delta = to - from;
|
||||
delta.y = 0f;
|
||||
float dist = math.length(delta);
|
||||
if (dist < 1e-5f)
|
||||
return to;
|
||||
float3 dir = delta / dist;
|
||||
const float skin = 0.05f;
|
||||
var cw = physics.CollisionWorld;
|
||||
if (!cw.SphereCast(from, radius, dir, dist, out var hit, filter))
|
||||
return to;
|
||||
|
||||
float allowed = math.max(0f, hit.Fraction * dist - skin);
|
||||
float3 stop = from + dir * allowed;
|
||||
stop.y = from.y;
|
||||
|
||||
// Slide the unused motion along the wall, then sweep the slide so we don't tunnel a second wall.
|
||||
float3 slide = EnemyAIMath.SlideVelocity(to - stop, hit.SurfaceNormal);
|
||||
float slideDist = math.length(slide);
|
||||
if (slideDist < 1e-5f)
|
||||
return stop;
|
||||
float3 sdir = slide / slideDist;
|
||||
float3 result = cw.SphereCast(stop, radius, sdir, slideDist, out var hit2, filter)
|
||||
? stop + sdir * math.max(0f, hit2.Fraction * slideDist - skin)
|
||||
: stop + slide;
|
||||
result.y = from.y;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
"Unity.Mathematics",
|
||||
"Unity.Burst",
|
||||
"Unity.NetCode",
|
||||
"Unity.Networking.Transport"
|
||||
"Unity.Networking.Transport",
|
||||
"Unity.Physics"
|
||||
],
|
||||
"includePlatforms": [],
|
||||
"excludePlatforms": [],
|
||||
|
||||
@@ -35,6 +35,24 @@ namespace ProjectM.Simulation
|
||||
d.y = 0f;
|
||||
return math.lengthsq(d) <= range * range;
|
||||
}
|
||||
/// <summary>
|
||||
/// Projects a planar movement <paramref name="vel"/> onto a wall plane defined by <paramref name="surfaceNormal"/>
|
||||
/// (collide-and-slide): removes the component of <paramref name="vel"/> that pushes into the surface so the
|
||||
/// mover glances along the wall instead of stopping dead. Both inputs are flattened to the XZ plane (top-down).
|
||||
/// Returns <paramref name="vel"/> unchanged when the normal is degenerate.
|
||||
/// </summary>
|
||||
public static float3 SlideVelocity(float3 vel, float3 surfaceNormal)
|
||||
{
|
||||
surfaceNormal.y = 0f;
|
||||
float len = math.length(surfaceNormal);
|
||||
if (len < 1e-6f)
|
||||
return vel;
|
||||
float3 n = surfaceNormal / len;
|
||||
float3 slid = vel - math.dot(vel, n) * n;
|
||||
slid.y = 0f;
|
||||
return slid;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Deterministic planar ring position around <paramref name="center"/> for spawn
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
using Unity.Entities;
|
||||
|
||||
namespace ProjectM.Simulation
|
||||
{
|
||||
/// <summary>
|
||||
/// Singleton holding the physics-filter mask of the static world-collision layer ("Environment"): the baked
|
||||
/// boundary ring + landmark colliders the player CC sweeps. Baked from the GameObject layer at edit-time (see
|
||||
/// WorldCollisionAuthoring) so server systems can build a <c>CollisionFilter</c> in Burst WITHOUT a managed
|
||||
/// <c>LayerMask.NameToLayer</c> call or a hardcoded layer index. Read by <see cref="ProjectM.Server"/>'s
|
||||
/// EnemyAISystem to sweep-test Husk movement against the environment only (never the player / other Husks).
|
||||
/// </summary>
|
||||
public struct WorldCollisionConfig : IComponentData
|
||||
{
|
||||
/// <summary>BelongsTo bitmask of the Environment physics layer (<c>1u << layerIndex</c>).</summary>
|
||||
public uint EnvironmentMask;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 70c75b96478d39f43aca221c926c9561
|
||||
File diff suppressed because it is too large
Load Diff
@@ -75,5 +75,41 @@ namespace ProjectM.Tests
|
||||
var other = EnemyAIMath.RingPosition(c, 2, 8, 4f);
|
||||
Assert.Greater(math.distance(a, other), 1e-3f);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SlideVelocity_RemovesIntoWallComponent()
|
||||
{
|
||||
// Moving +X into a wall whose normal is -X (facing the mover): the into-wall component is removed.
|
||||
var slid = EnemyAIMath.SlideVelocity(new float3(4, 0, 0), new float3(-1, 0, 0));
|
||||
Assert.AreEqual(0f, math.length(slid), Eps);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SlideVelocity_KeepsParallelComponent()
|
||||
{
|
||||
// Moving diagonally into a wall with normal -X: the +X part is clipped, the +Z part survives.
|
||||
var slid = EnemyAIMath.SlideVelocity(new float3(3, 0, 5), new float3(-1, 0, 0));
|
||||
Assert.AreEqual(0f, slid.x, Eps);
|
||||
Assert.AreEqual(5f, slid.z, Eps);
|
||||
Assert.AreEqual(0f, slid.y, Eps);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SlideVelocity_FlattensNormalToPlane()
|
||||
{
|
||||
// A normal with a Y tilt is flattened to XZ before projecting, so vertical tilt never leaks in.
|
||||
var slid = EnemyAIMath.SlideVelocity(new float3(2, 0, 0), new float3(-1, 5, 0));
|
||||
Assert.AreEqual(0f, slid.x, Eps);
|
||||
Assert.AreEqual(0f, slid.y, Eps);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SlideVelocity_DegenerateNormal_ReturnsInput()
|
||||
{
|
||||
var v = new float3(2, 0, 3);
|
||||
var slid = EnemyAIMath.SlideVelocity(v, float3.zero);
|
||||
Assert.AreEqual(v.x, slid.x, Eps);
|
||||
Assert.AreEqual(v.z, slid.z, Eps);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,14 +101,14 @@ Long-form originals + the milestone each came from: `Docs/Vault/_Meta/CLAUDE_Bui
|
||||
- **Synty HUD skin via a build-safe `HudTheme` ★ (DR-024):** Synty sprites/fonts under `Assets/Synty/…` (NOT Resources) → a runtime name-string `Resources.Load` is **build-stripped**; use a curated `HudTheme : ScriptableObject` (`Assets/_Project/Resources/HudTheme.asset`) holding **serialized** refs, loaded null-safe via `HudTheme.Get()` (every consumer falls back to flat on a null ref). `unityBackgroundImageTintColor` MULTIPLIES (tint white skins); fonts = cached SDF, reset on `SubsystemRegistration`. Don't set `unitySlice*` on Synty 9-slice frame/bar sprites (per-element ERROR; DO set it for border-0 sprites). Some Synty sprites import as **Multiple** → `LoadAssetAtPath<Sprite>` null; verify. See [[DR-024_HUD_Synty_Skin_Theme]].
|
||||
|
||||
### Art import (HDRP store packs → URP)
|
||||
- BefourStudios art is **HDRP-authored** → magenta under URP 17.4 + Entities Graphics. **Convert, don't switch pipelines** (HDRP breaks Entities Graphics). Re-author to stock URP/Lit via `EnvArtTools.cs` (menu `ProjectM/Art/1. Convert Curated Env Materials`). Synty art is **URP-native — no conversion**.
|
||||
- **World = cosmetic Synty nature biomes ★ (DR-025):** `Game.unity` roots `BaseBiome`(Meadow_Forest)@origin + `ExpeditionBiome`(Arid_Desert)@+1000 — classic-URP cosmetics, colliders stripped, **NEVER the subscene**; ground = stock URP/Lit `Mat_Grass_Textures_01`/`sand 1` (NOT prop-atlas `S_General` mats). Global `Skybox/Procedural` material (a Synty skydome MESH sits at origin → can't cover two regions); per-region fog/ambient cross-fade via client `WorldAtmosphereSystem` (camera X>500, mirrors `HudSystem`). **PNB fog/cloud-ring PREFABS render as a white torus — don't place them** (use `RenderSettings` fog). See [[DR-025_World_Environment_Redo_Natural_Frontier]].
|
||||
- **A dark-lit screenshot MASKS material bugs — verify material *values*.** Always `shader.GetPropertyType(idx)`-guard before `GetColor`/`GetFloat`/`GetTexture` (`S_General`'s `_BaseColorMultiply` is a float; `GetColor` on it returns black). Gate source emission on the `_Emissive` flag AND a fixture name. Keep converted env metallic low (0.1–0.2).
|
||||
- **`VolumeProfile.Add<T>()` does NOT persist** (serializes `{fileID:0}` on save) — use `AssetDatabase.AddObjectToAsset(component, profile)` + `SaveAssets`, verify on disk.
|
||||
- **A reverted engine/URP upgrade can stamp `UniversalRenderPipelineGlobalSettings.asset` `m_AssetVersion` AHEAD of the package's `k_LastVersion`** (here 11 > 10, from the reverted 6.6 alpha). URP migrates **forward only**, so `URPPreprocessBuild` rejects the "from-the-future" asset (*"not at last version"*) — **blocks player builds but NOT editor Play**. Fix: reflection-set `m_AssetVersion` back to `k_LastVersion`, `SetDirty` + `SaveAssets`.
|
||||
- **`LocalTransform.FromPosition()` resets Scale=1** — server spawners must read the prefab's baked `LocalTransform` and override only Position (Scale is a replicated `[GhostField]` → consistent-but-wrong).
|
||||
- **Static decor → gameplay subscene** (Entities Graphics renders only baked/EG-spawned entities); **strip colliders from cosmetic props** (else they bake into the PhysicsWorld the CC sweeps), no `GhostAuthoring` on scenery. Cosmetic SampleScene GameObjects (`SyntyWorld` root) render via classic URP and their colliders are **inert to the DOTS PhysicsWorld**. To swap a subscene object's visual while keeping collision: disable the MeshRenderer, keep the collider.
|
||||
- **A GA "projectile" prefab self-propels** (non-kinematic `Rigidbody` + collider + `ProjectileMoveScript`) — strip to particles before `Start` (`CombatFeedbackSystem.StripCosmetic`). Verify a prefab's *components*, not its name.
|
||||
- BefourStudios art is **HDRP-authored** → magenta under URP 17.4 + Entities Graphics. **Convert, don't switch pipelines** (HDRP breaks EG): re-author to stock URP/Lit via `EnvArtTools.cs` (menu `ProjectM/Art/1. Convert Curated Env Materials`). Synty art is **URP-native — no conversion**.
|
||||
- **World = cosmetic Synty nature biomes ★ (DR-025):** `Game.unity` roots `BaseBiome`(Meadow_Forest)@origin + `ExpeditionBiome`(Arid_Desert)@+1000 — classic-URP cosmetics; ground = stock URP/Lit `Mat_Grass_Textures_01`/`sand 1` (NOT prop-atlas `S_General` mats). Global `Skybox/Procedural` (skydome MESH @origin can't span both regions); per-region fog/ambient cross-fade via client `WorldAtmosphereSystem` (camera X>500). **PNB fog/cloud-ring PREFABS = white torus — don't place.** See [[DR-025_World_Environment_Redo_Natural_Frontier]].
|
||||
- **A dark-lit screenshot MASKS material bugs — verify material *values*.** `shader.GetPropertyType(idx)`-guard before `GetColor`/`GetFloat`/`GetTexture` (`S_General`'s `_BaseColorMultiply` is a float → `GetColor` returns black). Gate emission on the `_Emissive` flag + a fixture name; keep converted env metallic low (0.1–0.2).
|
||||
- **`VolumeProfile.Add<T>()` does NOT persist** (serializes `{fileID:0}`) — use `AssetDatabase.AddObjectToAsset(comp, profile)` + `SaveAssets`, verify on disk.
|
||||
- **A reverted engine/URP upgrade can stamp `URPGlobalSettings.asset` `m_AssetVersion` AHEAD of the package's `k_LastVersion`** (11>10, from the reverted 6.6 alpha); URP migrates forward-only so `URPPreprocessBuild` rejects it (*"not at last version"*) — **blocks player builds, not editor Play**. Fix: reflection-set `m_AssetVersion` back to `k_LastVersion` + `SaveAssets`.
|
||||
- **`LocalTransform.FromPosition()` resets Scale=1** — server spawners read the prefab's baked `LocalTransform`, override only Position (Scale is a `[GhostField]` → consistent-but-wrong).
|
||||
- **Static decor → gameplay subscene** (Entities Graphics renders only baked/EG-spawned entities); **strip colliders from cosmetic props** (else they bake into the PhysicsWorld the CC sweeps), no `GhostAuthoring` on scenery (classic-URP cosmetic colliders are **inert to the DOTS PhysicsWorld**). **World collision = subscene-only ★:** `Environment`-layer boundary ring + landmark box colliders (player blocked via the default layer matrix); enemies slide via a server `CollisionWorld.SphereCast` in `EnemyAISystem` (filter=`WorldCollisionConfig.EnvironmentMask`). Boundaries read as a **raised rock-cliff bowl rim** (`SM_Env_Rock_Cliff` ring ground-snapped at the collider radius, flat walkable interior) — top-down gates height as a hard vertical wall, never traversable slopes. See [[2026-06-08_World_Collision_HUD_Scaling]].
|
||||
- **A GA "projectile" prefab self-propels** (non-kinematic `Rigidbody`+collider+`ProjectileMoveScript`) — strip to particles before `Start` (`CombatFeedbackSystem.StripCosmetic`). Verify *components*, not the name.
|
||||
|
||||
### Aim controls
|
||||
- **Client-derived aim rides the EXISTING `PlayerInput.Aim` `[GhostField]`** — mouse-cursor aim computed in `PlayerInputGatherSystem` (managed `SystemBase`, `GhostInputSystemGroup`): `Mouse.current.position` → `Camera.main.ScreenPointToRay` → `AimMath.PlanarAimFromRay` (pure, unit-tested) → player→cursor direction. Only the direction crosses the wire; strafe-while-aiming is free (`Move` already decoupled from `Aim`).
|
||||
|
||||
@@ -1,7 +1,15 @@
|
||||
---
|
||||
date: 2026-06-03
|
||||
type: session
|
||||
tags: [session, input, controls, aiming, gamepad, netcode, presentation]
|
||||
tags:
|
||||
- session
|
||||
- input
|
||||
- controls
|
||||
- aiming
|
||||
- gamepad
|
||||
- netcode
|
||||
- presentation
|
||||
permalink: gamevault/07-sessions/2026/2026-06-03-aim-controls-cursor-gamepad
|
||||
---
|
||||
|
||||
# Session 2026-06-03 — Aim controls: mouse cursor + gamepad twin-stick
|
||||
@@ -40,4 +48,4 @@ After the first pass landed and tested well, the operator asked to make KBM aimi
|
||||
|
||||
## Next
|
||||
|
||||
- Operator focused click-test of cursor aim + device switching; then consider ability-slot expansion or controller aim-assist tuning.
|
||||
- Operator focused click-test of cursor aim + device switching; then consider ability-slot expansion or controller aim-assist tuning.
|
||||
@@ -1,7 +1,14 @@
|
||||
---
|
||||
date: 2026-06-03
|
||||
type: session
|
||||
tags: [session, m6, core-loop, netcode, ghost-relevancy, design]
|
||||
tags:
|
||||
- session
|
||||
- m6
|
||||
- core-loop
|
||||
- netcode
|
||||
- ghost-relevancy
|
||||
- design
|
||||
permalink: gamevault/07-sessions/2026/2026-06-03-m6-aether-cycle-core-loop
|
||||
---
|
||||
|
||||
# Session 2026-06-03 — M6 "The Aether Cycle": core-loop research, plan, and Stages 0–1
|
||||
@@ -130,4 +137,4 @@ See [[DR-013_M6_Aether_Cycle_Region_Split]] for the full architecture + validate
|
||||
## Next
|
||||
|
||||
Checkpoint for operator feedback on the working core-loop skeleton, then continue Stage 2 (resources + harvest)
|
||||
— the gather half of the economy — followed by build placement (Stage 3) and persistence/goal (Stage 4).
|
||||
— the gather half of the economy — followed by build placement (Stage 3) and persistence/goal (Stage 4).
|
||||
@@ -1,7 +1,15 @@
|
||||
---
|
||||
date: 2026-06-03
|
||||
type: session
|
||||
tags: [session, cleanup, housekeeping, netcode, perf, vault, packages]
|
||||
tags:
|
||||
- session
|
||||
- cleanup
|
||||
- housekeeping
|
||||
- netcode
|
||||
- perf
|
||||
- vault
|
||||
- packages
|
||||
permalink: gamevault/07-sessions/2026/2026-06-03-pre-m6-cleanup
|
||||
---
|
||||
|
||||
# Session 2026-06-03 — Pre-M6 cleanup (loose ends before Build/Placement)
|
||||
@@ -45,4 +53,4 @@ Inventory finding up front: the **code layer was already clean** — no open dec
|
||||
|
||||
## Next
|
||||
|
||||
- Start **M6 — Build/Placement** (server-authoritative grid placement via RPC) on the locked `BaseGridMath` coordinate space ([[DR-008_M5_HomeBase_BaseLayer_Storage]]).
|
||||
- Start **M6 — Build/Placement** (server-authoritative grid placement via RPC) on the locked `BaseGridMath` coordinate space ([[DR-008_M5_HomeBase_BaseLayer_Storage]]).
|
||||
@@ -1,7 +1,15 @@
|
||||
---
|
||||
date: 2026-06-04
|
||||
type: session
|
||||
tags: [session, core-loop, pacing, netcode, dev-tools, scenes, m8]
|
||||
tags:
|
||||
- session
|
||||
- core-loop
|
||||
- pacing
|
||||
- netcode
|
||||
- dev-tools
|
||||
- scenes
|
||||
- m8
|
||||
permalink: gamevault/07-sessions/2026/2026-06-04-m8-persistent-base-player-driven-pacing
|
||||
---
|
||||
|
||||
# Session 2026-06-04 — M8: Persistent base & player-driven pacing
|
||||
@@ -61,4 +69,4 @@ Replaces the M6 **forced-timer treadmill** (Expedition 60s → Defend → Build
|
||||
|
||||
- **Build/automation/customization expansion** on the now-persistent base (the operator's stated next direction) — the ThreatDirector inert sources + the DR-014 structure tick fields are the additive hooks.
|
||||
- Multi-client (MPPM) run of the co-op split-presence + dev-tools-over-a-real-connection (the unconditional RPC type is the enabler).
|
||||
- Optional: base-integrity fail-state if losing a siege should have visible teeth.
|
||||
- Optional: base-integrity fail-state if losing a siege should have visible teeth.
|
||||
@@ -1,7 +1,15 @@
|
||||
---
|
||||
date: 2026-06-04
|
||||
type: session
|
||||
tags: [session, polish, backlog, testing, hygiene, netcode, audio]
|
||||
tags:
|
||||
- session
|
||||
- polish
|
||||
- backlog
|
||||
- testing
|
||||
- hygiene
|
||||
- netcode
|
||||
- audio
|
||||
permalink: gamevault/07-sessions/2026/2026-06-04-polish-backlog-pass
|
||||
---
|
||||
|
||||
# Session 2026-06-04 — Polish & Backlog-Clear Pass (Stages A–G)
|
||||
@@ -72,4 +80,4 @@ This log covers **Stages A, B, C, D, and E(audio)**. Stages A–C were done on t
|
||||
|
||||
- **Polish stages A–F are DONE + validated** (118 EditMode green; the one new netcode surface — `CycleState.WaveNumber` — proven server==client in Play; feel operator-approved; props reskinned + post verified).
|
||||
- **Stage G done so far:** timed modifiers, knockback, attack telegraph (all validated). **Remaining:** the ranged **Spitter** (the large one — new `EnemySpitter` + new interpolated `EnemyProjectile` ghost prefabs + spit-fire/move/damage-vs-players systems; re-bake = new ghost TYPES, not an existing-ghost serializer change) and **multi-prefab abilities** (generalize the non-Burst `ProjectileClassificationSystem` to a ghost-type SET; core correctness — no owner-client double-spawn — is Play-only). Small fold-ins still open: standalone-server debug RPC, storage proximity-gate, pickup auto-grant (confirm intent).
|
||||
- **Stage H** (rebindable controls + ability slots + ability icon/UI) and **Stage I** (thin-client/MPPM harness + operator-required live runs: two-build LAN co-op, live fire, standalone server perf — the standing ~1.25–1.75 ticks/frame question).
|
||||
- **Stage H** (rebindable controls + ability slots + ability icon/UI) and **Stage I** (thin-client/MPPM harness + operator-required live runs: two-build LAN co-op, live fire, standalone server perf — the standing ~1.25–1.75 ticks/frame question).
|
||||
@@ -1,7 +1,18 @@
|
||||
---
|
||||
date: 2026-06-05
|
||||
type: session
|
||||
tags: [session, frontend, menu, ui-toolkit, settings, saves, netcode, world-lifecycle, build, infra]
|
||||
tags:
|
||||
- session
|
||||
- frontend
|
||||
- menu
|
||||
- ui-toolkit
|
||||
- settings
|
||||
- saves
|
||||
- netcode
|
||||
- world-lifecycle
|
||||
- build
|
||||
- infra
|
||||
permalink: gamevault/07-sessions/2026/2026-06-05-game-infrastructure-menu-settings-saves
|
||||
---
|
||||
|
||||
# Session 2026-06-05 — Game infrastructure: Main Menu, Settings, Saves foundation, Build wiring
|
||||
@@ -79,4 +90,4 @@ The core change: adopt the Netcode **frontend pattern** — boot a menu with NO
|
||||
|
||||
## Next
|
||||
|
||||
- Operator: run the build + a real LAN join; then resume **M7 Automation** (the next milestone) or base/automation expansion on the now-buildable, persistent-save foundation.
|
||||
- Operator: run the build + a real LAN join; then resume **M7 Automation** (the next milestone) or base/automation expansion on the now-buildable, persistent-save foundation.
|
||||
@@ -1,7 +1,15 @@
|
||||
---
|
||||
date: 2026-06-05
|
||||
type: session
|
||||
tags: [session, hud, ui-toolkit, build-palette, presentation, uitk, juice]
|
||||
tags:
|
||||
- session
|
||||
- hud
|
||||
- ui-toolkit
|
||||
- build-palette
|
||||
- presentation
|
||||
- uitk
|
||||
- juice
|
||||
permalink: gamevault/07-sessions/2026/2026-06-05-hud-rework-uitk-build-palette
|
||||
---
|
||||
|
||||
# Session 2026-06-05 — HUD rework to UI Toolkit + build-palette HUD (click-to-place + ghost preview)
|
||||
@@ -38,4 +46,4 @@ Converted the in-game HUD from code-built **uGUI** (`HudSystem`'s RawImage bars
|
||||
- **Per-buildable icons** + a conveyor-facing arrow on the ghost (text-only palette + cube ghost today).
|
||||
- **Throughput visuals** (item-on-belt) still need a small replicated field (server-only machine buffers don't reach the client).
|
||||
- Remove the legacy IMGUI `ConnectionUI` "Net: Connected" label (backlog) — the only non-UITK on-screen UI left in-game.
|
||||
- Optional: a one-line "BUILD: [name] • click to place, [/] rotate, Esc cancel" hint while in build mode; a build toggle key to open/close the palette focus.
|
||||
- Optional: a one-line "BUILD: [name] • click to place, [/] rotate, Esc cancel" hint while in build mode; a build toggle key to open/close the palette focus.
|
||||
@@ -1,7 +1,16 @@
|
||||
---
|
||||
date: 2026-06-05
|
||||
type: session
|
||||
tags: [session, m7, automation, production-chains, conveyor, persistence, netcode, determinism]
|
||||
tags:
|
||||
- session
|
||||
- m7
|
||||
- automation
|
||||
- production-chains
|
||||
- conveyor
|
||||
- persistence
|
||||
- netcode
|
||||
- determinism
|
||||
permalink: gamevault/07-sessions/2026/2026-06-05-m7-automation
|
||||
---
|
||||
|
||||
# Session 2026-06-05 — M7 Automation: self-running production chains (Harvester → Conveyor → Fabricator)
|
||||
@@ -46,4 +55,4 @@ Intake decisions (AskUserQuestion):
|
||||
- **Build-palette HUD + ghost preview** + a conveyor-facing indicator (dev `[`/`]` rotate + H/F/C keys only today).
|
||||
- **Relevancy ceiling:** `RegionRelevancySystem`'s O(structures×connections)/tick scan becomes load-bearing at higher conveyor counts (DR-014 ceiling note) — batch it when counts grow.
|
||||
- **Recipe depth:** multi-input fabricator recipes; fabricator→conveyor output chaining (additive — give the fabricator a `MachineOutput`); per-machine distinct meshes (machines reuse the Turret mesh as a placeholder).
|
||||
- **Operator live play-through** + a real 2-build LAN run to exercise the chain under latency (single-client validated).
|
||||
- **Operator live play-through** + a real 2-build LAN run to exercise the chain under latency (single-client validated).
|
||||
@@ -1,7 +1,16 @@
|
||||
---
|
||||
date: 2026-06-06
|
||||
type: session
|
||||
tags: [session, animation, rukhanka, synty, netcode, presentation, dots, slice]
|
||||
tags:
|
||||
- session
|
||||
- animation
|
||||
- rukhanka
|
||||
- synty
|
||||
- netcode
|
||||
- presentation
|
||||
- dots
|
||||
- slice
|
||||
permalink: gamevault/07-sessions/2026/2026-06-06-animation-pipeline-slice1
|
||||
---
|
||||
|
||||
# Session 2026-06-06 — Animation pipeline (Rukhanka + Synty), Slice 1: the player is alive
|
||||
@@ -45,4 +54,4 @@ Operator (via `/dots-dev`, ultracode): *"Explore animations for this DOTS projec
|
||||
- Template the pipeline to **enemies** (Husk/Brute/Swarmer) — same flow, swap mesh + reuse `AC_PlayerTopDown` (or per-enemy clips).
|
||||
- Source a **combat/hit-react/death** anim pack (Base Locomotion is locomotion-only; Death is a crouch placeholder; Fire has no clip yet).
|
||||
- **Aim-IK** upper body toward the cursor (twin-stick), then ragdoll-on-death, bone-socket weapons, GPU engine + VAT for crowds.
|
||||
- Operator live play-through to tune anim-speed scaling / blend thresholds / the −0.9 offset, and a 2-client MPPM check that remote players animate (the position-delta path).
|
||||
- Operator live play-through to tune anim-speed scaling / blend thresholds / the −0.9 offset, and a 2-client MPPM check that remote players animate (the position-delta path).
|
||||
@@ -1,7 +1,16 @@
|
||||
---
|
||||
date: 2026-06-06
|
||||
type: session
|
||||
tags: [session, cleanup, alignment, docs, refactor, hygiene, connectionui, uitk]
|
||||
tags:
|
||||
- session
|
||||
- cleanup
|
||||
- alignment
|
||||
- docs
|
||||
- refactor
|
||||
- hygiene
|
||||
- connectionui
|
||||
- uitk
|
||||
permalink: gamevault/07-sessions/2026/2026-06-06-cleanup-alignment
|
||||
---
|
||||
|
||||
# Session 2026-06-06 — Cleanup & alignment (docs, dead code, refactor) before more development
|
||||
@@ -50,4 +59,4 @@ No DR (hygiene pass). Reaffirmed conventions: edit `Assets/*.cs` only via MCP; `
|
||||
## Next-session intent
|
||||
|
||||
- Resume feature work on the now-aligned, committed base. Candidate threads from the M7 follow-ups: throughput/belt visuals (one replicated byte), recipe depth (multi-input fabricator, fabricator→conveyor chaining), per-machine meshes; operator live play-through + a real 2-build LAN run.
|
||||
- Optional code-tidy follow-ups (logged in [[Backlog]]) if churn budget allows.
|
||||
- Optional code-tidy follow-ups (logged in [[Backlog]]) if churn budget allows.
|
||||
@@ -1,7 +1,18 @@
|
||||
---
|
||||
date: 2026-06-06
|
||||
type: session
|
||||
tags: [session, animation, rukhanka, synty, enemies, netcode, presentation, dots, slice, inventory]
|
||||
tags:
|
||||
- session
|
||||
- animation
|
||||
- rukhanka
|
||||
- synty
|
||||
- enemies
|
||||
- netcode
|
||||
- presentation
|
||||
- dots
|
||||
- slice
|
||||
- inventory
|
||||
permalink: gamevault/07-sessions/2026/2026-06-06-enemy-animation-synty-inventory
|
||||
---
|
||||
|
||||
# Session 2026-06-06 — Enemy animation (Rukhanka, client-derived), Slice 2 + Synty inventory
|
||||
@@ -42,4 +53,4 @@ Operator (via `/dots-dev`, ultracode): *"Extend the animation system to encompas
|
||||
- **Cyberpunk enemy faction** (PolygonSciFiCity) as new wave variants on this exact pipeline — one material + `EnemyRigTools` variant rows.
|
||||
- Wire **PolygonParticleFX** (blood/gore/explosion) into `VFXConfig` for richer Husk-death VFX.
|
||||
|
||||
See [[DR-023_Enemy_Animation_MonsterMash]].
|
||||
See [[DR-023_Enemy_Animation_MonsterMash]].
|
||||
@@ -1,7 +1,16 @@
|
||||
---
|
||||
date: 2026-06-07
|
||||
type: session
|
||||
tags: [session, hud, ui-toolkit, synty, presentation, juice, build, dots]
|
||||
tags:
|
||||
- session
|
||||
- hud
|
||||
- ui-toolkit
|
||||
- synty
|
||||
- presentation
|
||||
- juice
|
||||
- build
|
||||
- dots
|
||||
permalink: gamevault/07-sessions/2026/2026-06-07-hud-synty-visual-pass
|
||||
---
|
||||
|
||||
# Session 2026-06-07 — Expansive HUD visual pass (Synty sci-fi-soldier kit → UITK)
|
||||
@@ -42,4 +51,4 @@ The in-game HUD (DR-021) was code-built UITK but flat-colour + system font + tex
|
||||
## Next-session intent
|
||||
|
||||
- Eyeball the HUD at a true 1920 game-view (the narrow ~945 editor window overlaps vitals↔palette — resolution artifact, fine at target res).
|
||||
- Confirm the conveyor-facing arrow's compass mapping vs the world placement ghost (a 1-line `FacingDegrees` offset if the arrow art's default vector differs); optional polish: cooldown radial, throughput visuals (needs a replicated machine field — DR-020 open).
|
||||
- Confirm the conveyor-facing arrow's compass mapping vs the world placement ghost (a 1-line `FacingDegrees` offset if the arrow art's default vector differs); optional polish: cooldown radial, throughput visuals (needs a replicated machine field — DR-020 open).
|
||||
@@ -0,0 +1,141 @@
|
||||
---
|
||||
date: 2026-08-08
|
||||
type: session
|
||||
tags:
|
||||
- session
|
||||
- physics
|
||||
- collision
|
||||
- character-controller
|
||||
- enemy-ai
|
||||
- hud
|
||||
- uitk
|
||||
- ui-scaling
|
||||
permalink: gamevault/07-sessions/2026/2026-06-08-world-collision-hud-scaling
|
||||
---
|
||||
|
||||
# Session 2026-06-08 — World collision (terrain bowl + landmarks + enemies) & HUD scaling
|
||||
|
||||
> Driven by `/dots-dev`. Two operator bugs after the [[DR-025_World_Environment_Redo_Natural_Frontier]] world
|
||||
> redo: the player glides through the world, and the HUD is huge/overlapping in Play.
|
||||
|
||||
## Goal
|
||||
|
||||
Operator: *"Fix the colliders for the terrain — the player just glides through them and other stuff is in the
|
||||
middle of things. Then fix the HUD scaling — in Play it's huge and overlapping; make it scale correctly for the
|
||||
editor and in game."* Intake forks resolved (one `AskUserQuestion`): collision scope = **boundary ring + solid
|
||||
landmarks** (low cover stays walkable); **enemies must collide too**.
|
||||
|
||||
## Root causes
|
||||
|
||||
- **Collision:** DR-025 made the whole world cosmetic classic-URP GameObjects with colliders stripped (inert to the
|
||||
DOTS PhysicsWorld). The player CC sweeps only the baked `Gameplay` subscene, which held just **3 leftover test
|
||||
colliders** (`Wall_North`/`Wall_East`/`Pillar_Center` — the pillar sat at the player spawn origin). Enemies move
|
||||
by direct `LocalTransform` writes (physics-blind), so they phase through everything too.
|
||||
- **HUD:** `RuntimePanelSettings.asset` was effectively **`ConstantPhysicalSize`** (the serialized `m_ScaleMode: 1`
|
||||
is NOT ScaleWithScreenSize in this Unity version — see gotcha). At 96 dpi that renders the HUD at **1:1 pixels**,
|
||||
so the `HudSystem.cs` layout (420px bars, 30–52px fonts) filled a small Game-view (the 420px health bar spanned
|
||||
the whole 420px-tall view → "huge and overlapping"). It never scaled with the screen at all.
|
||||
|
||||
## What was done
|
||||
|
||||
### World collision
|
||||
- New **`Environment` physics layer** (slot 8). Unity Physics 1.x derives a baked collider's `BelongsTo` from the
|
||||
GameObject layer; the default layer-collision matrix has Default (player) collide with it → **player blocked for
|
||||
free, no player-authoring change**.
|
||||
- New `WorldCollisionConfig{uint EnvironmentMask}` (Simulation) baked by `WorldCollisionAuthoring` (Authoring) from
|
||||
`1u << LayerMask.NameToLayer("Environment")` — lets the Bursted server AI build a `CollisionFilter` without a
|
||||
managed lookup or a hardcoded layer index. One instance dropped in the subscene.
|
||||
- Into the **Gameplay subscene** (open-additive → build via `execute_code` → save → close): a **boundary ring**
|
||||
per region (base r30 / 16 segs outside the ±16 32×32 build grid; expedition r52 / 24 segs at the cliff line) of
|
||||
tangent box segments (15% overlap, no gaps), plus **landmark box colliders** on the solid interior structures
|
||||
(warpgate, cabin, windmill, well, waterwheel; expedition artefact, rock arch, sign, survey tent). Low/flat cover
|
||||
(flowers, bushes, grass, ground rocks) intentionally **left walkable**. Removed the 3 stale test colliders.
|
||||
- **Enemy collide-and-slide** in `EnemyAISystem` (server-only, non-predicted → no rollback/desync risk; stays
|
||||
`[BurstCompile]`): both the seek and knockback moves are now swept with `CollisionWorld.SphereCast`
|
||||
(closest-hit, non-generic → Burst-safe) filtered to `CollidesWith = EnvironmentMask` (hits only the static world,
|
||||
never the player collider or other Husks — they have no collider). On a hit: stop at the wall (skin gap) then
|
||||
slide the remainder along the surface via the new pure, unit-tested `EnemyAIMath.SlideVelocity(vel, normal)`, with
|
||||
a second short sweep so it can't tunnel a second wall. Sweep radius is a constant 0.5 (decoupled from the
|
||||
`HitRadius` query so the EnemyAISystem EditMode tests, which build minimal Husks, keep matching).
|
||||
- `ProjectM.Server.asmdef` gained a direct **`Unity.Physics`** reference (needed for the cast).
|
||||
|
||||
### HUD scaling
|
||||
- `RuntimePanelSettings.asset`: set **`scaleMode = ScaleWithScreenSize`** (the actual fix), `referenceResolution =
|
||||
1920×1080`, `screenMatchMode = MatchWidthOrHeight`, `match = 0.5` — **applied via the typed `PanelSettings` API**,
|
||||
not a SerializedObject int (the enum int is non-standard, below). Shared by HUD + menus/pause/settings → all
|
||||
screens consistent. Verified live: panelScale 0.453 on a 991×420 Game-view (logical 2190×928) — the HUD now ~45%
|
||||
of its former on-screen size and proportional at any resolution.
|
||||
- **First attempt was a false fix:** a SerializedObject write of `m_ScaleMode = 1` (assuming 1 = ScaleWithScreenSize)
|
||||
left it on **ConstantPhysicalSize**. Caught by reading `ps.scaleMode` at runtime in Play, not by the asset YAML.
|
||||
|
||||
## Validation
|
||||
|
||||
- **EditMode 218/218** (214 prior + 4 new `SlideVelocity` tests). First run caught 3 EnemyAISystem-test regressions
|
||||
from adding `RefRO<HitRadius>` to the query (test Husks lack it) → fixed by dropping it for a constant radius.
|
||||
- **Play-mode (server world introspection):** `WorldCollisionConfig.EnvironmentMask == 256`; CollisionWorld has
|
||||
**50 static bodies** + 1 dynamic (player). SphereCasts on the env filter hit the base ring at 28.7m, the cabin
|
||||
landmark at 6.5m, and the expedition ring at 50.7m — the exact pipeline `EnemyAISystem` uses, proven live. No
|
||||
console errors / no Burst ICE in Play.
|
||||
- **HUD screenshot** at a wide aspect: banner/resources/palette/health all proportionate and readable (no longer
|
||||
huge or overlapping). At 16:9 the corner panels separate further.
|
||||
|
||||
## Gotchas / notes
|
||||
|
||||
- **`apply_text_edits` column math bit me twice** — guessed `endCol` values truncated lines (brace-balance validator
|
||||
caught it) and an accidental `RefRO<LocalTransform>` swap. Lesson: use **full-line ranges** (start-of-line →
|
||||
start-of-next-line) for multi-line replacements; let the validator + tests catch the rest.
|
||||
- **Adding a component to a `SystemAPI.Query` tuple silently filters out entities that lack it** — broke 3 existing
|
||||
tests whose minimal test entities didn't have `HitRadius`. Prefer a constant or a `ComponentLookup` HasComponent
|
||||
check over widening a hot query when test fixtures build partial archetypes.
|
||||
- `manage_scene save` saved the **active** (Game) scene, not the additively-opened Gameplay subscene — save the
|
||||
subscene explicitly via `EditorSceneManager.SaveScene(GetSceneByName("Gameplay"))`.
|
||||
- **`PanelSettings.m_ScaleMode` serialized int is NON-standard in Unity 6.4:** `ConstantPixelSize=0`,
|
||||
**`ConstantPhysicalSize=1`**, **`ScaleWithScreenSize=2`** (confirmed by printing `(int)PanelScaleMode.*` at
|
||||
runtime). Set scale mode via the **typed enum API** (`ps.scaleMode = PanelScaleMode.ScaleWithScreenSize`), never a
|
||||
raw SerializedObject int — and **verify the live `ps.scaleMode` in Play**, not the asset YAML (the YAML int lies).
|
||||
|
||||
## Known limitation (future work)
|
||||
|
||||
Enemies collide-and-slide but have **no pathfinding** — they can briefly stall in concave corners (sparse bowl
|
||||
arena makes this acceptable). A nav pass (flow-field / simple steering-around) is the follow-up if it reads badly.
|
||||
|
||||
## Follow-up — verticality / "bowl rim" pass (operator feedback)
|
||||
|
||||
Operator: *"if traversal of the terrain/rocks isn't going to be smooth, instead of laying them out create a clear
|
||||
verticality visual gap where it's clear the player can't go above this — how do Riftbreaker / V Rising handle
|
||||
height?"* Forks: **raised cliff/rock-rim bowl** + **clear interior scatter, keep landmarks**.
|
||||
|
||||
**Design principle (Riftbreaker / V Rising / They Are Billions / Diablo):** the playable area is **flat** — the
|
||||
player never traverses terrain height. Height is used *only* as a hard, legible boundary: a clear vertical cliff
|
||||
face that towers over the play plane so it unmistakably reads "can't go up there." Things are **flat = walkable**
|
||||
or **clearly tall/vertical = blocked**, never the ambiguous middle. Our bug was exactly that middle — rocks/chunks
|
||||
at ground level the player clipped through, plus an invisible wall in open grass.
|
||||
|
||||
**What was done (cosmetic re-dressing of both `Game.unity` biome roots, aligned to the existing colliders):**
|
||||
- The base (Meadow) biome has **no vertical-wall prefab** (only 105×18 flat terrain *tiles*), so the rim is built
|
||||
from the **arid `SM_Env_Rock_Cliff`** (22u tall, vertical) — grey rock ringing a green meadow = a natural
|
||||
mountain basin. A **continuous wall ring** (40 front @ r33 + 22 offset backstop @ r37.5, deterministic LCG,
|
||||
per-piece ground-snap via renderer-bounds, colliders stripped) sits just behind the boundary collider (r30); the
|
||||
34 trees re-rung densely *in front* at r28; big rocks pushed to a hidden band r40; flat terrain tiles pushed to
|
||||
distant backdrop r78. Interior = flat flower meadow + low cover + landmarks only.
|
||||
- Expedition (Arid) already used native rock cliffs → rebuilt as a continuous wall (46 @ r55 + 26 @ r60); 69 big
|
||||
rock/spike/arch/mound instances pushed to backdrop r70; outer outpost props pulled inside the wall (~r46) so the
|
||||
landmark cluster stays visible; low cover (cactus/bramble/craters/bones/pebbles) left walkable.
|
||||
- `LM_RockArch` collider removed from the subscene (its cosmetic moved to the backdrop → it would've been an
|
||||
invisible interior wall). Boundary-ring + remaining landmark colliders unchanged and still aligned.
|
||||
|
||||
**Validation:** player-eye screenshots both regions show a clear towering rock basin around a clean flat interior
|
||||
(no horizon gaps); in-Play the gameplay camera confirms HUD + bowl together; server CollisionWorld = 49 static
|
||||
(50 −1 rock arch) + 1 dynamic, base & expedition ring casts still hit. Console clean.
|
||||
|
||||
**Technique note:** to ring tall props as a continuous, gap-free wall — overlap two offset rows (front + half-phase
|
||||
backstop), `LookRotation(outward)` per piece, deterministic LCG jitter on radius/yaw/scale, and **ground-snap each
|
||||
piece by `groundY - rendererBounds.min.y`** (Synty pivots vary; never trust pivot=base). Verify by screenshotting
|
||||
from *inside* the bowl looking out (`manage_camera` `view_position`/`view_target`) — watch the region center
|
||||
(expedition is at x=1000, **z=0**; a z=1000 camera shoots empty desert).
|
||||
|
||||
## Next-session intent
|
||||
|
||||
Trigger a live siege wave to watch Husks slide along the base ring / landmarks under load; tune boundary radii and
|
||||
landmark box sizes against the visual props if anything reads off; consider per-tree collision only if the walkable
|
||||
gaps feel wrong.
|
||||
@@ -2,6 +2,7 @@
|
||||
title: CLAUDE.md Build-Gotchas Archive
|
||||
type: reference
|
||||
created: 2026-06-04
|
||||
permalink: gamevault/meta/claude-build-gotchas-archive
|
||||
---
|
||||
|
||||
# CLAUDE.md Build-Gotchas Archive
|
||||
@@ -361,4 +362,4 @@ cosmetic classic-URP biomes in `Game.unity`; region-aware `WorldAtmosphereSystem
|
||||
(mirrors `HudSystem.ExpeditionRegionXMin`). No ECS query, observe-only, `"Game"`-scene guarded so the menu isn't
|
||||
restyled; knobs in a `WorldFeelConfig`-style MonoBehaviour with `SubsystemRegistration` static reset + null-safe
|
||||
fallbacks. Zero sim/netcode impact (writes only global managed `RenderSettings`; `ClientSimulation` filter keeps
|
||||
it off the server/headless world).
|
||||
it off the server/headless world).
|
||||
@@ -2,7 +2,7 @@
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!78 &1
|
||||
TagManager:
|
||||
serializedVersion: 2
|
||||
serializedVersion: 3
|
||||
tags: []
|
||||
layers:
|
||||
- Default
|
||||
@@ -13,7 +13,7 @@ TagManager:
|
||||
- UI
|
||||
-
|
||||
-
|
||||
-
|
||||
- Environment
|
||||
-
|
||||
-
|
||||
-
|
||||
@@ -50,27 +50,4 @@ TagManager:
|
||||
- Light Layer 5
|
||||
- Light Layer 6
|
||||
- Light Layer 7
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
-
|
||||
m_MigratedRenderPipelines: []
|
||||
|
||||
Reference in New Issue
Block a user