Author SHA1 Message Date
AsanoRema 7912604faf update .gitignore 2026-08-11 17:22:28 +03:00
Henjke d71b90c8bd Edited
Добавлен таймер, конфиг и публичный метод
SpawnItems()
CooldownRemaining - оставшееся время до спавна float
CooldownSecondsRemaining - оставшееся время до спавна int
2026-08-11 18:42:09 +05:00
AsanoRema 5b888fba95 Changed .gitignore 2026-08-11 10:30:09 +03:00
Henjke e3d5561fc8 New
Второй спавнер с нормальными настройками и обновленные префабы
2026-08-11 10:47:35 +05:00
275 changed files with 38567 additions and 52983 deletions
+1 -1
View File
@@ -78,4 +78,4 @@ crashlytics-build.properties
ProjectSettings/Packages/com.unity.probuilder/Settings.json
Assets/Editor/x64/Bakery/.uvgblog.txt
Assets/Editor/x64/Bakery/.uvgblog.txt
Assets/Editor/x64/Bakery/.uvgblog.txt
+2 -3
View File
@@ -39,7 +39,6 @@ Material:
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -69,7 +68,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: a75118087a5b8ea41a9f58ce5debb2d2, type: 3}
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
@@ -137,7 +136,7 @@ Material:
- _ZWrite: 0
m_Colors:
- _BaseColor: {r: 0, g: 0, b: 0, a: 1}
- _Color: {r: 0, g: 0, b: 0, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0.9705882, g: 0.947554, b: 0.9063581, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []
+3 -1
View File
@@ -11,7 +11,9 @@ Material:
m_Shader: {fileID: 4800000, guid: 8d2bb70cbf9db8d4da26e15b26e74248, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords: []
m_ValidKeywords:
- _GLOSSINESS_FROM_BASE_ALPHA
- _SPECULAR_COLOR
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
@@ -25,7 +25,6 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ENVIRONMENTREFLECTIONS_OFF
- _SPECULARHIGHLIGHTS_OFF
m_InvalidKeywords:
- _GLOSSYREFLECTIONS_OFF
@@ -12,7 +12,6 @@ Material:
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ENVIRONMENTREFLECTIONS_OFF
- _SPECULARHIGHLIGHTS_OFF
m_InvalidKeywords:
- _GLOSSYREFLECTIONS_OFF
@@ -53,7 +52,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 2800000, guid: 4a3ea3eb16909a646a66ff7b19d31788, type: 3}
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
+3 -26
View File
@@ -15,11 +15,7 @@ MonoBehaviour:
modifiedAssetPathList:
- Assets/Bakery/examples/content/sponza/sponza.FBX
- Assets/Rocks and Boulders 2/Rocks/Source/Models/Rock2.fbx
- Assets/Rocks and Boulders 2/Rocks/Source/Models/Rock1A.fbx
- Assets/Rocks and Boulders 2/Rocks/Source/Models/Rock5A.fbx
- Assets/Rocks and Boulders 2/Rocks/Source/Models/Rock3.fbx
- Assets/Rocks and Boulders 2/Rocks/Source/Models/Rock4A.fbx
modifiedAssetPaddingHash: d6a958ff333fd3d9343fd3d9353fd3d93e3fd3d94adc894b
modifiedAssetPaddingHash: d6a958ff333fd3d9
modifiedMeshList: []
modifiedMeshPaddingList:
modifiedAssets:
@@ -406,22 +402,6 @@ MonoBehaviour:
- Rock2E_LP:polySurface1
padding: 04000000
unwrapper: 00000000
- meshName:
- Rock1_LP:polySurface1
padding: 07000000
unwrapper: 00000000
- meshName:
- polySurface250
padding: 06000000
unwrapper: 00000000
- meshName:
- Rock3_LP_smooth:polySurface1
padding: 09000000
unwrapper: 00000000
- meshName:
- polySurface115
padding: 10000000
unwrapper: 00000000
assetList:
- Assets/Bakery/examples/content/sponza/bush.FBX
- Assets/Bakery/examples/content/floor_lamp.FBX
@@ -429,10 +409,7 @@ MonoBehaviour:
- Assets/Objects/Boxes and pallets/Res/Boxes.fbx
- Assets/Objects/Boxes and pallets/Res/Pallet.fbx
- Assets/Rocks and Boulders 2/Rocks/Source/Models/box.fbx
- Assets/Bitgem/StylisedWater/URP/Meshes/example-scene-01.fbx
- Assets/Fill.obj
- Assets/CONTENT/ART/tripo_convert_afbded3b-3351-4484-9604-f5a846a051d2.fbx
uvOverlapAssetList: 00000000ffffffff01010000010100000101000000000000000000000000000000000000
uvOverlapAssetList: 00000000ffffffff01010000010100000101000000000000
xatlasWarningShown: 0
foundCompatibleSetup: 1
gpuName_2: NVIDIA GeForce RTX 5080
@@ -534,5 +511,5 @@ MonoBehaviour:
renderSettingsRTPVExposure: 1
renderSettingsRemoveDuplicateLightmaps: 0
tagOverrides: []
modifiedMeshPaddingArray: 10000000
modifiedMeshPaddingArray: 04000000
modifiedMeshUnwrapperArray: 00000000
+1 -5
View File
@@ -15,8 +15,4 @@ MonoBehaviour:
modifiedAssetPathList:
- Assets/Bakery/examples/content/sponza/sponza.FBX
- Assets/Rocks and Boulders 2/Rocks/Source/Models/Rock2.fbx
- Assets/Rocks and Boulders 2/Rocks/Source/Models/Rock1A.fbx
- Assets/Rocks and Boulders 2/Rocks/Source/Models/Rock5A.fbx
- Assets/Rocks and Boulders 2/Rocks/Source/Models/Rock3.fbx
- Assets/Rocks and Boulders 2/Rocks/Source/Models/Rock4A.fbx
modifiedAssetPaddingHash: d6a958ff333fd3d9343fd3d9353fd3d93e3fd3d94adc894b
modifiedAssetPaddingHash: d6a958ff333fd3d9
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,130 +0,0 @@
fileFormatVersion: 2
guid: ade59780048e71b4aa6efea78558a5ea
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
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: 1
wrapV: 1
wrapW: 1
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: 0
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 6
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: 1024
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
- serializedVersion: 4
buildTarget: Android
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:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: afda85841890d5948bdf27e9b18b36eb
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.
-222
View File
@@ -1,222 +0,0 @@
fileFormatVersion: 2
guid: fa03336b0a46f304483077f85309749c
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
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
- serializedVersion: 4
buildTarget: Android
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:
- serializedVersion: 2
name: Group 3_0
rect:
serializedVersion: 2
x: 18
y: 13
width: 62
height: 96
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: d6939717bcacd5a4e8b7ff689d4a9b0e
internalID: -120519267
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Group 3_1
rect:
serializedVersion: 2
x: 113
y: 5
width: 60
height: 113
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: 1bcce9c987b749145bc2407a3982791a
internalID: -733085833
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Group 3_2
rect:
serializedVersion: 2
x: 185
y: 4
width: 77
height: 112
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: a95544add49c3a5429158f0e6552a4fa
internalID: 1344260059
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Group 3_3
rect:
serializedVersion: 2
x: 273
y: 4
width: 66
height: 111
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: 0
bones: []
spriteID: 60b06cd03a7f92c4697dcc15858b1b90
internalID: 1722157387
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
Group 3_0: -120519267
Group 3_1: -733085833
Group 3_2: 1344260059
Group 3_3: 1722157387
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.
-130
View File
@@ -1,130 +0,0 @@
fileFormatVersion: 2
guid: 926590dcd0bce8e4698fd51aa91b4a74
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
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
- serializedVersion: 4
buildTarget: Android
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.
-130
View File
@@ -1,130 +0,0 @@
fileFormatVersion: 2
guid: fba7f80db8855ce4cac9f8d14c3a995c
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
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: 2
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 10, y: 10, z: 10, w: 10}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
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: 1
textureFormat: 4
textureCompression: 2
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
- serializedVersion: 4
buildTarget: Android
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: 5e97eb03825dee720800000000000000
internalID: 1537655665
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.
-130
View File
@@ -1,130 +0,0 @@
fileFormatVersion: 2
guid: bc012667b957a98468907faa7f183227
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
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: 2
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 10, y: 10, z: 10, w: 10}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
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: 1
textureFormat: 4
textureCompression: 2
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
- serializedVersion: 4
buildTarget: Android
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: 5e97eb03825dee720800000000000000
internalID: 1537655665
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
Binary file not shown.
-130
View File
@@ -1,130 +0,0 @@
fileFormatVersion: 2
guid: 6dd4cb0e55ca3454e81b5886619750e6
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
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
- serializedVersion: 4
buildTarget: Android
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
@@ -1,130 +0,0 @@
fileFormatVersion: 2
guid: 11a7500f3885deb4f995353fb4d9ae76
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
- serializedVersion: 4
buildTarget: Android
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:
@@ -1,107 +0,0 @@
fileFormatVersion: 2
guid: 0418ebccddcd3204aa042b0fb09ea84e
ModelImporter:
serializedVersion: 22200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 5da4c81b147b7544e9cb44f942ad51f0
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 6bc910aee46640ce911e111e1b7376b2
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,149 +0,0 @@
using UnityEditor;
using UnityEngine;
[CustomEditor(typeof(MapCoordinateSystem))]
public sealed class MapCoordinateSystemEditor : Editor
{
public override void OnInspectorGUI()
{
DrawDefaultInspector();
EditorGUILayout.HelpBox(
"Select MapCoordinates to display its grid and live crosshair coordinates in the Scene view. " +
"This visualization is not rendered in the Game view or in builds.",
MessageType.Info);
}
private void OnSceneGUI()
{
MapCoordinateSystem coordinateSystem = (MapCoordinateSystem)target;
if (!coordinateSystem.ShowSceneVisualization || !coordinateSystem.HasValidCorners())
return;
DrawGrid(coordinateSystem);
DrawCorners(coordinateSystem);
DrawCrosshairs(coordinateSystem);
DrawTargets(coordinateSystem);
}
private static void DrawGrid(MapCoordinateSystem coordinateSystem)
{
int divisions = coordinateSystem.GridDivisions;
GUIStyle labelStyle = CreateLabelStyle(coordinateSystem.BoundaryColor);
for (int index = 0; index <= divisions; index++)
{
float normalized = (float)index / divisions;
Vector3 verticalStart = Vector3.Lerp(
coordinateSystem.BottomLeft.position,
coordinateSystem.BottomRight.position,
normalized);
Vector3 verticalEnd = Vector3.Lerp(
coordinateSystem.TopLeft.position,
coordinateSystem.TopRight.position,
normalized);
Vector3 horizontalStart = Vector3.Lerp(
coordinateSystem.BottomLeft.position,
coordinateSystem.TopLeft.position,
normalized);
Vector3 horizontalEnd = Vector3.Lerp(
coordinateSystem.BottomRight.position,
coordinateSystem.TopRight.position,
normalized);
bool isBoundary = index == 0 || index == divisions;
Handles.color = isBoundary ? coordinateSystem.BoundaryColor : coordinateSystem.GridColor;
Handles.DrawLine(verticalStart, verticalEnd);
Handles.DrawLine(horizontalStart, horizontalEnd);
if (!coordinateSystem.ShowCoordinateLabels)
continue;
float horizontalCoordinate = coordinateSystem.MaximumCoordinates.x * normalized;
float verticalCoordinate = coordinateSystem.MaximumCoordinates.y * normalized;
Handles.Label(verticalStart, horizontalCoordinate.ToString("0.##"), labelStyle);
Handles.Label(horizontalStart, verticalCoordinate.ToString("0.##"), labelStyle);
}
}
private static void DrawCorners(MapCoordinateSystem coordinateSystem)
{
Handles.color = coordinateSystem.BoundaryColor;
DrawCorner(coordinateSystem.BottomLeft, "(0, 0)", coordinateSystem);
DrawCorner(
coordinateSystem.BottomRight,
$"({coordinateSystem.MaximumCoordinates.x:0.##}, 0)",
coordinateSystem);
DrawCorner(
coordinateSystem.TopLeft,
$"(0, {coordinateSystem.MaximumCoordinates.y:0.##})",
coordinateSystem);
DrawCorner(
coordinateSystem.TopRight,
$"({coordinateSystem.MaximumCoordinates.x:0.##}, " +
$"{coordinateSystem.MaximumCoordinates.y:0.##})",
coordinateSystem);
}
private static void DrawCorner(
Transform corner,
string label,
MapCoordinateSystem coordinateSystem)
{
float size = coordinateSystem.MarkerSize * HandleUtility.GetHandleSize(corner.position);
Handles.SphereHandleCap(0, corner.position, Quaternion.identity, size, EventType.Repaint);
if (coordinateSystem.ShowCoordinateLabels)
Handles.Label(corner.position, label, CreateLabelStyle(coordinateSystem.BoundaryColor));
}
private static void DrawCrosshairs(MapCoordinateSystem coordinateSystem)
{
MapController[] controllers =
Object.FindObjectsByType<MapController>(FindObjectsSortMode.None);
foreach (MapController controller in controllers)
{
if (controller.CoordinateSystem != coordinateSystem || controller.CrosshairVisual == null)
continue;
Vector3 position = controller.CrosshairVisual.position;
Vector2 coordinates = coordinateSystem.WorldPositionToCoordinates(position);
float size = coordinateSystem.MarkerSize * 1.35f * HandleUtility.GetHandleSize(position);
Handles.color = Color.yellow;
Handles.SphereHandleCap(0, position, Quaternion.identity, size, EventType.Repaint);
Handles.Label(
position,
$"Crosshair ({coordinates.x:0.00}, {coordinates.y:0.00})",
CreateLabelStyle(Color.yellow));
}
}
private static void DrawTargets(MapCoordinateSystem coordinateSystem)
{
if (!coordinateSystem.ShowCoordinateLabels)
return;
MapTarget[] targets = Object.FindObjectsByType<MapTarget>(FindObjectsSortMode.None);
foreach (MapTarget mapTarget in targets)
{
if (mapTarget.CoordinateSystem != null && mapTarget.CoordinateSystem != coordinateSystem)
continue;
Vector3 position = mapTarget.transform.position;
Vector2 coordinates = coordinateSystem.WorldPositionToCoordinates(position);
Handles.Label(
position,
$"{mapTarget.name} ({coordinates.x:0.00}, {coordinates.y:0.00})",
CreateLabelStyle(Color.red));
}
}
private static GUIStyle CreateLabelStyle(Color color)
{
GUIStyle style = new(EditorStyles.boldLabel);
style.normal.textColor = color;
return style;
}
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 7c020017978644e9be71242ece0e6011
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,98 +0,0 @@
using UnityEngine;
[DisallowMultipleComponent]
public sealed class MapController : MonoBehaviour
{
[Header("Main References")]
[SerializeField] private MapCrosshairController crosshair = null;
[SerializeField] private MapCoordinateSystem coordinateSystem = null;
[Header("Target System")]
[SerializeField] private MapTargetController targetController = null;
[SerializeField] private MapTarget targetPrefab = null;
[SerializeField] private Transform targetParent = null;
[SerializeField] private bool createTargetsOnStart = true;
[Header("Radar System")]
[SerializeField] private MapRadarController radarController = null;
[Header("Crosshair Objects")]
[SerializeField] private Transform relayX = null;
[SerializeField] private Transform relayY = null;
[SerializeField] private Transform crosshairVisual = null;
[Header("Input")]
[SerializeField, Min(0f)] private float movementSpeed = 1f;
[SerializeField] private bool useKeyboardInput = true;
public MapCoordinateSystem CoordinateSystem => coordinateSystem;
public Transform CrosshairVisual => crosshairVisual;
private void Awake()
{
if (targetController != null)
{
targetController.Configure(
coordinateSystem,
targetPrefab,
targetParent);
if (createTargetsOnStart)
targetController.CreateAndPlaceTargets();
}
if (radarController != null)
radarController.Configure(coordinateSystem, targetController, targetPrefab);
if (crosshair == null)
return;
crosshair.Configure(
coordinateSystem,
relayX,
relayY,
crosshairVisual,
movementSpeed,
useKeyboardInput,
targetController);
}
public void SetHorizontalAxis(float value)
{
if (crosshair != null)
crosshair.SetHorizontalAxis(value);
}
public void SetVerticalAxis(float value)
{
if (crosshair != null)
crosshair.SetVerticalAxis(value);
}
public Vector2 GetCrosshairCoordinates()
{
return crosshair != null ? crosshair.GetCrosshairCoordinates() : Vector2.zero;
}
public void CreateAndPlaceTargets()
{
if (targetController != null)
targetController.CreateAndPlaceTargets();
}
public bool TryGetNearestTarget(out MapTarget target, out float distance)
{
if (crosshair != null)
return crosshair.TryGetNearestTarget(out target, out distance);
target = null;
distance = -1f;
return false;
}
public bool ActivateRadar()
{
return radarController != null && radarController.ActivateRadar();
}
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 5a5f18d44c314323a2550f92ba7d988a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,147 +0,0 @@
using UnityEngine;
[DisallowMultipleComponent]
public sealed class MapCoordinateSystem : MonoBehaviour
{
public const float CoordinateMaximum = 10f;
[Header("Coordinate Bounds")]
[SerializeField] private Transform bottomLeft = null;
[SerializeField] private Transform bottomRight = null;
[SerializeField] private Transform topLeft = null;
[SerializeField] private Transform topRight = null;
[Header("Square Bounds")]
[SerializeField, Min(0.001f)] private float squareSize = 5.14925f;
[Header("Scene View Visualization")]
[SerializeField] private bool showSceneVisualization = true;
[SerializeField, Range(1, 20)] private int gridDivisions = 10;
[SerializeField] private bool showCoordinateLabels = true;
[SerializeField] private Color boundaryColor = new(0f, 0.85f, 1f, 1f);
[SerializeField] private Color gridColor = new(0f, 0.85f, 1f, 0.3f);
[SerializeField, Min(0.001f)] private float markerSize = 0.06f;
public Vector2 MaximumCoordinates => new(CoordinateMaximum, CoordinateMaximum);
public float SquareSize => Mathf.Max(0.001f, squareSize);
public bool ShowSceneVisualization => showSceneVisualization;
public int GridDivisions => Mathf.Max(1, gridDivisions);
public bool ShowCoordinateLabels => showCoordinateLabels;
public Color BoundaryColor => boundaryColor;
public Color GridColor => gridColor;
public float MarkerSize => Mathf.Max(0.001f, markerSize);
public Transform BottomLeft => bottomLeft;
public Transform BottomRight => bottomRight;
public Transform TopLeft => topLeft;
public Transform TopRight => topRight;
private void OnValidate()
{
squareSize = Mathf.Max(0.001f, squareSize);
ApplySquareBounds();
}
public void ApplySquareBounds()
{
if (!HasValidCorners())
return;
Vector3 origin = bottomLeft.position;
Vector3 rightDirection = bottomRight.position - origin;
Vector3 upDirection = topLeft.position - origin;
if (rightDirection.sqrMagnitude <= Mathf.Epsilon || upDirection.sqrMagnitude <= Mathf.Epsilon)
return;
rightDirection.Normalize();
upDirection = Vector3.ProjectOnPlane(upDirection, rightDirection);
if (upDirection.sqrMagnitude <= Mathf.Epsilon)
return;
upDirection.Normalize();
float size = SquareSize;
bottomRight.position = origin + rightDirection * size;
topLeft.position = origin + upDirection * size;
topRight.position = origin + (rightDirection + upDirection) * size;
}
public Vector2 ClampCoordinates(Vector2 coordinates)
{
return new Vector2(
Mathf.Clamp(coordinates.x, 0f, CoordinateMaximum),
Mathf.Clamp(coordinates.y, 0f, CoordinateMaximum));
}
public Vector3 CoordinatesToWorldPosition(Vector2 coordinates)
{
if (!HasValidCorners())
return transform.position;
Vector2 clamped = ClampCoordinates(coordinates);
float horizontal = clamped.x / CoordinateMaximum;
float vertical = clamped.y / CoordinateMaximum;
Vector3 bottom = Vector3.Lerp(bottomLeft.position, bottomRight.position, horizontal);
Vector3 top = Vector3.Lerp(topLeft.position, topRight.position, horizontal);
return Vector3.Lerp(bottom, top, vertical);
}
public Vector2 WorldPositionToCoordinates(Vector3 worldPosition)
{
if (!HasValidCorners())
return Vector2.zero;
Vector3 horizontalEdge = bottomRight.position - bottomLeft.position;
Vector3 verticalEdge = topLeft.position - bottomLeft.position;
Vector3 fromBottomLeft = worldPosition - bottomLeft.position;
float horizontal = horizontalEdge.sqrMagnitude > Mathf.Epsilon
? Vector3.Dot(fromBottomLeft, horizontalEdge) / horizontalEdge.sqrMagnitude
: 0f;
float vertical = verticalEdge.sqrMagnitude > Mathf.Epsilon
? Vector3.Dot(fromBottomLeft, verticalEdge) / verticalEdge.sqrMagnitude
: 0f;
for (int iteration = 0; iteration < 6; iteration++)
{
Vector3 current = BilinearPosition(horizontal, vertical);
Vector3 error = worldPosition - current;
Vector3 horizontalDerivative = Vector3.Lerp(
bottomRight.position - bottomLeft.position,
topRight.position - topLeft.position,
vertical);
Vector3 verticalDerivative = Vector3.Lerp(
topLeft.position - bottomLeft.position,
topRight.position - bottomRight.position,
horizontal);
float horizontalLength = Vector3.Dot(horizontalDerivative, horizontalDerivative);
float mixedLength = Vector3.Dot(horizontalDerivative, verticalDerivative);
float verticalLength = Vector3.Dot(verticalDerivative, verticalDerivative);
float determinant = horizontalLength * verticalLength - mixedLength * mixedLength;
if (Mathf.Abs(determinant) <= Mathf.Epsilon)
break;
float horizontalError = Vector3.Dot(horizontalDerivative, error);
float verticalError = Vector3.Dot(verticalDerivative, error);
horizontal += (horizontalError * verticalLength - verticalError * mixedLength) / determinant;
vertical += (verticalError * horizontalLength - horizontalError * mixedLength) / determinant;
}
Vector2 coordinates = new(
horizontal * CoordinateMaximum,
vertical * CoordinateMaximum);
return ClampCoordinates(coordinates);
}
private Vector3 BilinearPosition(float horizontal, float vertical)
{
Vector3 bottom = Vector3.LerpUnclamped(bottomLeft.position, bottomRight.position, horizontal);
Vector3 top = Vector3.LerpUnclamped(topLeft.position, topRight.position, horizontal);
return Vector3.LerpUnclamped(bottom, top, vertical);
}
public bool HasValidCorners()
{
return bottomLeft != null && bottomRight != null && topLeft != null && topRight != null;
}
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: 7206111709094332bdc9b4c7c44695b4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,181 +0,0 @@
using UnityEngine;
using UnityEngine.InputSystem;
[DisallowMultipleComponent]
public sealed class MapCrosshairController : MonoBehaviour
{
[Header("Nearest Target (Runtime)")]
[SerializeField] private MapTarget nearestTarget = null;
[SerializeField] private float distanceToNearestTarget = -1f;
private MapCoordinateSystem coordinateSystem;
private MapTargetController targetController;
private Transform relayX;
private Transform relayY;
private Transform crosshairVisual;
private float movementSpeed;
private bool useKeyboardInput;
private float horizontalAxis;
private float verticalAxis;
private Vector2 crosshairCoordinates;
private Vector3 relayXOffset;
private Vector3 relayYOffset;
private bool isConfigured;
public MapCoordinateSystem CoordinateSystem => coordinateSystem;
public void Configure(
MapCoordinateSystem newCoordinateSystem,
Transform newRelayX,
Transform newRelayY,
Transform newCrosshairVisual,
float newMovementSpeed,
bool enableKeyboardInput,
MapTargetController newTargetController)
{
coordinateSystem = newCoordinateSystem;
relayX = newRelayX;
relayY = newRelayY;
crosshairVisual = newCrosshairVisual;
movementSpeed = Mathf.Max(0f, newMovementSpeed);
useKeyboardInput = enableKeyboardInput;
targetController = newTargetController;
crosshairCoordinates = Vector2.zero;
isConfigured = CalibrateObjects();
if (isConfigured)
ApplyCoordinates();
}
private void Update()
{
if (!isConfigured)
return;
if (useKeyboardInput)
ReadKeyboardInput();
Vector2 movement = new(horizontalAxis, verticalAxis);
crosshairCoordinates += movement * (movementSpeed * Time.deltaTime);
crosshairCoordinates = coordinateSystem.ClampCoordinates(crosshairCoordinates);
ApplyCoordinates();
UpdateNearestTarget();
}
public void SetHorizontalAxis(float value)
{
horizontalAxis = Mathf.Clamp(value, -1f, 1f);
}
public void SetVerticalAxis(float value)
{
verticalAxis = Mathf.Clamp(value, -1f, 1f);
}
public Vector2 GetCrosshairCoordinates()
{
return crosshairCoordinates;
}
public MapTarget GetNearestTarget()
{
return nearestTarget;
}
public float GetDistanceToNearestTarget()
{
return distanceToNearestTarget;
}
public bool TryGetNearestTarget(out MapTarget target, out float distance)
{
target = nearestTarget;
distance = distanceToNearestTarget;
return target != null;
}
private void ReadKeyboardInput()
{
Keyboard keyboard = Keyboard.current;
if (keyboard == null)
{
SetHorizontalAxis(0f);
SetVerticalAxis(0f);
return;
}
SetHorizontalAxis(
(keyboard.lKey.isPressed ? 1f : 0f) - (keyboard.jKey.isPressed ? 1f : 0f));
SetVerticalAxis(
(keyboard.iKey.isPressed ? 1f : 0f) - (keyboard.kKey.isPressed ? 1f : 0f));
}
private void ApplyCoordinates()
{
Vector3 targetWorldPosition = coordinateSystem.CoordinatesToWorldPosition(crosshairCoordinates);
crosshairVisual.position = targetWorldPosition;
if (relayX != null)
relayX.position = coordinateSystem.CoordinatesToWorldPosition(
new Vector2(crosshairCoordinates.x, 0f)) + relayXOffset;
if (relayY != null)
relayY.position = coordinateSystem.CoordinatesToWorldPosition(
new Vector2(0f, crosshairCoordinates.y)) + relayYOffset;
}
private bool CalibrateObjects()
{
if (coordinateSystem == null || crosshairVisual == null || !coordinateSystem.HasValidCorners())
return false;
Vector3 origin = coordinateSystem.CoordinatesToWorldPosition(Vector2.zero);
Vector3 horizontalDirection =
coordinateSystem.CoordinatesToWorldPosition(new Vector2(MapCoordinateSystem.CoordinateMaximum, 0f)) -
origin;
Vector3 verticalDirection =
coordinateSystem.CoordinatesToWorldPosition(new Vector2(0f, MapCoordinateSystem.CoordinateMaximum)) -
origin;
if (horizontalDirection.sqrMagnitude <= Mathf.Epsilon ||
verticalDirection.sqrMagnitude <= Mathf.Epsilon)
return false;
horizontalDirection.Normalize();
verticalDirection.Normalize();
if (relayX != null)
relayXOffset = Vector3.ProjectOnPlane(relayX.position - origin, horizontalDirection);
if (relayY != null)
relayYOffset = Vector3.ProjectOnPlane(relayY.position - origin, verticalDirection);
return true;
}
private void UpdateNearestTarget()
{
nearestTarget = null;
distanceToNearestTarget = -1f;
if (targetController == null)
return;
float nearestSqrDistance = float.PositiveInfinity;
foreach (MapTarget target in targetController.Targets)
{
if (target == null)
continue;
float sqrDistance = (target.MapCoordinates - crosshairCoordinates).sqrMagnitude;
if (sqrDistance >= nearestSqrDistance)
continue;
nearestSqrDistance = sqrDistance;
nearestTarget = target;
}
if (nearestTarget != null)
distanceToNearestTarget = Mathf.Sqrt(nearestSqrDistance);
}
}
@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: f1eaeed1aba94e03b8f4b98a580444de
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,113 +0,0 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
[DisallowMultipleComponent]
public sealed class MapRadarController : MonoBehaviour
{
[Header("Radar Settings")]
[SerializeField, Min(0f)] private float cooldown = 5f;
[SerializeField] private bool useKeyboardInput = true;
[Header("Radar State (Runtime)")]
[SerializeField] private float cooldownRemaining;
private readonly List<GameObject> radarMarks = new();
private MapCoordinateSystem coordinateSystem;
private MapTargetController targetController;
private MapTarget radarMarkPrefab;
private float nextActivationTime;
private bool isConfigured;
public float CooldownRemaining => cooldownRemaining;
public bool IsReady => cooldownRemaining <= 0f;
private void OnValidate()
{
cooldown = Mathf.Max(0f, cooldown);
}
public void Configure(
MapCoordinateSystem newCoordinateSystem,
MapTargetController newTargetController,
MapTarget newRadarMarkPrefab)
{
coordinateSystem = newCoordinateSystem;
targetController = newTargetController;
radarMarkPrefab = newRadarMarkPrefab;
isConfigured = coordinateSystem != null &&
coordinateSystem.HasValidCorners() &&
targetController != null &&
radarMarkPrefab != null;
if (targetController != null)
targetController.SetTargetVisualsVisible(false);
}
private void Update()
{
cooldownRemaining = Mathf.Max(0f, nextActivationTime - Time.time);
if (!useKeyboardInput)
return;
Keyboard keyboard = Keyboard.current;
if (keyboard != null && keyboard.oKey.wasPressedThisFrame)
ActivateRadar();
}
public bool ActivateRadar()
{
if (!isConfigured || Time.time < nextActivationTime)
return false;
PlaceRadarMarks();
nextActivationTime = Time.time + Mathf.Max(0f, cooldown);
cooldownRemaining = Mathf.Max(0f, nextActivationTime - Time.time);
return true;
}
private void PlaceRadarMarks()
{
int targetCount = targetController.Targets.Count;
EnsureRadarMarkCount(targetCount);
for (int index = 0; index < radarMarks.Count; index++)
{
bool hasTarget = index < targetCount && targetController.Targets[index] != null;
GameObject radarMark = radarMarks[index];
radarMark.SetActive(hasTarget);
if (!hasTarget)
continue;
MapTarget target = targetController.Targets[index];
radarMark.name = $"Radar Mark - {target.name}";
radarMark.transform.position =
coordinateSystem.CoordinatesToWorldPosition(target.MapCoordinates);
}
}
private void EnsureRadarMarkCount(int requiredCount)
{
while (radarMarks.Count < requiredCount)
{
GameObject radarMark = Instantiate(radarMarkPrefab.gameObject, transform);
PrepareRadarMark(radarMark);
radarMarks.Add(radarMark);
}
}
private static void PrepareRadarMark(GameObject radarMark)
{
MapTarget targetMovement = radarMark.GetComponent<MapTarget>();
if (targetMovement != null)
targetMovement.enabled = false;
foreach (Collider targetCollider in radarMark.GetComponentsInChildren<Collider>(true))
targetCollider.enabled = false;
foreach (Renderer targetRenderer in radarMark.GetComponentsInChildren<Renderer>(true))
targetRenderer.enabled = true;
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 168bf77c50d14e44a54a3a2e6717d012
@@ -1,88 +0,0 @@
using UnityEngine;
[DisallowMultipleComponent]
public sealed class MapTarget : MonoBehaviour
{
[Header("Map Position (Runtime)")]
[SerializeField] private Vector2 mapCoordinates;
private MapCoordinateSystem coordinateSystem;
private Vector2 movementDirection;
private float movementSpeed;
private bool isConfigured;
private Renderer[] targetRenderers;
public Vector2 MapCoordinates => mapCoordinates;
public MapCoordinateSystem CoordinateSystem => coordinateSystem;
public void Configure(
MapCoordinateSystem newCoordinateSystem,
Vector2 startCoordinates,
float newMovementSpeed,
Vector2 initialDirection)
{
coordinateSystem = newCoordinateSystem;
movementSpeed = Mathf.Max(0f, newMovementSpeed);
movementDirection = initialDirection.sqrMagnitude > Mathf.Epsilon
? initialDirection.normalized
: Vector2.right;
isConfigured = coordinateSystem != null && coordinateSystem.HasValidCorners();
SetMapCoordinates(startCoordinates);
}
private void Update()
{
if (!isConfigured || movementSpeed <= 0f)
return;
Vector2 nextCoordinates = mapCoordinates + movementDirection * (movementSpeed * Time.deltaTime);
ReflectAtMapBounds(ref nextCoordinates);
SetMapCoordinates(nextCoordinates);
}
public void SetMapCoordinates(Vector2 coordinates)
{
mapCoordinates = coordinateSystem != null
? coordinateSystem.ClampCoordinates(coordinates)
: new Vector2(
Mathf.Clamp(coordinates.x, 0f, MapCoordinateSystem.CoordinateMaximum),
Mathf.Clamp(coordinates.y, 0f, MapCoordinateSystem.CoordinateMaximum));
if (isConfigured)
transform.position = coordinateSystem.CoordinatesToWorldPosition(mapCoordinates);
}
public Vector2 GetMapCoordinates()
{
return mapCoordinates;
}
public void SetVisualsVisible(bool isVisible)
{
if (targetRenderers == null)
targetRenderers = GetComponentsInChildren<Renderer>(true);
foreach (Renderer targetRenderer in targetRenderers)
{
if (targetRenderer != null)
targetRenderer.enabled = isVisible;
}
}
private void ReflectAtMapBounds(ref Vector2 coordinates)
{
float maximum = MapCoordinateSystem.CoordinateMaximum;
if (coordinates.x < 0f || coordinates.x > maximum)
{
movementDirection.x = -movementDirection.x;
coordinates.x = Mathf.Clamp(coordinates.x, 0f, maximum);
}
if (coordinates.y < 0f || coordinates.y > maximum)
{
movementDirection.y = -movementDirection.y;
coordinates.y = Mathf.Clamp(coordinates.y, 0f, maximum);
}
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 2ae53f81d9ed4a0fb8d3496feac79ca1
@@ -1,113 +0,0 @@
using System.Collections.Generic;
using UnityEngine;
[DisallowMultipleComponent]
public sealed class MapTargetController : MonoBehaviour
{
[Header("Target Settings")]
[SerializeField, Min(0)] private int targetCount = 5;
[SerializeField, Min(0f)] private float targetMovementSpeed = 1f;
private readonly List<MapTarget> targets = new();
private MapCoordinateSystem coordinateSystem;
private MapTarget targetPrefab;
private Transform targetParent;
private bool isConfigured;
public IReadOnlyList<MapTarget> Targets => targets;
public int TargetCount => targetCount;
public float TargetMovementSpeed => targetMovementSpeed;
private void OnValidate()
{
targetCount = Mathf.Max(0, targetCount);
targetMovementSpeed = Mathf.Max(0f, targetMovementSpeed);
}
public void Configure(
MapCoordinateSystem newCoordinateSystem,
MapTarget newTargetPrefab,
Transform newTargetParent)
{
coordinateSystem = newCoordinateSystem;
targetPrefab = newTargetPrefab;
targetParent = newTargetParent != null ? newTargetParent : transform;
isConfigured = coordinateSystem != null &&
coordinateSystem.HasValidCorners() &&
targetPrefab != null;
}
public void CreateAndPlaceTargets()
{
if (!isConfigured)
{
Debug.LogWarning("Target system is not configured.", this);
return;
}
RegisterExistingTargets();
while (targets.Count < targetCount)
{
MapTarget target = Instantiate(targetPrefab, targetParent);
target.name = $"Target_{targets.Count + 1}";
targets.Add(target);
}
while (targets.Count > targetCount)
{
int lastIndex = targets.Count - 1;
MapTarget target = targets[lastIndex];
targets.RemoveAt(lastIndex);
if (target != null)
Destroy(target.gameObject);
}
for (int index = 0; index < targets.Count; index++)
{
MapTarget target = targets[index];
if (target == null)
continue;
target.Configure(
coordinateSystem,
GetRandomCoordinates(),
targetMovementSpeed,
Random.insideUnitCircle.normalized);
target.SetVisualsVisible(false);
}
}
public void SetTargetVisualsVisible(bool isVisible)
{
foreach (MapTarget target in targets)
{
if (target != null)
target.SetVisualsVisible(isVisible);
}
}
public MapTarget GetTarget(int index)
{
return index >= 0 && index < targets.Count ? targets[index] : null;
}
private void RegisterExistingTargets()
{
targets.Clear();
MapTarget[] existingTargets = targetParent.GetComponentsInChildren<MapTarget>(true);
foreach (MapTarget target in existingTargets)
{
if (target != null && !targets.Contains(target))
targets.Add(target);
}
}
private static Vector2 GetRandomCoordinates()
{
float maximum = MapCoordinateSystem.CoordinateMaximum;
return new Vector2(Random.Range(0f, maximum), Random.Range(0f, maximum));
}
}
@@ -1,2 +0,0 @@
fileFormatVersion: 2
guid: 06d2f3ff739a4a4ca04d749ccf14fd9c
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: d88efbc6589a4404caadb566c0e28842
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,124 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &4012125527390687084
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2929517388927179322}
- component: {fileID: 1898238889115289471}
- component: {fileID: 5321613745555827914}
- component: {fileID: 212733908007784450}
- component: {fileID: 878491239745611204}
m_Layer: 0
m_Name: TargetTest
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &2929517388927179322
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4012125527390687084}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -0.42, y: 3.280054, z: 2.6187859}
m_LocalScale: {x: 0.39, y: 0.39, z: 0.39}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &1898238889115289471
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4012125527390687084}
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
--- !u!23 &5321613745555827914
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4012125527390687084}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: c57515654cf43eb4995ae19964d2ca0b, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!65 &212733908007784450
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4012125527390687084}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 3
m_Size: {x: 1, y: 1, z: 1}
m_Center: {x: 0, y: 0, z: 0}
--- !u!114 &878491239745611204
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4012125527390687084}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2ae53f81d9ed4a0fb8d3496feac79ca1, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MapTarget
mapCoordinates: {x: 0, y: 0}
@@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 985d88cac4b4daa48973a1a464a3d4e5
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 01fc6a03af2e2c74a8ef1cd4a6f4ad5e
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,137 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Crosshair
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _EMISSION
m_InvalidKeywords: []
m_LightmapFlags: 2
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap:
RenderType: Opaque
disabledShaderPasses:
- MOTIONVECTORS
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 2800000, guid: 8b6daeadfc1e345a792cbbff1ceeabb9, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 0
- _AlphaToMask: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.5
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EnvironmentReflections: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0.632
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 0.106
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 0
- _WorkflowMode: 1
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 0, g: 0.9233861, b: 1, a: 1}
- _Color: {r: 0, g: 0.9233861, b: 1, a: 1}
- _EmissionColor: {r: 0.15221034, g: 1.493739, b: 1.5365998, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1
--- !u!114 &3289058871599513036
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier:
version: 10
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 22474510b3d8cc048bb0bc8679862784
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,117 +0,0 @@
fileFormatVersion: 2
guid: 71c6f8835ecab4c489ead4e40a5aafef
TextureImporter:
internalIDToNameTable: []
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
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: 1
wrapV: 1
wrapW: 0
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 1
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
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: 5e97eb03825dee720800000000000000
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:
@@ -1,137 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Target
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _EMISSION
m_InvalidKeywords: []
m_LightmapFlags: 2
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap:
RenderType: Opaque
disabledShaderPasses:
- MOTIONVECTORS
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 2800000, guid: 8b6daeadfc1e345a792cbbff1ceeabb9, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 0
- _AlphaToMask: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.5
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EnvironmentReflections: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0.632
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 0.106
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 0
- _WorkflowMode: 1
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 0, b: 0.050980568, a: 1}
- _Color: {r: 1, g: 0, b: 0.050980546, a: 1}
- _EmissionColor: {r: 2.0907834, g: 0, b: 0, a: 1}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: []
m_AllowLocking: 1
--- !u!114 &3289058871599513036
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier:
version: 10
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: c57515654cf43eb4995ae19964d2ca0b
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,137 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-4452286349835602218
MonoBehaviour:
m_ObjectHideFlags: 11
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3}
m_Name:
m_EditorClassIdentifier:
version: 10
--- !u!21 &2100000
Material:
serializedVersion: 8
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Test
m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _SMOOTHNESS_TEXTURE_ALBEDO_CHANNEL_A
m_InvalidKeywords: []
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap:
RenderType: Opaque
disabledShaderPasses:
- MOTIONVECTORS
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BaseMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_Lightmaps:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_LightmapsInd:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- unity_ShadowMasks:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Ints: []
m_Floats:
- _AddPrecomputedVelocity: 0
- _AlphaClip: 0
- _AlphaToMask: 0
- _Blend: 0
- _BlendModePreserveSpecular: 1
- _BumpScale: 1
- _ClearCoatMask: 0
- _ClearCoatSmoothness: 0
- _Cull: 2
- _Cutoff: 0.5
- _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EnvironmentReflections: 1
- _GlossMapScale: 0
- _Glossiness: 0
- _GlossyReflections: 0
- _Metallic: 0
- _OcclusionStrength: 1
- _Parallax: 0.005
- _QueueOffset: 0
- _ReceiveShadows: 1
- _Smoothness: 0
- _SmoothnessTextureChannel: 1
- _SpecularHighlights: 1
- _SrcBlend: 1
- _SrcBlendAlpha: 1
- _Surface: 0
- _WorkflowMode: 1
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _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
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 0b8e0a594b1c84542b029378c039338e
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 2100000
userData:
assetBundleName:
assetBundleVariant:
@@ -11,26 +11,20 @@ MonoBehaviour:
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 142c75ae48de4c7ba6fd0daad6905872, type: 3}
m_Name: ItemPipeConfig
m_EditorClassIdentifier:
m_EditorClassIdentifier:
spawnInterval: 0.05
spawnCooldown: 10
localVelocityChange: {x: 0, y: -5, z: 0}
guaranteedItems:
- prefab: {fileID: 8351909960905108939, guid: 6eee6df5dab550446b41008fa6fff89a, type: 3}
amount: 1
- prefab: {fileID: 6752047176419627530, guid: 8cc9c4d7d9e04d640bbd0616e7926670, type: 3}
- prefab: {fileID: 4504260422113134419, guid: 8790cd6f776403940ac664c5db12dab4, type: 3}
amount: 1
randomItemCount: 7
randomItems:
- prefab: {fileID: 4609832768900680681, guid: 5cf4d9e867c084847ba82c56bddc456b, type: 3}
- prefab: {fileID: 2474374521670934351, guid: c91d2337125ccaf45a0c57af9a6703c8, type: 3}
weight: 1
- prefab: {fileID: 9206541098482503491, guid: 29519dc5d2cfae441b261f3ca68f2290, type: 3}
- prefab: {fileID: 4728426142119307488, guid: 795e138cd804c7c42aa508895e6a61df, type: 3}
weight: 1
- prefab: {fileID: 8351909960905108939, guid: 6eee6df5dab550446b41008fa6fff89a, type: 3}
weight: 0.3
- prefab: {fileID: 6752047176419627530, guid: 8cc9c4d7d9e04d640bbd0616e7926670, type: 3}
weight: 0.3
- prefab: {fileID: 3256751277309890899, guid: 04a6d9d9e28782a4a9f8f71ce4438fc0, type: 3}
weight: 1.5
- prefab: {fileID: 4504260422113134419, guid: 8790cd6f776403940ac664c5db12dab4, type: 3}
weight: 3
randomSpawnX: 1
randomSpawnZ: 1
+59 -186
View File
@@ -1,11 +1,9 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;
[RequireComponent(typeof(NetworkObject))]
public sealed class ItemPipe : NetworkBehaviour
public class ItemPipe : MonoBehaviour
{
[Header("Pipe")]
[SerializeField] private Transform spawnPoint;
@@ -13,192 +11,84 @@ public sealed class ItemPipe : NetworkBehaviour
[Header("Configuration")]
[SerializeField] private ItemPipeConfig config;
private readonly NetworkVariable<bool> spawnSequenceActive = new(
false,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Server);
[Header("Temporary testing")]
[SerializeField] private bool spawnOnE = true;
private readonly NetworkVariable<double> cooldownEndsAt = new(
0d,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Server);
private Coroutine spawnRoutine;
private bool isSpawning;
public float CooldownDuration => config != null ? config.SpawnCooldown : 0f;
public float CooldownRemaining
{
get
{
double now = NetworkManager != null
? NetworkManager.ServerTime.Time
: Time.timeAsDouble;
return Mathf.Max(0f, (float)(cooldownEndsAt.Value - now));
}
}
public float CooldownRemaining { get; private set; }
public int CooldownSecondsRemaining => Mathf.CeilToInt(CooldownRemaining);
public bool IsSpawning => spawnSequenceActive.Value;
public bool CanSpawnItems =>
IsSpawned &&
config != null &&
!spawnSequenceActive.Value &&
CooldownRemaining <= 0f;
public bool CanSpawnItems => config != null && !isSpawning && CooldownRemaining <= 0f;
public event Action Changed;
private void Reset() => spawnPoint = transform;
public override void OnNetworkSpawn()
private void Update()
{
spawnSequenceActive.OnValueChanged += HandleSpawnStateChanged;
cooldownEndsAt.OnValueChanged += HandleCooldownChanged;
if (CooldownRemaining > 0f)
CooldownRemaining = Mathf.Max(0f, CooldownRemaining - Time.deltaTime);
if (IsServer)
{
spawnSequenceActive.Value = false;
cooldownEndsAt.Value = 0d;
}
if (!spawnOnE || Keyboard.current == null)
return;
Changed?.Invoke();
if (Keyboard.current.eKey.wasPressedThisFrame)
SpawnItems();
}
public override void OnNetworkDespawn()
{
spawnSequenceActive.OnValueChanged -= HandleSpawnStateChanged;
cooldownEndsAt.OnValueChanged -= HandleCooldownChanged;
if (spawnRoutine != null)
{
StopCoroutine(spawnRoutine);
spawnRoutine = null;
}
}
/// <summary>
/// Starts one configured batch. Safe to connect directly to a Button or UnityEvent.
/// Calls made on a client are forwarded to the server.
/// </summary>
public void SpawnItems()
{
if (!IsSpawned)
if (!CanSpawnItems)
return;
if (IsServer)
TryStartSpawnSequenceOnServer();
else
RequestSpawnItemsRpc();
StartCoroutine(SpawnSequence(config));
}
/// <summary>
/// UnityEvent&lt;bool&gt; adapter for a lever. Only the true edge starts a batch;
/// returning a momentary lever to false does not cancel the current batch.
/// </summary>
public void SpawnItems(bool activated)
private IEnumerator SpawnSequence(ItemPipeConfig activeConfig)
{
if (activated)
SpawnItems();
}
isSpawning = true;
/// <summary>
/// Starts while true and cancels the current batch while false. Use this when
/// the lever position must control whether the pipe is allowed to keep running.
/// </summary>
public void SetSpawning(bool shouldSpawn)
{
if (shouldSpawn)
SpawnItems();
else
StopSpawning();
}
public void StopSpawning()
{
if (!IsSpawned)
return;
if (IsServer)
StopSpawnSequenceOnServer(applyCooldown: true);
else
RequestStopSpawningRpc();
}
[Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)]
private void RequestSpawnItemsRpc() => TryStartSpawnSequenceOnServer();
[Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)]
private void RequestStopSpawningRpc() =>
StopSpawnSequenceOnServer(applyCooldown: true);
private bool TryStartSpawnSequenceOnServer()
{
if (!IsServer || !CanSpawnItems)
return false;
spawnSequenceActive.Value = true;
spawnRoutine = StartCoroutine(SpawnSequenceOnServer(config));
return true;
}
private IEnumerator SpawnSequenceOnServer(ItemPipeConfig activeConfig)
{
List<GameObject> spawnQueue = BuildSpawnQueue(activeConfig);
for (int index = 0; index < spawnQueue.Count; index++)
for (int i = 0; i < spawnQueue.Count; i++)
{
SpawnNetworkItemOnServer(spawnQueue[index], activeConfig);
Spawn(spawnQueue[i], activeConfig);
if (index < spawnQueue.Count - 1)
if (i < spawnQueue.Count - 1)
yield return new WaitForSeconds(activeConfig.SpawnInterval);
}
spawnRoutine = null;
cooldownEndsAt.Value =
NetworkManager.ServerTime.Time + activeConfig.SpawnCooldown;
spawnSequenceActive.Value = false;
isSpawning = false;
CooldownRemaining = activeConfig.SpawnCooldown;
}
private void StopSpawnSequenceOnServer(bool applyCooldown)
{
if (!IsServer || !spawnSequenceActive.Value)
return;
if (spawnRoutine != null)
{
StopCoroutine(spawnRoutine);
spawnRoutine = null;
}
cooldownEndsAt.Value = applyCooldown && config != null
? NetworkManager.ServerTime.Time + config.SpawnCooldown
: 0d;
spawnSequenceActive.Value = false;
}
private static List<GameObject> BuildSpawnQueue(ItemPipeConfig activeConfig)
private List<GameObject> BuildSpawnQueue(ItemPipeConfig activeConfig)
{
List<GameObject> queue = new();
// Добавляем предметы в точном количестве.
foreach (ItemPipeConfig.GuaranteedItem item in activeConfig.GuaranteedItems)
{
if (item.prefab == null)
continue;
for (int index = 0; index < item.amount; index++)
for (int i = 0; i < item.amount; i++)
queue.Add(item.prefab);
}
for (int index = 0; index < activeConfig.RandomItemCount; index++)
// Выбираем указанное количество случайных предметов.
for (int i = 0; i < activeConfig.RandomItemCount; i++)
{
GameObject selectedPrefab = ChooseWeightedRandom(activeConfig);
if (selectedPrefab != null)
queue.Add(selectedPrefab);
}
// Перемешиваем гарантированные и случайные предметы вместе.
Shuffle(queue);
return queue;
}
private static GameObject ChooseWeightedRandom(ItemPipeConfig activeConfig)
private GameObject ChooseWeightedRandom(ItemPipeConfig activeConfig)
{
float totalWeight = 0f;
@@ -211,81 +101,64 @@ public sealed class ItemPipe : NetworkBehaviour
if (totalWeight <= 0f)
return null;
float roll = UnityEngine.Random.value * totalWeight;
float accumulatedWeight = 0f;
float roll = Random.value * totalWeight;
float currentWeight = 0f;
foreach (ItemPipeConfig.RandomItem item in activeConfig.RandomItems)
{
if (item.prefab == null || item.weight <= 0f)
continue;
accumulatedWeight += item.weight;
if (roll < accumulatedWeight)
currentWeight += item.weight;
if (roll < currentWeight)
return item.prefab;
}
return null;
}
private static void Shuffle(List<GameObject> queue)
private void Shuffle(List<GameObject> queue)
{
for (int index = queue.Count - 1; index > 0; index--)
for (int i = queue.Count - 1; i > 0; i--)
{
int randomIndex = UnityEngine.Random.Range(0, index + 1);
(queue[index], queue[randomIndex]) =
(queue[randomIndex], queue[index]);
int randomIndex = Random.Range(0, i + 1);
(queue[i], queue[randomIndex]) =
(queue[randomIndex], queue[i]);
}
}
private void SpawnNetworkItemOnServer(
GameObject prefab,
ItemPipeConfig activeConfig)
private void Spawn(GameObject prefab, ItemPipeConfig activeConfig)
{
Transform activeSpawnPoint = spawnPoint != null ? spawnPoint : transform;
if (prefab == null)
if (prefab == null || spawnPoint == null)
return;
float offsetX = UnityEngine.Random.Range(
-activeConfig.RandomSpawnX,
activeConfig.RandomSpawnX);
float offsetZ = UnityEngine.Random.Range(
-activeConfig.RandomSpawnZ,
activeConfig.RandomSpawnZ);
float offsetX = RandomRange(-activeConfig.RandomSpawnX, activeConfig.RandomSpawnX);
float offsetZ = RandomRange(-activeConfig.RandomSpawnZ, activeConfig.RandomSpawnZ);
Vector3 spawnPosition =
activeSpawnPoint.position +
activeSpawnPoint.right * offsetX +
activeSpawnPoint.forward * offsetZ;
spawnPoint.position +
spawnPoint.right * offsetX +
spawnPoint.forward * offsetZ;
GameObject item = Instantiate(
prefab,
spawnPosition,
UnityEngine.Random.rotationUniform);
if (!item.TryGetComponent(out NetworkObject networkObject))
{
Debug.LogError(
$"{name} cannot spawn '{prefab.name}': the prefab has no NetworkObject.",
this);
Destroy(item);
return;
}
networkObject.Spawn();
Random.rotationUniform
);
if (item.TryGetComponent(out Rigidbody body))
{
Vector3 worldVelocityChange =
activeSpawnPoint.TransformDirection(activeConfig.LocalVelocityChange);
spawnPoint.TransformDirection(activeConfig.LocalVelocityChange);
body.AddForce(worldVelocityChange, ForceMode.VelocityChange);
}
}
private void HandleSpawnStateChanged(bool _, bool __) => Changed?.Invoke();
private void HandleCooldownChanged(double _, double __) => Changed?.Invoke();
[ContextMenu("Debug/Spawn Batch (Network Play Mode)")]
private void DebugSpawnBatch() => SpawnItems();
[ContextMenu("Debug/Stop Batch (Network Play Mode)")]
private void DebugStopBatch() => StopSpawning();
private float RandomRange(float min, float max)
{
return Random.Range(min, max);
}
}
@@ -9,7 +9,6 @@ GameObject:
serializedVersion: 6
m_Component:
- component: {fileID: 286431562970531899}
- component: {fileID: 641239187450981236}
- component: {fileID: 4539542294833622770}
m_Layer: 0
m_Name: SpawnJunk
@@ -33,32 +32,6 @@ Transform:
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &641239187450981236
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1621409648607792275}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier:
GlobalObjectIdHash: 0
InScenePlacedSourceGlobalObjectIdHash: 0
DeferredDespawnTick: 0
Ownership: 1
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 0
m_InScenePlaced: 1
ActiveSceneSynchronization: 0
SceneMigrationSynchronization: 0
SpawnWithObservers: 1
DontDestroyWithOwner: 0
AutoObjectParentSync: 1
SyncOwnerTransformWhenParented: 1
AllowOwnerToParent: 0
--- !u!114 &4539542294833622770
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -69,7 +42,8 @@ MonoBehaviour:
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d2976eecf10dffe429030900016fa86d, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Name:
m_EditorClassIdentifier:
spawnPoint: {fileID: 286431562970531899}
config: {fileID: 11400000, guid: 3883e23238f84f748e616770b66fa885, type: 2}
spawnOnE: 1
@@ -129,7 +129,7 @@ MonoBehaviour:
ScaleMaxInterpolationTime: 0.1
AuthorityMode: 1
TickSyncChildren: 0
UseUnreliableDeltas: 1
UseUnreliableDeltas: 0
SyncPositionX: 1
SyncPositionY: 1
SyncPositionZ: 1
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: bdc0e5a6ddbfb0e4690d8e85084966fd
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 5e549a32512e7674b82971da82d9cc61
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
-18
View File
@@ -1,18 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0c79cebdb4201743be8612545ee180e, type: 3}
m_Name: Fish
m_EditorClassIdentifier:
itemId: fish
displayName: Fish
category: 0
worldPrefab: {fileID: 6820144355512337958, guid: 04a6d9d9e28782a4a9f8f71ce4438fc0, type: 3}
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: f24c01151fded9c4cb5789c9a2a60268
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,17 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0928368adb57acb4987bb8fabda3a927, type: 3}
m_Name: ItemCatalog
m_EditorClassIdentifier:
items:
- {fileID: 11400000, guid: dc1f8087c2120614fa0ddcf92cde7f0d, type: 2}
- {fileID: 11400000, guid: 28dfa90ac37ac884d84b4f3754b33546, type: 2}
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: c367b3d51191b6342ace822007172950
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,18 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0c79cebdb4201743be8612545ee180e, type: 3}
m_Name: MetalPlate
m_EditorClassIdentifier:
itemId: metal_plate
displayName: Metal Plate
category: 1
worldPrefab: {fileID: 2888887303011377321, guid: 29519dc5d2cfae441b261f3ca68f2290, type: 3}
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 5887c6bd676db1e4eb497e4ac14bc231
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,18 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0c79cebdb4201743be8612545ee180e, type: 3}
m_Name: MetalRod
m_EditorClassIdentifier:
itemId: metal_rod
displayName: Metal Rod
category: 1
worldPrefab: {fileID: 6071798070859371582, guid: 5cf4d9e867c084847ba82c56bddc456b, type: 3}
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 4f630a08648639c47b2975160e744ea3
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: e6f108b1c62846e49aa2fcf8db4a93a2
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,18 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0c79cebdb4201743be8612545ee180e, type: 3}
m_Name: Rocket-Back-Standart
m_EditorClassIdentifier:
itemId: rocket-back-standart
displayName: Rocket-Back-Standart
category: 2
worldPrefab: {fileID: 8591287727625443167, guid: be54182e751ec4b48b7db90e8598dce1, type: 3}
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: b9e34349c67bdcf4f9ba3fc7655b9dac
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,18 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0c79cebdb4201743be8612545ee180e, type: 3}
m_Name: Rocket-Base-Avia
m_EditorClassIdentifier:
itemId: rocket-base-avia
displayName: Rocket-Base-Avia
category: 2
worldPrefab: {fileID: 1256934312238460503, guid: 9712e2459410a6d43b55ea9d3847e29a, type: 3}
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: e6fdb55d6695e0f4a919bcfbc6bf5ab9
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,18 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0c79cebdb4201743be8612545ee180e, type: 3}
m_Name: Rocket-Base-Standart
m_EditorClassIdentifier:
itemId: rocket-base-standart
displayName: Rocket-Base-Standart
category: 2
worldPrefab: {fileID: 875723161486981202, guid: 6e681ca5358fff648ba85ae9e494fa77, type: 3}
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: d3938024cd4dd964e804af02917917b2
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,18 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0c79cebdb4201743be8612545ee180e, type: 3}
m_Name: Rocket-Cone-Standart
m_EditorClassIdentifier:
itemId: rocket-cone-standart
displayName: Rocket-Cone-Standart
category: 2
worldPrefab: {fileID: 7151289907260619783, guid: a31204f69b185d54ab9e12b0a3a1e98b, type: 3}
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 57d611457f6826f46972c33527ddda60
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,19 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0928368adb57acb4987bb8fabda3a927, type: 3}
m_Name: Rocket-Parts-Catalog
m_EditorClassIdentifier:
items:
- {fileID: 11400000, guid: b9e34349c67bdcf4f9ba3fc7655b9dac, type: 2}
- {fileID: 11400000, guid: e6fdb55d6695e0f4a919bcfbc6bf5ab9, type: 2}
- {fileID: 11400000, guid: d3938024cd4dd964e804af02917917b2, type: 2}
- {fileID: 11400000, guid: 57d611457f6826f46972c33527ddda60, type: 2}
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: cf1fc024df6136d4d8ae38dae7ebf49b
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,18 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0c79cebdb4201743be8612545ee180e, type: 3}
m_Name: Scrap-1
m_EditorClassIdentifier:
itemId: scrap-1
displayName: Scrap-1
category: 0
worldPrefab: {fileID: 9104915302393667013, guid: 6eee6df5dab550446b41008fa6fff89a, type: 3}
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: dc1f8087c2120614fa0ddcf92cde7f0d
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,18 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b0c79cebdb4201743be8612545ee180e, type: 3}
m_Name: Scrap-2
m_EditorClassIdentifier:
itemId: scrap-2
displayName: Scrap-2
category: 0
worldPrefab: {fileID: 3823145821987330810, guid: 8cc9c4d7d9e04d640bbd0616e7926670, type: 3}
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 28dfa90ac37ac884d84b4f3754b33546
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
-8
View File
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 940520d122eb7f64e8532b91e666f61a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,20 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dbdeccc1573d9204f858f7c114972d91, type: 3}
m_Name: Recipe-RocketParts-Back-Standart
m_EditorClassIdentifier:
recipeId: back-standart
displayName: Back-Standart
outputItem: {fileID: 11400000, guid: b9e34349c67bdcf4f9ba3fc7655b9dac, type: 2}
outputAmount: 1
metalCost: 25
processingDuration: 3
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 2a3f0860fa76fc542a7e66f3f8cbd7f3
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,20 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dbdeccc1573d9204f858f7c114972d91, type: 3}
m_Name: Recipe-RocketParts-Base-Avia
m_EditorClassIdentifier:
recipeId: base-avia
displayName: Base-Avia
outputItem: {fileID: 11400000, guid: e6fdb55d6695e0f4a919bcfbc6bf5ab9, type: 2}
outputAmount: 1
metalCost: 25
processingDuration: 3
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: f82e77c5655f1cc49b1603531cbf9a63
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,20 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dbdeccc1573d9204f858f7c114972d91, type: 3}
m_Name: Recipe-RocketParts-Base-Standart
m_EditorClassIdentifier:
recipeId: base-standart
displayName: Base-Standart
outputItem: {fileID: 11400000, guid: d3938024cd4dd964e804af02917917b2, type: 2}
outputAmount: 1
metalCost: 25
processingDuration: 3
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: 39cc97f8147c0f54fa1a75670620f59c
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,20 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dbdeccc1573d9204f858f7c114972d91, type: 3}
m_Name: Recipe-RocketParts-Cone-Standart
m_EditorClassIdentifier:
recipeId: cone-standart
displayName: Cone-Standart
outputItem: {fileID: 11400000, guid: 57d611457f6826f46972c33527ddda60, type: 2}
outputAmount: 1
metalCost: 25
processingDuration: 3
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: f20a8ae0c8ade964c8aa4dfba8cdd8c3
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,20 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dbdeccc1573d9204f858f7c114972d91, type: 3}
m_Name: SmeltMetalPlate
m_EditorClassIdentifier:
recipeId: metal_plate
displayName: Metal Plate
outputItem: {fileID: 11400000, guid: 5887c6bd676db1e4eb497e4ac14bc231, type: 2}
outputAmount: 1
metalCost: 25
processingDuration: 3
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: b40efcd301179814b9266e1dad6821a0
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,20 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: dbdeccc1573d9204f858f7c114972d91, type: 3}
m_Name: SmeltMetalRod
m_EditorClassIdentifier:
recipeId: metal_rod
displayName: Metal Rod
outputItem: {fileID: 11400000, guid: 4f630a08648639c47b2975160e744ea3, type: 2}
outputAmount: 1
metalCost: 20
processingDuration: 2.5
@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: c01b9f700aec7c949a9d0b2e41d31515
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:
@@ -1,303 +0,0 @@
using System.Collections.Generic;
using System.IO;
using Unity.Netcode;
using Unity.Netcode.Components;
using UnityEditor;
using UnityEngine;
public static class FurnacePipelinePrototypeSetup
{
private const string ItemDataFolder = "Assets/CONTENT/Game/Data/Items";
private const string RecipeDataFolder = "Assets/CONTENT/Game/Data/Recipes";
private const string ItemPrefabFolder = "Assets/CONTENT/Game/Prefabs/Items/FurnacePrototype";
private const string WorkstationPrefabFolder = "Assets/CONTENT/Game/Prefabs/Workstations";
private const string NetworkPrefabsPath = "Assets/DefaultNetworkPrefabs.asset";
[MenuItem("FORT-BO/Prototypes/Create Furnace Pipeline")]
public static void CreatePrototype()
{
EnsureFolder(ItemDataFolder);
EnsureFolder(RecipeDataFolder);
EnsureFolder(ItemPrefabFolder);
EnsureFolder(WorkstationPrefabFolder);
ItemDefinition scrapDefinition = GetOrCreateAsset<ItemDefinition>(
$"{ItemDataFolder}/Scrap.asset");
ItemDefinition plateDefinition = GetOrCreateAsset<ItemDefinition>(
$"{ItemDataFolder}/MetalPlate.asset");
ItemDefinition rodDefinition = GetOrCreateAsset<ItemDefinition>(
$"{ItemDataFolder}/MetalRod.asset");
ConfigureItemDefinition(scrapDefinition, "scrap", "Scrap", ItemCategory.Scrap);
ConfigureItemDefinition(plateDefinition, "metal_plate", "Metal Plate", ItemCategory.SmeltedMaterial);
ConfigureItemDefinition(rodDefinition, "metal_rod", "Metal Rod", ItemCategory.SmeltedMaterial);
GameObject scrapPrefab = CreateNetworkItemPrefab(
$"{ItemPrefabFolder}/Scrap.prefab",
"Scrap",
scrapDefinition,
new Vector3(0.55f, 0.4f, 0.5f),
4f,
25f);
GameObject platePrefab = CreateNetworkItemPrefab(
$"{ItemPrefabFolder}/MetalPlate.prefab",
"MetalPlate",
plateDefinition,
new Vector3(0.7f, 0.12f, 0.45f),
2f,
0f);
GameObject rodPrefab = CreateNetworkItemPrefab(
$"{ItemPrefabFolder}/MetalRod.prefab",
"MetalRod",
rodDefinition,
new Vector3(0.18f, 0.18f, 0.9f),
1.5f,
0f);
SetObjectReference(scrapDefinition, "worldPrefab", scrapPrefab.GetComponent<NetworkObject>());
SetObjectReference(plateDefinition, "worldPrefab", platePrefab.GetComponent<NetworkObject>());
SetObjectReference(rodDefinition, "worldPrefab", rodPrefab.GetComponent<NetworkObject>());
ItemCatalog catalog = GetOrCreateAsset<ItemCatalog>($"{ItemDataFolder}/ItemCatalog.asset");
SetObjectReferenceList(catalog, "items", new Object[]
{
scrapDefinition,
plateDefinition,
rodDefinition
});
SmeltingRecipe plateRecipe = GetOrCreateAsset<SmeltingRecipe>(
$"{RecipeDataFolder}/SmeltMetalPlate.asset");
ConfigureRecipe(plateRecipe, "metal_plate", "Metal Plate", plateDefinition, 25f, 3f);
SmeltingRecipe rodRecipe = GetOrCreateAsset<SmeltingRecipe>(
$"{RecipeDataFolder}/SmeltMetalRod.asset");
ConfigureRecipe(rodRecipe, "metal_rod", "Metal Rod", rodDefinition, 20f, 2.5f);
GameObject furnacePrefab = CreateFurnacePrefab(
$"{WorkstationPrefabFolder}/PrototypeFurnace.prefab",
plateRecipe,
rodRecipe);
RegisterNetworkPrefabs(scrapPrefab, platePrefab, rodPrefab, furnacePrefab);
AssetDatabase.SaveAssets();
AssetDatabase.Refresh();
Selection.activeObject = furnacePrefab;
Debug.Log("Furnace pipeline prototype created. Place PrototypeFurnace.prefab in Factory.");
}
private static GameObject CreateNetworkItemPrefab(
string path,
string objectName,
ItemDefinition definition,
Vector3 scale,
float mass,
float metalAmount)
{
GameObject root = GameObject.CreatePrimitive(PrimitiveType.Cube);
root.name = objectName;
root.transform.localScale = scale;
root.AddComponent<NetworkObject>();
NetworkTransform networkTransform = root.AddComponent<NetworkTransform>();
networkTransform.AuthorityMode = NetworkTransform.AuthorityModes.Server;
networkTransform.UseUnreliableDeltas = true;
Rigidbody body = root.AddComponent<Rigidbody>();
body.mass = mass;
body.interpolation = RigidbodyInterpolation.Interpolate;
body.collisionDetectionMode = CollisionDetectionMode.Continuous;
NetworkRigidbody networkRigidbody = root.AddComponent<NetworkRigidbody>();
networkRigidbody.UseRigidBodyForMotion = true;
NetworkCarryableInteractable carryable = root.AddComponent<NetworkCarryableInteractable>();
SetVector3(carryable, "carryOffset", new Vector3(0f, -0.3f, 1.25f));
NetworkItem item = root.AddComponent<NetworkItem>();
SetObjectReference(item, "definition", definition);
if (metalAmount > 0f)
{
FurnaceMetalSource source = root.AddComponent<FurnaceMetalSource>();
SetFloat(source, "metalAmount", metalAmount);
}
GameObject prefab = PrefabUtility.SaveAsPrefabAsset(root, path);
Object.DestroyImmediate(root);
return prefab;
}
private static GameObject CreateFurnacePrefab(
string path,
SmeltingRecipe plateRecipe,
SmeltingRecipe rodRecipe)
{
GameObject root = new("PrototypeFurnace");
root.AddComponent<NetworkObject>();
FurnaceController controller = root.AddComponent<FurnaceController>();
GameObject body = GameObject.CreatePrimitive(PrimitiveType.Cube);
body.name = "Body";
body.transform.SetParent(root.transform, false);
body.transform.localPosition = new Vector3(0f, 0.8f, 0f);
body.transform.localScale = new Vector3(2.2f, 1.6f, 2f);
GameObject inputTrigger = new("ScrapReceiver");
inputTrigger.transform.SetParent(root.transform, false);
inputTrigger.transform.localPosition = new Vector3(0f, 1.7f, 0f);
BoxCollider trigger = inputTrigger.AddComponent<BoxCollider>();
trigger.isTrigger = true;
trigger.size = new Vector3(1.4f, 0.8f, 1.4f);
FurnaceScrapReceiver receiver = inputTrigger.AddComponent<FurnaceScrapReceiver>();
SetObjectReference(receiver, "furnace", controller);
GameObject outputPoint = new("OutputPoint");
outputPoint.transform.SetParent(root.transform, false);
outputPoint.transform.localPosition = new Vector3(0f, 0.45f, 1.5f);
GameObject emptyPoint = new("MetalEmptyPoint");
emptyPoint.transform.SetParent(root.transform, false);
emptyPoint.transform.localPosition = new Vector3(0f, 0.25f, 0f);
GameObject fullPoint = new("MetalFullPoint");
fullPoint.transform.SetParent(root.transform, false);
fullPoint.transform.localPosition = new Vector3(0f, 1.25f, 0f);
GameObject metalVisual = GameObject.CreatePrimitive(PrimitiveType.Cube);
metalVisual.name = "MoltenMetalVisual";
metalVisual.transform.SetParent(root.transform, false);
metalVisual.transform.localPosition = emptyPoint.transform.localPosition;
metalVisual.transform.localScale = new Vector3(1.3f, 0.12f, 1.1f);
Object.DestroyImmediate(metalVisual.GetComponent<Collider>());
FurnaceMetalLevelView levelView = metalVisual.AddComponent<FurnaceMetalLevelView>();
SetObjectReference(levelView, "furnace", controller);
SetObjectReference(levelView, "metalVisual", metalVisual.transform);
SetObjectReference(levelView, "emptyLocalPosition", emptyPoint.transform);
SetObjectReference(levelView, "fullLocalPosition", fullPoint.transform);
GameObject panelAnchor = new("WorldPanelAnchor");
panelAnchor.transform.SetParent(root.transform, false);
panelAnchor.transform.localPosition = new Vector3(1.2f, 1.2f, 1.05f);
SetString(controller, "workstationName", "Prototype Furnace");
SetFloat(controller, "metalCapacity", 100f);
SetObjectReference(controller, "outputPoint", outputPoint.transform);
SetObjectReferenceList(controller, "recipes", new Object[] { plateRecipe, rodRecipe });
GameObject prefab = PrefabUtility.SaveAsPrefabAsset(root, path);
Object.DestroyImmediate(root);
return prefab;
}
private static void ConfigureItemDefinition(
ItemDefinition definition,
string itemId,
string displayName,
ItemCategory category)
{
SetString(definition, "itemId", itemId);
SetString(definition, "displayName", displayName);
SetInt(definition, "category", (int)category);
}
private static void ConfigureRecipe(
SmeltingRecipe recipe,
string recipeId,
string displayName,
ItemDefinition output,
float metalCost,
float duration)
{
SetString(recipe, "recipeId", recipeId);
SetString(recipe, "displayName", displayName);
SetObjectReference(recipe, "outputItem", output);
SetInt(recipe, "outputAmount", 1);
SetFloat(recipe, "metalCost", metalCost);
SetFloat(recipe, "processingDuration", duration);
}
private static void RegisterNetworkPrefabs(params GameObject[] prefabs)
{
NetworkPrefabsList list = AssetDatabase.LoadAssetAtPath<NetworkPrefabsList>(NetworkPrefabsPath);
if (list == null)
throw new FileNotFoundException("Default network prefab list was not found.", NetworkPrefabsPath);
foreach (GameObject prefab in prefabs)
{
if (prefab != null && !list.Contains(prefab))
list.Add(new NetworkPrefab { Prefab = prefab });
}
EditorUtility.SetDirty(list);
}
private static T GetOrCreateAsset<T>(string path) where T : ScriptableObject
{
T asset = AssetDatabase.LoadAssetAtPath<T>(path);
if (asset != null)
return asset;
asset = ScriptableObject.CreateInstance<T>();
AssetDatabase.CreateAsset(asset, path);
return asset;
}
private static void EnsureFolder(string folderPath)
{
string current = "Assets";
string[] segments = folderPath.Split('/');
for (int index = 1; index < segments.Length; index++)
{
string next = $"{current}/{segments[index]}";
if (!AssetDatabase.IsValidFolder(next))
AssetDatabase.CreateFolder(current, segments[index]);
current = next;
}
}
private static void SetString(Object target, string propertyName, string value) =>
Edit(target, propertyName, property => property.stringValue = value);
private static void SetFloat(Object target, string propertyName, float value) =>
Edit(target, propertyName, property => property.floatValue = value);
private static void SetInt(Object target, string propertyName, int value) =>
Edit(target, propertyName, property => property.intValue = value);
private static void SetVector3(Object target, string propertyName, Vector3 value) =>
Edit(target, propertyName, property => property.vector3Value = value);
private static void SetObjectReference(Object target, string propertyName, Object value) =>
Edit(target, propertyName, property => property.objectReferenceValue = value);
private static void SetObjectReferenceList(
Object target,
string propertyName,
IReadOnlyList<Object> values)
{
SerializedObject serializedObject = new(target);
SerializedProperty property = serializedObject.FindProperty(propertyName);
property.arraySize = values.Count;
for (int index = 0; index < values.Count; index++)
property.GetArrayElementAtIndex(index).objectReferenceValue = values[index];
serializedObject.ApplyModifiedPropertiesWithoutUndo();
EditorUtility.SetDirty(target);
}
private static void Edit(
Object target,
string propertyName,
System.Action<SerializedProperty> edit)
{
SerializedObject serializedObject = new(target);
SerializedProperty property = serializedObject.FindProperty(propertyName);
if (property == null)
throw new System.MissingFieldException(target.GetType().Name, propertyName);
edit(property);
serializedObject.ApplyModifiedPropertiesWithoutUndo();
EditorUtility.SetDirty(target);
}
}

Some files were not shown because too many files have changed in this diff Show More