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
|
m_CustomRenderQueue: -1
|
||||||
stringTagMap:
|
stringTagMap:
|
||||||
RenderType: Opaque
|
RenderType: Opaque
|
||||||
disabledShaderPasses: []
|
disabledShaderPasses:
|
||||||
|
- MOTIONVECTORS
|
||||||
m_LockedProperties:
|
m_LockedProperties:
|
||||||
m_SavedProperties:
|
m_SavedProperties:
|
||||||
serializedVersion: 3
|
serializedVersion: 3
|
||||||
@@ -96,6 +97,7 @@ Material:
|
|||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
m_Ints: []
|
m_Ints: []
|
||||||
m_Floats:
|
m_Floats:
|
||||||
|
- _AddPrecomputedVelocity: 0
|
||||||
- _AlphaClip: 0
|
- _AlphaClip: 0
|
||||||
- _AlphaToMask: 0
|
- _AlphaToMask: 0
|
||||||
- _Blend: 0
|
- _Blend: 0
|
||||||
@@ -127,6 +129,7 @@ Material:
|
|||||||
- _Surface: 0
|
- _Surface: 0
|
||||||
- _UVSec: 0
|
- _UVSec: 0
|
||||||
- _WorkflowMode: 1
|
- _WorkflowMode: 1
|
||||||
|
- _XRMotionVectorsPass: 1
|
||||||
- _ZWrite: 1
|
- _ZWrite: 1
|
||||||
m_Colors:
|
m_Colors:
|
||||||
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
||||||
@@ -134,3 +137,4 @@ Material:
|
|||||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||||
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
||||||
m_BuildTextureStacks: []
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
|
|||||||
+7
-3
@@ -33,7 +33,8 @@ Material:
|
|||||||
m_CustomRenderQueue: -1
|
m_CustomRenderQueue: -1
|
||||||
stringTagMap:
|
stringTagMap:
|
||||||
RenderType: Opaque
|
RenderType: Opaque
|
||||||
disabledShaderPasses: []
|
disabledShaderPasses:
|
||||||
|
- MOTIONVECTORS
|
||||||
m_LockedProperties:
|
m_LockedProperties:
|
||||||
m_SavedProperties:
|
m_SavedProperties:
|
||||||
serializedVersion: 3
|
serializedVersion: 3
|
||||||
@@ -63,8 +64,8 @@ Material:
|
|||||||
m_Scale: {x: 2, y: 2}
|
m_Scale: {x: 2, y: 2}
|
||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
- _MainTex:
|
- _MainTex:
|
||||||
m_Texture: {fileID: 0}
|
m_Texture: {fileID: 2800000, guid: 6064e4e3e79a3a1408ee2059beaa066b, type: 3}
|
||||||
m_Scale: {x: 1, y: 1}
|
m_Scale: {x: 2, y: 2}
|
||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
- _MetallicGlossMap:
|
- _MetallicGlossMap:
|
||||||
m_Texture: {fileID: 0}
|
m_Texture: {fileID: 0}
|
||||||
@@ -96,6 +97,7 @@ Material:
|
|||||||
m_Offset: {x: 0, y: 0}
|
m_Offset: {x: 0, y: 0}
|
||||||
m_Ints: []
|
m_Ints: []
|
||||||
m_Floats:
|
m_Floats:
|
||||||
|
- _AddPrecomputedVelocity: 0
|
||||||
- _AlphaClip: 0
|
- _AlphaClip: 0
|
||||||
- _AlphaToMask: 0
|
- _AlphaToMask: 0
|
||||||
- _Blend: 0
|
- _Blend: 0
|
||||||
@@ -127,6 +129,7 @@ Material:
|
|||||||
- _Surface: 0
|
- _Surface: 0
|
||||||
- _UVSec: 0
|
- _UVSec: 0
|
||||||
- _WorkflowMode: 1
|
- _WorkflowMode: 1
|
||||||
|
- _XRMotionVectorsPass: 1
|
||||||
- _ZWrite: 1
|
- _ZWrite: 1
|
||||||
m_Colors:
|
m_Colors:
|
||||||
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
|
||||||
@@ -134,3 +137,4 @@ Material:
|
|||||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||||
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
|
||||||
m_BuildTextureStacks: []
|
m_BuildTextureStacks: []
|
||||||
|
m_AllowLocking: 1
|
||||||
|
|||||||
@@ -18,15 +18,15 @@ MonoBehaviour:
|
|||||||
m_RenderMode: 0
|
m_RenderMode: 0
|
||||||
m_ColliderUpdateMode: 0
|
m_ColliderUpdateMode: 0
|
||||||
m_ColliderIsTrigger: 1
|
m_ColliderIsTrigger: 1
|
||||||
m_ScaleMode: 1
|
m_ScaleMode: 2
|
||||||
m_ReferenceSpritePixelsPerUnit: 100
|
m_ReferenceSpritePixelsPerUnit: 100
|
||||||
m_PixelsPerUnit: 100
|
m_PixelsPerUnit: 100
|
||||||
m_Scale: 1
|
m_Scale: 1
|
||||||
m_ReferenceDpi: 96
|
m_ReferenceDpi: 96
|
||||||
m_FallbackDpi: 96
|
m_FallbackDpi: 96
|
||||||
m_ReferenceResolution: {x: 1200, y: 800}
|
m_ReferenceResolution: {x: 1920, y: 1080}
|
||||||
m_ScreenMatchMode: 0
|
m_ScreenMatchMode: 0
|
||||||
m_Match: 0
|
m_Match: 0.5
|
||||||
m_SortingOrder: 0
|
m_SortingOrder: 0
|
||||||
m_TargetDisplay: 0
|
m_TargetDisplay: 0
|
||||||
m_BindingLogLevel: 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.Entities;
|
||||||
using Unity.Mathematics;
|
using Unity.Mathematics;
|
||||||
using Unity.NetCode;
|
using Unity.NetCode;
|
||||||
|
using Unity.Physics;
|
||||||
using Unity.Transforms;
|
using Unity.Transforms;
|
||||||
|
|
||||||
namespace ProjectM.Server
|
namespace ProjectM.Server
|
||||||
@@ -61,6 +62,11 @@ namespace ProjectM.Server
|
|||||||
var serverTick = SystemAPI.GetSingleton<NetworkTime>().ServerTick;
|
var serverTick = SystemAPI.GetSingleton<NetworkTime>().ServerTick;
|
||||||
uint now = serverTick.TickIndexForValidTick;
|
uint now = serverTick.TickIndexForValidTick;
|
||||||
var ecb = new EntityCommandBuffer(Allocator.Temp);
|
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
|
foreach (var (xform, stats, cooldown, knockback, windup) in
|
||||||
SystemAPI.Query<RefRW<LocalTransform>, RefRO<EnemyStats>, RefRW<EnemyAttackCooldown>,
|
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);
|
float3 kpos = pos + new float3(kb.Dir.x, 0f, kb.Dir.y) * (kb.Speed * dt);
|
||||||
kpos.y = pos.y;
|
kpos.y = pos.y;
|
||||||
|
if (sweep)
|
||||||
|
kpos = SweptMove(in physics, pos, kpos, SweepRadius, envFilter);
|
||||||
xform.ValueRW.Position = kpos;
|
xform.ValueRW.Position = kpos;
|
||||||
windup.ValueRW.WindUpUntilTick = 0; // a recoiling Husk does not wind up
|
windup.ValueRW.WindUpUntilTick = 0; // a recoiling Husk does not wind up
|
||||||
continue; // recoiling: skip seek + strike this tick
|
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 vel = EnemyAIMath.SeekVelocity(pos, targetPos, stats.ValueRO.MoveSpeed, stopDistance);
|
||||||
float3 newPos = pos + vel * dt;
|
float3 newPos = pos + vel * dt;
|
||||||
newPos.y = pos.y; // hold the movement plane
|
newPos.y = pos.y; // hold the movement plane
|
||||||
|
if (sweep)
|
||||||
|
newPos = SweptMove(in physics, pos, newPos, SweepRadius, envFilter);
|
||||||
xform.ValueRW.Position = newPos;
|
xform.ValueRW.Position = newPos;
|
||||||
|
|
||||||
// Face the target (planar) for presentation.
|
// Face the target (planar) for presentation.
|
||||||
@@ -166,5 +176,38 @@ namespace ProjectM.Server
|
|||||||
playerEntities.Dispose();
|
playerEntities.Dispose();
|
||||||
playerPositions.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.Mathematics",
|
||||||
"Unity.Burst",
|
"Unity.Burst",
|
||||||
"Unity.NetCode",
|
"Unity.NetCode",
|
||||||
"Unity.Networking.Transport"
|
"Unity.Networking.Transport",
|
||||||
|
"Unity.Physics"
|
||||||
],
|
],
|
||||||
"includePlatforms": [],
|
"includePlatforms": [],
|
||||||
"excludePlatforms": [],
|
"excludePlatforms": [],
|
||||||
|
|||||||
@@ -35,6 +35,24 @@ namespace ProjectM.Simulation
|
|||||||
d.y = 0f;
|
d.y = 0f;
|
||||||
return math.lengthsq(d) <= range * range;
|
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>
|
/// <summary>
|
||||||
/// Deterministic planar ring position around <paramref name="center"/> for spawn
|
/// 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);
|
var other = EnemyAIMath.RingPosition(c, 2, 8, 4f);
|
||||||
Assert.Greater(math.distance(a, other), 1e-3f);
|
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]].
|
- **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)
|
### 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**.
|
- 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, 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]].
|
- **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*.** 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).
|
- **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}` on save) — use `AssetDatabase.AddObjectToAsset(component, profile)` + `SaveAssets`, verify on disk.
|
- **`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 `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`.
|
- **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 must read the prefab's baked `LocalTransform` and override only Position (Scale is a replicated `[GhostField]` → consistent-but-wrong).
|
- **`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. 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.
|
- **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 a prefab's *components*, not its name.
|
- **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
|
### 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`).
|
- **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
|
date: 2026-06-03
|
||||||
type: session
|
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
|
# Session 2026-06-03 — Aim controls: mouse cursor + gamepad twin-stick
|
||||||
|
|||||||
@@ -1,7 +1,14 @@
|
|||||||
---
|
---
|
||||||
date: 2026-06-03
|
date: 2026-06-03
|
||||||
type: session
|
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
|
# Session 2026-06-03 — M6 "The Aether Cycle": core-loop research, plan, and Stages 0–1
|
||||||
|
|||||||
@@ -1,7 +1,15 @@
|
|||||||
---
|
---
|
||||||
date: 2026-06-03
|
date: 2026-06-03
|
||||||
type: session
|
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)
|
# Session 2026-06-03 — Pre-M6 cleanup (loose ends before Build/Placement)
|
||||||
|
|||||||
@@ -1,7 +1,15 @@
|
|||||||
---
|
---
|
||||||
date: 2026-06-04
|
date: 2026-06-04
|
||||||
type: session
|
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
|
# Session 2026-06-04 — M8: Persistent base & player-driven pacing
|
||||||
|
|||||||
@@ -1,7 +1,15 @@
|
|||||||
---
|
---
|
||||||
date: 2026-06-04
|
date: 2026-06-04
|
||||||
type: session
|
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)
|
# Session 2026-06-04 — Polish & Backlog-Clear Pass (Stages A–G)
|
||||||
|
|||||||
@@ -1,7 +1,18 @@
|
|||||||
---
|
---
|
||||||
date: 2026-06-05
|
date: 2026-06-05
|
||||||
type: session
|
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
|
# Session 2026-06-05 — Game infrastructure: Main Menu, Settings, Saves foundation, Build wiring
|
||||||
|
|||||||
@@ -1,7 +1,15 @@
|
|||||||
---
|
---
|
||||||
date: 2026-06-05
|
date: 2026-06-05
|
||||||
type: session
|
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)
|
# Session 2026-06-05 — HUD rework to UI Toolkit + build-palette HUD (click-to-place + ghost preview)
|
||||||
|
|||||||
@@ -1,7 +1,16 @@
|
|||||||
---
|
---
|
||||||
date: 2026-06-05
|
date: 2026-06-05
|
||||||
type: session
|
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)
|
# Session 2026-06-05 — M7 Automation: self-running production chains (Harvester → Conveyor → Fabricator)
|
||||||
|
|||||||
@@ -1,7 +1,16 @@
|
|||||||
---
|
---
|
||||||
date: 2026-06-06
|
date: 2026-06-06
|
||||||
type: session
|
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
|
# Session 2026-06-06 — Animation pipeline (Rukhanka + Synty), Slice 1: the player is alive
|
||||||
|
|||||||
@@ -1,7 +1,16 @@
|
|||||||
---
|
---
|
||||||
date: 2026-06-06
|
date: 2026-06-06
|
||||||
type: session
|
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
|
# Session 2026-06-06 — Cleanup & alignment (docs, dead code, refactor) before more development
|
||||||
|
|||||||
@@ -1,7 +1,18 @@
|
|||||||
---
|
---
|
||||||
date: 2026-06-06
|
date: 2026-06-06
|
||||||
type: session
|
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
|
# Session 2026-06-06 — Enemy animation (Rukhanka, client-derived), Slice 2 + Synty inventory
|
||||||
|
|||||||
@@ -1,7 +1,16 @@
|
|||||||
---
|
---
|
||||||
date: 2026-06-07
|
date: 2026-06-07
|
||||||
type: session
|
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)
|
# Session 2026-06-07 — Expansive HUD visual pass (Synty sci-fi-soldier kit → UITK)
|
||||||
|
|||||||
@@ -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
|
title: CLAUDE.md Build-Gotchas Archive
|
||||||
type: reference
|
type: reference
|
||||||
created: 2026-06-04
|
created: 2026-06-04
|
||||||
|
permalink: gamevault/meta/claude-build-gotchas-archive
|
||||||
---
|
---
|
||||||
|
|
||||||
# CLAUDE.md Build-Gotchas Archive
|
# CLAUDE.md Build-Gotchas Archive
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
%TAG !u! tag:unity3d.com,2011:
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
--- !u!78 &1
|
--- !u!78 &1
|
||||||
TagManager:
|
TagManager:
|
||||||
serializedVersion: 2
|
serializedVersion: 3
|
||||||
tags: []
|
tags: []
|
||||||
layers:
|
layers:
|
||||||
- Default
|
- Default
|
||||||
@@ -13,7 +13,7 @@ TagManager:
|
|||||||
- UI
|
- UI
|
||||||
-
|
-
|
||||||
-
|
-
|
||||||
-
|
- Environment
|
||||||
-
|
-
|
||||||
-
|
-
|
||||||
-
|
-
|
||||||
@@ -50,27 +50,4 @@ TagManager:
|
|||||||
- Light Layer 5
|
- Light Layer 5
|
||||||
- Light Layer 6
|
- Light Layer 6
|
||||||
- Light Layer 7
|
- Light Layer 7
|
||||||
-
|
m_MigratedRenderPipelines: []
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
-
|
|
||||||
|
|||||||
Reference in New Issue
Block a user