Added Furnance and smelting
This commit is contained in:
Binary file not shown.
@@ -0,0 +1,130 @@
|
||||
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:
|
||||
Binary file not shown.
@@ -0,0 +1,107 @@
|
||||
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:
|
||||
@@ -129,7 +129,7 @@ MonoBehaviour:
|
||||
ScaleMaxInterpolationTime: 0.1
|
||||
AuthorityMode: 1
|
||||
TickSyncChildren: 0
|
||||
UseUnreliableDeltas: 0
|
||||
UseUnreliableDeltas: 1
|
||||
SyncPositionX: 1
|
||||
SyncPositionY: 1
|
||||
SyncPositionZ: 1
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bdc0e5a6ddbfb0e4690d8e85084966fd
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5e549a32512e7674b82971da82d9cc61
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,18 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 0928368adb57acb4987bb8fabda3a927, type: 3}
|
||||
m_Name: ItemCatalog
|
||||
m_EditorClassIdentifier:
|
||||
items:
|
||||
- {fileID: 11400000, guid: dc1f8087c2120614fa0ddcf92cde7f0d, type: 2}
|
||||
- {fileID: 11400000, guid: 5887c6bd676db1e4eb497e4ac14bc231, type: 2}
|
||||
- {fileID: 11400000, guid: 4f630a08648639c47b2975160e744ea3, type: 2}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c367b3d51191b6342ace822007172950
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,18 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 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}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5887c6bd676db1e4eb497e4ac14bc231
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,18 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 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}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4f630a08648639c47b2975160e744ea3
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,18 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: b0c79cebdb4201743be8612545ee180e, type: 3}
|
||||
m_Name: Scrap
|
||||
m_EditorClassIdentifier:
|
||||
itemId: scrap
|
||||
displayName: Scrap
|
||||
category: 0
|
||||
worldPrefab: {fileID: 4847937828371134312, guid: 7f5a91b903d654342bfb77c0b9126aa3, type: 3}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dc1f8087c2120614fa0ddcf92cde7f0d
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 940520d122eb7f64e8532b91e666f61a
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,20 @@
|
||||
%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
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b40efcd301179814b9266e1dad6821a0
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,20 @@
|
||||
%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
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c01b9f700aec7c949a9d0b2e41d31515
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,303 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 29fefdfbc459d664e91002f5a2faa978
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 949ae76896b9d4d4bafc762cf43460f6
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,267 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &9206541098482503491
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 373046150160241831}
|
||||
- component: {fileID: 2240617945687571729}
|
||||
- component: {fileID: 1570541890800567413}
|
||||
- component: {fileID: 1152236939985309631}
|
||||
- component: {fileID: 2888887303011377321}
|
||||
- component: {fileID: 6283895837328394518}
|
||||
- component: {fileID: 7357262106795929317}
|
||||
- component: {fileID: 3154893980981319754}
|
||||
- component: {fileID: 8625021823589156851}
|
||||
- component: {fileID: 6907445135272842745}
|
||||
m_Layer: 0
|
||||
m_Name: MetalPlate
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &373046150160241831
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 9206541098482503491}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 0.7, y: 0.12, z: 0.45}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!33 &2240617945687571729
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 9206541098482503491}
|
||||
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!65 &1570541890800567413
|
||||
BoxCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 9206541098482503491}
|
||||
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!23 &1152236939985309631
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 9206541098482503491}
|
||||
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: 31321ba15b8f8eb4c954353edc038b1d, 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: 1
|
||||
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!114 &2888887303011377321
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 9206541098482503491}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
GlobalObjectIdHash: 3864715941
|
||||
InScenePlacedSourceGlobalObjectIdHash: 0
|
||||
DeferredDespawnTick: 0
|
||||
Ownership: 1
|
||||
AlwaysReplicateAsRoot: 0
|
||||
SynchronizeTransform: 1
|
||||
m_InScenePlaced: 1
|
||||
ActiveSceneSynchronization: 0
|
||||
SceneMigrationSynchronization: 0
|
||||
SpawnWithObservers: 1
|
||||
DontDestroyWithOwner: 0
|
||||
AutoObjectParentSync: 1
|
||||
SyncOwnerTransformWhenParented: 1
|
||||
AllowOwnerToParent: 0
|
||||
--- !u!114 &6283895837328394518
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 9206541098482503491}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
NetworkTransformExpanded: 0
|
||||
AutoOwnerAuthorityTickOffset: 1
|
||||
PositionInterpolationType: 0
|
||||
RotationInterpolationType: 0
|
||||
ScaleInterpolationType: 0
|
||||
PositionLerpSmoothing: 1
|
||||
PositionMaxInterpolationTime: 0.1
|
||||
RotationLerpSmoothing: 1
|
||||
RotationMaxInterpolationTime: 0.1
|
||||
ScaleLerpSmoothing: 1
|
||||
ScaleMaxInterpolationTime: 0.1
|
||||
AuthorityMode: 0
|
||||
TickSyncChildren: 0
|
||||
UseUnreliableDeltas: 1
|
||||
SyncPositionX: 1
|
||||
SyncPositionY: 1
|
||||
SyncPositionZ: 1
|
||||
SyncRotAngleX: 1
|
||||
SyncRotAngleY: 1
|
||||
SyncRotAngleZ: 1
|
||||
SyncScaleX: 1
|
||||
SyncScaleY: 1
|
||||
SyncScaleZ: 1
|
||||
PositionThreshold: 0.001
|
||||
RotAngleThreshold: 0.01
|
||||
ScaleThreshold: 0.01
|
||||
UseQuaternionSynchronization: 0
|
||||
UseQuaternionCompression: 0
|
||||
UseHalfFloatPrecision: 0
|
||||
InLocalSpace: 0
|
||||
SwitchTransformSpaceWhenParented: 0
|
||||
Interpolate: 1
|
||||
SlerpPosition: 0
|
||||
--- !u!54 &7357262106795929317
|
||||
Rigidbody:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 9206541098482503491}
|
||||
serializedVersion: 4
|
||||
m_Mass: 2
|
||||
m_Drag: 0
|
||||
m_AngularDrag: 0.05
|
||||
m_CenterOfMass: {x: 0, y: 0, z: 0}
|
||||
m_InertiaTensor: {x: 1, y: 1, z: 1}
|
||||
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_IncludeLayers:
|
||||
serializedVersion: 2
|
||||
m_Bits: 0
|
||||
m_ExcludeLayers:
|
||||
serializedVersion: 2
|
||||
m_Bits: 0
|
||||
m_ImplicitCom: 1
|
||||
m_ImplicitTensor: 1
|
||||
m_UseGravity: 1
|
||||
m_IsKinematic: 0
|
||||
m_Interpolate: 1
|
||||
m_Constraints: 0
|
||||
m_CollisionDetection: 1
|
||||
--- !u!114 &3154893980981319754
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 9206541098482503491}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: f6c0be61502bb534f922ebb746851216, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
NetworkRigidbodyBaseExpanded: 0
|
||||
UseRigidBodyForMotion: 1
|
||||
AutoUpdateKinematicState: 1
|
||||
AutoSetKinematicOnDespawn: 1
|
||||
--- !u!114 &8625021823589156851
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 9206541098482503491}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fad79bb3d620ffb46b527a9e361c28ae, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
interactionLabel: Interact
|
||||
maximumInteractionDistance: 3
|
||||
physicsBody: {fileID: 0}
|
||||
objectColliders: []
|
||||
collisionRefreshInterval: 0.25
|
||||
throwForce: 6
|
||||
throwUpwardForce: 0.5
|
||||
carryOffset: {x: 0, y: -0.3, z: 1.25}
|
||||
--- !u!114 &6907445135272842745
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 9206541098482503491}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 323282b7a87fc4344bd33250e88822e8, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
definition: {fileID: 11400000, guid: 5887c6bd676db1e4eb497e4ac14bc231, type: 2}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 29519dc5d2cfae441b261f3ca68f2290
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,267 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &4609832768900680681
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 487314608127039729}
|
||||
- component: {fileID: 3106168562386324944}
|
||||
- component: {fileID: 3569781445972802911}
|
||||
- component: {fileID: 3857679988419566510}
|
||||
- component: {fileID: 6071798070859371582}
|
||||
- component: {fileID: 383076140020281943}
|
||||
- component: {fileID: 8195051303485245904}
|
||||
- component: {fileID: 5091558897397927903}
|
||||
- component: {fileID: 7827715941785157600}
|
||||
- component: {fileID: 1162555763859047266}
|
||||
m_Layer: 0
|
||||
m_Name: MetalRod
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &487314608127039729
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 4609832768900680681}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 0.18, y: 0.18, z: 0.9}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!33 &3106168562386324944
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 4609832768900680681}
|
||||
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!65 &3569781445972802911
|
||||
BoxCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 4609832768900680681}
|
||||
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!23 &3857679988419566510
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 4609832768900680681}
|
||||
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: 31321ba15b8f8eb4c954353edc038b1d, 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: 1
|
||||
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!114 &6071798070859371582
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 4609832768900680681}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
GlobalObjectIdHash: 3864715941
|
||||
InScenePlacedSourceGlobalObjectIdHash: 0
|
||||
DeferredDespawnTick: 0
|
||||
Ownership: 1
|
||||
AlwaysReplicateAsRoot: 0
|
||||
SynchronizeTransform: 1
|
||||
m_InScenePlaced: 1
|
||||
ActiveSceneSynchronization: 0
|
||||
SceneMigrationSynchronization: 0
|
||||
SpawnWithObservers: 1
|
||||
DontDestroyWithOwner: 0
|
||||
AutoObjectParentSync: 1
|
||||
SyncOwnerTransformWhenParented: 1
|
||||
AllowOwnerToParent: 0
|
||||
--- !u!114 &383076140020281943
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 4609832768900680681}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
NetworkTransformExpanded: 0
|
||||
AutoOwnerAuthorityTickOffset: 1
|
||||
PositionInterpolationType: 0
|
||||
RotationInterpolationType: 0
|
||||
ScaleInterpolationType: 0
|
||||
PositionLerpSmoothing: 1
|
||||
PositionMaxInterpolationTime: 0.1
|
||||
RotationLerpSmoothing: 1
|
||||
RotationMaxInterpolationTime: 0.1
|
||||
ScaleLerpSmoothing: 1
|
||||
ScaleMaxInterpolationTime: 0.1
|
||||
AuthorityMode: 0
|
||||
TickSyncChildren: 0
|
||||
UseUnreliableDeltas: 1
|
||||
SyncPositionX: 1
|
||||
SyncPositionY: 1
|
||||
SyncPositionZ: 1
|
||||
SyncRotAngleX: 1
|
||||
SyncRotAngleY: 1
|
||||
SyncRotAngleZ: 1
|
||||
SyncScaleX: 1
|
||||
SyncScaleY: 1
|
||||
SyncScaleZ: 1
|
||||
PositionThreshold: 0.001
|
||||
RotAngleThreshold: 0.01
|
||||
ScaleThreshold: 0.01
|
||||
UseQuaternionSynchronization: 0
|
||||
UseQuaternionCompression: 0
|
||||
UseHalfFloatPrecision: 0
|
||||
InLocalSpace: 0
|
||||
SwitchTransformSpaceWhenParented: 0
|
||||
Interpolate: 1
|
||||
SlerpPosition: 0
|
||||
--- !u!54 &8195051303485245904
|
||||
Rigidbody:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 4609832768900680681}
|
||||
serializedVersion: 4
|
||||
m_Mass: 1.5
|
||||
m_Drag: 0
|
||||
m_AngularDrag: 0.05
|
||||
m_CenterOfMass: {x: 0, y: 0, z: 0}
|
||||
m_InertiaTensor: {x: 1, y: 1, z: 1}
|
||||
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_IncludeLayers:
|
||||
serializedVersion: 2
|
||||
m_Bits: 0
|
||||
m_ExcludeLayers:
|
||||
serializedVersion: 2
|
||||
m_Bits: 0
|
||||
m_ImplicitCom: 1
|
||||
m_ImplicitTensor: 1
|
||||
m_UseGravity: 1
|
||||
m_IsKinematic: 0
|
||||
m_Interpolate: 1
|
||||
m_Constraints: 0
|
||||
m_CollisionDetection: 1
|
||||
--- !u!114 &5091558897397927903
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 4609832768900680681}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: f6c0be61502bb534f922ebb746851216, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
NetworkRigidbodyBaseExpanded: 0
|
||||
UseRigidBodyForMotion: 1
|
||||
AutoUpdateKinematicState: 1
|
||||
AutoSetKinematicOnDespawn: 1
|
||||
--- !u!114 &7827715941785157600
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 4609832768900680681}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fad79bb3d620ffb46b527a9e361c28ae, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
interactionLabel: Interact
|
||||
maximumInteractionDistance: 3
|
||||
physicsBody: {fileID: 0}
|
||||
objectColliders: []
|
||||
collisionRefreshInterval: 0.25
|
||||
throwForce: 6
|
||||
throwUpwardForce: 0.5
|
||||
carryOffset: {x: 0, y: -0.3, z: 1.25}
|
||||
--- !u!114 &1162555763859047266
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 4609832768900680681}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 323282b7a87fc4344bd33250e88822e8, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
definition: {fileID: 11400000, guid: 4f630a08648639c47b2975160e744ea3, type: 2}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5cf4d9e867c084847ba82c56bddc456b
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,281 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &2182525189444712253
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 480043602958892554}
|
||||
- component: {fileID: 6778003009800737139}
|
||||
- component: {fileID: 4070976183960967726}
|
||||
- component: {fileID: 7688550467070204870}
|
||||
- component: {fileID: 4847937828371134312}
|
||||
- component: {fileID: 739157423183201639}
|
||||
- component: {fileID: 6952725408238905275}
|
||||
- component: {fileID: 7507489822569431272}
|
||||
- component: {fileID: 1530920348677395089}
|
||||
- component: {fileID: 4457586862197726001}
|
||||
- component: {fileID: 2791467813053421235}
|
||||
m_Layer: 0
|
||||
m_Name: Scrap
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &480043602958892554
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2182525189444712253}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 0.55, y: 0.4, z: 0.5}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!33 &6778003009800737139
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2182525189444712253}
|
||||
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!65 &4070976183960967726
|
||||
BoxCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2182525189444712253}
|
||||
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!23 &7688550467070204870
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2182525189444712253}
|
||||
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: 31321ba15b8f8eb4c954353edc038b1d, 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: 1
|
||||
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!114 &4847937828371134312
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2182525189444712253}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
GlobalObjectIdHash: 3864715941
|
||||
InScenePlacedSourceGlobalObjectIdHash: 0
|
||||
DeferredDespawnTick: 0
|
||||
Ownership: 1
|
||||
AlwaysReplicateAsRoot: 0
|
||||
SynchronizeTransform: 1
|
||||
m_InScenePlaced: 1
|
||||
ActiveSceneSynchronization: 0
|
||||
SceneMigrationSynchronization: 0
|
||||
SpawnWithObservers: 1
|
||||
DontDestroyWithOwner: 0
|
||||
AutoObjectParentSync: 1
|
||||
SyncOwnerTransformWhenParented: 1
|
||||
AllowOwnerToParent: 0
|
||||
--- !u!114 &739157423183201639
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2182525189444712253}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: e96cb6065543e43c4a752faaa1468eb1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
NetworkTransformExpanded: 0
|
||||
AutoOwnerAuthorityTickOffset: 1
|
||||
PositionInterpolationType: 0
|
||||
RotationInterpolationType: 0
|
||||
ScaleInterpolationType: 0
|
||||
PositionLerpSmoothing: 1
|
||||
PositionMaxInterpolationTime: 0.1
|
||||
RotationLerpSmoothing: 1
|
||||
RotationMaxInterpolationTime: 0.1
|
||||
ScaleLerpSmoothing: 1
|
||||
ScaleMaxInterpolationTime: 0.1
|
||||
AuthorityMode: 0
|
||||
TickSyncChildren: 0
|
||||
UseUnreliableDeltas: 1
|
||||
SyncPositionX: 1
|
||||
SyncPositionY: 1
|
||||
SyncPositionZ: 1
|
||||
SyncRotAngleX: 1
|
||||
SyncRotAngleY: 1
|
||||
SyncRotAngleZ: 1
|
||||
SyncScaleX: 1
|
||||
SyncScaleY: 1
|
||||
SyncScaleZ: 1
|
||||
PositionThreshold: 0.001
|
||||
RotAngleThreshold: 0.01
|
||||
ScaleThreshold: 0.01
|
||||
UseQuaternionSynchronization: 0
|
||||
UseQuaternionCompression: 0
|
||||
UseHalfFloatPrecision: 0
|
||||
InLocalSpace: 0
|
||||
SwitchTransformSpaceWhenParented: 0
|
||||
Interpolate: 1
|
||||
SlerpPosition: 0
|
||||
--- !u!54 &6952725408238905275
|
||||
Rigidbody:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2182525189444712253}
|
||||
serializedVersion: 4
|
||||
m_Mass: 4
|
||||
m_Drag: 0
|
||||
m_AngularDrag: 0.05
|
||||
m_CenterOfMass: {x: 0, y: 0, z: 0}
|
||||
m_InertiaTensor: {x: 1, y: 1, z: 1}
|
||||
m_InertiaRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_IncludeLayers:
|
||||
serializedVersion: 2
|
||||
m_Bits: 0
|
||||
m_ExcludeLayers:
|
||||
serializedVersion: 2
|
||||
m_Bits: 0
|
||||
m_ImplicitCom: 1
|
||||
m_ImplicitTensor: 1
|
||||
m_UseGravity: 1
|
||||
m_IsKinematic: 0
|
||||
m_Interpolate: 1
|
||||
m_Constraints: 0
|
||||
m_CollisionDetection: 1
|
||||
--- !u!114 &7507489822569431272
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2182525189444712253}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: f6c0be61502bb534f922ebb746851216, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
NetworkRigidbodyBaseExpanded: 0
|
||||
UseRigidBodyForMotion: 1
|
||||
AutoUpdateKinematicState: 1
|
||||
AutoSetKinematicOnDespawn: 1
|
||||
--- !u!114 &1530920348677395089
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2182525189444712253}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fad79bb3d620ffb46b527a9e361c28ae, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
interactionLabel: Interact
|
||||
maximumInteractionDistance: 3
|
||||
physicsBody: {fileID: 0}
|
||||
objectColliders: []
|
||||
collisionRefreshInterval: 0.25
|
||||
throwForce: 6
|
||||
throwUpwardForce: 0.5
|
||||
carryOffset: {x: 0, y: -0.3, z: 1.25}
|
||||
--- !u!114 &4457586862197726001
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2182525189444712253}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 323282b7a87fc4344bd33250e88822e8, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
definition: {fileID: 11400000, guid: dc1f8087c2120614fa0ddcf92cde7f0d, type: 2}
|
||||
--- !u!114 &2791467813053421235
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 2182525189444712253}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 9dd3ea21361871345b5a9d21839c6da1, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
metalAmount: 25
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7f5a91b903d654342bfb77c0b9126aa3
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0729853bea6ebee4fa828e015900836f
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,491 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &1329045462390593297
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 3440049079948703452}
|
||||
m_Layer: 0
|
||||
m_Name: OutputPoint
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &3440049079948703452
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1329045462390593297}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0.45, z: 1.5}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1858887632278238715}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &3006047789126627680
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1858887632278238715}
|
||||
- component: {fileID: 8352192086953126879}
|
||||
- component: {fileID: 9213789764659406484}
|
||||
m_Layer: 0
|
||||
m_Name: PrototypeFurnace
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &1858887632278238715
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3006047789126627680}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 2029505042144761538}
|
||||
- {fileID: 2613004420124304525}
|
||||
- {fileID: 3440049079948703452}
|
||||
- {fileID: 4757451503622202597}
|
||||
- {fileID: 7303050713835538076}
|
||||
- {fileID: 8123456789012345678}
|
||||
- {fileID: 8123456789012345679}
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &8352192086953126879
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3006047789126627680}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
GlobalObjectIdHash: 3864715941
|
||||
InScenePlacedSourceGlobalObjectIdHash: 0
|
||||
DeferredDespawnTick: 0
|
||||
Ownership: 1
|
||||
AlwaysReplicateAsRoot: 0
|
||||
SynchronizeTransform: 1
|
||||
m_InScenePlaced: 1
|
||||
ActiveSceneSynchronization: 0
|
||||
SceneMigrationSynchronization: 0
|
||||
SpawnWithObservers: 1
|
||||
DontDestroyWithOwner: 0
|
||||
AutoObjectParentSync: 1
|
||||
SyncOwnerTransformWhenParented: 1
|
||||
AllowOwnerToParent: 0
|
||||
--- !u!114 &9213789764659406484
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3006047789126627680}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 41af49db79eeaf84ea8bc7c3dd75ae0f, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
ShowTopMostFoldoutHeaderGroup: 1
|
||||
workstationName: Prototype Furnace
|
||||
metalCapacity: 100
|
||||
outputPoint: {fileID: 3440049079948703452}
|
||||
recipes:
|
||||
- {fileID: 11400000, guid: b40efcd301179814b9266e1dad6821a0, type: 2}
|
||||
- {fileID: 11400000, guid: c01b9f700aec7c949a9d0b2e41d31515, type: 2}
|
||||
outputSpacing: 0.35
|
||||
--- !u!1 &5866073999598946136
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 2029505042144761538}
|
||||
- component: {fileID: 5819807494397148051}
|
||||
- component: {fileID: 1357381158899099494}
|
||||
- component: {fileID: 1741101750847204452}
|
||||
m_Layer: 0
|
||||
m_Name: Body
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &2029505042144761538
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5866073999598946136}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0.8, z: 0}
|
||||
m_LocalScale: {x: 2.2, y: 1.6, z: 2}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1858887632278238715}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!33 &5819807494397148051
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5866073999598946136}
|
||||
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!65 &1357381158899099494
|
||||
BoxCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5866073999598946136}
|
||||
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!23 &1741101750847204452
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 5866073999598946136}
|
||||
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: 31321ba15b8f8eb4c954353edc038b1d, 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: 1
|
||||
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!1 &6576840628880540716
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 7303050713835538076}
|
||||
m_Layer: 0
|
||||
m_Name: WorldPanelAnchor
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &7303050713835538076
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6576840628880540716}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 1.2, y: 1.2, z: 1.05}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1858887632278238715}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &7138330055807641713
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 4757451503622202597}
|
||||
- component: {fileID: 6734764425722011759}
|
||||
- component: {fileID: 8437323508402642124}
|
||||
- component: {fileID: 5043639884140826952}
|
||||
m_Layer: 0
|
||||
m_Name: MoltenMetalVisual
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &4757451503622202597
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7138330055807641713}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0.25, z: 0}
|
||||
m_LocalScale: {x: 1.3, y: 0.12, z: 1.1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1858887632278238715}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!33 &6734764425722011759
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7138330055807641713}
|
||||
m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!23 &8437323508402642124
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7138330055807641713}
|
||||
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: 31321ba15b8f8eb4c954353edc038b1d, 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: 1
|
||||
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!114 &5043639884140826952
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 7138330055807641713}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: d51e4e087bfc8f14d8df1b4da69a6d56, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
furnace: {fileID: 9213789764659406484}
|
||||
metalVisual: {fileID: 4757451503622202597}
|
||||
emptyLocalPosition: {fileID: 8123456789012345678}
|
||||
fullLocalPosition: {fileID: 8123456789012345679}
|
||||
movementSpeed: 1.5
|
||||
--- !u!1 &8137587946794080883
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 2613004420124304525}
|
||||
- component: {fileID: 489308711476225990}
|
||||
- component: {fileID: 250802876963792781}
|
||||
m_Layer: 0
|
||||
m_Name: ScrapReceiver
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &2613004420124304525
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8137587946794080883}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 1.7, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1858887632278238715}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!65 &489308711476225990
|
||||
BoxCollider:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8137587946794080883}
|
||||
m_Material: {fileID: 0}
|
||||
m_IncludeLayers:
|
||||
serializedVersion: 2
|
||||
m_Bits: 0
|
||||
m_ExcludeLayers:
|
||||
serializedVersion: 2
|
||||
m_Bits: 0
|
||||
m_LayerOverridePriority: 0
|
||||
m_IsTrigger: 1
|
||||
m_ProvidesContacts: 0
|
||||
m_Enabled: 1
|
||||
serializedVersion: 3
|
||||
m_Size: {x: 1.4, y: 0.8, z: 1.4}
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &250802876963792781
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8137587946794080883}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 7a72230fcd966f84d967ab39b124447d, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
furnace: {fileID: 9213789764659406484}
|
||||
--- !u!1 &8821000000000000001
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 8123456789012345678}
|
||||
m_Layer: 0
|
||||
m_Name: MetalEmptyPoint
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &8123456789012345678
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8821000000000000001}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0.25, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1858887632278238715}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!1 &8821000000000000002
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 8123456789012345679}
|
||||
m_Layer: 0
|
||||
m_Name: MetalFullPoint
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &8123456789012345679
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8821000000000000002}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 1.25, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1858887632278238715}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 802af0722eb96ab46ae2cecf926bc6c9
|
||||
PrefabImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -123,7 +123,10 @@ public sealed class NetworkPhysicalLeverInteractable :
|
||||
}
|
||||
|
||||
if (TryCalculateTargetValue(playerObject, out float targetValue))
|
||||
{
|
||||
MoveTowardsValue(targetValue);
|
||||
UpdateActivationAtEndpoint();
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -198,8 +201,7 @@ public sealed class NetworkPhysicalLeverInteractable :
|
||||
hasSnapTarget = false;
|
||||
bool snappedToMaximum = snapTargetValue >= 0.5f;
|
||||
|
||||
if (isActivated.Value != snappedToMaximum)
|
||||
isActivated.Value = snappedToMaximum;
|
||||
SetActivation(snappedToMaximum);
|
||||
|
||||
bool movedAwayFromInitialPosition =
|
||||
!Mathf.Approximately(snapTargetValue, InitialPositionValue);
|
||||
@@ -209,6 +211,22 @@ public sealed class NetworkPhysicalLeverInteractable :
|
||||
: -1f;
|
||||
}
|
||||
|
||||
private void UpdateActivationAtEndpoint()
|
||||
{
|
||||
const float endpointTolerance = 0.001f;
|
||||
|
||||
if (synchronizedValue.Value >= 1f - endpointTolerance)
|
||||
SetActivation(true);
|
||||
else if (synchronizedValue.Value <= endpointTolerance)
|
||||
SetActivation(false);
|
||||
}
|
||||
|
||||
private void SetActivation(bool activated)
|
||||
{
|
||||
if (isActivated.Value != activated)
|
||||
isActivated.Value = activated;
|
||||
}
|
||||
|
||||
private bool IsPlayerWithinControlDistance(NetworkObject playerObject)
|
||||
{
|
||||
float maximumDistanceSquared = maximumControlDistance * maximumControlDistance;
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 49b83c56f1d5e6d46b448c92e658fbe9
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,22 @@
|
||||
using UnityEngine;
|
||||
|
||||
[DisallowMultipleComponent]
|
||||
[RequireComponent(typeof(NetworkItem))]
|
||||
public sealed class FurnaceMetalSource : MonoBehaviour
|
||||
{
|
||||
[SerializeField, Min(0.01f)] private float metalAmount = 25f;
|
||||
|
||||
private bool isConsumed;
|
||||
|
||||
public float MetalAmount => metalAmount;
|
||||
public bool IsConsumed => isConsumed;
|
||||
|
||||
public bool TryMarkConsumed()
|
||||
{
|
||||
if (isConsumed)
|
||||
return false;
|
||||
|
||||
isConsumed = true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9dd3ea21361871345b5a9d21839c6da1
|
||||
@@ -0,0 +1,42 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
[CreateAssetMenu(fileName = "ItemCatalog", menuName = "FORT-BO/Items/Item Catalog")]
|
||||
public sealed class ItemCatalog : ScriptableObject
|
||||
{
|
||||
[SerializeField] private List<ItemDefinition> items = new();
|
||||
|
||||
private readonly Dictionary<string, ItemDefinition> itemsById =
|
||||
new(StringComparer.Ordinal);
|
||||
|
||||
public IReadOnlyList<ItemDefinition> Items => items;
|
||||
|
||||
private void OnEnable() => RebuildIndex();
|
||||
private void OnValidate() => RebuildIndex();
|
||||
|
||||
public bool TryGetItem(string itemId, out ItemDefinition definition)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(itemId))
|
||||
{
|
||||
definition = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
return itemsById.TryGetValue(itemId.Trim().ToLowerInvariant(), out definition);
|
||||
}
|
||||
|
||||
private void RebuildIndex()
|
||||
{
|
||||
itemsById.Clear();
|
||||
|
||||
foreach (ItemDefinition definition in items)
|
||||
{
|
||||
if (definition == null || string.IsNullOrWhiteSpace(definition.ItemId))
|
||||
continue;
|
||||
|
||||
if (!itemsById.TryAdd(definition.ItemId, definition))
|
||||
Debug.LogError($"Duplicate item id '{definition.ItemId}' in {name}.", this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0928368adb57acb4987bb8fabda3a927
|
||||
@@ -0,0 +1,31 @@
|
||||
using Unity.Netcode;
|
||||
using UnityEngine;
|
||||
|
||||
public enum ItemCategory
|
||||
{
|
||||
Scrap,
|
||||
SmeltedMaterial,
|
||||
RocketPart,
|
||||
Tool,
|
||||
Consumable
|
||||
}
|
||||
|
||||
[CreateAssetMenu(fileName = "ItemDefinition", menuName = "FORT-BO/Items/Item Definition")]
|
||||
public sealed class ItemDefinition : ScriptableObject
|
||||
{
|
||||
[SerializeField] private string itemId;
|
||||
[SerializeField] private string displayName;
|
||||
[SerializeField] private ItemCategory category;
|
||||
[SerializeField] private NetworkObject worldPrefab;
|
||||
|
||||
public string ItemId => itemId;
|
||||
public string DisplayName => string.IsNullOrWhiteSpace(displayName) ? name : displayName;
|
||||
public ItemCategory Category => category;
|
||||
public NetworkObject WorldPrefab => worldPrefab;
|
||||
|
||||
private void OnValidate()
|
||||
{
|
||||
itemId = itemId?.Trim().ToLowerInvariant();
|
||||
displayName = displayName?.Trim();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b0c79cebdb4201743be8612545ee180e
|
||||
@@ -0,0 +1,14 @@
|
||||
using Unity.Netcode;
|
||||
using UnityEngine;
|
||||
|
||||
[DisallowMultipleComponent]
|
||||
[RequireComponent(typeof(NetworkObject))]
|
||||
public sealed class NetworkItem : NetworkBehaviour
|
||||
{
|
||||
[SerializeField] private ItemDefinition definition;
|
||||
|
||||
public ItemDefinition Definition => definition;
|
||||
public string ItemId => definition != null ? definition.ItemId : string.Empty;
|
||||
public string DisplayName => definition != null ? definition.DisplayName : name;
|
||||
public ItemCategory Category => definition != null ? definition.Category : default;
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 323282b7a87fc4344bd33250e88822e8
|
||||
@@ -12,9 +12,18 @@ using Unity.Services.Relay.Models;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
public enum NetworkConnectionMode
|
||||
{
|
||||
None,
|
||||
Relay,
|
||||
Lan
|
||||
}
|
||||
|
||||
[RequireComponent(typeof(NetworkManager), typeof(UnityTransport))]
|
||||
public sealed class NetworkSessionController : MonoBehaviour
|
||||
{
|
||||
public const ushort DefaultLanPort = 7777;
|
||||
|
||||
private const string PlayerNamePreferenceKey = "player_name";
|
||||
private const string RelayCodeDataKey = "relay_code";
|
||||
|
||||
@@ -26,9 +35,12 @@ public sealed class NetworkSessionController : MonoBehaviour
|
||||
[SerializeField, Min(1)] private int maxClientCount = 3;
|
||||
[SerializeField] private bool useSecureRelay = false;
|
||||
|
||||
public string Status { get; private set; } = "Relay is not initialized.";
|
||||
public string Status { get; private set; } = "Ready.";
|
||||
public string JoinCode { get; private set; } = string.Empty;
|
||||
public string LocalPlayerName { get; private set; }
|
||||
public string LanAddress { get; private set; } = "127.0.0.1";
|
||||
public ushort LanPort { get; private set; } = DefaultLanPort;
|
||||
public NetworkConnectionMode ConnectionMode { get; private set; }
|
||||
public bool IsBusy { get; private set; }
|
||||
public bool IsOnline => NetworkManager.Singleton != null && NetworkManager.Singleton.IsListening;
|
||||
public bool IsHost => networkManager != null && networkManager.IsHost;
|
||||
@@ -85,12 +97,15 @@ public sealed class NetworkSessionController : MonoBehaviour
|
||||
allocation.AllocationIdBytes, allocation.Key, allocation.ConnectionData, useSecureRelay);
|
||||
JoinCode = await RelayService.Instance.GetJoinCodeAsync(allocation.AllocationId);
|
||||
await PublishLobbyAsync();
|
||||
ConnectionMode = NetworkConnectionMode.Relay;
|
||||
loadFactoryAfterServerStart = true;
|
||||
if (!networkManager.StartHost()) throw new InvalidOperationException("Netcode host could not start.");
|
||||
Status = "Host started.";
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
ConnectionMode = NetworkConnectionMode.None;
|
||||
loadFactoryAfterServerStart = false;
|
||||
Status = $"Relay host error: {exception.Message}";
|
||||
Debug.LogException(exception);
|
||||
}
|
||||
@@ -108,17 +123,93 @@ public sealed class NetworkSessionController : MonoBehaviour
|
||||
JoinAllocation allocation = await RelayService.Instance.JoinAllocationAsync(joinCode.Trim().ToUpperInvariant());
|
||||
transport.SetClientRelayData(allocation.RelayServer.IpV4, (ushort)allocation.RelayServer.Port,
|
||||
allocation.AllocationIdBytes, allocation.Key, allocation.ConnectionData, allocation.HostConnectionData, useSecureRelay);
|
||||
ConnectionMode = NetworkConnectionMode.Relay;
|
||||
if (!networkManager.StartClient()) throw new InvalidOperationException("Netcode client could not start.");
|
||||
Status = "Connecting to host...";
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
ConnectionMode = NetworkConnectionMode.None;
|
||||
Status = $"Relay join error: {exception.Message}";
|
||||
Debug.LogException(exception);
|
||||
}
|
||||
finally { IsBusy = false; }
|
||||
}
|
||||
|
||||
public bool StartLanHost(ushort port = DefaultLanPort)
|
||||
{
|
||||
if (IsBusy || IsOnline)
|
||||
return false;
|
||||
|
||||
IsBusy = true;
|
||||
try
|
||||
{
|
||||
JoinCode = string.Empty;
|
||||
LanAddress = "127.0.0.1";
|
||||
LanPort = port;
|
||||
ConnectionMode = NetworkConnectionMode.Lan;
|
||||
transport.SetConnectionData(LanAddress, LanPort, "0.0.0.0");
|
||||
loadFactoryAfterServerStart = true;
|
||||
|
||||
if (!networkManager.StartHost())
|
||||
throw new InvalidOperationException("Netcode LAN host could not start.");
|
||||
|
||||
Status = $"LAN host started on port {LanPort}.";
|
||||
return true;
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
ConnectionMode = NetworkConnectionMode.None;
|
||||
loadFactoryAfterServerStart = false;
|
||||
Status = $"LAN host error: {exception.Message}";
|
||||
Debug.LogException(exception);
|
||||
return false;
|
||||
}
|
||||
finally
|
||||
{
|
||||
IsBusy = false;
|
||||
}
|
||||
}
|
||||
|
||||
public bool StartLanClient(string address, ushort port = DefaultLanPort)
|
||||
{
|
||||
if (IsBusy || IsOnline)
|
||||
return false;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(address))
|
||||
{
|
||||
Status = "LAN address is empty.";
|
||||
return false;
|
||||
}
|
||||
|
||||
IsBusy = true;
|
||||
try
|
||||
{
|
||||
JoinCode = string.Empty;
|
||||
LanAddress = address.Trim();
|
||||
LanPort = port;
|
||||
ConnectionMode = NetworkConnectionMode.Lan;
|
||||
transport.SetConnectionData(LanAddress, LanPort);
|
||||
|
||||
if (!networkManager.StartClient())
|
||||
throw new InvalidOperationException("Netcode LAN client could not start.");
|
||||
|
||||
Status = $"Connecting directly to {LanAddress}:{LanPort}...";
|
||||
return true;
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
ConnectionMode = NetworkConnectionMode.None;
|
||||
Status = $"LAN join error: {exception.Message}";
|
||||
Debug.LogException(exception);
|
||||
return false;
|
||||
}
|
||||
finally
|
||||
{
|
||||
IsBusy = false;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task RefreshPublicLobbiesAsync()
|
||||
{
|
||||
if (IsBusy) return;
|
||||
|
||||
@@ -60,6 +60,24 @@ public sealed class FirstPersonCameraController : NetworkBehaviour, IPlayerSyste
|
||||
|
||||
if (isInitialized && !IsOwner)
|
||||
ApplyCameraPitch(synchronizedPitch.Value);
|
||||
|
||||
if (isInitialized && IsOwner)
|
||||
CaptureCursor();
|
||||
}
|
||||
|
||||
private void LateUpdate()
|
||||
{
|
||||
if (!isInitialized || !IsOwner || !Application.isFocused)
|
||||
return;
|
||||
|
||||
if (Cursor.lockState != CursorLockMode.Locked || Cursor.visible)
|
||||
CaptureCursor();
|
||||
}
|
||||
|
||||
private void OnApplicationFocus(bool hasFocus)
|
||||
{
|
||||
if (hasFocus && isInitialized && IsOwner)
|
||||
CaptureCursor();
|
||||
}
|
||||
|
||||
public void ApplyPitch(float pitchDelta)
|
||||
@@ -98,4 +116,10 @@ public sealed class FirstPersonCameraController : NetworkBehaviour, IPlayerSyste
|
||||
if (playerCamera != null)
|
||||
playerCamera.transform.localRotation = Quaternion.Euler(pitch, 0f, 0f);
|
||||
}
|
||||
|
||||
private static void CaptureCursor()
|
||||
{
|
||||
Cursor.lockState = CursorLockMode.Locked;
|
||||
Cursor.visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,12 +11,23 @@ public sealed class FactoryLobbyCodeView : MonoBehaviour
|
||||
GUILayout.BeginArea(new Rect(42, 42, 304, 76));
|
||||
if (session.IsHost)
|
||||
{
|
||||
GUILayout.Label("LOBBY CODE");
|
||||
GUILayout.Label(string.IsNullOrEmpty(session.JoinCode) ? "Generating..." : session.JoinCode);
|
||||
if (session.ConnectionMode == NetworkConnectionMode.Lan)
|
||||
{
|
||||
GUILayout.Label("LAN HOST");
|
||||
GUILayout.Label($"Same PC: 127.0.0.1:{session.LanPort}");
|
||||
}
|
||||
else
|
||||
{
|
||||
GUILayout.Label("LOBBY CODE");
|
||||
GUILayout.Label(string.IsNullOrEmpty(session.JoinCode) ? "Generating..." : session.JoinCode);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
GUILayout.Label("CONNECTED TO FACTORY");
|
||||
string connectionName = session.ConnectionMode == NetworkConnectionMode.Lan
|
||||
? "LAN"
|
||||
: "RELAY";
|
||||
GUILayout.Label($"CONNECTED VIA {connectionName}");
|
||||
}
|
||||
GUILayout.EndArea();
|
||||
}
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public interface IGlobalUISectionController { }
|
||||
|
||||
public sealed class GlobalUIController : MonoBehaviour
|
||||
{
|
||||
public static GlobalUIController Instance { get; private set; }
|
||||
|
||||
private readonly HashSet<IGlobalUISectionController> sectionControllers = new();
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (Instance != null && Instance != this)
|
||||
@@ -13,11 +18,43 @@ public sealed class GlobalUIController : MonoBehaviour
|
||||
}
|
||||
|
||||
Instance = this;
|
||||
|
||||
foreach (MonoBehaviour behaviour in FindObjectsByType<MonoBehaviour>(
|
||||
FindObjectsInactive.Include,
|
||||
FindObjectsSortMode.None))
|
||||
{
|
||||
if (behaviour is IGlobalUISectionController controller)
|
||||
Register(controller);
|
||||
}
|
||||
}
|
||||
|
||||
public void Register(IGlobalUISectionController controller)
|
||||
{
|
||||
if (controller != null)
|
||||
sectionControllers.Add(controller);
|
||||
}
|
||||
|
||||
public void Unregister(IGlobalUISectionController controller)
|
||||
{
|
||||
if (controller != null)
|
||||
sectionControllers.Remove(controller);
|
||||
}
|
||||
|
||||
public IEnumerable<T> GetControllers<T>() where T : class, IGlobalUISectionController
|
||||
{
|
||||
foreach (IGlobalUISectionController controller in sectionControllers)
|
||||
{
|
||||
if (controller is T typedController)
|
||||
yield return typedController;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
if (Instance == this)
|
||||
{
|
||||
sectionControllers.Clear();
|
||||
Instance = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,14 +4,17 @@ using UnityEngine;
|
||||
public sealed class MainMenuController : MonoBehaviour
|
||||
{
|
||||
private string joinCode = string.Empty;
|
||||
private string lanAddress = "127.0.0.1";
|
||||
private string lanPort = NetworkSessionController.DefaultLanPort.ToString();
|
||||
private string playerName = string.Empty;
|
||||
private string lanValidationMessage = string.Empty;
|
||||
private Vector2 lobbyScrollPosition;
|
||||
|
||||
private void OnGUI()
|
||||
{
|
||||
NetworkSessionController session = NetworkSessionController.Instance;
|
||||
GUI.Box(new Rect(24, 24, 480, 620), string.Empty);
|
||||
GUILayout.BeginArea(new Rect(44, 44, 440, 580));
|
||||
GUI.Box(new Rect(24, 24, 480, 700), string.Empty);
|
||||
GUILayout.BeginArea(new Rect(44, 44, 440, 660));
|
||||
GUILayout.Label("FRIENDSLOP // MOUNTAIN FACTORY");
|
||||
GUILayout.Space(10);
|
||||
|
||||
@@ -38,6 +41,27 @@ public sealed class MainMenuController : MonoBehaviour
|
||||
|
||||
GUILayout.Space(10);
|
||||
GUI.enabled = !session.IsBusy;
|
||||
|
||||
GUILayout.Label("LAN // DIRECT CONNECTION");
|
||||
GUILayout.BeginHorizontal();
|
||||
GUILayout.Label("IP", GUILayout.Width(24));
|
||||
lanAddress = GUILayout.TextField(lanAddress);
|
||||
GUILayout.Label("Port", GUILayout.Width(32));
|
||||
lanPort = GUILayout.TextField(lanPort, GUILayout.Width(64));
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
GUILayout.BeginHorizontal();
|
||||
if (GUILayout.Button("Start LAN Host", GUILayout.Height(32)) && TryReadLanPort(out ushort hostPort))
|
||||
session.StartLanHost(hostPort);
|
||||
if (GUILayout.Button("Join LAN", GUILayout.Height(32)) && TryReadLanPort(out ushort clientPort))
|
||||
session.StartLanClient(lanAddress, clientPort);
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
if (!string.IsNullOrEmpty(lanValidationMessage))
|
||||
GUILayout.Label(lanValidationMessage);
|
||||
|
||||
GUILayout.Space(12);
|
||||
GUILayout.Label("RELAY // ONLINE");
|
||||
if (GUILayout.Button("Create Relay Host", GUILayout.Height(34)))
|
||||
_ = session.StartHostAsync();
|
||||
|
||||
@@ -54,7 +78,7 @@ public sealed class MainMenuController : MonoBehaviour
|
||||
_ = session.RefreshPublicLobbiesAsync();
|
||||
GUILayout.EndHorizontal();
|
||||
|
||||
lobbyScrollPosition = GUILayout.BeginScrollView(lobbyScrollPosition, GUILayout.Height(220));
|
||||
lobbyScrollPosition = GUILayout.BeginScrollView(lobbyScrollPosition, GUILayout.Height(160));
|
||||
foreach (Lobby lobby in session.PublicLobbies)
|
||||
{
|
||||
GUILayout.BeginHorizontal(GUI.skin.box);
|
||||
@@ -72,4 +96,11 @@ public sealed class MainMenuController : MonoBehaviour
|
||||
GUI.enabled = true;
|
||||
GUILayout.EndArea();
|
||||
}
|
||||
|
||||
private bool TryReadLanPort(out ushort port)
|
||||
{
|
||||
bool isValid = ushort.TryParse(lanPort, out port) && port > 0;
|
||||
lanValidationMessage = isValid ? string.Empty : "LAN port must be between 1 and 65535.";
|
||||
return isValid;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d65437d286974b44bb6df1a726ef6d23
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d965f4d1841b6bf41b6345426ad113b4
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,11 @@
|
||||
using Unity.Netcode;
|
||||
using UnityEngine;
|
||||
|
||||
[RequireComponent(typeof(NetworkObject))]
|
||||
public abstract class NetworkWorkstationController : NetworkBehaviour
|
||||
{
|
||||
[SerializeField] private string workstationName = "Workstation";
|
||||
|
||||
public string WorkstationName => workstationName;
|
||||
public abstract bool IsOperating { get; }
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b35ba1fb1e9287646b0e3bdf150e98db
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1af1f8302444cae4e8c981b8d01cfcbb
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,291 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Unity.Netcode;
|
||||
using UnityEngine;
|
||||
|
||||
public enum FurnaceState : byte
|
||||
{
|
||||
Idle,
|
||||
Smelting
|
||||
}
|
||||
|
||||
public sealed class FurnaceController : NetworkWorkstationController
|
||||
{
|
||||
[Header("Storage")]
|
||||
[SerializeField, Min(1f)] private float metalCapacity = 100f;
|
||||
|
||||
[Header("Production")]
|
||||
[SerializeField] private Transform outputPoint;
|
||||
[SerializeField] private List<SmeltingRecipe> recipes = new();
|
||||
[SerializeField, Min(0f)] private float outputSpacing = 0.35f;
|
||||
|
||||
private readonly NetworkVariable<float> storedMetal = new(
|
||||
0f,
|
||||
NetworkVariableReadPermission.Everyone,
|
||||
NetworkVariableWritePermission.Server);
|
||||
|
||||
private readonly NetworkVariable<int> selectedRecipeIndex = new(
|
||||
-1,
|
||||
NetworkVariableReadPermission.Everyone,
|
||||
NetworkVariableWritePermission.Server);
|
||||
|
||||
private readonly NetworkVariable<FurnaceState> furnaceState = new(
|
||||
FurnaceState.Idle,
|
||||
NetworkVariableReadPermission.Everyone,
|
||||
NetworkVariableWritePermission.Server);
|
||||
|
||||
private readonly NetworkVariable<double> processStartedAt = new(
|
||||
0d,
|
||||
NetworkVariableReadPermission.Everyone,
|
||||
NetworkVariableWritePermission.Server);
|
||||
|
||||
private readonly NetworkVariable<double> processEndsAt = new(
|
||||
0d,
|
||||
NetworkVariableReadPermission.Everyone,
|
||||
NetworkVariableWritePermission.Server);
|
||||
|
||||
public override bool IsOperating => furnaceState.Value == FurnaceState.Smelting;
|
||||
public FurnaceState State => furnaceState.Value;
|
||||
public float StoredMetal => storedMetal.Value;
|
||||
public float MetalCapacity => metalCapacity;
|
||||
public float MetalNormalized => metalCapacity > 0f ? storedMetal.Value / metalCapacity : 0f;
|
||||
public int SelectedRecipeIndex => selectedRecipeIndex.Value;
|
||||
public IReadOnlyList<SmeltingRecipe> Recipes => recipes;
|
||||
public SmeltingRecipe SelectedRecipe => TryGetRecipe(selectedRecipeIndex.Value, out SmeltingRecipe recipe)
|
||||
? recipe
|
||||
: null;
|
||||
public bool CanStartSelectedRecipe =>
|
||||
!IsOperating &&
|
||||
SelectedRecipe != null &&
|
||||
SelectedRecipe.OutputItem != null &&
|
||||
SelectedRecipe.OutputItem.WorldPrefab != null &&
|
||||
storedMetal.Value >= SelectedRecipe.MetalCost;
|
||||
public float ProcessProgress
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!IsOperating)
|
||||
return 0f;
|
||||
|
||||
double duration = processEndsAt.Value - processStartedAt.Value;
|
||||
if (duration <= 0d)
|
||||
return 1f;
|
||||
|
||||
double now = NetworkManager != null
|
||||
? NetworkManager.ServerTime.Time
|
||||
: Time.timeAsDouble;
|
||||
return Mathf.Clamp01((float)((now - processStartedAt.Value) / duration));
|
||||
}
|
||||
}
|
||||
public float RemainingSeconds
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!IsOperating)
|
||||
return 0f;
|
||||
|
||||
double now = NetworkManager != null
|
||||
? NetworkManager.ServerTime.Time
|
||||
: Time.timeAsDouble;
|
||||
return Mathf.Max(0f, (float)(processEndsAt.Value - now));
|
||||
}
|
||||
}
|
||||
|
||||
public event Action Changed;
|
||||
|
||||
public override void OnNetworkSpawn()
|
||||
{
|
||||
storedMetal.OnValueChanged += HandleStoredMetalChanged;
|
||||
selectedRecipeIndex.OnValueChanged += HandleSelectedRecipeChanged;
|
||||
furnaceState.OnValueChanged += HandleStateChanged;
|
||||
processStartedAt.OnValueChanged += HandleProcessTimeChanged;
|
||||
processEndsAt.OnValueChanged += HandleProcessTimeChanged;
|
||||
|
||||
if (IsServer)
|
||||
{
|
||||
storedMetal.Value = Mathf.Clamp(storedMetal.Value, 0f, metalCapacity);
|
||||
selectedRecipeIndex.Value = recipes.Count > 0 ? 0 : -1;
|
||||
furnaceState.Value = FurnaceState.Idle;
|
||||
processStartedAt.Value = 0d;
|
||||
processEndsAt.Value = 0d;
|
||||
}
|
||||
|
||||
Changed?.Invoke();
|
||||
}
|
||||
|
||||
public override void OnNetworkDespawn()
|
||||
{
|
||||
storedMetal.OnValueChanged -= HandleStoredMetalChanged;
|
||||
selectedRecipeIndex.OnValueChanged -= HandleSelectedRecipeChanged;
|
||||
furnaceState.OnValueChanged -= HandleStateChanged;
|
||||
processStartedAt.OnValueChanged -= HandleProcessTimeChanged;
|
||||
processEndsAt.OnValueChanged -= HandleProcessTimeChanged;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (!IsServer || !IsSpawned || !IsOperating)
|
||||
return;
|
||||
|
||||
if (NetworkManager.ServerTime.Time >= processEndsAt.Value)
|
||||
CompleteSmeltingOnServer();
|
||||
}
|
||||
|
||||
public bool TryConsumeMetalSource(FurnaceMetalSource source)
|
||||
{
|
||||
if (!IsServer || !IsSpawned || source == null || storedMetal.Value >= metalCapacity)
|
||||
return false;
|
||||
|
||||
NetworkItem item = source.GetComponent<NetworkItem>();
|
||||
if (item == null || !item.IsSpawned || item.NetworkObject == null)
|
||||
return false;
|
||||
|
||||
if (source.TryGetComponent(out NetworkHeldInteractable heldObject) && heldObject.IsHeld)
|
||||
return false;
|
||||
|
||||
if (source.TryGetComponent(out NetworkHandItemInteractable handItem) && handItem.IsHeld)
|
||||
return false;
|
||||
|
||||
if (!source.TryMarkConsumed())
|
||||
return false;
|
||||
|
||||
storedMetal.Value = Mathf.Min(metalCapacity, storedMetal.Value + source.MetalAmount);
|
||||
item.NetworkObject.Despawn(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool TryAddMetal(float amount)
|
||||
{
|
||||
if (!IsServer || !IsSpawned || amount <= 0f || storedMetal.Value >= metalCapacity)
|
||||
return false;
|
||||
|
||||
storedMetal.Value = Mathf.Min(metalCapacity, storedMetal.Value + amount);
|
||||
return true;
|
||||
}
|
||||
|
||||
public void SelectRecipe(int recipeIndex)
|
||||
{
|
||||
if (!IsSpawned)
|
||||
return;
|
||||
|
||||
if (IsServer)
|
||||
SelectRecipeOnServer(recipeIndex);
|
||||
else
|
||||
RequestSelectRecipeRpc(recipeIndex);
|
||||
}
|
||||
|
||||
public void StartSmelting()
|
||||
{
|
||||
if (!IsSpawned)
|
||||
return;
|
||||
|
||||
if (IsServer)
|
||||
TryStartSmeltingOnServer();
|
||||
else
|
||||
RequestStartSmeltingRpc();
|
||||
}
|
||||
|
||||
public void SelectAndStartRecipe(int recipeIndex)
|
||||
{
|
||||
if (!IsSpawned)
|
||||
return;
|
||||
|
||||
if (IsServer)
|
||||
{
|
||||
if (SelectRecipeOnServer(recipeIndex))
|
||||
TryStartSmeltingOnServer();
|
||||
}
|
||||
else
|
||||
{
|
||||
RequestSelectAndStartRecipeRpc(recipeIndex);
|
||||
}
|
||||
}
|
||||
|
||||
[Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)]
|
||||
private void RequestSelectRecipeRpc(int recipeIndex) =>
|
||||
SelectRecipeOnServer(recipeIndex);
|
||||
|
||||
[Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)]
|
||||
private void RequestStartSmeltingRpc() =>
|
||||
TryStartSmeltingOnServer();
|
||||
|
||||
[Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Everyone)]
|
||||
private void RequestSelectAndStartRecipeRpc(int recipeIndex)
|
||||
{
|
||||
if (SelectRecipeOnServer(recipeIndex))
|
||||
TryStartSmeltingOnServer();
|
||||
}
|
||||
|
||||
private bool SelectRecipeOnServer(int recipeIndex)
|
||||
{
|
||||
if (!IsServer || IsOperating || !TryGetRecipe(recipeIndex, out _))
|
||||
return false;
|
||||
|
||||
selectedRecipeIndex.Value = recipeIndex;
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool TryStartSmeltingOnServer()
|
||||
{
|
||||
if (!IsServer || !CanStartSelectedRecipe)
|
||||
return false;
|
||||
|
||||
SmeltingRecipe recipe = SelectedRecipe;
|
||||
storedMetal.Value -= recipe.MetalCost;
|
||||
double now = NetworkManager.ServerTime.Time;
|
||||
processStartedAt.Value = now;
|
||||
processEndsAt.Value = now + recipe.ProcessingDuration;
|
||||
furnaceState.Value = FurnaceState.Smelting;
|
||||
return true;
|
||||
}
|
||||
|
||||
private void CompleteSmeltingOnServer()
|
||||
{
|
||||
if (!TryGetRecipe(selectedRecipeIndex.Value, out SmeltingRecipe recipe) ||
|
||||
recipe.OutputItem == null ||
|
||||
recipe.OutputItem.WorldPrefab == null)
|
||||
{
|
||||
Debug.LogError($"{name} cannot complete smelting: output prefab is missing.", this);
|
||||
StopProcessingOnServer();
|
||||
return;
|
||||
}
|
||||
|
||||
Transform spawnTransform = outputPoint != null ? outputPoint : transform;
|
||||
for (int index = 0; index < recipe.OutputAmount; index++)
|
||||
{
|
||||
Vector3 sideOffset = spawnTransform.right * outputSpacing * index;
|
||||
NetworkObject output = Instantiate(
|
||||
recipe.OutputItem.WorldPrefab,
|
||||
spawnTransform.position + sideOffset,
|
||||
spawnTransform.rotation);
|
||||
output.Spawn();
|
||||
}
|
||||
|
||||
StopProcessingOnServer();
|
||||
}
|
||||
|
||||
private void StopProcessingOnServer()
|
||||
{
|
||||
furnaceState.Value = FurnaceState.Idle;
|
||||
processStartedAt.Value = 0d;
|
||||
processEndsAt.Value = 0d;
|
||||
}
|
||||
|
||||
private bool TryGetRecipe(int index, out SmeltingRecipe recipe)
|
||||
{
|
||||
bool isValid = index >= 0 && index < recipes.Count && recipes[index] != null;
|
||||
recipe = isValid ? recipes[index] : null;
|
||||
return isValid;
|
||||
}
|
||||
|
||||
private void HandleStoredMetalChanged(float _, float __) => Changed?.Invoke();
|
||||
private void HandleSelectedRecipeChanged(int _, int __) => Changed?.Invoke();
|
||||
private void HandleStateChanged(FurnaceState _, FurnaceState __) => Changed?.Invoke();
|
||||
private void HandleProcessTimeChanged(double _, double __) => Changed?.Invoke();
|
||||
|
||||
[ContextMenu("Debug/Add 25 Metal (Server Play Mode)")]
|
||||
private void DebugAddMetal() => TryAddMetal(25f);
|
||||
|
||||
[ContextMenu("Debug/Start Selected Recipe (Server Play Mode)")]
|
||||
private void DebugStartSelectedRecipe() => StartSmelting();
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 41af49db79eeaf84ea8bc7c3dd75ae0f
|
||||
@@ -0,0 +1,88 @@
|
||||
using UnityEngine;
|
||||
|
||||
public sealed class FurnaceMetalLevelView : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private FurnaceController furnace;
|
||||
[SerializeField] private Transform metalVisual;
|
||||
[SerializeField] private Transform emptyLocalPosition;
|
||||
[SerializeField] private Transform fullLocalPosition;
|
||||
[SerializeField, Min(0f)] private float movementSpeed = 1.5f;
|
||||
|
||||
private Vector3 targetLocalPosition;
|
||||
|
||||
private void Reset()
|
||||
{
|
||||
furnace = GetComponentInParent<FurnaceController>();
|
||||
metalVisual = transform;
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
if (furnace == null)
|
||||
furnace = GetComponentInParent<FurnaceController>();
|
||||
|
||||
if (furnace != null)
|
||||
furnace.Changed += RefreshTarget;
|
||||
|
||||
RefreshTarget();
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
if (furnace != null)
|
||||
furnace.Changed -= RefreshTarget;
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (metalVisual == null)
|
||||
return;
|
||||
|
||||
metalVisual.localPosition = movementSpeed <= 0f
|
||||
? targetLocalPosition
|
||||
: Vector3.MoveTowards(
|
||||
metalVisual.localPosition,
|
||||
targetLocalPosition,
|
||||
movementSpeed * Time.deltaTime);
|
||||
}
|
||||
|
||||
private void RefreshTarget()
|
||||
{
|
||||
float normalized = furnace != null ? furnace.MetalNormalized : 0f;
|
||||
targetLocalPosition = Vector3.Lerp(
|
||||
GetLocalPoint(emptyLocalPosition),
|
||||
GetLocalPoint(fullLocalPosition),
|
||||
normalized);
|
||||
}
|
||||
|
||||
private Vector3 GetLocalPoint(Transform point)
|
||||
{
|
||||
if (point == null || metalVisual == null)
|
||||
return metalVisual != null ? metalVisual.localPosition : Vector3.zero;
|
||||
|
||||
Transform space = metalVisual.parent;
|
||||
return space != null
|
||||
? space.InverseTransformPoint(point.position)
|
||||
: point.position;
|
||||
}
|
||||
|
||||
[ContextMenu("Preview/Empty")]
|
||||
private void PreviewEmpty() => ApplyPreview(0f);
|
||||
|
||||
[ContextMenu("Preview/Half")]
|
||||
private void PreviewHalf() => ApplyPreview(0.5f);
|
||||
|
||||
[ContextMenu("Preview/Full")]
|
||||
private void PreviewFull() => ApplyPreview(1f);
|
||||
|
||||
private void ApplyPreview(float normalized)
|
||||
{
|
||||
if (metalVisual == null)
|
||||
return;
|
||||
|
||||
metalVisual.localPosition = Vector3.Lerp(
|
||||
GetLocalPoint(emptyLocalPosition),
|
||||
GetLocalPoint(fullLocalPosition),
|
||||
normalized);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d51e4e087bfc8f14d8df1b4da69a6d56
|
||||
@@ -0,0 +1,31 @@
|
||||
using UnityEngine;
|
||||
|
||||
[DisallowMultipleComponent]
|
||||
[RequireComponent(typeof(Collider))]
|
||||
public sealed class FurnaceScrapReceiver : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private FurnaceController furnace;
|
||||
|
||||
private void Reset()
|
||||
{
|
||||
furnace = GetComponentInParent<FurnaceController>();
|
||||
Collider receiverCollider = GetComponent<Collider>();
|
||||
receiverCollider.isTrigger = true;
|
||||
}
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (furnace == null)
|
||||
furnace = GetComponentInParent<FurnaceController>();
|
||||
}
|
||||
|
||||
private void OnTriggerEnter(Collider other)
|
||||
{
|
||||
if (furnace == null || !furnace.IsServer || !furnace.IsSpawned)
|
||||
return;
|
||||
|
||||
FurnaceMetalSource source = other.GetComponentInParent<FurnaceMetalSource>();
|
||||
if (source != null)
|
||||
furnace.TryConsumeMetalSource(source);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7a72230fcd966f84d967ab39b124447d
|
||||
@@ -0,0 +1,25 @@
|
||||
using UnityEngine;
|
||||
|
||||
[CreateAssetMenu(fileName = "SmeltingRecipe", menuName = "FORT-BO/Workstations/Smelting Recipe")]
|
||||
public sealed class SmeltingRecipe : ScriptableObject
|
||||
{
|
||||
[SerializeField] private string recipeId;
|
||||
[SerializeField] private string displayName;
|
||||
[SerializeField] private ItemDefinition outputItem;
|
||||
[SerializeField, Min(1)] private int outputAmount = 1;
|
||||
[SerializeField, Min(0.01f)] private float metalCost = 25f;
|
||||
[SerializeField, Min(0.05f)] private float processingDuration = 3f;
|
||||
|
||||
public string RecipeId => recipeId;
|
||||
public string DisplayName => string.IsNullOrWhiteSpace(displayName) ? name : displayName;
|
||||
public ItemDefinition OutputItem => outputItem;
|
||||
public int OutputAmount => outputAmount;
|
||||
public float MetalCost => metalCost;
|
||||
public float ProcessingDuration => processingDuration;
|
||||
|
||||
private void OnValidate()
|
||||
{
|
||||
recipeId = recipeId?.Trim().ToLowerInvariant();
|
||||
displayName = displayName?.Trim();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dbdeccc1573d9204f858f7c114972d91
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 46d9fb1e1a0fed4479d8298a3ccff544
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,72 @@
|
||||
using UnityEngine;
|
||||
|
||||
public sealed class FurnacePanelUIController : MonoBehaviour, IGlobalUISectionController
|
||||
{
|
||||
[SerializeField] private FurnaceController furnace;
|
||||
[SerializeField] private FurnacePanelUIView view;
|
||||
|
||||
private void Reset()
|
||||
{
|
||||
furnace = GetComponentInParent<FurnaceController>();
|
||||
view = GetComponent<FurnacePanelUIView>();
|
||||
}
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
if (furnace == null)
|
||||
furnace = GetComponentInParent<FurnaceController>();
|
||||
if (view == null)
|
||||
view = GetComponent<FurnacePanelUIView>();
|
||||
|
||||
if (furnace != null)
|
||||
furnace.Changed += Refresh;
|
||||
|
||||
GlobalUIController.Instance?.Register(this);
|
||||
|
||||
Refresh();
|
||||
}
|
||||
|
||||
private void OnDisable()
|
||||
{
|
||||
if (furnace != null)
|
||||
furnace.Changed -= Refresh;
|
||||
|
||||
GlobalUIController.Instance?.Unregister(this);
|
||||
}
|
||||
|
||||
private void Update()
|
||||
{
|
||||
if (furnace != null && furnace.IsOperating)
|
||||
Refresh();
|
||||
}
|
||||
|
||||
public void SelectRecipe(int recipeIndex)
|
||||
{
|
||||
furnace?.SelectRecipe(recipeIndex);
|
||||
}
|
||||
|
||||
public void SelectAndStartRecipe(int recipeIndex)
|
||||
{
|
||||
furnace?.SelectAndStartRecipe(recipeIndex);
|
||||
}
|
||||
|
||||
public void StartSmelting()
|
||||
{
|
||||
furnace?.StartSmelting();
|
||||
}
|
||||
|
||||
public void Refresh()
|
||||
{
|
||||
if (furnace == null || view == null)
|
||||
return;
|
||||
|
||||
view.Render(
|
||||
furnace.StoredMetal,
|
||||
furnace.MetalCapacity,
|
||||
furnace.SelectedRecipe,
|
||||
furnace.State,
|
||||
furnace.ProcessProgress,
|
||||
furnace.RemainingSeconds,
|
||||
furnace.CanStartSelectedRecipe);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6cce45d5e80938340961575a1e91eb41
|
||||
@@ -0,0 +1,51 @@
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
public sealed class FurnacePanelUIView : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private TMP_Text metalText;
|
||||
[SerializeField] private TMP_Text selectedRecipeText;
|
||||
[SerializeField] private TMP_Text statusText;
|
||||
[SerializeField] private TMP_Text remainingTimeText;
|
||||
[SerializeField] private Image metalImage;
|
||||
[SerializeField] private Image progressImage;
|
||||
[SerializeField] private Button startButton;
|
||||
|
||||
public void Render(
|
||||
float storedMetal,
|
||||
float metalCapacity,
|
||||
SmeltingRecipe selectedRecipe,
|
||||
FurnaceState state,
|
||||
float processProgress,
|
||||
float remainingSeconds,
|
||||
bool canStart)
|
||||
{
|
||||
if (metalText != null)
|
||||
metalText.text = $"METAL {storedMetal:0.#} / {metalCapacity:0.#}";
|
||||
|
||||
if (metalImage != null)
|
||||
metalImage.fillAmount = metalCapacity > 0f ? storedMetal / metalCapacity : 0f;
|
||||
|
||||
if (selectedRecipeText != null)
|
||||
{
|
||||
selectedRecipeText.text = selectedRecipe != null
|
||||
? $"{selectedRecipe.DisplayName} | {selectedRecipe.MetalCost:0.#} metal"
|
||||
: "NO RECIPE";
|
||||
}
|
||||
|
||||
if (statusText != null)
|
||||
statusText.text = state == FurnaceState.Smelting ? "SMELTING" : "READY";
|
||||
|
||||
if (progressImage != null)
|
||||
progressImage.fillAmount = processProgress;
|
||||
|
||||
if (remainingTimeText != null)
|
||||
remainingTimeText.text = state == FurnaceState.Smelting
|
||||
? $"{remainingSeconds:0.0}s"
|
||||
: string.Empty;
|
||||
|
||||
if (startButton != null)
|
||||
startButton.interactable = canStart;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 871599a5b7d016b45a74a2005a6e22e5
|
||||
@@ -202,7 +202,7 @@ MonoBehaviour:
|
||||
Prefabs:
|
||||
NetworkPrefabsLists:
|
||||
- {fileID: 11400000, guid: ade67b675ab279949a8c1b7b0684ce60, type: 2}
|
||||
TickRate: 30
|
||||
TickRate: 60
|
||||
ClientConnectionBufferTimeout: 10
|
||||
ConnectionApproval: 0
|
||||
ConnectionData:
|
||||
|
||||
+14512
-7150
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user