wip : scarecrow fix & subtitle event implementation

This commit is contained in:
Ferlat Thibaud
2026-06-01 12:45:40 +02:00
parent fde7b39206
commit 28c951f50f
14 changed files with 1088 additions and 567 deletions
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
@@ -17,5 +17,5 @@ MonoBehaviour:
- English - English
- French - French
_values: _values:
- 'What ? ' - Where am I ?
- 'Quoi ? ' - 'Ou suis je ? '
@@ -17,5 +17,5 @@ MonoBehaviour:
- English - English
- French - French
_values: _values:
- 'It won''t stop ? ' - I don't understand ?
- "Ca ne veut pas s'arr\xEAter ? " - 'Je ne comprends pas ? '
@@ -17,5 +17,5 @@ MonoBehaviour:
- English - English
- French - French
_values: _values:
- The theatre ? - 'He ? '
- 'Le theatre ? ' - 'Hein ? '
File diff suppressed because one or more lines are too long
@@ -132,7 +132,7 @@ Material:
- _Surface: 0 - _Surface: 0
- _VignettePower: 4.92 - _VignettePower: 4.92
- _VignetteStrength: 1 - _VignetteStrength: 1
- _Weight: 0.08962297 - _Weight: 1
- _WorkflowMode: 1 - _WorkflowMode: 1
- _XRMotionVectorsPass: 1 - _XRMotionVectorsPass: 1
- _ZWrite: 1 - _ZWrite: 1
+4 -15
View File
@@ -11,7 +11,6 @@ GameObject:
- component: {fileID: 688462554248565909} - component: {fileID: 688462554248565909}
- component: {fileID: 3502526413762748772} - component: {fileID: 3502526413762748772}
- component: {fileID: 3666808908055770611} - component: {fileID: 3666808908055770611}
- component: {fileID: 1386704396112132862}
m_Layer: 0 m_Layer: 0
m_Name: Ray m_Name: Ray
m_TagString: Untagged m_TagString: Untagged
@@ -62,6 +61,8 @@ MeshRenderer:
m_RayTracingAccelStructBuildFlagsOverride: 0 m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1 m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1 m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1 m_RenderingLayerMask: 1
m_RendererPriority: 0 m_RendererPriority: 0
m_Materials: m_Materials:
@@ -83,21 +84,9 @@ MeshRenderer:
m_AutoUVMaxDistance: 0.5 m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89 m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0} m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0 m_SortingLayerID: 0
m_SortingLayer: 0 m_SortingLayer: 0
m_SortingOrder: 0 m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0} m_AdditionalVertexStreams: {fileID: 0}
--- !u!114 &1386704396112132862
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2541733693143394657}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: cc3f4e6ebaca477438c280760d2d2f16, type: 3}
m_Name:
m_EditorClassIdentifier:
MeshFilter: {fileID: 3502526413762748772}
Renderer: {fileID: 3666808908055770611}
+231 -189
View File
@@ -806,11 +806,11 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4440040250278121308, guid: 6493d77978c5c1246a0410d1f9204524, type: 3} - target: {fileID: 4440040250278121308, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: m_LocalRotation.w propertyPath: m_LocalRotation.w
value: 1 value: 0.9816273
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4440040250278121308, guid: 6493d77978c5c1246a0410d1f9204524, type: 3} - target: {fileID: 4440040250278121308, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: m_LocalRotation.x propertyPath: m_LocalRotation.x
value: 0 value: -0.19080894
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4440040250278121308, guid: 6493d77978c5c1246a0410d1f9204524, type: 3} - target: {fileID: 4440040250278121308, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: m_LocalRotation.y propertyPath: m_LocalRotation.y
@@ -822,7 +822,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4440040250278121308, guid: 6493d77978c5c1246a0410d1f9204524, type: 3} - target: {fileID: 4440040250278121308, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: m_LocalEulerAnglesHint.x propertyPath: m_LocalEulerAnglesHint.x
value: 0 value: -22
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 4484393045093388587, guid: 6493d77978c5c1246a0410d1f9204524, type: 3} - target: {fileID: 4484393045093388587, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: _debugStressValue propertyPath: _debugStressValue
@@ -1004,12 +1004,6 @@ PrefabInstance:
insertIndex: -1 insertIndex: -1
addedObject: {fileID: 1918828521} addedObject: {fileID: 1918828521}
m_AddedComponents: m_AddedComponents:
- targetCorrespondingSourceObject: {fileID: 5575782855984327677, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
insertIndex: -1
addedObject: {fileID: 130733312}
- targetCorrespondingSourceObject: {fileID: 5575782855984327677, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
insertIndex: -1
addedObject: {fileID: 130733313}
- targetCorrespondingSourceObject: {fileID: 2101508725665932610, guid: 6493d77978c5c1246a0410d1f9204524, type: 3} - targetCorrespondingSourceObject: {fileID: 2101508725665932610, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
insertIndex: -1 insertIndex: -1
addedObject: {fileID: 126892899} addedObject: {fileID: 126892899}
@@ -1072,102 +1066,6 @@ MonoBehaviour:
scalingFactor: 1 scalingFactor: 1
m_posOffsetData: {fileID: 0} m_posOffsetData: {fileID: 0}
listenerMask: 1 listenerMask: 1
--- !u!1 &130733311 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 5575782855984327677, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
m_PrefabInstance: {fileID: 126892893}
m_PrefabAsset: {fileID: 0}
--- !u!114 &130733312
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 130733311}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0097589062bdfad4a96fa20e8effbe2f, type: 3}
m_Name:
m_EditorClassIdentifier: OctoCore.Runtime::OctoCore.Components.OctoProceduralAnimator
_settings:
Space: 0
Type: 3
Balance: 1
Curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 1
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
RandomOffset: 1
Duration: 15
CycleOffset: 0
Translation: {x: 0, y: 0, z: 0}
Rotation: {x: -22, y: 0, z: 0}
Scale: {x: 0, y: 0, z: 0}
_state:
CurrentTime: 0
IsFinished: 0
InitialPosition: {x: 0, y: 0, z: 0}
InitialRotation: {x: 0, y: 0, z: 0, w: 0}
InitialScale: {x: 0, y: 0, z: 0}
--- !u!114 &130733313
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 130733311}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5170627695bd877419928fa9ca37865d, type: 3}
m_Name:
m_EditorClassIdentifier: OctoCore.Runtime::OctoCore.Components.OctoWorldEvent
_trigger: 2
_action: 0
_condition: 0
_tags: []
_targets: []
_tolerance: 0.5
_duration: 1
_execution: 1
_delay: 10
_onTrigger:
m_PersistentCalls:
m_Calls: []
_onTriggerDelayed:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 130733312}
m_TargetAssemblyTypeName: OctoCore.Components.OctoProceduralAnimator, OctoCore.Runtime
m_MethodName: PlayAnimation
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!1 &166766592 stripped --- !u!1 &166766592 stripped
GameObject: GameObject:
m_CorrespondingSourceObject: {fileID: 8829451551789304542, guid: 8206b722d11501a449d6a278cca2adfa, type: 3} m_CorrespondingSourceObject: {fileID: 8829451551789304542, guid: 8206b722d11501a449d6a278cca2adfa, type: 3}
@@ -1239,6 +1137,39 @@ Transform:
- {fileID: 498371833} - {fileID: 498371833}
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &228353701
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 228353702}
m_Layer: 0
m_Name: 'FlamesReflections '
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &228353702
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 228353701}
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: 1879689922}
- {fileID: 1952597877}
m_Father: {fileID: 571823342}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &230644866 --- !u!1001 &230644866
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -1249,23 +1180,23 @@ PrefabInstance:
m_Modifications: m_Modifications:
- target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_LocalScale.x propertyPath: m_LocalScale.x
value: 4 value: 8
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_LocalScale.y propertyPath: m_LocalScale.y
value: 5.0204 value: 9.774718
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_LocalScale.z propertyPath: m_LocalScale.z
value: 4 value: 8
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_LocalPosition.x propertyPath: m_LocalPosition.x
value: 12.46 value: 24
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_LocalPosition.y propertyPath: m_LocalPosition.y
value: -3.094842 value: 8.6539
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_LocalPosition.z propertyPath: m_LocalPosition.z
@@ -1301,7 +1232,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_ConstrainProportionsScale propertyPath: m_ConstrainProportionsScale
value: 1 value: 0
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 787135931011508029, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 787135931011508029, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_Name propertyPath: m_Name
@@ -1719,7 +1650,7 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: m_Children:
- {fileID: 1058633435} - {fileID: 1058633435}
- {fileID: 1879689922} - {fileID: 228353702}
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &575144955 --- !u!1 &575144955
@@ -2007,51 +1938,6 @@ Transform:
m_CorrespondingSourceObject: {fileID: 2721267321453921552, guid: a4ca96f09a0c04645aa697def551b52d, type: 3} m_CorrespondingSourceObject: {fileID: 2721267321453921552, guid: a4ca96f09a0c04645aa697def551b52d, type: 3}
m_PrefabInstance: {fileID: 620676192} m_PrefabInstance: {fileID: 620676192}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!1 &658668483
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 658668485}
- component: {fileID: 658668484}
m_Layer: 0
m_Name: InputManager
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &658668484
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 658668483}
m_Enabled: 0
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: e340839b22a784542ba8afdfde612c2e, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Unheimlich.Core.Input.InputManager
_currentContext: 3
--- !u!4 &658668485
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 658668483}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -1.32941, y: -1.014, z: 2.47307}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1358231749}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &832575517 --- !u!1 &832575517
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -2455,23 +2341,23 @@ PrefabInstance:
m_Modifications: m_Modifications:
- target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_LocalScale.x propertyPath: m_LocalScale.x
value: 4 value: 8
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_LocalScale.y propertyPath: m_LocalScale.y
value: 5.0204 value: 9.774718
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_LocalScale.z propertyPath: m_LocalScale.z
value: 4 value: 8
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_LocalPosition.x propertyPath: m_LocalPosition.x
value: -12 value: -24
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_LocalPosition.y propertyPath: m_LocalPosition.y
value: -3.094842 value: 8.6539
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_LocalPosition.z propertyPath: m_LocalPosition.z
@@ -2507,7 +2393,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 303326238445583123, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_ConstrainProportionsScale propertyPath: m_ConstrainProportionsScale
value: 1 value: 0
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 787135931011508029, guid: b235f6e405ca9644bb305756268ae07f, type: 3} - target: {fileID: 787135931011508029, guid: b235f6e405ca9644bb305756268ae07f, type: 3}
propertyPath: m_Name propertyPath: m_Name
@@ -2843,7 +2729,6 @@ Transform:
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: m_Children:
- {fileID: 1533276369} - {fileID: 1533276369}
- {fileID: 658668485}
- {fileID: 882795733} - {fileID: 882795733}
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -2875,8 +2760,8 @@ Transform:
m_GameObject: {fileID: 1520114605} m_GameObject: {fileID: 1520114605}
serializedVersion: 2 serializedVersion: 2
m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068} m_LocalRotation: {x: 0.7071068, y: -0, z: -0, w: 0.7071068}
m_LocalPosition: {x: 0, y: -16.294641, z: 0} m_LocalPosition: {x: 0, y: -19.2968, z: 0}
m_LocalScale: {x: 2.297417, y: 5, z: 4.9749117} m_LocalScale: {x: 5.169189, y: 11.250002, z: 10.593136}
m_ConstrainProportionsScale: 1 m_ConstrainProportionsScale: 1
m_Children: [] m_Children: []
m_Father: {fileID: 1527450886} m_Father: {fileID: 1527450886}
@@ -2928,7 +2813,7 @@ MeshRenderer:
m_RenderingLayerMask: 1 m_RenderingLayerMask: 1
m_RendererPriority: 0 m_RendererPriority: 0
m_Materials: m_Materials:
- {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} - {fileID: 2100000, guid: 5f465680b9c699e4a8e573e246fa1e9e, type: 2}
m_StaticBatchInfo: m_StaticBatchInfo:
firstSubMesh: 0 firstSubMesh: 0
subMeshCount: 0 subMeshCount: 0
@@ -3116,9 +3001,12 @@ MonoBehaviour:
m_PreInfinity: 2 m_PreInfinity: 2
m_PostInfinity: 2 m_PostInfinity: 2
m_RotationOrder: 4 m_RotationOrder: 4
_heatMaterial: {fileID: 2100000, guid: 1daabe35e56c7bf41bb81f984e694029, type: 2} _heatMaterial: {fileID: 0}
_lightFlicker: {fileID: 0} _lights:
_targetLightIntensity: 15000 - Flicker: {fileID: 1879689923}
TargetIntensity: 15000
- Flicker: {fileID: 1952597878}
TargetIntensity: 300
--- !u!4 &1533276369 --- !u!4 &1533276369
Transform: Transform:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -3720,7 +3608,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 8829451551789304537, guid: 8206b722d11501a449d6a278cca2adfa, type: 3} - target: {fileID: 8829451551789304537, guid: 8206b722d11501a449d6a278cca2adfa, type: 3}
propertyPath: m_LocalScale.y propertyPath: m_LocalScale.y
value: 9.897436 value: 9
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 8829451551789304537, guid: 8206b722d11501a449d6a278cca2adfa, type: 3} - target: {fileID: 8829451551789304537, guid: 8206b722d11501a449d6a278cca2adfa, type: 3}
propertyPath: m_LocalScale.z propertyPath: m_LocalScale.z
@@ -3732,7 +3620,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 8829451551789304537, guid: 8206b722d11501a449d6a278cca2adfa, type: 3} - target: {fileID: 8829451551789304537, guid: 8206b722d11501a449d6a278cca2adfa, type: 3}
propertyPath: m_LocalPosition.y propertyPath: m_LocalPosition.y
value: 9.4512825 value: 8.44
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 8829451551789304537, guid: 8206b722d11501a449d6a278cca2adfa, type: 3} - target: {fileID: 8829451551789304537, guid: 8206b722d11501a449d6a278cca2adfa, type: 3}
propertyPath: m_LocalPosition.z propertyPath: m_LocalPosition.z
@@ -3864,7 +3752,7 @@ GameObject:
- component: {fileID: 1879689922} - component: {fileID: 1879689922}
- component: {fileID: 1879689921} - component: {fileID: 1879689921}
- component: {fileID: 1879689920} - component: {fileID: 1879689920}
- component: {fileID: 1879689919} - component: {fileID: 1879689923}
m_Layer: 0 m_Layer: 0
m_Name: Point Light m_Name: Point Light
m_TagString: Untagged m_TagString: Untagged
@@ -3872,18 +3760,6 @@ GameObject:
m_NavMeshLayer: 0 m_NavMeshLayer: 0
m_StaticEditorFlags: 0 m_StaticEditorFlags: 0
m_IsActive: 1 m_IsActive: 1
--- !u!114 &1879689919
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1879689918}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d4144428452c31843a84d459266f8212, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MonoLimboStudio.LightFlicker
--- !u!114 &1879689920 --- !u!114 &1879689920
MonoBehaviour: MonoBehaviour:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -3923,9 +3799,9 @@ Light:
m_Enabled: 1 m_Enabled: 1
serializedVersion: 12 serializedVersion: 12
m_Type: 2 m_Type: 2
m_Color: {r: 0.5471698, g: 0.2757114, b: 0.17722787, a: 1} m_Color: {r: 0.9716981, g: 0.32118085, b: 0, a: 1}
m_Intensity: 5000 m_Intensity: 5000
m_Range: 25.400116 m_Range: 32.184563
m_SpotAngle: 30 m_SpotAngle: 30
m_InnerSpotAngle: 21.80208 m_InnerSpotAngle: 21.80208
m_CookieSize2D: {x: 0.5, y: 0.5} m_CookieSize2D: {x: 0.5, y: 0.5}
@@ -3987,12 +3863,31 @@ Transform:
m_GameObject: {fileID: 1879689918} m_GameObject: {fileID: 1879689918}
serializedVersion: 2 serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0.17059004, y: 10.366, z: -1.12693} m_LocalPosition: {x: 0, y: 15.91, z: -1.3500001}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
m_Father: {fileID: 571823342} m_Father: {fileID: 228353702}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1879689923
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1879689918}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1df1fd6452d396e4699ee7d8406130a2, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MonoLimboStudio.LightFlicker
targetLight: {fileID: 1879689921}
baseIntensity: 0
flickerRange: 0.4
flickerSpeed: 0.6
glitchChance: 0.15
glitchMinDuration: 0.1
glitchMaxDuration: 0.2
--- !u!1001 &1884628755 --- !u!1001 &1884628755
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -4201,6 +4096,153 @@ MeshFilter:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1918828520} m_GameObject: {fileID: 1918828520}
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
--- !u!1 &1952597876
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1952597877}
- component: {fileID: 1952597880}
- component: {fileID: 1952597879}
- component: {fileID: 1952597878}
m_Layer: 0
m_Name: Point Light (1)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1952597877
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1952597876}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 15.91, z: 9.53}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 228353702}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1952597878
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1952597876}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1df1fd6452d396e4699ee7d8406130a2, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::MonoLimboStudio.LightFlicker
targetLight: {fileID: 1952597880}
baseIntensity: 0
flickerRange: 0.2
flickerSpeed: 0.4
glitchChance: 0
glitchMinDuration: 0
glitchMaxDuration: 0
--- !u!114 &1952597879
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1952597876}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.UniversalAdditionalLightData
m_UsePipelineSettings: 1
m_AdditionalLightsShadowResolutionTier: 2
m_CustomShadowLayers: 0
m_LightCookieSize: {x: 1, y: 1}
m_LightCookieOffset: {x: 0, y: 0}
m_SoftShadowQuality: 0
m_RenderingLayersMask:
serializedVersion: 0
m_Bits: 1
m_ShadowRenderingLayersMask:
serializedVersion: 0
m_Bits: 1
m_Version: 4
m_LightLayerMask: 1
m_ShadowLayerMask: 1
m_RenderingLayers: 1
m_ShadowRenderingLayers: 1
--- !u!108 &1952597880
Light:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1952597876}
m_Enabled: 1
serializedVersion: 12
m_Type: 2
m_Color: {r: 0.972549, g: 0.17432763, b: 0, a: 1}
m_Intensity: 200
m_Range: 32.184563
m_SpotAngle: 30
m_InnerSpotAngle: 21.80208
m_CookieSize2D: {x: 0.5, y: 0.5}
m_Shadows:
m_Type: 0
m_Resolution: -1
m_CustomResolution: -1
m_Strength: 1
m_Bias: 0.05
m_NormalBias: 0.4
m_NearPlane: 0.2
m_CullingMatrixOverride:
e00: 1
e01: 0
e02: 0
e03: 0
e10: 0
e11: 1
e12: 0
e13: 0
e20: 0
e21: 0
e22: 1
e23: 0
e30: 0
e31: 0
e32: 0
e33: 1
m_UseCullingMatrixOverride: 0
m_Cookie: {fileID: 0}
m_DrawHalo: 0
m_Flare: {fileID: 0}
m_RenderMode: 0
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_RenderingLayerMask: 1
m_Lightmapping: 4
m_LightShadowCasterMode: 0
m_AreaSize: {x: 1, y: 1}
m_BounceIntensity: 1
m_ColorTemperature: 6570
m_UseColorTemperature: 0
m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0}
m_UseBoundingSphereOverride: 0
m_UseViewFrustumForShadowCasterCull: 1
m_ForceVisible: 0
m_ShadowRadius: 0
m_ShadowAngle: 0
m_LightUnit: 1
m_LuxAtDistance: 1
m_EnableSpotReflector: 1
--- !u!1001 &1976921335 --- !u!1001 &1976921335
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
+223 -49
View File
@@ -1654,6 +1654,18 @@ MonoBehaviour:
m_StringArgument: m_StringArgument:
m_BoolArgument: 1 m_BoolArgument: 1
m_CallState: 2 m_CallState: 2
- m_Target: {fileID: 625490235}
m_TargetAssemblyTypeName: Unheimlich.World.CameraSystem.LostFootageRig, Assembly-CSharp
m_MethodName: Enable
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 1
m_CallState: 2
_onTriggerDelayed: _onTriggerDelayed:
m_PersistentCalls: m_PersistentCalls:
m_Calls: [] m_Calls: []
@@ -4874,6 +4886,17 @@ Light:
m_LightUnit: 1 m_LightUnit: 1
m_LuxAtDistance: 1 m_LuxAtDistance: 1
m_EnableSpotReflector: 1 m_EnableSpotReflector: 1
--- !u!114 &625490235 stripped
MonoBehaviour:
m_CorrespondingSourceObject: {fileID: 1476756471834662335, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
m_PrefabInstance: {fileID: 1549040694}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 320cde26f18d40b40a31c85e85ee4e59, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Unheimlich.World.CameraSystem.LostFootageRig
--- !u!4 &638798851 stripped --- !u!4 &638798851 stripped
Transform: Transform:
m_CorrespondingSourceObject: {fileID: -1693702828174715032, guid: 026d90e6b31bf0f47b6072ba92aef39a, type: 3} m_CorrespondingSourceObject: {fileID: -1693702828174715032, guid: 026d90e6b31bf0f47b6072ba92aef39a, type: 3}
@@ -8202,10 +8225,12 @@ GameObject:
- component: {fileID: 938880779} - component: {fileID: 938880779}
- component: {fileID: 938880778} - component: {fileID: 938880778}
- component: {fileID: 938880777} - component: {fileID: 938880777}
- component: {fileID: 938880775} - component: {fileID: 938880781}
- component: {fileID: 938880776} - component: {fileID: 938880776}
- component: {fileID: 938880775}
- component: {fileID: 938880780}
m_Layer: 0 m_Layer: 0
m_Name: DialogueOne m_Name: DialogueA
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
@@ -8293,7 +8318,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1023fdbb836c50f48bd4b52575ed3689, type: 3} m_Script: {fileID: 11500000, guid: 1023fdbb836c50f48bd4b52575ed3689, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: OctoCore.Runtime::OctoCore.Localization.OctoLocalizedText m_EditorClassIdentifier: OctoCore.Runtime::OctoCore.Localization.OctoLocalizedText
data: {fileID: 0} data: {fileID: 11400000, guid: 973e511f44be1e7419527fbc54fa0bf1, type: 2}
text: {fileID: 0} text: {fileID: 0}
textMeshPro: {fileID: 0} textMeshPro: {fileID: 0}
textMeshProUGUI: {fileID: 938880778} textMeshProUGUI: {fileID: 938880778}
@@ -8342,7 +8367,7 @@ MonoBehaviour:
m_OnCullStateChanged: m_OnCullStateChanged:
m_PersistentCalls: m_PersistentCalls:
m_Calls: [] m_Calls: []
m_text: 'Ou suis je ? ' m_text: Where am I ?
m_isRightToLeft: 0 m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 9861d68f4cda1504f8e39cc1464e8bec, type: 2} m_fontAsset: {fileID: 11400000, guid: 9861d68f4cda1504f8e39cc1464e8bec, type: 2}
m_sharedMaterial: {fileID: -7153799593197912463, guid: 9861d68f4cda1504f8e39cc1464e8bec, type: 2} m_sharedMaterial: {fileID: -7153799593197912463, guid: 9861d68f4cda1504f8e39cc1464e8bec, type: 2}
@@ -8422,6 +8447,58 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 938880773} m_GameObject: {fileID: 938880773}
m_CullTransparentMesh: 1 m_CullTransparentMesh: 1
--- !u!114 &938880780
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 938880773}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5170627695bd877419928fa9ca37865d, type: 3}
m_Name:
m_EditorClassIdentifier: OctoCore.Runtime::OctoCore.Components.OctoWorldEvent
_trigger: 3
_action: 0
_condition: 0
_tags: []
_targets: []
_tolerance: 0.5
_duration: 1
_execution: 1
_delay: 3
_onTrigger:
m_PersistentCalls:
m_Calls: []
_onTriggerDelayed:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 681190132}
m_TargetAssemblyTypeName: Unheimlich.Features.Hallucination.HallucinationFlash,
Assembly-CSharp
m_MethodName: Play
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!114 &938880781
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 938880773}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a2fcf97d75546f147adf431e737bce52, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Unheimlich.Features.Dialogue.LocalizedSubtitle
--- !u!1 &939771951 --- !u!1 &939771951
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -10769,6 +10846,18 @@ MonoBehaviour:
m_StringArgument: m_StringArgument:
m_BoolArgument: 0 m_BoolArgument: 0
m_CallState: 2 m_CallState: 2
- m_Target: {fileID: 625490235}
m_TargetAssemblyTypeName: Unheimlich.World.CameraSystem.LostFootageRig, Assembly-CSharp
m_MethodName: Disable
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
_onTriggerDelayed: _onTriggerDelayed:
m_PersistentCalls: m_PersistentCalls:
m_Calls: [] m_Calls: []
@@ -10809,7 +10898,7 @@ GameObject:
- component: {fileID: 1161394551} - component: {fileID: 1161394551}
- component: {fileID: 1161394545} - component: {fileID: 1161394545}
m_Layer: 0 m_Layer: 0
m_Name: DialogueThree m_Name: DialogueC
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
@@ -12093,10 +12182,11 @@ GameObject:
- component: {fileID: 1221498299} - component: {fileID: 1221498299}
- component: {fileID: 1221498298} - component: {fileID: 1221498298}
- component: {fileID: 1221498297} - component: {fileID: 1221498297}
- component: {fileID: 1221498295} - component: {fileID: 1221498300}
- component: {fileID: 1221498296} - component: {fileID: 1221498296}
- component: {fileID: 1221498295}
m_Layer: 0 m_Layer: 0
m_Name: DialogueThree m_Name: DialogueC
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
@@ -12148,7 +12238,7 @@ MonoBehaviour:
_onTriggerDelayed: _onTriggerDelayed:
m_PersistentCalls: m_PersistentCalls:
m_Calls: m_Calls:
- m_Target: {fileID: 6305877997866428113} - m_Target: {fileID: 477153748}
m_TargetAssemblyTypeName: Unheimlich.Features.Hallucination.HallucinationFlash, m_TargetAssemblyTypeName: Unheimlich.Features.Hallucination.HallucinationFlash,
Assembly-CSharp Assembly-CSharp
m_MethodName: Play m_MethodName: Play
@@ -12173,7 +12263,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1023fdbb836c50f48bd4b52575ed3689, type: 3} m_Script: {fileID: 11500000, guid: 1023fdbb836c50f48bd4b52575ed3689, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: OctoCore.Runtime::OctoCore.Localization.OctoLocalizedText m_EditorClassIdentifier: OctoCore.Runtime::OctoCore.Localization.OctoLocalizedText
data: {fileID: 0} data: {fileID: 11400000, guid: 1775f09327d76ab4eac9a8b4b75480ff, type: 2}
text: {fileID: 0} text: {fileID: 0}
textMeshPro: {fileID: 0} textMeshPro: {fileID: 0}
textMeshProUGUI: {fileID: 1221498298} textMeshProUGUI: {fileID: 1221498298}
@@ -12222,7 +12312,7 @@ MonoBehaviour:
m_OnCullStateChanged: m_OnCullStateChanged:
m_PersistentCalls: m_PersistentCalls:
m_Calls: [] m_Calls: []
m_text: 'Hein ? ' m_text: 'He ? '
m_isRightToLeft: 0 m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 9861d68f4cda1504f8e39cc1464e8bec, type: 2} m_fontAsset: {fileID: 11400000, guid: 9861d68f4cda1504f8e39cc1464e8bec, type: 2}
m_sharedMaterial: {fileID: -7153799593197912463, guid: 9861d68f4cda1504f8e39cc1464e8bec, type: 2} m_sharedMaterial: {fileID: -7153799593197912463, guid: 9861d68f4cda1504f8e39cc1464e8bec, type: 2}
@@ -12302,6 +12392,18 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1221498293} m_GameObject: {fileID: 1221498293}
m_CullTransparentMesh: 1 m_CullTransparentMesh: 1
--- !u!114 &1221498300
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1221498293}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a2fcf97d75546f147adf431e737bce52, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Unheimlich.Features.Dialogue.LocalizedSubtitle
--- !u!1 &1233009596 --- !u!1 &1233009596
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -12357,10 +12459,12 @@ GameObject:
- component: {fileID: 1270400839} - component: {fileID: 1270400839}
- component: {fileID: 1270400838} - component: {fileID: 1270400838}
- component: {fileID: 1270400837} - component: {fileID: 1270400837}
- component: {fileID: 1270400835} - component: {fileID: 1270400841}
- component: {fileID: 1270400836} - component: {fileID: 1270400836}
- component: {fileID: 1270400835}
- component: {fileID: 1270400840}
m_Layer: 0 m_Layer: 0
m_Name: DialogueTwo m_Name: DialogueB
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
@@ -12448,7 +12552,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 1023fdbb836c50f48bd4b52575ed3689, type: 3} m_Script: {fileID: 11500000, guid: 1023fdbb836c50f48bd4b52575ed3689, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: OctoCore.Runtime::OctoCore.Localization.OctoLocalizedText m_EditorClassIdentifier: OctoCore.Runtime::OctoCore.Localization.OctoLocalizedText
data: {fileID: 0} data: {fileID: 11400000, guid: 3c05ba91d318d524fbcf867fe886c553, type: 2}
text: {fileID: 0} text: {fileID: 0}
textMeshPro: {fileID: 0} textMeshPro: {fileID: 0}
textMeshProUGUI: {fileID: 1270400838} textMeshProUGUI: {fileID: 1270400838}
@@ -12497,7 +12601,7 @@ MonoBehaviour:
m_OnCullStateChanged: m_OnCullStateChanged:
m_PersistentCalls: m_PersistentCalls:
m_Calls: [] m_Calls: []
m_text: 'Je ne comprend pas ? ' m_text: I don't understand ?
m_isRightToLeft: 0 m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 9861d68f4cda1504f8e39cc1464e8bec, type: 2} m_fontAsset: {fileID: 11400000, guid: 9861d68f4cda1504f8e39cc1464e8bec, type: 2}
m_sharedMaterial: {fileID: -7153799593197912463, guid: 9861d68f4cda1504f8e39cc1464e8bec, type: 2} m_sharedMaterial: {fileID: -7153799593197912463, guid: 9861d68f4cda1504f8e39cc1464e8bec, type: 2}
@@ -12577,6 +12681,58 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1270400833} m_GameObject: {fileID: 1270400833}
m_CullTransparentMesh: 1 m_CullTransparentMesh: 1
--- !u!114 &1270400840
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1270400833}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 5170627695bd877419928fa9ca37865d, type: 3}
m_Name:
m_EditorClassIdentifier: OctoCore.Runtime::OctoCore.Components.OctoWorldEvent
_trigger: 3
_action: 0
_condition: 0
_tags: []
_targets: []
_tolerance: 0.5
_duration: 1
_execution: 1
_delay: 3
_onTrigger:
m_PersistentCalls:
m_Calls: []
_onTriggerDelayed:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1916608619}
m_TargetAssemblyTypeName: Unheimlich.Features.Hallucination.HallucinationFlash,
Assembly-CSharp
m_MethodName: Play
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!114 &1270400841
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1270400833}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a2fcf97d75546f147adf431e737bce52, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Unheimlich.Features.Dialogue.LocalizedSubtitle
--- !u!1 &1276767359 --- !u!1 &1276767359
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -13639,12 +13795,12 @@ GameObject:
- component: {fileID: 1385908343} - component: {fileID: 1385908343}
- component: {fileID: 1385908342} - component: {fileID: 1385908342}
- component: {fileID: 1385908341} - component: {fileID: 1385908341}
- component: {fileID: 1385908339}
- component: {fileID: 1385908345} - component: {fileID: 1385908345}
- component: {fileID: 1385908344} - component: {fileID: 1385908344}
- component: {fileID: 1385908339}
- component: {fileID: 1385908346} - component: {fileID: 1385908346}
m_Layer: 0 m_Layer: 0
m_Name: DialogueTwo m_Name: DialogueB
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
@@ -15223,8 +15379,44 @@ PrefabInstance:
propertyPath: m_Enabled propertyPath: m_Enabled
value: 1 value: 1
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1476756471834662335, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: _isActive
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1476756471834662335, guid: 6493d77978c5c1246a0410d1f9204524, type: 3} - target: {fileID: 1476756471834662335, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: m_Enabled propertyPath: m_Enabled
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1476756471834662335, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: _stressLevel
value: 0.3
objectReference: {fileID: 0}
- target: {fileID: 1476756471834662335, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: _idleAmplitude
value: 0.5
objectReference: {fileID: 0}
- target: {fileID: 1476756471834662335, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: _walkAmplitude
value: 0.7
objectReference: {fileID: 0}
- target: {fileID: 1476756471834662335, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: _idleNoiseSpeed
value: 1.6
objectReference: {fileID: 0}
- target: {fileID: 1476756471834662335, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: _walkNoiseSpeed
value: 2
objectReference: {fileID: 0}
- target: {fileID: 1476756471834662335, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: _masterIntensity
value: 1.5
objectReference: {fileID: 0}
- target: {fileID: 1476756471834662335, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: _debugStressValue
value: 0
objectReference: {fileID: 0}
- target: {fileID: 1476756471834662335, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
propertyPath: _debugSustainStress
value: 0 value: 0
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 5295567073180248356, guid: 6493d77978c5c1246a0410d1f9204524, type: 3} - target: {fileID: 5295567073180248356, guid: 6493d77978c5c1246a0410d1f9204524, type: 3}
@@ -16518,6 +16710,19 @@ MonoBehaviour:
m_StringArgument: m_StringArgument:
m_BoolArgument: 1 m_BoolArgument: 1
m_CallState: 2 m_CallState: 2
- m_Target: {fileID: 625490235}
m_TargetAssemblyTypeName: Unheimlich.World.CameraSystem.LostFootageRig,
Assembly-CSharp
m_MethodName: Enable
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 1
m_CallState: 2
Triggered: 0 Triggered: 0
- Progression: 0.5 - Progression: 0.5
OnReached: OnReached:
@@ -16629,37 +16834,6 @@ MonoBehaviour:
m_BoolArgument: 0 m_BoolArgument: 0
m_CallState: 2 m_CallState: 2
Triggered: 0 Triggered: 0
- Progression: 0.9
OnReached:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 2002434881}
m_TargetAssemblyTypeName: Unheimlich.Features.Hallucination.HallucinationPostProcess,
Assembly-CSharp
m_MethodName: AddSanityWrapper
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
- m_Target: {fileID: 3473725938941227729}
m_TargetAssemblyTypeName: Unheimlich.Features.Hallucination.HallucinationFlash,
Assembly-CSharp
m_MethodName: Play
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
Triggered: 0
--- !u!1 &1708782433 --- !u!1 &1708782433
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -22539,12 +22713,12 @@ GameObject:
- component: {fileID: 6820444050397160330} - component: {fileID: 6820444050397160330}
- component: {fileID: 160056245658704172} - component: {fileID: 160056245658704172}
- component: {fileID: 6984622148685993083} - component: {fileID: 6984622148685993083}
- component: {fileID: 6984622148685993084}
- component: {fileID: 6984622148685993087} - component: {fileID: 6984622148685993087}
- component: {fileID: 6984622148685993085} - component: {fileID: 6984622148685993085}
- component: {fileID: 6984622148685993084}
- component: {fileID: 6984622148685993088} - component: {fileID: 6984622148685993088}
m_Layer: 0 m_Layer: 0
m_Name: DialogueOne m_Name: DialogueA
m_TagString: Untagged m_TagString: Untagged
m_Icon: {fileID: 0} m_Icon: {fileID: 0}
m_NavMeshLayer: 0 m_NavMeshLayer: 0
@@ -1,4 +1,6 @@
using System.Collections; using System.Collections;
using System.Collections.Generic;
using Unheimlich.VFX;
using UnityEngine; using UnityEngine;
using UnityEngine.Rendering; using UnityEngine.Rendering;
@@ -8,7 +10,6 @@ public class ScarecrowFire : MonoBehaviour
public class FireElement public class FireElement
{ {
public GameObject VFX; public GameObject VFX;
/// <summary>Original scale captured at initialization, used as lerp target.</summary>
[HideInInspector] public Vector3 OriginalScale; [HideInInspector] public Vector3 OriginalScale;
} }
@@ -23,14 +24,9 @@ public class ScarecrowFire : MonoBehaviour
[SerializeField] private FireElement _fireBig; [SerializeField] private FireElement _fireBig;
[Header("Propagation Timings")] [Header("Propagation Timings")]
[Tooltip("Duration of the scale lerp for each fire element (seconds).")]
[SerializeField] private float _growDuration = 3f; [SerializeField] private float _growDuration = 3f;
[Tooltip("How early the next stage starts before the current one finishes (0 = no overlap, 1 = instant).")]
[Range(0f, 1f)] [Range(0f, 1f)]
[SerializeField] private float _overlapFactor = 0.4f; [SerializeField] private float _overlapFactor = 0.4f;
[Tooltip("Curve driving the scale growth — tweak directly in the Inspector.")]
[SerializeField] private AnimationCurve _growCurve = new AnimationCurve( [SerializeField] private AnimationCurve _growCurve = new AnimationCurve(
new Keyframe(0f, 0f, 0f, 0f), new Keyframe(0f, 0f, 0f, 0f),
new Keyframe(0.3f, 0.1f, 0f, 2f), new Keyframe(0.3f, 0.1f, 0f, 2f),
@@ -39,10 +35,7 @@ public class ScarecrowFire : MonoBehaviour
); );
[Header("Post Process")] [Header("Post Process")]
[Tooltip("Volume driving the heat haze effect — weight is driven up as fire spreads.")]
[SerializeField] private Volume _heatVolume; [SerializeField] private Volume _heatVolume;
[Tooltip("Curve driving all heat effects over the full sequence duration.")]
[SerializeField] private AnimationCurve _heatCurve = new AnimationCurve( [SerializeField] private AnimationCurve _heatCurve = new AnimationCurve(
new Keyframe(0f, 0f, 0f, 0.5f), new Keyframe(0f, 0f, 0f, 0.5f),
new Keyframe(0.5f, 0.4f, 1f, 1f), new Keyframe(0.5f, 0.4f, 1f, 1f),
@@ -50,17 +43,18 @@ public class ScarecrowFire : MonoBehaviour
); );
[Header("Heat Shader")] [Header("Heat Shader")]
[Tooltip("Material using the HeatHaze shader — _Weight property is driven from 0 to 1.")]
[SerializeField] private Material _heatMaterial; [SerializeField] private Material _heatMaterial;
[Header("Light")] [Header("Lights")]
[Tooltip("LightFlicker component to drive — baseIntensity is ramped up with the fire.")] [SerializeField] private List<LightEntry> _lights = new List<LightEntry>();
[SerializeField] private MonoLimboStudio.LightFlicker _lightFlicker;
[Tooltip("Final light intensity reached when the fire is fully ablaze.")] [System.Serializable]
[SerializeField] private float _targetLightIntensity = 3f; public class LightEntry
{
public LightFlicker Flicker;
public float TargetIntensity = 3f;
}
// Flag set when the last GrowFire completes — DriveHeatEffects waits on this
private bool _fireSequenceComplete = false; private bool _fireSequenceComplete = false;
private float _totalSequenceDuration = 0f; private float _totalSequenceDuration = 0f;
@@ -77,16 +71,13 @@ public class ScarecrowFire : MonoBehaviour
InitElement(_fireHead); InitElement(_fireHead);
InitElement(_fireBig); InitElement(_fireBig);
// Used as a time reference for _heatCurve mapping — doesn't need to be exact
// since DriveHeatEffects now syncs to _fireSequenceComplete rather than this value
float overlapDelay = _growDuration * (1f - _overlapFactor); float overlapDelay = _growDuration * (1f - _overlapFactor);
_totalSequenceDuration = _growDuration + (7f * overlapDelay); _totalSequenceDuration = _growDuration + (7f * overlapDelay);
// Ensure everything starts at zero
SetHeatShaderWeight(0f); SetHeatShaderWeight(0f);
if (_lightFlicker) foreach (var entry in _lights)
_lightFlicker.SetBaseIntensity(0f); if (entry.Flicker) entry.Flicker.SetBaseIntensity(0f);
} }
void Start() void Start()
@@ -94,10 +85,6 @@ public class ScarecrowFire : MonoBehaviour
TriggerFire(); TriggerFire();
} }
/// <summary>
/// Captures the original Inspector scale, then sets the starting scale to
/// (x * 0.2, y * 0.1, z * 0.2) so each element grows from near-nothing.
/// </summary>
private void InitElement(FireElement el) private void InitElement(FireElement el)
{ {
if (!el.VFX) return; if (!el.VFX) return;
@@ -113,51 +100,36 @@ public class ScarecrowFire : MonoBehaviour
// ───────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────
/// <summary>Starts the full fire propagation sequence.</summary>
public void TriggerFire() public void TriggerFire()
{ {
_fireSequenceComplete = false; _fireSequenceComplete = false;
StartCoroutine(FireSequence()); StartCoroutine(FireSequence());
} }
/// <summary>
/// Propagates fire bottom-up with overlapping stages for an organic feel.
/// Sets _fireSequenceComplete when the last element finishes growing.
/// </summary>
private IEnumerator FireSequence() private IEnumerator FireSequence()
{ {
float overlapDelay = _growDuration * (1f - _overlapFactor); float overlapDelay = _growDuration * (1f - _overlapFactor);
// Drive all heat effects independently — syncs via _fireSequenceComplete
StartCoroutine(DriveHeatEffects()); StartCoroutine(DriveHeatEffects());
// Feet
StartCoroutine(GrowFire(_fireBase)); StartCoroutine(GrowFire(_fireBase));
yield return new WaitForSeconds(overlapDelay); yield return new WaitForSeconds(overlapDelay);
// Torso overlaps with feet still growing
StartCoroutine(GrowFire(_fireTorso)); StartCoroutine(GrowFire(_fireTorso));
yield return new WaitForSeconds(overlapDelay); yield return new WaitForSeconds(overlapDelay);
// Both arms ignite simultaneously, each propagating from shoulder to tip
StartCoroutine(PropagateArm(_fireArmLeft, _fireArmLeftEnd, overlapDelay)); StartCoroutine(PropagateArm(_fireArmLeft, _fireArmLeftEnd, overlapDelay));
StartCoroutine(PropagateArm(_fireArmRight, _fireArmRightEnd, overlapDelay)); StartCoroutine(PropagateArm(_fireArmRight, _fireArmRightEnd, overlapDelay));
yield return new WaitForSeconds(overlapDelay * 2f); yield return new WaitForSeconds(overlapDelay * 2f);
// Head
StartCoroutine(GrowFire(_fireHead)); StartCoroutine(GrowFire(_fireHead));
yield return new WaitForSeconds(overlapDelay); yield return new WaitForSeconds(overlapDelay);
// Full blaze — wait for it to fully complete before flagging done
yield return StartCoroutine(GrowFire(_fireBig)); yield return StartCoroutine(GrowFire(_fireBig));
_fireSequenceComplete = true; _fireSequenceComplete = true;
} }
/// <summary>
/// Propagates fire along one arm: shoulder ignites first,
/// then tip starts after overlapDelay rather than waiting for shoulder to finish.
/// </summary>
private IEnumerator PropagateArm(FireElement shoulder, FireElement tip, float overlapDelay) private IEnumerator PropagateArm(FireElement shoulder, FireElement tip, float overlapDelay)
{ {
StartCoroutine(GrowFire(shoulder)); StartCoroutine(GrowFire(shoulder));
@@ -165,10 +137,6 @@ public class ScarecrowFire : MonoBehaviour
yield return StartCoroutine(GrowFire(tip)); yield return StartCoroutine(GrowFire(tip));
} }
/// <summary>
/// Activates a fire element and lerps its scale from near-zero to its original
/// Inspector scale, driven by _growCurve for an organic progression.
/// </summary>
private IEnumerator GrowFire(FireElement el) private IEnumerator GrowFire(FireElement el)
{ {
if (!el.VFX) yield break; if (!el.VFX) yield break;
@@ -195,57 +163,54 @@ public class ScarecrowFire : MonoBehaviour
// ───────────────────────────────────────────────────────────────────────── // ─────────────────────────────────────────────────────────────────────────
/// <summary>
/// Drives all heat effects (post-process volume, heat shader, light intensity)
/// using _heatCurve until _fireSequenceComplete is set, then snaps cleanly to 1.
/// Decoupled from individual fire element timing for smoother blending.
/// </summary>
private IEnumerator DriveHeatEffects() private IEnumerator DriveHeatEffects()
{ {
float elapsed = 0f; float elapsed = 0f;
float lastWeight = 0f;
// Phase 1 : monte avec la heatCurve jusqu'à ce que la séquence feu soit finie.
// On snapshote lastWeight à chaque frame pour partir de la vraie valeur courante
// en phase 2, évitant tout creux si la courbe redescend après t=1.
while (!_fireSequenceComplete) while (!_fireSequenceComplete)
{ {
elapsed += Time.deltaTime; elapsed += Time.deltaTime;
float t = elapsed / _totalSequenceDuration; float t = elapsed / _totalSequenceDuration;
float weight = _heatCurve.Evaluate(Mathf.Min(t, 0.99f)); lastWeight = _heatCurve.Evaluate(Mathf.Clamp01(t));
if (_heatVolume)
_heatVolume.weight = weight;
SetHeatShaderWeight(weight);
if (_lightFlicker)
_lightFlicker.SetBaseIntensity(_targetLightIntensity * weight);
ApplyHeatWeight(lastWeight);
yield return null; yield return null;
} }
// Phase 2 : lerp propre de la valeur courante vers 1, sans jamais redescendre.
float lerpElapsed = 0f; float lerpElapsed = 0f;
float lerpDuration = 8f; float lerpDuration = 8f;
float startWeight = _heatCurve.Evaluate(0.99f); float startWeight = lastWeight; // ← valeur réelle au moment du flag, pas heatCurve(0.99)
while (lerpElapsed < lerpDuration) while (lerpElapsed < lerpDuration)
{ {
lerpElapsed += Time.deltaTime; lerpElapsed += Time.deltaTime;
float weight = Mathf.Lerp(startWeight, 1f, lerpElapsed / lerpDuration); float weight = Mathf.Lerp(startWeight, 1f, lerpElapsed / lerpDuration);
if (_heatVolume) _heatVolume.weight = weight; ApplyHeatWeight(weight);
SetHeatShaderWeight(weight);
if (_lightFlicker) _lightFlicker.SetBaseIntensity(_targetLightIntensity * weight);
yield return null; yield return null;
} }
if (_heatVolume) _heatVolume.weight = 1f; // Phase 3 : maintien à 1 à l'infini.
SetHeatShaderWeight(1f); ApplyHeatWeight(1f);
if (_lightFlicker) _lightFlicker.SetBaseIntensity(_targetLightIntensity); }
/// <summary>Applique un weight normalisé à tous les effets de chaleur + lumière.</summary>
private void ApplyHeatWeight(float weight)
{
if (_heatVolume) _heatVolume.weight = weight;
SetHeatShaderWeight(weight);
// ScarecrowFire pilote la base — LightFlicker applique le flicker par-dessus
// sans écrire directement sur targetLight.intensity.
foreach (var entry in _lights)
if (entry.Flicker) entry.Flicker.SetBaseIntensity(entry.TargetIntensity * weight);
} }
/// <summary>
/// Drives the heat shader via a single normalized weight (0-1).
/// All visual parameters are tweaked directly on the material in the Inspector.
/// </summary>
private void SetHeatShaderWeight(float weight) private void SetHeatShaderWeight(float weight)
{ {
if (!_heatMaterial) return; if (!_heatMaterial) return;
@@ -7,12 +7,15 @@ namespace Unheimlich.World.CameraSystem
/// Overlays a "lost footage / handheld camcorder" shake on a dedicated pivot /// Overlays a "lost footage / handheld camcorder" shake on a dedicated pivot
/// sitting between CameraPivot and Camera Player. /// sitting between CameraPivot and Camera Player.
/// ///
/// Layered in three passes: /// Layered in four passes:
/// 1. Continuous Perlin drift — organic idle tremor, scales with movement and stress. /// 1. Continuous Perlin drift — organic idle tremor, scales with movement and stress.
/// 2. Micro-jolts — randomised snap/recoil spikes, only fire when the camera /// 2. Micro-jolts — randomised snap/recoil spikes, only fire when the
/// is steady (attenuated during active mouse look). /// camera is steady (attenuated during active mouse look).
/// 3. Inertia swinging — the camera "lags" behind head rotation on all axes, /// 3. Inertia swinging — the camera "lags" behind head rotation on all axes,
/// simulating the physical weight of a handheld camcorder. /// simulating the physical weight of a handheld camcorder.
/// 4. Spinning/dizzy drift — a slow, persistent rotational pull on Y (and a subtle
/// rolling tilt on Z) that builds with stress, simulating
/// a confused/disoriented head.
/// ///
/// Hierarchy expected: /// Hierarchy expected:
/// OctoPlayerFP (mouse-look root) /// OctoPlayerFP (mouse-look root)
@@ -20,13 +23,32 @@ namespace Unheimlich.World.CameraSystem
/// └── LostFootagePivot ← this component /// └── LostFootagePivot ← this component
/// └── Camera Player /// └── Camera Player
/// ///
/// Mouse-look speed is sampled on OctoPlayerFP (grandparent) to avoid being /// Quick setup:
/// polluted by the continuous rotations CameraHeadBob writes on CameraPivot. /// • Toggle "Is Active" in the inspector (or call SetActive()) to enable/disable with fade.
/// Movement blend (moveT) is smoothed to avoid noise amplitude spikes on /// • "Master Intensity" scales everything: noise, jolts, inertia and spin.
/// direction changes. /// • "Stress Level" can be driven externally (e.g. by a StressController) or left at 0.
/// </summary> /// </summary>
public class LostFootageRig : MonoBehaviour public class LostFootageRig : MonoBehaviour
{ {
// ── Inspector — Global ────────────────────────────────────────────────────
[Header("Global")]
[Tooltip("Enable or disable the whole rig (with fade). Can also be toggled at runtime via SetActive().")]
[SerializeField] private bool _isActive = true;
[Tooltip("Master scale applied to ALL effects (noise amplitude, jolt amplitude, inertia strength, spin strength). 0 = off, 1 = nominal.")]
[SerializeField] [Range(0f, 3f)] private float _masterIntensity = 1f;
// ── Inspector — Stress ────────────────────────────────────────────────────
[Header("Stress")]
[Tooltip("Stress level in [0, 1]. Can be driven externally (StressController.Instance → rig.StressLevel = ...) or set manually here for testing.")]
[SerializeField] [Range(0f, 1f)] private float _stressLevel = 0f;
[Header("Stress — noise scale")]
[SerializeField] private float _stressAmplitudeMul = 2.5f;
[SerializeField] private float _stressSpeedMul = 1f;
// ── Inspector — Noise ───────────────────────────────────────────────────── // ── Inspector — Noise ─────────────────────────────────────────────────────
[Header("Noise — idle")] [Header("Noise — idle")]
@@ -41,12 +63,8 @@ namespace Unheimlich.World.CameraSystem
[SerializeField] private float _runAmplitude = 5f; [SerializeField] private float _runAmplitude = 5f;
[SerializeField] private float _runNoiseSpeed = 0.6f; [SerializeField] private float _runNoiseSpeed = 0.6f;
[Header("Noise — stress scale")]
[SerializeField] private float _stressAmplitudeMul = 2.5f;
[SerializeField] private float _stressSpeedMul = 1f;
[Header("Noise — smoothing")] [Header("Noise — smoothing")]
[Tooltip("How fast the noise amplitude blends between idle/walk/run. Lower = smoother transitions.")] [Tooltip("How fast the noise amplitude blends between idle/walk/run.")]
[SerializeField] private float _moveTSmoothSpeed = 4f; [SerializeField] private float _moveTSmoothSpeed = 4f;
// ── Inspector — Micro-jolts ─────────────────────────────────────────────── // ── Inspector — Micro-jolts ───────────────────────────────────────────────
@@ -64,56 +82,73 @@ namespace Unheimlich.World.CameraSystem
[SerializeField] private Vector2 _runJoltIntervalRange = new Vector2(1f, 2f); [SerializeField] private Vector2 _runJoltIntervalRange = new Vector2(1f, 2f);
[Header("Micro-jolts — shared")] [Header("Micro-jolts — shared")]
[Tooltip("How fast the jolt snaps to its target (fraction of interval).")]
[SerializeField] private float _joltSnapFraction = 0.1f; [SerializeField] private float _joltSnapFraction = 0.1f;
[Tooltip("Jolt interval is divided by this value when stress = 1.")]
[SerializeField] private float _stressJoltFreqMul = 2f; [SerializeField] private float _stressJoltFreqMul = 2f;
[Tooltip("Jolt amplitude is multiplied by this value when stress = 1.")]
[SerializeField] private float _stressJoltAmpMul = 1.4f; [SerializeField] private float _stressJoltAmpMul = 1.4f;
[Tooltip("Look speed (deg/s) above which jolts are fully suppressed. Sampled on OctoPlayerFP to bypass CameraHeadBob noise.")] [Tooltip("Look speed (deg/s) above which jolts are fully suppressed.")]
[SerializeField] private float _joltLookSuppressSpeed = 5f; [SerializeField] private float _joltLookSuppressSpeed = 5f;
// ── Inspector — Inertia swing ───────────────────────────────────────────── // ── Inspector — Inertia swing ─────────────────────────────────────────────
[Header("Inertia swing")] [Header("Inertia swing")]
[Tooltip("How strongly the camera lags behind movement. Higher = more swing.")]
[SerializeField] private float _inertiaStrength = 4f; [SerializeField] private float _inertiaStrength = 4f;
[Tooltip("How fast the inertia offset returns to zero. Lower = longer swing tail.")]
[SerializeField] private float _inertiaDamping = 6f; [SerializeField] private float _inertiaDamping = 6f;
[Tooltip("Maximum swing angle (degrees) on each axis to avoid excessive drift.")]
[SerializeField] private float _inertiaMaxAngle = 8f; [SerializeField] private float _inertiaMaxAngle = 8f;
// ── Inspector — Spinning / dizzy head ─────────────────────────────────────
[Header("Spinning / dizzy head")]
[Tooltip("Maximum Y-axis spin angle (degrees) at stress = 1 and masterIntensity = 1.")]
[SerializeField] private float _spinMaxYAngle = 6f;
[Tooltip("Maximum Z-axis roll angle (degrees) at stress = 1 — the subtle listing tilt.")]
[SerializeField] private float _spinMaxZAngle = 2.5f;
[Tooltip("Speed of the Perlin noise driving the spin drift. Lower = slower, more nauseating.")]
[SerializeField] private float _spinNoiseSpeed = 0.08f;
[Tooltip("How fast the spin offset interpolates toward its target. Lower = more sluggish/drunk.")]
[SerializeField] private float _spinDamping = 2f;
// ── Inspector — Fade ────────────────────────────────────────────────────── // ── Inspector — Fade ──────────────────────────────────────────────────────
[Header("Fade")] [Header("Fade")]
[Tooltip("Duration (seconds) of the fade-in / fade-out when toggling the rig.")]
[SerializeField] private float _fadeDuration = 0.6f; [SerializeField] private float _fadeDuration = 0.6f;
// ── Inspector — Debug ───────────────────────────────────────────────────── // ── Inspector — Debug ─────────────────────────────────────────────────────
[Header("Debug")] [Header("Debug")]
[SerializeField] private bool _debugSustainStress; [SerializeField] private bool _debugOverrideStress;
[SerializeField] [Range(0f, 1f)] private float _debugStressValue; [SerializeField] [Range(0f, 1f)] private float _debugStressOverride;
// ── Runtime state ───────────────────────────────────────────────────────── // ── Public API ────────────────────────────────────────────────────────────
/// <summary>Current stress level in [0, 1]. Driven by <see cref="StressController"/>.</summary> /// <summary>
public float StressLevel { get; set; } /// Current stress level in [0, 1].
/// Set this from an external controller (e.g. StressController) each frame,
/// or leave it at the inspector default.
/// </summary>
public float StressLevel
{
get => _stressLevel;
set => _stressLevel = Mathf.Clamp01(value);
}
/// <summary>Whether the rig is currently active (or fading in/out).</summary> /// <summary>Whether the rig is currently active (or fading in/out).</summary>
public bool IsActive { get; private set; } public bool IsActive { get; private set; }
// ── Runtime state ─────────────────────────────────────────────────────────
private float _weight; private float _weight;
private float _initialMasterIntensity; // value set in inspector, restored on Enable()
private float _noiseTimer; private float _noiseTimer;
private float _spinTimer;
private Vector3 _noiseOffset; private Vector3 _noiseOffset;
private Vector3 _joltRotation; private Vector3 _joltRotation;
private Vector3 _inertiaOffset; private Vector3 _inertiaOffset;
private Vector3 _spinOffset; // current smoothed spin (Y, Z) rotation
// Smoothed movement blend — avoids amplitude spikes on direction changes.
private float _smoothMoveT; private float _smoothMoveT;
// Mouse-look speed sampled on OctoPlayerFP (grandparent) — used to gate
// micro-jolts so they only fire when the player is not actively looking around.
private Quaternion _lastLookRootRotation; private Quaternion _lastLookRootRotation;
private float _lookSpeed; private float _lookSpeed;
@@ -129,65 +164,87 @@ namespace Unheimlich.World.CameraSystem
Random.Range(0f, 100f), Random.Range(0f, 100f),
Random.Range(0f, 100f) Random.Range(0f, 100f)
); );
// Spin uses its own offset to decouple from the main noise.
_spinTimer = Random.Range(0f, 100f);
} }
private void Start() private void Start()
{ {
// Store the inspector value so Enable() can restore it even if the rig
// started disabled (and _masterIntensity was faded to 0).
_initialMasterIntensity = _masterIntensity;
// Sync inspector toggle on first frame.
IsActive = _isActive;
_weight = _isActive ? 1f : 0f;
Transform lookRoot = transform.parent?.parent; Transform lookRoot = transform.parent?.parent;
_lastLookRootRotation = lookRoot != null _lastLookRootRotation = lookRoot != null
? lookRoot.localRotation ? lookRoot.localRotation
: Quaternion.identity; : Quaternion.identity;
if (_isActive)
_joltCoroutine = StartCoroutine(JoltCoroutine());
}
private void OnValidate()
{
// Allow toggling _isActive from the inspector during Play mode.
if (!Application.isPlaying) return;
SetActive(_isActive);
} }
private void Update() private void Update()
{ {
if (_debugSustainStress) if (_debugOverrideStress)
StressLevel = _debugStressValue; _stressLevel = _debugStressOverride;
float stress = Mathf.Clamp01(_stressLevel);
float intensity = _masterIntensity;
UpdateInertia();
if (_weight <= 0f) if (_weight <= 0f)
{ {
UpdateInertia(); transform.localRotation = Quaternion.identity;
return; return;
} }
float stress = Mathf.Clamp01(StressLevel); // ── 1. Movement state ─────────────────────────────────────────────────
// ── 1. Resolve movement state ─────────────────────────────────────────
float horizontalSpeed = 0f; float horizontalSpeed = 0f;
bool isRunning = false; bool running = IsRunning();
if (Unheimlich.Features.Player.PlayerController.Instance?.CharController != null) if (Unheimlich.Features.Player.PlayerController.Instance?.CharController != null)
{ {
var vel = Unheimlich.Features.Player.PlayerController.Instance.CharController.velocity; var vel = Unheimlich.Features.Player.PlayerController.Instance.CharController.velocity;
horizontalSpeed = new Vector3(vel.x, 0f, vel.z).magnitude; horizontalSpeed = new Vector3(vel.x, 0f, vel.z).magnitude;
isRunning = OctoCore.Components.OctoPlayer.Instance != null
&& OctoCore.Components.OctoPlayer.Instance.State.IsRunning;
} }
const float WalkSpeedMs = 10f / 3.6f; const float WalkSpeedMs = 10f / 3.6f;
const float RunSpeedMs = 20f / 3.6f; const float RunSpeedMs = 20f / 3.6f;
float maxSpeed = isRunning ? RunSpeedMs : WalkSpeedMs; float maxSpeed = running ? RunSpeedMs : WalkSpeedMs;
float rawMoveT = Mathf.Clamp01(horizontalSpeed / maxSpeed); float rawMoveT = Mathf.Clamp01(horizontalSpeed / maxSpeed);
// Smooth moveT to avoid abrupt amplitude jumps on direction changes.
_smoothMoveT = Mathf.Lerp(_smoothMoveT, rawMoveT, Time.deltaTime * _moveTSmoothSpeed); _smoothMoveT = Mathf.Lerp(_smoothMoveT, rawMoveT, Time.deltaTime * _moveTSmoothSpeed);
// ── 2. Interpolate noise parameters from movement state ─────────────── // ── 2. Noise parameters ───────────────────────────────────────────────
float targetAmp = isRunning float targetAmp = running
? Mathf.Lerp(_walkAmplitude, _runAmplitude, _smoothMoveT) ? Mathf.Lerp(_walkAmplitude, _runAmplitude, _smoothMoveT)
: Mathf.Lerp(_idleAmplitude, _walkAmplitude, _smoothMoveT); : Mathf.Lerp(_idleAmplitude, _walkAmplitude, _smoothMoveT);
float targetSpeed = isRunning float targetSpeed = running
? Mathf.Lerp(_walkNoiseSpeed, _runNoiseSpeed, _smoothMoveT) ? Mathf.Lerp(_walkNoiseSpeed, _runNoiseSpeed, _smoothMoveT)
: Mathf.Lerp(_idleNoiseSpeed, _walkNoiseSpeed, _smoothMoveT); : Mathf.Lerp(_idleNoiseSpeed, _walkNoiseSpeed, _smoothMoveT);
float amp = (targetAmp + stress * _stressAmplitudeMul) * _weight; float amp = (targetAmp + stress * _stressAmplitudeMul) * _weight * intensity;
float spd = (targetSpeed + stress * _stressSpeedMul); float spd = targetSpeed + stress * _stressSpeedMul;
_noiseTimer += Time.deltaTime * spd; _noiseTimer += Time.deltaTime * spd;
if (_noiseTimer > 1000f) _noiseTimer -= 1000f; // wrap to avoid float precision loss if (_noiseTimer > 1000f) _noiseTimer -= 1000f;
float t = _noiseTimer; float t = _noiseTimer;
// ── 3. Perlin drift ─────────────────────────────────────────────────── // ── 3. Perlin drift ───────────────────────────────────────────────────
@@ -198,74 +255,101 @@ namespace Unheimlich.World.CameraSystem
// ── 4. Inertia swing ────────────────────────────────────────────────── // ── 4. Inertia swing ──────────────────────────────────────────────────
UpdateInertia(); Vector3 swing = _inertiaOffset * _weight * intensity;
Vector3 swing = _inertiaOffset * _weight;
// ── 5. Compose and apply ────────────────────────────────────────────── // ── 5. Spinning / dizzy drift ─────────────────────────────────────────
//
// Two independent Perlin channels drive a slow yaw drift (Y) and a
// listing roll (Z). Both scale with stress and masterIntensity.
// The offset is smoothed via _spinDamping so it feels heavy and sluggish
// rather than jittery — like a head that's struggling to stay level.
_spinTimer += Time.deltaTime * _spinNoiseSpeed;
if (_spinTimer > 1000f) _spinTimer -= 1000f;
float spinScale = stress * _weight * intensity;
float targetSpinY = (Mathf.PerlinNoise(_noiseOffset.x * 0.5f + _spinTimer, 10f) - 0.5f)
* _spinMaxYAngle * 2f * spinScale;
float targetSpinZ = (Mathf.PerlinNoise(_noiseOffset.z * 0.5f + _spinTimer, 20f) - 0.5f)
* _spinMaxZAngle * 2f * spinScale;
Vector3 targetSpin = new Vector3(0f, targetSpinY, targetSpinZ);
_spinOffset = Vector3.Lerp(_spinOffset, targetSpin, Time.deltaTime * _spinDamping);
// ── 6. Compose and apply ──────────────────────────────────────────────
transform.localRotation = Quaternion.Euler( transform.localRotation = Quaternion.Euler(
rx + _joltRotation.x + swing.x, rx + _joltRotation.x + swing.x,
ry + _joltRotation.y + swing.y, ry + _joltRotation.y + swing.y + _spinOffset.y,
rz + _joltRotation.z + swing.z rz + _joltRotation.z + swing.z + _spinOffset.z
); );
} }
// ── Public API ──────────────────────────────────────────────────────────── // ── Public API ────────────────────────────────────────────────────────────
/// <summary>UnityEvent-friendly wrapper — enables with the inspector master intensity.</summary>
public void Enable() => Enable(_initialMasterIntensity, _stressLevel);
/// <summary>UnityEvent-friendly wrapper — disables with a fade to 0.</summary>
public void Disable() => Disable(0f);
/// <summary> /// <summary>
/// Enables or disables the lost-footage effect with a smooth fade. /// Enables the rig and lerps <see cref="_masterIntensity"/> toward
/// Safe to call multiple times — an in-progress fade is cancelled and reversed. /// <paramref name="targetIntensity"/> and <see cref="_stressLevel"/> toward
/// <paramref name="targetStress"/> over <see cref="_fadeDuration"/> seconds.
/// Pass the values you want to reach — the current inspector values are left
/// untouched if you don't call this.
/// </summary> /// </summary>
public void SetActive(bool active) public void Enable(float targetIntensity, float targetStress = 0f)
{ {
if (IsActive == active) _isActive = true;
return; IsActive = true;
IsActive = active; if (_fadeCoroutine != null) StopCoroutine(_fadeCoroutine);
_fadeCoroutine = StartCoroutine(FadeCoroutine(true, targetIntensity, targetStress));
if (_fadeCoroutine != null)
StopCoroutine(_fadeCoroutine);
_fadeCoroutine = StartCoroutine(FadeCoroutine(active));
if (active)
{
if (_joltCoroutine != null)
StopCoroutine(_joltCoroutine);
if (_joltCoroutine != null) StopCoroutine(_joltCoroutine);
_joltCoroutine = StartCoroutine(JoltCoroutine()); _joltCoroutine = StartCoroutine(JoltCoroutine());
} }
/// <summary>
/// Disables the rig, lerping <see cref="_masterIntensity"/> toward
/// <paramref name="targetIntensity"/> (default 0) over <see cref="_fadeDuration"/> seconds.
/// </summary>
public void Disable(float targetIntensity = 0f)
{
_isActive = false;
IsActive = false;
if (_fadeCoroutine != null) StopCoroutine(_fadeCoroutine);
_fadeCoroutine = StartCoroutine(FadeCoroutine(false, targetIntensity, _stressLevel));
} }
/// <summary>Backwards-compatible toggle — calls Enable() or Disable().</summary>
public void SetActive(bool active) { if (active) Enable(); else Disable(); }
// ── Private helpers ─────────────────────────────────────────────────────── // ── Private helpers ───────────────────────────────────────────────────────
/// <summary>
/// Drives inertia swing from CharController velocity projected into local camera space,
/// avoiding the rotation-delta approach which caused spikes whenever CameraHeadBob
/// changed phase. Also samples OctoPlayerFP (grandparent) rotation delta to measure
/// true mouse-look speed for jolt gating.
/// </summary>
private void UpdateInertia() private void UpdateInertia()
{ {
// ── Inertia from CharController velocity ──────────────────────────────
Vector3 velocity = Vector3.zero; Vector3 velocity = Vector3.zero;
if (Unheimlich.Features.Player.PlayerController.Instance?.CharController != null) if (Unheimlich.Features.Player.PlayerController.Instance?.CharController != null)
velocity = Unheimlich.Features.Player.PlayerController.Instance.CharController.velocity; velocity = Unheimlich.Features.Player.PlayerController.Instance.CharController.velocity;
// Project velocity into local camera space so the swing feels attached to the view.
Vector3 localVel = transform.parent != null Vector3 localVel = transform.parent != null
? transform.parent.InverseTransformDirection(velocity) ? transform.parent.InverseTransformDirection(velocity)
: velocity; : velocity;
Vector3 targetInertia = new Vector3(-localVel.z, 0f, localVel.x) * (_inertiaStrength * 0.01f); Vector3 targetInertia = new Vector3(-localVel.z, 0f, localVel.x)
* (_inertiaStrength * _masterIntensity * 0.01f);
targetInertia = Vector3.ClampMagnitude(targetInertia, _inertiaMaxAngle); targetInertia = Vector3.ClampMagnitude(targetInertia, _inertiaMaxAngle);
_inertiaOffset = Vector3.Lerp(_inertiaOffset, targetInertia, _inertiaDamping * Time.deltaTime); _inertiaOffset = Vector3.Lerp(_inertiaOffset, targetInertia, _inertiaDamping * Time.deltaTime);
// ── Mouse-look speed from OctoPlayerFP (grandparent) ───────────────── // Mouse-look speed from OctoPlayerFP (grandparent) — gates micro-jolts.
Transform lookRoot = transform.parent?.parent; Transform lookRoot = transform.parent?.parent;
Quaternion lookRot = lookRoot != null ? lookRoot.localRotation : Quaternion.identity; Quaternion lookRot = lookRoot != null ? lookRoot.localRotation : Quaternion.identity;
Quaternion lookDelta = lookRot * Quaternion.Inverse(_lastLookRootRotation); Quaternion lookDelta = lookRot * Quaternion.Inverse(_lastLookRootRotation);
@@ -277,20 +361,27 @@ namespace Unheimlich.World.CameraSystem
_lastLookRootRotation = lookRot; _lastLookRootRotation = lookRot;
} }
private IEnumerator FadeCoroutine(bool fadeIn) private IEnumerator FadeCoroutine(bool fadeIn, float targetIntensity, float targetStress)
{ {
float start = _weight; float startIntensity = _masterIntensity;
float target = fadeIn ? 1f : 0f; float startStress = _stressLevel;
float elapsed = 0f; float elapsed = 0f;
if (fadeIn && _weight <= 0f) _weight = 0.001f;
while (elapsed < _fadeDuration) while (elapsed < _fadeDuration)
{ {
elapsed += Time.deltaTime; elapsed += Time.deltaTime;
_weight = Mathf.Lerp(start, target, elapsed / _fadeDuration); float t = elapsed / _fadeDuration;
_masterIntensity = Mathf.Lerp(startIntensity, targetIntensity, t);
_stressLevel = Mathf.Lerp(startStress, targetStress, t);
_weight = _masterIntensity > 0f ? 1f : 0f;
yield return null; yield return null;
} }
_weight = target; _masterIntensity = targetIntensity;
_stressLevel = targetStress;
_weight = targetIntensity > 0f ? 1f : 0f;
_fadeCoroutine = null; _fadeCoroutine = null;
if (!fadeIn && _joltCoroutine != null) if (!fadeIn && _joltCoroutine != null)
@@ -304,14 +395,14 @@ namespace Unheimlich.World.CameraSystem
{ {
while (true) while (true)
{ {
float stress = Mathf.Clamp01(StressLevel); float stress = Mathf.Clamp01(_stressLevel);
bool running = IsRunning();
// Use the same smoothed moveT as Update to keep jolt parameters consistent. float joltAmp = running
float joltAmp = isRunning()
? Mathf.Lerp(_walkJoltAmplitude, _runJoltAmplitude, _smoothMoveT) ? Mathf.Lerp(_walkJoltAmplitude, _runJoltAmplitude, _smoothMoveT)
: Mathf.Lerp(_idleJoltAmplitude, _walkJoltAmplitude, _smoothMoveT); : Mathf.Lerp(_idleJoltAmplitude, _walkJoltAmplitude, _smoothMoveT);
Vector2 intervalRange = isRunning() Vector2 intervalRange = running
? Vector2.Lerp(_walkJoltIntervalRange, _runJoltIntervalRange, _smoothMoveT) ? Vector2.Lerp(_walkJoltIntervalRange, _runJoltIntervalRange, _smoothMoveT)
: Vector2.Lerp(_idleJoltIntervalRange, _walkJoltIntervalRange, _smoothMoveT); : Vector2.Lerp(_idleJoltIntervalRange, _walkJoltIntervalRange, _smoothMoveT);
@@ -320,10 +411,8 @@ namespace Unheimlich.World.CameraSystem
yield return new WaitForSeconds(interval); yield return new WaitForSeconds(interval);
// Jolts only fire when the camera is steady — steadyFactor is 1 when still,
// 0 when the player is actively looking around.
float steadyFactor = 1f - Mathf.Clamp01(_lookSpeed / _joltLookSuppressSpeed); float steadyFactor = 1f - Mathf.Clamp01(_lookSpeed / _joltLookSuppressSpeed);
float ampScale = (1f + stress * _stressJoltAmpMul) * _weight * steadyFactor; float ampScale = (1f + stress * _stressJoltAmpMul) * _weight * _masterIntensity * steadyFactor;
Vector3 target = new Vector3( Vector3 target = new Vector3(
Random.Range(-1f, 1f) * joltAmp * ampScale, Random.Range(-1f, 1f) * joltAmp * ampScale,
@@ -335,17 +424,12 @@ namespace Unheimlich.World.CameraSystem
} }
} }
/// <summary>Returns true if the player is currently running.</summary> private bool IsRunning()
private bool isRunning()
{ {
return OctoCore.Components.OctoPlayer.Instance != null return OctoCore.Components.OctoPlayer.Instance != null
&& OctoCore.Components.OctoPlayer.Instance.State.IsRunning; && OctoCore.Components.OctoPlayer.Instance.State.IsRunning;
} }
/// <summary>
/// Snaps to <paramref name="target"/> in the first fraction of the interval,
/// then eases back to zero for the remainder — simulating a hand recoil.
/// </summary>
private IEnumerator ApplyJolt(Vector3 target, float totalDuration) private IEnumerator ApplyJolt(Vector3 target, float totalDuration)
{ {
float snapDur = totalDuration * _joltSnapFraction; float snapDur = totalDuration * _joltSnapFraction;
@@ -1,74 +1,39 @@
using System.Collections; using System.Collections;
using UnityEngine; using UnityEngine;
using UnityEngine.Rendering;
namespace MonoLimboStudio namespace Unheimlich.VFX
{ {
public class LightFlicker : MonoBehaviour public class LightFlicker : MonoBehaviour
{ {
[Header("Light Settings")]
public Light targetLight; public Light targetLight;
[Tooltip("Base intensity set externally (e.g. by ScarecrowFire). Flicker oscillates around this value.")] [Tooltip("Flicker oscillates around this value. Driven each frame by ScarecrowFire.")]
public float baseIntensity = 1f; public float baseIntensity = 0f;
[Tooltip("Flicker range applied relative to baseIntensity (e.g. 0.3 = ±30%).")] [Range(0f, 1f)] public float flickerRange = 0.3f;
[Range(0f, 1f)]
public float flickerRange = 0.3f;
[Header("Perlin Flicker (smooth)")]
public float flickerSpeed = 5f; public float flickerSpeed = 5f;
[Header("Glitch Flicker (bursts)")]
[Range(0f, 1f)] public float glitchChance = 0.15f; [Range(0f, 1f)] public float glitchChance = 0.15f;
public float glitchMinDuration = 0.02f; public float glitchMinDuration = 0.02f;
public float glitchMaxDuration = 0.12f; public float glitchMaxDuration = 0.12f;
[Header("Material Settings")]
public Renderer targetRenderer;
public string opacityProperty = "_Opacity";
[Range(0f, 1f)] public float minOpacity = 0.2f;
[Range(0f, 1f)] public float maxOpacity = 1.0f;
private Material _materialInstance;
private float _randomOffset; private float _randomOffset;
// ─────────────────────────────────────────────────────────────────────
void Start() void Start()
{ {
_randomOffset = Random.Range(0f, 1000f); _randomOffset = Random.Range(0f, 1000f);
if (targetRenderer != null)
{
_materialInstance = targetRenderer.material;
if (!_materialInstance.HasProperty(opacityProperty))
Debug.LogWarning($"Property '{opacityProperty}' not found on material.");
}
StartCoroutine(FlickerRoutine()); StartCoroutine(FlickerRoutine());
} }
// ───────────────────────────────────────────────────────────────────── /// <summary>Called each frame by ScarecrowFire to update the base the flicker oscillates around.</summary>
public void SetBaseIntensity(float value) => baseIntensity = value;
/// <summary>
/// Sets the base intensity that the flicker oscillates around.
/// Called each frame by ScarecrowFire as the fire grows.
/// </summary>
public void SetBaseIntensity(float value)
{
baseIntensity = value;
}
// ─────────────────────────────────────────────────────────────────────
private IEnumerator FlickerRoutine() private IEnumerator FlickerRoutine()
{ {
while (true) while (true)
{ {
float perlinValue = Mathf.PerlinNoise(Time.time * flickerSpeed + _randomOffset, 0f); float t = Mathf.PerlinNoise(Time.time * flickerSpeed + _randomOffset, 0f);
ApplyFlicker(perlinValue); ApplyFlicker(t);
if (Random.value < glitchChance) if (Random.value < glitchChance)
yield return StartCoroutine(GlitchBurst()); yield return StartCoroutine(GlitchBurst());
@@ -79,8 +44,8 @@ namespace MonoLimboStudio
private IEnumerator GlitchBurst() private IEnumerator GlitchBurst()
{ {
float duration = Random.Range(glitchMinDuration, glitchMaxDuration);
float elapsed = 0f; float elapsed = 0f;
float duration = Random.Range(glitchMinDuration, glitchMaxDuration);
while (elapsed < duration) while (elapsed < duration)
{ {
@@ -90,26 +55,12 @@ namespace MonoLimboStudio
} }
} }
/// <summary>
/// Applies flicker as an offset around baseIntensity rather than
/// absolute min/max, so external intensity control stays intact.
/// </summary>
private void ApplyFlicker(float t) private void ApplyFlicker(float t)
{ {
if (targetLight != null) if (targetLight == null) return;
{ float offset = Mathf.Lerp(-baseIntensity * flickerRange,
float offset = Mathf.Lerp(-flickerRange, flickerRange, t); baseIntensity * flickerRange, t);
targetLight.intensity = Mathf.Max(0f, baseIntensity + offset); targetLight.intensity = Mathf.Max(0f, baseIntensity + offset);
} }
if (_materialInstance != null && _materialInstance.HasProperty(opacityProperty))
_materialInstance.SetFloat(opacityProperty, Mathf.Lerp(minOpacity, maxOpacity, t));
}
void OnDestroy()
{
if (_materialInstance != null)
Destroy(_materialInstance);
}
} }
} }