Added Furnance and smelting

This commit is contained in:
2026-08-11 17:12:34 +03:00
parent 2a30d4d8cf
commit 67e0bcfaaf
82 changed files with 25148 additions and 7186 deletions
+2 -1
View File
@@ -431,7 +431,8 @@ MonoBehaviour:
- Assets/Rocks and Boulders 2/Rocks/Source/Models/box.fbx
- Assets/Bitgem/StylisedWater/URP/Meshes/example-scene-01.fbx
- Assets/Fill.obj
uvOverlapAssetList: 00000000ffffffff010100000101000001010000000000000000000000000000
- Assets/CONTENT/ART/tripo_convert_afbded3b-3351-4484-9604-f5a846a051d2.fbx
uvOverlapAssetList: 00000000ffffffff01010000010100000101000000000000000000000000000000000000
xatlasWarningShown: 0
foundCompatibleSetup: 1
gpuName_2: NVIDIA GeForce RTX 5080
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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:
@@ -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
+8
View File
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: bdc0e5a6ddbfb0e4690d8e85084966fd
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
+8
View File
@@ -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:
+8
View File
@@ -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
+1 -1
View File
@@ -202,7 +202,7 @@ MonoBehaviour:
Prefabs:
NetworkPrefabsLists:
- {fileID: 11400000, guid: ade67b675ab279949a8c1b7b0684ce60, type: 2}
TickRate: 30
TickRate: 60
ClientConnectionBufferTimeout: 10
ConnectionApproval: 0
ConnectionData:
File diff suppressed because one or more lines are too long
+16 -1
View File
@@ -45,7 +45,22 @@ MonoBehaviour:
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 8335220146391086898, guid: 3bfc25c2194679746bdc7441f889af7c, type: 3}
Prefab: {fileID: 2182525189444712253, guid: 7f5a91b903d654342bfb77c0b9126aa3, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 9206541098482503491, guid: 29519dc5d2cfae441b261f3ca68f2290, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 4609832768900680681, guid: 5cf4d9e867c084847ba82c56bddc456b, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
- Override: 0
Prefab: {fileID: 3006047789126627680, guid: 802af0722eb96ab46ae2cecf926bc6c9, type: 3}
SourcePrefabToOverride: {fileID: 0}
SourceHashToOverride: 0
OverridingTargetPrefab: {fileID: 0}
+57
View File
@@ -1003,3 +1003,60 @@ launch3
launch4
$
Done
2026-8-11
Init...
Context created
Tiles: 1
Loading shader denoisePrepareOIDN.ptx::oxMain...
Loaded
Loading shader denoiseFinishOIDN.ptx::oxMain...
Loaded
launch1
launch2
launch3
launch4
^
launch1
launch2
launch3
launch4
$
Done
2026-8-11
Init...
Context created
Tiles: 1
Loading shader denoisePrepareOIDN.ptx::oxMain...
Loaded
Loading shader denoiseFinishOIDN.ptx::oxMain...
Loaded
launch1
launch2
launch3
launch4
^
launch1
launch2
launch3
launch4
$
Done
2026-8-11
Init...
Context created
Tiles: 1
Loading shader denoisePrepareOIDN.ptx::oxMain...
Loaded
Loading shader denoiseFinishOIDN.ptx::oxMain...
Loaded
launch1
launch2
launch3
launch4
^
launch1
launch2
launch3
launch4
$
Done
File diff suppressed because it is too large Load Diff
+167
View File
@@ -1465,3 +1465,170 @@ Symbol file LoadedFromMemory is not a mono symbol file
[main 2026-08-11T07:49:01.962Z] Extension host with pid 9568 exited with code: 0, signal: unknown.
[main 2026-08-11T07:49:01.972Z] Extension host with pid 8660 exited with code: 0, signal: unknown.
[main 2026-08-11T07:49:01.977Z] Extension host with pid 32444 exited with code: 0, signal: unknown.
Done
Done
Done
Done
Loaded vertex shader: quad.vso
Loaded pixel shader: skyOutput.pso
Loaded pixel shader: cookieOutput.pso
initShaders done
initScene done
Done
Rendering UV GBuffer for Factory_LM0 51
RGBA32F...RGBA8...R8...RGBA8_SRGB...RGBA16F...states...
Rendering UV normal...
Rendering faceted UV normal...
Rendering UV pos...
Rendering smooth UV pos...
Rendering UV GBuffer for Factory_LMA1 51
RGBA32F...RGBA8...R8...RGBA8_SRGB...RGBA16F...states...
Rendering UV normal...
Rendering faceted UV normal...
Rendering UV pos...
Rendering smooth UV pos...
Rendering UV GBuffer for Factory_LMA2 51
RGBA32F...RGBA8...R8...RGBA8_SRGB...RGBA16F...states...
Rendering UV normal...
Rendering faceted UV normal...
Rendering UV pos...
Rendering smooth UV pos...
Rendering UV GBuffer for volumes 512
RGBA32F...RGBA8...R8...RGBA8_SRGB...RGBA16F...states...
Done
Done
Running ftraceRTX fixpos3D "C:\Users\42\AppData\Local\Temp\frender" "uvpos_volumes.lz4" 2 0 3 fixPos3D_3.bin
Running ftraceRTX fixpos12 "C:\Users\42\AppData\Local\Temp\frender" "uvpos_Factory_LM0.lz4" 2 0 0 0
Running ftraceRTX fixpos12 "C:\Users\42\AppData\Local\Temp\frender" "uvpos_Factory_LMA1.lz4" 2 0 1 0
Running ftraceRTX fixpos12 "C:\Users\42\AppData\Local\Temp\frender" "uvpos_Factory_LMA2.lz4" 2 0 2 0
Running ftraceRTX arealightprobesh "C:\Users\42\AppData\Local\Temp\frender" "light_1_3" 1924 0 3 lights0.bin
Running ftraceRTX batchpointlightprobeshlegacy "C:\Users\42\AppData\Local\Temp\frender" "PointBatch_3_0_5" 1924 0 3 batchpointlight_3_0_5.bin
Running ftraceRTX addmul "C:\Users\42\AppData\Local\Temp\frender" "volumes" 4 0 3 comp_3.bin
Running ftraceRTX arealight "C:\Users\42\AppData\Local\Temp\frender" "light_1_0" 4 0 0 lights0.bin
Running ftraceRTX batchpointlightlegacy "C:\Users\42\AppData\Local\Temp\frender" "PointBatch_0_0_5" 4 0 0 batchpointlight_0_0_5.bin
Running ftraceRTX addmul "C:\Users\42\AppData\Local\Temp\frender" "Factory_LM0" 4 0 0 comp_0.bin
Running ftraceRTX arealight "C:\Users\42\AppData\Local\Temp\frender" "light_1_1" 4 0 1 lights0.bin
Running ftraceRTX batchpointlightlegacy "C:\Users\42\AppData\Local\Temp\frender" "PointBatch_1_0_5" 4 0 1 batchpointlight_1_0_5.bin
Running ftraceRTX addmul "C:\Users\42\AppData\Local\Temp\frender" "Factory_LMA1" 4 0 1 comp_1.bin
Running ftraceRTX arealight "C:\Users\42\AppData\Local\Temp\frender" "light_1_2" 4 0 2 lights0.bin
Running ftraceRTX addmul "C:\Users\42\AppData\Local\Temp\frender" "Factory_LMA2" 4 0 2 comp_2.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LM0_diffuse" 4 16 0 "gi_Factory_LM00.bin" "Factory_LM0_diffuse0_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LMA1_diffuse" 4 16 1 "gi_Factory_LMA10.bin" "Factory_LMA1_diffuse0_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LMA2_diffuse" 4 16 2 "gi_Factory_LMA20.bin" "Factory_LMA2_diffuse0_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LM0_diffuse" 4 16 0 "gi_Factory_LM01.bin" "Factory_LM0_diffuse0_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LMA1_diffuse" 4 16 1 "gi_Factory_LMA11.bin" "Factory_LMA1_diffuse0_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LMA2_diffuse" 4 16 2 "gi_Factory_LMA21.bin" "Factory_LMA2_diffuse0_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LM0_diffuse" 4 16 0 "gi_Factory_LM02.bin" "Factory_LM0_diffuse0_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LMA1_diffuse" 4 16 1 "gi_Factory_LMA12.bin" "Factory_LMA1_diffuse0_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LMA2_diffuse" 4 16 2 "gi_Factory_LMA22.bin" "Factory_LMA2_diffuse0_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LM0_diffuse" 4 16 0 "gi_Factory_LM03.bin" "Factory_LM0_diffuse0_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LMA1_diffuse" 4 16 1 "gi_Factory_LMA13.bin" "Factory_LMA1_diffuse0_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LMA2_diffuse" 4 16 2 "gi_Factory_LMA23.bin" "Factory_LMA2_diffuse0_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgiprobesh "C:\Users\42\AppData\Local\Temp\frender" "volumes_final" 1924 16 3 "gi_volumes4.bin" "volumes_lights_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LM0_final" 4 16 0 "gi_Factory_LM04.bin" "Factory_LM0_lights_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LMA1_final" 4 16 1 "gi_Factory_LMA14.bin" "Factory_LMA1_lights_HDR.lz4" vbTraceTex.bin
Running ftraceRTX texgi "C:\Users\42\AppData\Local\Temp\frender" "Factory_LMA2_final" 4 16 2 "gi_Factory_LMA24.bin" "Factory_LMA2_lights_HDR.lz4" vbTraceTex.bin
Running ftraceRTX addsh "C:\Users\42\AppData\Local\Temp\frender" "volumes_final_" 4 0 3 shcomp_3.bin
Running denoiserOIDN c "C:\Users\42\AppData\Local\Temp\frender/Factory_LM0_final_HDR.lz4" "C:\Users\42\AppData\Local\Temp\frender/Factory_LM0_final_HDR.lz4" 4096 0
Running seamfixer "C:\Users\42\AppData\Local\Temp\frender" "0" "Factory_LM0_final_HDR.lz4"
Loading geometry...
Tris filtered by LMID: was 35936, left 3188
Collecting edges...
9564 edges
Sorting...
Finding seams...X
948 seams
Generating mesh...
Initializing D3D...
Selected device: NVIDIA GeForce RTX 5080
Loaded vertex shader: seamfix.vso
Loaded pixel shader: debugLines.pso
Loading half-float lightmap...
Rendering...
Saving...
Running denoiserOIDN c "C:\Users\42\AppData\Local\Temp\frender/Factory_LMA1_final_HDR.lz4" "C:\Users\42\AppData\Local\Temp\frender/Factory_LMA1_final_HDR.lz4" 4096 0
Running seamfixer "C:\Users\42\AppData\Local\Temp\frender" "1" "Factory_LMA1_final_HDR.lz4"
Loading geometry...
Tris filtered by LMID: was 35936, left 5784
Collecting edges...
17289 edges
Sorting...
Finding seams...X
1140 seams
Generating mesh...
Initializing D3D...
Selected device: NVIDIA GeForce RTX 5080
Loaded vertex shader: seamfix.vso
Loaded pixel shader: debugLines.pso
Loading half-float lightmap...
Rendering...
Saving...
Running denoiserOIDN c "C:\Users\42\AppData\Local\Temp\frender/Factory_LMA2_final_HDR.lz4" "C:\Users\42\AppData\Local\Temp\frender/Factory_LMA2_final_HDR.lz4" 1024 0
Running seamfixer "C:\Users\42\AppData\Local\Temp\frender" "2" "Factory_LMA2_final_HDR.lz4"
Loading geometry...
Tris filtered by LMID: was 35936, left 12
Collecting edges...
36 edges
Sorting...
Finding seams...X
0 seams
Running halffloat2hdr "C:\Users\42\AppData\Local\Temp\frender/Factory_LM0_final_HDR.lz4" "D:/UnityProjects/FORT-BO/Assets/BakeryLightmaps/Factory_LM0_final.hdr" 1024
Initializing D3D...
Done
Running halffloat2hdr "C:\Users\42\AppData\Local\Temp\frender/Factory_LMA1_final_HDR.lz4" "D:/UnityProjects/FORT-BO/Assets/BakeryLightmaps/Factory_LMA1_final.hdr" 1024
Initializing D3D...
Done
Running halffloat2hdr "C:\Users\42\AppData\Local\Temp\frender/Factory_LMA2_final_HDR.lz4" "D:/UnityProjects/FORT-BO/Assets/BakeryLightmaps/Factory_LMA2_final.hdr" 1024
Initializing D3D...
Done
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
[main 2026-08-11T12:59:28.234Z] [RendererPing] enabled (intervalMs=5000, blockThresholdMs=15000, stacks=true)
[main 2026-08-11T12:59:28.334Z] updateURL https://api2.cursor.sh/updates/api/update/win32-x64-user/cursor/3.15.6/484e98c431d003939cb044bad799f11c5fc4746a8e9cc56f4e8964771f655062/stable
[main 2026-08-11T12:59:28.335Z] update#setState idle
[main 2026-08-11T12:59:42.208Z] [CursorProclistService] Config enabled feature (subsample every 10s; memoryPressureMonitorEnabled=false)
[main 2026-08-11T12:59:56.638Z] update#setState checking for updates
[main 2026-08-11T13:00:01.320Z] update#setState idle
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
[main 2026-08-11T13:17:01.878Z] [PowerMainService] Started wakelock id=0 owner=window:1 reason="agent-loop" activeCount=1
[main 2026-08-11T13:17:01.891Z] [PowerMainService] Disabled background throttling id=1 owner=window:1 reason="agent-loop" activeCount=1
[main 2026-08-11T13:18:09.839Z] [PowerMainService] Stopping wakelock id=0 owner=window:1 reason="agent-loop" heldForMs=67961
[main 2026-08-11T13:18:09.847Z] [PowerMainService] Stopped background throttling disable id=1 owner=window:1 reason="agent-loop" heldForMs=67956
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
[main 2026-08-11T13:23:39.041Z] [PowerMainService] Started wakelock id=1 owner=window:1 reason="agent-loop" activeCount=1
[main 2026-08-11T13:23:39.053Z] [PowerMainService] Disabled background throttling id=2 owner=window:1 reason="agent-loop" activeCount=1
[main 2026-08-11T13:25:39.905Z] [PowerMainService] Stopping wakelock id=1 owner=window:1 reason="agent-loop" heldForMs=120864
[main 2026-08-11T13:25:39.911Z] [PowerMainService] Stopped background throttling disable id=2 owner=window:1 reason="agent-loop" heldForMs=120859
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
Symbol file LoadedFromMemory is not a mono symbol file
[main 2026-08-11T13:56:24.373Z] update#setState checking for updates
[main 2026-08-11T13:56:24.934Z] update#setState idle
File diff suppressed because one or more lines are too long
@@ -104,12 +104,12 @@
{
"type": "System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
"key": "ShapeBuilder.ActiveShapeIndex",
"value": "{\"m_Value\":7}"
"value": "{\"m_Value\":6}"
},
{
"type": "UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",
"key": "ShapeBuilder.LastSize.Cube",
"value": "{\"m_Value\":{\"x\":1.1326942443847657,\"y\":3.317640781402588,\"z\":0.7999992370605469}}"
"value": "{\"m_Value\":{\"x\":1.2000001668930054,\"y\":0.4000001549720764,\"z\":1.4000000953674317}}"
},
{
"type": "UnityEngine.Vector3, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null",
+1 -1
View File
@@ -83,7 +83,7 @@ PlayerSettings:
androidApplicationEntry: 2
defaultIsNativeResolution: 1
macRetinaSupport: 1
runInBackground: 0
runInBackground: 1
muteOtherAudioSources: 0
Prepare IOS For Recording: 0
Force IOS Speakers When Recording: 0
+1
View File
@@ -22,3 +22,4 @@
08.06.2026 18:04 | Factory | 0h 0m 29s
08.10.2026 12:31 | Factory | 0h 0m 39s
08.10.2026 12:32 | Factory | 0h 0m 43s
08.11.2026 10:50 | Factory | 0h 0m 40s