diff --git a/Assets/Art/Levels/Dump/Animation/TrashGate/LeverIdle.anim b/Assets/Art/Levels/Dump/Animation/TrashGate/LeverIdle.anim
new file mode 100644
index 00000000..0b45029b
--- /dev/null
+++ b/Assets/Art/Levels/Dump/Animation/TrashGate/LeverIdle.anim
@@ -0,0 +1,72 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: LeverIdle
+ serializedVersion: 7
+ m_Legacy: 0
+ m_Compressed: 0
+ m_UseHighQualityCurve: 1
+ m_RotationCurves: []
+ m_CompressedRotationCurves: []
+ m_EulerCurves: []
+ m_PositionCurves: []
+ m_ScaleCurves: []
+ m_FloatCurves: []
+ m_PPtrCurves:
+ - serializedVersion: 2
+ curve:
+ - time: 0
+ value: {fileID: 1983369653, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ attribute: m_Sprite
+ path:
+ classID: 212
+ script: {fileID: 0}
+ flags: 2
+ m_SampleRate: 30
+ m_WrapMode: 0
+ m_Bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ m_ClipBindingConstant:
+ genericBindings:
+ - serializedVersion: 2
+ path: 0
+ attribute: 0
+ script: {fileID: 0}
+ typeID: 212
+ customType: 23
+ isPPtrCurve: 1
+ isIntCurve: 0
+ isSerializeReferenceCurve: 0
+ pptrCurveMapping:
+ - {fileID: 1983369653, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ m_AnimationClipSettings:
+ serializedVersion: 2
+ m_AdditiveReferencePoseClip: {fileID: 0}
+ m_AdditiveReferencePoseTime: 0
+ m_StartTime: 0
+ m_StopTime: 0.033333335
+ m_OrientationOffsetY: 0
+ m_Level: 0
+ m_CycleOffset: 0
+ m_HasAdditiveReferencePose: 0
+ m_LoopTime: 0
+ m_LoopBlend: 0
+ m_LoopBlendOrientation: 0
+ m_LoopBlendPositionY: 0
+ m_LoopBlendPositionXZ: 0
+ m_KeepOriginalOrientation: 0
+ m_KeepOriginalPositionY: 1
+ m_KeepOriginalPositionXZ: 0
+ m_HeightFromFeet: 0
+ m_Mirror: 0
+ m_EditorCurves: []
+ m_EulerEditorCurves: []
+ m_HasGenericRootTransform: 0
+ m_HasMotionFloatCurves: 0
+ m_Events: []
diff --git a/Assets/Art/Levels/Dump/Animation/TrashGate/LeverIdle.anim.meta b/Assets/Art/Levels/Dump/Animation/TrashGate/LeverIdle.anim.meta
new file mode 100644
index 00000000..9aa33642
--- /dev/null
+++ b/Assets/Art/Levels/Dump/Animation/TrashGate/LeverIdle.anim.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9fa6031302d433f408438e70a14fffc8
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 7400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Art/Levels/Dump/Animation/TrashGate/LeverOver.anim b/Assets/Art/Levels/Dump/Animation/TrashGate/LeverOver.anim
new file mode 100644
index 00000000..c222da8b
--- /dev/null
+++ b/Assets/Art/Levels/Dump/Animation/TrashGate/LeverOver.anim
@@ -0,0 +1,93 @@
+%YAML 1.1
+%TAG !u! tag:unity3d.com,2011:
+--- !u!74 &7400000
+AnimationClip:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: LeverOver
+ serializedVersion: 7
+ m_Legacy: 0
+ m_Compressed: 0
+ m_UseHighQualityCurve: 1
+ m_RotationCurves: []
+ m_CompressedRotationCurves: []
+ m_EulerCurves: []
+ m_PositionCurves: []
+ m_ScaleCurves: []
+ m_FloatCurves: []
+ m_PPtrCurves:
+ - serializedVersion: 2
+ curve:
+ - time: 0
+ value: {fileID: 1983369653, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ - time: 0.033333335
+ value: {fileID: 182198627, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ - time: 0.06666667
+ value: {fileID: 2099342698, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ - time: 0.1
+ value: {fileID: 1141896416, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ - time: 0.13333334
+ value: {fileID: 1211958902, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ - time: 0.16666667
+ value: {fileID: 1892208514, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ - time: 0.2
+ value: {fileID: 1469259267, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ - time: 0.23333333
+ value: {fileID: -1077132752, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ attribute: m_Sprite
+ path:
+ classID: 212
+ script: {fileID: 0}
+ flags: 2
+ m_SampleRate: 30
+ m_WrapMode: 0
+ m_Bounds:
+ m_Center: {x: 0, y: 0, z: 0}
+ m_Extent: {x: 0, y: 0, z: 0}
+ m_ClipBindingConstant:
+ genericBindings:
+ - serializedVersion: 2
+ path: 0
+ attribute: 0
+ script: {fileID: 0}
+ typeID: 212
+ customType: 23
+ isPPtrCurve: 1
+ isIntCurve: 0
+ isSerializeReferenceCurve: 0
+ pptrCurveMapping:
+ - {fileID: 1983369653, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ - {fileID: 182198627, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ - {fileID: 2099342698, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ - {fileID: 1141896416, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ - {fileID: 1211958902, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ - {fileID: 1892208514, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ - {fileID: 1469259267, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ - {fileID: -1077132752, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
+ m_AnimationClipSettings:
+ serializedVersion: 2
+ m_AdditiveReferencePoseClip: {fileID: 0}
+ m_AdditiveReferencePoseTime: 0
+ m_StartTime: 0
+ m_StopTime: 0.26666668
+ m_OrientationOffsetY: 0
+ m_Level: 0
+ m_CycleOffset: 0
+ m_HasAdditiveReferencePose: 0
+ m_LoopTime: 0
+ m_LoopBlend: 0
+ m_LoopBlendOrientation: 0
+ m_LoopBlendPositionY: 0
+ m_LoopBlendPositionXZ: 0
+ m_KeepOriginalOrientation: 0
+ m_KeepOriginalPositionY: 1
+ m_KeepOriginalPositionXZ: 0
+ m_HeightFromFeet: 0
+ m_Mirror: 0
+ m_EditorCurves: []
+ m_EulerEditorCurves: []
+ m_HasGenericRootTransform: 0
+ m_HasMotionFloatCurves: 0
+ m_Events: []
diff --git a/Assets/Art/Levels/Dump/Animation/TrashGate/LeverOver.anim.meta b/Assets/Art/Levels/Dump/Animation/TrashGate/LeverOver.anim.meta
new file mode 100644
index 00000000..095853d9
--- /dev/null
+++ b/Assets/Art/Levels/Dump/Animation/TrashGate/LeverOver.anim.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0e15051dcb3df814fab52e617496fc40
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 7400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Art/Levels/Dump/Animation/TrashGate/gate_lever0001.controller b/Assets/Art/Levels/Dump/Animation/TrashGate/gate_lever0001.controller
index f0c77446..71f05694 100644
--- a/Assets/Art/Levels/Dump/Animation/TrashGate/gate_lever0001.controller
+++ b/Assets/Art/Levels/Dump/Animation/TrashGate/gate_lever0001.controller
@@ -1,5 +1,27 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
+--- !u!1101 &-9052709553426898635
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_Conditions: []
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: 6005905035337375392}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.25
+ m_TransitionOffset: 0
+ m_ExitTime: 1
+ m_HasExitTime: 1
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
--- !u!1107 &-4471614901610054980
AnimatorStateMachine:
serializedVersion: 6
@@ -11,17 +33,23 @@ AnimatorStateMachine:
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: -4348510085696419942}
- m_Position: {x: 200, y: 0, z: 0}
+ m_Position: {x: 260, y: 110, z: 0}
+ - serializedVersion: 1
+ m_State: {fileID: -314990716293606577}
+ m_Position: {x: 110, y: 220, z: 0}
+ - serializedVersion: 1
+ m_State: {fileID: 6005905035337375392}
+ m_Position: {x: 460, y: 230, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
m_StateMachineTransitions: {}
m_StateMachineBehaviours: []
- m_AnyStatePosition: {x: 50, y: 20, z: 0}
- m_EntryPosition: {x: 50, y: 120, z: 0}
+ m_AnyStatePosition: {x: 100, y: -30, z: 0}
+ m_EntryPosition: {x: -20, y: 110, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
- m_DefaultState: {fileID: -4348510085696419942}
+ m_DefaultState: {fileID: -314990716293606577}
--- !u!1102 &-4348510085696419942
AnimatorState:
serializedVersion: 6
@@ -32,7 +60,8 @@ AnimatorState:
m_Name: Lever
m_Speed: 1
m_CycleOffset: 0
- m_Transitions: []
+ m_Transitions:
+ - {fileID: -9052709553426898635}
m_StateMachineBehaviours: []
m_Position: {x: 50, y: 50, z: 0}
m_IKOnFeet: 0
@@ -48,6 +77,58 @@ AnimatorState:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
+--- !u!1101 &-2774546409871568984
+AnimatorStateTransition:
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name:
+ m_Conditions:
+ - m_ConditionMode: 1
+ m_ConditionEvent: PushLever
+ m_EventTreshold: 0
+ m_DstStateMachine: {fileID: 0}
+ m_DstState: {fileID: -4348510085696419942}
+ m_Solo: 0
+ m_Mute: 0
+ m_IsExit: 0
+ serializedVersion: 3
+ m_TransitionDuration: 0.25
+ m_TransitionOffset: 0
+ m_ExitTime: 0.75
+ m_HasExitTime: 1
+ m_HasFixedDuration: 1
+ m_InterruptionSource: 0
+ m_OrderedInterruption: 1
+ m_CanTransitionToSelf: 1
+--- !u!1102 &-314990716293606577
+AnimatorState:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: Idle
+ m_Speed: 1
+ m_CycleOffset: 0
+ m_Transitions:
+ - {fileID: -2774546409871568984}
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_TimeParameterActive: 0
+ m_Motion: {fileID: 7400000, guid: 9fa6031302d433f408438e70a14fffc8, type: 2}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+ m_TimeParameter:
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
@@ -56,7 +137,13 @@ AnimatorController:
m_PrefabAsset: {fileID: 0}
m_Name: gate_lever0001
serializedVersion: 5
- m_AnimatorParameters: []
+ m_AnimatorParameters:
+ - m_Name: PushLever
+ m_Type: 9
+ m_DefaultFloat: 0
+ m_DefaultInt: 0
+ m_DefaultBool: 0
+ m_Controller: {fileID: 9100000}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
@@ -70,3 +157,29 @@ AnimatorController:
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
+--- !u!1102 &6005905035337375392
+AnimatorState:
+ serializedVersion: 6
+ m_ObjectHideFlags: 1
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_Name: LeverOver
+ m_Speed: 1
+ m_CycleOffset: 0
+ m_Transitions: []
+ m_StateMachineBehaviours: []
+ m_Position: {x: 50, y: 50, z: 0}
+ m_IKOnFeet: 0
+ m_WriteDefaultValues: 1
+ m_Mirror: 0
+ m_SpeedParameterActive: 0
+ m_MirrorParameterActive: 0
+ m_CycleOffsetParameterActive: 0
+ m_TimeParameterActive: 0
+ m_Motion: {fileID: 7400000, guid: 0e15051dcb3df814fab52e617496fc40, type: 2}
+ m_Tag:
+ m_SpeedParameter:
+ m_MirrorParameter:
+ m_CycleOffsetParameter:
+ m_TimeParameter:
diff --git a/Assets/Editor/ControllerSwitchItemEditor.cs b/Assets/Editor/ControllerSwitchItemEditor.cs
index 13a1910f..20ddbe9e 100644
--- a/Assets/Editor/ControllerSwitchItemEditor.cs
+++ b/Assets/Editor/ControllerSwitchItemEditor.cs
@@ -7,33 +7,39 @@ namespace Editor
///
/// Custom editor for ControllerSwitchItem that shows only relevant fields based on camera switch mode.
///
- [CustomEditor(typeof(ControllerSwitchItem))]
+ [CustomEditor(typeof(ControllerSwitchItem), true)]
public class ControllerSwitchItemEditor : UnityEditor.Editor
{
- private SerializedProperty _targetControllerName;
- private SerializedProperty _cameraSwitchMode;
- private SerializedProperty _targetVirtualCamera;
- private SerializedProperty _targetCameraState;
- private SerializedProperty _visualRepresentation;
+ protected SerializedProperty _targetControllerName;
+ protected SerializedProperty _visualRepresentation;
// Base class properties
- private SerializedProperty _isOneTime;
- private SerializedProperty _cooldown;
- private SerializedProperty _characterToInteract;
+ protected SerializedProperty _isOneTime;
+ protected SerializedProperty _cooldown;
+ protected SerializedProperty _characterToInteract;
+
+ // Base interactable events
+ protected SerializedProperty _interactionStarted;
+ protected SerializedProperty _interactionInterrupted;
+ protected SerializedProperty _characterArrived;
+ protected SerializedProperty _interactionComplete;
- private void OnEnable()
+ protected virtual void OnEnable()
{
// Controller Switch Settings
_targetControllerName = serializedObject.FindProperty("targetControllerName");
- _cameraSwitchMode = serializedObject.FindProperty("cameraSwitchMode");
- _targetVirtualCamera = serializedObject.FindProperty("targetVirtualCamera");
- _targetCameraState = serializedObject.FindProperty("targetCameraState");
_visualRepresentation = serializedObject.FindProperty("visualRepresentation");
// Base class properties
_isOneTime = serializedObject.FindProperty("isOneTime");
_cooldown = serializedObject.FindProperty("cooldown");
_characterToInteract = serializedObject.FindProperty("characterToInteract");
+
+ // Base interactable events
+ _interactionStarted = serializedObject.FindProperty("interactionStarted");
+ _interactionInterrupted = serializedObject.FindProperty("interactionInterrupted");
+ _characterArrived = serializedObject.FindProperty("characterArrived");
+ _interactionComplete = serializedObject.FindProperty("interactionComplete");
}
public override void OnInspectorGUI()
@@ -58,34 +64,10 @@ namespace Editor
// Controller Switch Settings
EditorGUILayout.LabelField("Controller Switch Settings", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(_targetControllerName);
-
- EditorGUILayout.Space();
-
- // Camera Settings
- EditorGUILayout.LabelField("Camera Settings", EditorStyles.boldLabel);
- EditorGUILayout.PropertyField(_cameraSwitchMode);
-
- // Show relevant camera fields based on mode
- CameraSwitchMode mode = (CameraSwitchMode)_cameraSwitchMode.enumValueIndex;
- switch (mode)
+ if (string.IsNullOrEmpty(_targetControllerName.stringValue))
{
- case CameraSwitchMode.None:
- EditorGUILayout.HelpBox("No camera switching will occur. Only the controller will be switched.", MessageType.Info);
- break;
-
- case CameraSwitchMode.DirectReference:
- EditorGUILayout.PropertyField(_targetVirtualCamera);
- if (_targetVirtualCamera.objectReferenceValue == null)
- {
- EditorGUILayout.HelpBox("Assign a Cinemachine camera to blend to when switching controllers.", MessageType.Warning);
- }
- break;
-
- case CameraSwitchMode.TrashMazeCameraState:
- EditorGUILayout.PropertyField(_targetCameraState);
- EditorGUILayout.HelpBox("Uses TrashMazeCameraController to switch camera state. Make sure TrashMazeCameraController is present in the scene.", MessageType.Info);
- break;
+ EditorGUILayout.HelpBox("Assign a target controller name (must match registration name in InputManager).", MessageType.Warning);
}
EditorGUILayout.Space();
@@ -93,9 +75,28 @@ namespace Editor
// Visual Feedback
EditorGUILayout.LabelField("Visual Feedback", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(_visualRepresentation);
+
+ EditorGUILayout.Space();
+
+ // Base Interactable Events
+ EditorGUILayout.LabelField("Interaction Events", EditorStyles.boldLabel);
+ EditorGUILayout.PropertyField(_interactionStarted);
+ EditorGUILayout.PropertyField(_interactionInterrupted);
+ EditorGUILayout.PropertyField(_characterArrived);
+ EditorGUILayout.PropertyField(_interactionComplete);
+
+ DrawCustomFields();
serializedObject.ApplyModifiedProperties();
}
+
+ ///
+ /// Override this in derived editors to add custom fields specific to derived classes
+ ///
+ protected virtual void DrawCustomFields()
+ {
+ // Base class has no additional custom fields
+ }
}
}
diff --git a/Assets/Editor/MazeExitEditor.cs b/Assets/Editor/MazeExitEditor.cs
new file mode 100644
index 00000000..a49f003b
--- /dev/null
+++ b/Assets/Editor/MazeExitEditor.cs
@@ -0,0 +1,89 @@
+using UnityEditor;
+using UnityEngine;
+using Minigames.TrashMaze.Objects;
+
+namespace Editor
+{
+ ///
+ /// Custom editor for MazeExit showing teleportation and camera settings
+ ///
+ [CustomEditor(typeof(MazeExit))]
+ public class MazeExitEditor : UnityEditor.Editor
+ {
+ private SerializedProperty _teleportTarget;
+ private SerializedProperty _targetCameraState;
+
+ // Base class properties
+ private SerializedProperty _isOneTime;
+ private SerializedProperty _cooldown;
+ private SerializedProperty _characterToInteract;
+
+ private void OnEnable()
+ {
+ _teleportTarget = serializedObject.FindProperty("teleportTarget");
+ _targetCameraState = serializedObject.FindProperty("targetCameraState");
+
+ // Base class properties
+ _isOneTime = serializedObject.FindProperty("isOneTime");
+ _cooldown = serializedObject.FindProperty("cooldown");
+ _characterToInteract = serializedObject.FindProperty("characterToInteract");
+ }
+
+ public override void OnInspectorGUI()
+ {
+ serializedObject.Update();
+
+ // Draw script field (read-only)
+ EditorGUI.BeginDisabledGroup(true);
+ EditorGUILayout.ObjectField("Script", MonoScript.FromMonoBehaviour((MonoBehaviour)target), GetType(), false);
+ EditorGUI.EndDisabledGroup();
+
+ EditorGUILayout.Space();
+
+ // Interaction Settings (from base class)
+ EditorGUILayout.LabelField("Interaction Settings", EditorStyles.boldLabel);
+ EditorGUILayout.PropertyField(_isOneTime);
+ EditorGUILayout.PropertyField(_cooldown);
+ EditorGUILayout.PropertyField(_characterToInteract);
+
+ EditorGUILayout.Space();
+
+ // Maze Exit Settings
+ EditorGUILayout.LabelField("Maze Exit Settings", EditorStyles.boldLabel);
+
+ EditorGUILayout.PropertyField(_teleportTarget);
+ if (_teleportTarget.objectReferenceValue == null)
+ {
+ EditorGUILayout.HelpBox("Assign a Transform where Pulver should be teleported to (maze exit position). Teleportation happens midway through camera blend.", MessageType.Warning);
+ }
+ else
+ {
+ EditorGUILayout.HelpBox("✓ Pulver will be teleported to this position halfway through the camera blend. Tracking target is set immediately.", MessageType.Info);
+ }
+
+ EditorGUILayout.Space();
+
+ EditorGUILayout.PropertyField(_targetCameraState);
+ EditorGUILayout.HelpBox("Camera state to blend to. Typically 'PulverGameplay' when exiting maze. Requires TrashMazeCameraController in scene.", MessageType.Info);
+
+ EditorGUILayout.Space();
+
+ // Info box about the behavior
+ EditorGUILayout.HelpBox(
+ "Maze Exit Behavior:\n" +
+ "1. Find Pulver (player-controlled in maze)\n" +
+ "2. Start camera blend to target state\n" +
+ "3. ★ Teleport Pulver midway through blend ★\n" +
+ "4. Set Pulver as tracking target immediately\n" +
+ "5. Wait for blend to complete\n" +
+ "6. Stop Pulver movement (clear cached input)\n" +
+ "\n" +
+ "Note: Does NOT switch controllers - Pulver remains player-controlled!",
+ MessageType.None
+ );
+
+ serializedObject.ApplyModifiedProperties();
+ }
+ }
+}
+
diff --git a/Assets/Editor/MazeExitEditor.cs.meta b/Assets/Editor/MazeExitEditor.cs.meta
new file mode 100644
index 00000000..ef9986a5
--- /dev/null
+++ b/Assets/Editor/MazeExitEditor.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 9bcc6ff619f74a88b899223936a66845
+timeCreated: 1766151279
\ No newline at end of file
diff --git a/Assets/Editor/TrashMazeSwitchToPulverEditor.cs b/Assets/Editor/TrashMazeSwitchToPulverEditor.cs
new file mode 100644
index 00000000..40f99794
--- /dev/null
+++ b/Assets/Editor/TrashMazeSwitchToPulverEditor.cs
@@ -0,0 +1,63 @@
+using UnityEditor;
+using Minigames.TrashMaze.Objects;
+
+namespace Editor
+{
+ ///
+ /// Custom editor for TrashMazeSwitchToPulver showing maze-specific settings
+ ///
+ [CustomEditor(typeof(TrashMazeSwitchToPulver))]
+ public class TrashMazeSwitchToPulverEditor : ControllerSwitchItemEditor
+ {
+ private SerializedProperty _teleportTarget;
+ private SerializedProperty _targetCameraState;
+
+ protected override void OnEnable()
+ {
+ base.OnEnable();
+
+ _teleportTarget = serializedObject.FindProperty("teleportTarget");
+ _targetCameraState = serializedObject.FindProperty("targetCameraState");
+ }
+
+ protected override void DrawCustomFields()
+ {
+ EditorGUILayout.Space();
+
+ // Trash Maze Specific Settings
+ EditorGUILayout.LabelField("Trash Maze - To Pulver Settings", EditorStyles.boldLabel);
+
+ EditorGUILayout.PropertyField(_teleportTarget);
+ if (_teleportTarget.objectReferenceValue == null)
+ {
+ EditorGUILayout.HelpBox("Assign a Transform where Pulver should be teleported to (maze entrance position). Teleportation happens midway through camera blend.", MessageType.Warning);
+ }
+ else
+ {
+ EditorGUILayout.HelpBox("✓ Pulver will be teleported to this position halfway through the camera blend, creating a seamless 'entering maze' effect.", MessageType.Info);
+ }
+
+ EditorGUILayout.Space();
+
+ EditorGUILayout.PropertyField(_targetCameraState);
+ EditorGUILayout.HelpBox("Camera state to blend to. Typically 'Maze' when entering the maze. Requires TrashMazeCameraController in scene.", MessageType.Info);
+
+ EditorGUILayout.Space();
+
+ // Info box about the behavior
+ EditorGUILayout.HelpBox(
+ "Switch Behavior:\n" +
+ "1. Deactivate current controller (Trafalgar)\n" +
+ "2. Deactivate Pulver's follower mode\n" +
+ "3. Start camera blend to Maze view\n" +
+ "4. ★ Teleport Pulver midway through blend ★\n" +
+ "5. Set Pulver as tracking target immediately\n" +
+ "6. Wait for blend to complete\n" +
+ "7. Activate PulverController for player control\n" +
+ "8. Switch input to 'pulver'",
+ MessageType.None
+ );
+ }
+ }
+}
+
diff --git a/Assets/Editor/TrashMazeSwitchToPulverEditor.cs.meta b/Assets/Editor/TrashMazeSwitchToPulverEditor.cs.meta
new file mode 100644
index 00000000..1b8b9004
--- /dev/null
+++ b/Assets/Editor/TrashMazeSwitchToPulverEditor.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: ded1ca7102b144a99d9e36a67d9054c0
+timeCreated: 1766149825
\ No newline at end of file
diff --git a/Assets/Editor/TrashMazeSwitchToTrafalgarEditor.cs b/Assets/Editor/TrashMazeSwitchToTrafalgarEditor.cs
new file mode 100644
index 00000000..471e8b96
--- /dev/null
+++ b/Assets/Editor/TrashMazeSwitchToTrafalgarEditor.cs
@@ -0,0 +1,50 @@
+using UnityEditor;
+using UnityEngine;
+using Minigames.TrashMaze.Objects;
+
+namespace Editor
+{
+ ///
+ /// Custom editor for TrashMazeSwitchToTrafalgar showing maze-specific settings
+ ///
+ [CustomEditor(typeof(TrashMazeSwitchToTrafalgar))]
+ public class TrashMazeSwitchToTrafalgarEditor : ControllerSwitchItemEditor
+ {
+ private SerializedProperty _targetCameraState;
+
+ protected override void OnEnable()
+ {
+ base.OnEnable();
+
+ _targetCameraState = serializedObject.FindProperty("targetCameraState");
+ }
+
+ protected override void DrawCustomFields()
+ {
+ EditorGUILayout.Space();
+
+ // Trash Maze Specific Settings
+ EditorGUILayout.LabelField("Trash Maze - To Trafalgar Settings", EditorStyles.boldLabel);
+
+ EditorGUILayout.PropertyField(_targetCameraState);
+ EditorGUILayout.HelpBox("Camera state to blend to. Typically 'Gameplay' when exiting the maze. Requires TrashMazeCameraController in scene.", MessageType.Info);
+
+ EditorGUILayout.Space();
+
+ // Info box about the behavior
+ EditorGUILayout.HelpBox(
+ "Switch Behavior:\n" +
+ "1. Deactivate PulverController (stops input)\n" +
+ "2. Start camera blend to Gameplay view\n" +
+ "3. Wait for blend to complete\n" +
+ "4. Clear Pulver from maze camera tracking\n" +
+ "5. Set Trafalgar as tracking target for gameplay camera\n" +
+ "6. Activate Pulver's follower mode (follows Trafalgar)\n" +
+ "7. Activate PlayerTouchController (Trafalgar)\n" +
+ "8. Switch input to 'trafalgar'",
+ MessageType.None
+ );
+ }
+ }
+}
+
diff --git a/Assets/Editor/TrashMazeSwitchToTrafalgarEditor.cs.meta b/Assets/Editor/TrashMazeSwitchToTrafalgarEditor.cs.meta
new file mode 100644
index 00000000..5a2f1af1
--- /dev/null
+++ b/Assets/Editor/TrashMazeSwitchToTrafalgarEditor.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: b58486fd20fd458ea14a508070a0f277
+timeCreated: 1766149834
\ No newline at end of file
diff --git a/Assets/Editor/TriggerAnimationOnInteractionEditor.cs b/Assets/Editor/TriggerAnimationOnInteractionEditor.cs
new file mode 100644
index 00000000..db6c2ce8
--- /dev/null
+++ b/Assets/Editor/TriggerAnimationOnInteractionEditor.cs
@@ -0,0 +1,121 @@
+using UnityEditor;
+using UnityEngine;
+using Interactions;
+
+namespace Editor
+{
+ ///
+ /// Custom editor for TriggerAnimationOnInteraction with helpful validation and feedback
+ ///
+ [CustomEditor(typeof(TriggerAnimationOnInteraction))]
+ public class TriggerAnimationOnInteractionEditor : UnityEditor.Editor
+ {
+ private SerializedProperty _interactable;
+ private SerializedProperty _animator;
+ private SerializedProperty _triggerName;
+
+ private void OnEnable()
+ {
+ _interactable = serializedObject.FindProperty("interactable");
+ _animator = serializedObject.FindProperty("animator");
+ _triggerName = serializedObject.FindProperty("triggerName");
+ }
+
+ public override void OnInspectorGUI()
+ {
+ serializedObject.Update();
+
+ // Draw script field (read-only)
+ EditorGUI.BeginDisabledGroup(true);
+ EditorGUILayout.ObjectField("Script", MonoScript.FromMonoBehaviour((MonoBehaviour)target), GetType(), false);
+ EditorGUI.EndDisabledGroup();
+
+ EditorGUILayout.Space();
+
+ // Component References
+ EditorGUILayout.LabelField("Component References (Optional)", EditorStyles.boldLabel);
+ EditorGUILayout.PropertyField(_interactable);
+ EditorGUILayout.PropertyField(_animator);
+
+ if (_interactable.objectReferenceValue == null || _animator.objectReferenceValue == null)
+ {
+ EditorGUILayout.HelpBox("Leave fields empty to auto-discover components on this GameObject or children.", MessageType.Info);
+ }
+
+ EditorGUILayout.Space();
+
+ // Animation Settings
+ EditorGUILayout.LabelField("Animation Settings", EditorStyles.boldLabel);
+ EditorGUILayout.PropertyField(_triggerName);
+
+ if (string.IsNullOrEmpty(_triggerName.stringValue))
+ {
+ EditorGUILayout.HelpBox("Assign a trigger name that matches a trigger parameter in the Animator.", MessageType.Warning);
+ }
+
+ EditorGUILayout.Space();
+
+ // Component Discovery Info
+ EditorGUILayout.LabelField("Component Discovery Status", EditorStyles.boldLabel);
+
+ var component = (TriggerAnimationOnInteraction)target;
+
+ // Check what will be used at runtime
+ InteractableBase resolvedInteractable = _interactable.objectReferenceValue as InteractableBase;
+ if (resolvedInteractable == null)
+ {
+ resolvedInteractable = component.GetComponent();
+ }
+ if (resolvedInteractable == null)
+ {
+ resolvedInteractable = component.GetComponentInChildren();
+ }
+
+ Animator resolvedAnimator = _animator.objectReferenceValue as Animator;
+ if (resolvedAnimator == null)
+ {
+ resolvedAnimator = component.GetComponent();
+ }
+ if (resolvedAnimator == null)
+ {
+ resolvedAnimator = component.GetComponentInChildren();
+ }
+
+ // Show discovered components
+ if (resolvedInteractable != null)
+ {
+ string source = _interactable.objectReferenceValue != null ? "Assigned" : "Auto-discovered";
+ EditorGUILayout.HelpBox($"✓ Interactable: {resolvedInteractable.gameObject.name} ({source})", MessageType.Info);
+ }
+ else
+ {
+ EditorGUILayout.HelpBox("✗ No Interactable found! Assign one or ensure an Interactable exists on this GameObject or children.", MessageType.Error);
+ }
+
+ if (resolvedAnimator != null)
+ {
+ string source = _animator.objectReferenceValue != null ? "Assigned" : "Auto-discovered";
+ EditorGUILayout.HelpBox($"✓ Animator: {resolvedAnimator.gameObject.name} ({source})", MessageType.Info);
+ }
+ else
+ {
+ EditorGUILayout.HelpBox("✗ No Animator found! Assign one or ensure an Animator exists on this GameObject or children.", MessageType.Error);
+ }
+
+ EditorGUILayout.Space();
+
+ // Behavior explanation
+ EditorGUILayout.HelpBox(
+ "Behavior:\n" +
+ "• Components can be manually assigned or auto-discovered\n" +
+ "• Auto-discovery searches: this GameObject → children\n" +
+ "• Listens to interactionComplete event from Interactable\n" +
+ "• Triggers animation ONLY when interaction succeeds (success = true)\n" +
+ "• Uses SetTrigger() with the specified trigger name",
+ MessageType.None
+ );
+
+ serializedObject.ApplyModifiedProperties();
+ }
+ }
+}
\ No newline at end of file
diff --git a/Assets/Editor/TriggerAnimationOnInteractionEditor.cs.meta b/Assets/Editor/TriggerAnimationOnInteractionEditor.cs.meta
new file mode 100644
index 00000000..2560415b
--- /dev/null
+++ b/Assets/Editor/TriggerAnimationOnInteractionEditor.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: cb5befe45d9c4f9ab10e20ee4c946cf4
+timeCreated: 1766153779
\ No newline at end of file
diff --git a/Assets/Prefabs/Characters/PulverCharacter.prefab b/Assets/Prefabs/Characters/PulverCharacter.prefab
index 2999c216..10fda47f 100644
--- a/Assets/Prefabs/Characters/PulverCharacter.prefab
+++ b/Assets/Prefabs/Characters/PulverCharacter.prefab
@@ -19,6 +19,7 @@ GameObject:
- component: {fileID: 4467608046243604209}
- component: {fileID: 887004370483616855}
- component: {fileID: 3342764969520326238}
+ - component: {fileID: 3719568838531840149}
m_Layer: 8
m_Name: PulverCharacter
m_TagString: Pulver
@@ -379,6 +380,23 @@ MonoBehaviour:
m_EditorClassIdentifier: AppleHillsScripts::UI.Tracking.TrackableTarget
icon: {fileID: -4695408507704126972, guid: 31cfa2eea2b70af4b97a7a588fad0758, type: 3}
trackDistance: 0
+--- !u!114 &3719568838531840149
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1102400833121127473}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: AppleHillsScripts::Minigames.TrashMaze.Core.PulverController
+ moveSpeed: 5
+ obstacleMask:
+ serializedVersion: 2
+ m_Bits: 64
+ colliderRadius: 0.5
--- !u!1 &5934518940303293264
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/Prefabs/Levels/Dump/ControllerSwitchItem.prefab b/Assets/Prefabs/Levels/Dump/TrashMazeSwitch_ToPulver.prefab
similarity index 83%
rename from Assets/Prefabs/Levels/Dump/ControllerSwitchItem.prefab
rename to Assets/Prefabs/Levels/Dump/TrashMazeSwitch_ToPulver.prefab
index ff940535..85b42471 100644
--- a/Assets/Prefabs/Levels/Dump/ControllerSwitchItem.prefab
+++ b/Assets/Prefabs/Levels/Dump/TrashMazeSwitch_ToPulver.prefab
@@ -1,6 +1,6 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
---- !u!1 &1190045438452732069
+--- !u!1 &4288680281016853984
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -8,75 +8,40 @@ GameObject:
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- - component: {fileID: 1136290793271151494}
- - component: {fileID: 5320225058563658919}
- - component: {fileID: 7813271480623895155}
- - component: {fileID: 6196606079257550}
+ - component: {fileID: 7174400527820218549}
+ - component: {fileID: 2385482746242042445}
+ - component: {fileID: 6654368395698888506}
+ - component: {fileID: 6351228451172460299}
m_Layer: 0
- m_Name: ControllerSwitchItem_To_pulver
+ m_Name: TrashMazeSwitch_ToPulver
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
---- !u!4 &1136290793271151494
+--- !u!4 &7174400527820218549
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1190045438452732069}
+ m_GameObject: {fileID: 4288680281016853984}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
- m_LocalPosition: {x: -56, y: -38.8, z: 0}
+ m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 10, y: 10, z: 10}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!114 &5320225058563658919
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1190045438452732069}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 915abd653d714ea3ae11bbf14feafb1e, type: 3}
- m_Name:
- m_EditorClassIdentifier: AppleHillsScripts::Items.ControllerSwitchItem
- isOneTime: 0
- cooldown: -1
- characterToInteract: 2
- interactionStarted:
- m_PersistentCalls:
- m_Calls: []
- interactionInterrupted:
- m_PersistentCalls:
- m_Calls: []
- characterArrived:
- m_PersistentCalls:
- m_Calls: []
- interactionComplete:
- m_PersistentCalls:
- m_Calls: []
- targetControllerName: pulver
- cameraSwitchMode: 2
- targetVirtualCamera: {fileID: 0}
- targetCameraState: 1
- visualRepresentation: {fileID: 0}
- OnCharacterSwitch:
- m_PersistentCalls:
- m_Calls: []
---- !u!212 &7813271480623895155
+--- !u!212 &2385482746242042445
SpriteRenderer:
serializedVersion: 2
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1190045438452732069}
+ m_GameObject: {fileID: 4288680281016853984}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
@@ -128,13 +93,13 @@ SpriteRenderer:
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
---- !u!61 &6196606079257550
+--- !u!61 &6654368395698888506
BoxCollider2D:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1190045438452732069}
+ m_GameObject: {fileID: 4288680281016853984}
m_Enabled: 1
serializedVersion: 3
m_Density: 1
@@ -174,3 +139,37 @@ BoxCollider2D:
m_AutoTiling: 0
m_Size: {x: 0.44087836, y: 0.440879}
m_EdgeRadius: 0
+--- !u!114 &6351228451172460299
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4288680281016853984}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe2d6200d0d54638adb61befd932228f, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: AppleHillsScripts::Minigames.TrashMaze.Objects.TrashMazeSwitchToPulver
+ isOneTime: 0
+ cooldown: -1
+ characterToInteract: 2
+ interactionStarted:
+ m_PersistentCalls:
+ m_Calls: []
+ interactionInterrupted:
+ m_PersistentCalls:
+ m_Calls: []
+ characterArrived:
+ m_PersistentCalls:
+ m_Calls: []
+ interactionComplete:
+ m_PersistentCalls:
+ m_Calls: []
+ targetControllerName: pulver
+ visualRepresentation: {fileID: 0}
+ OnCharacterSwitch:
+ m_PersistentCalls:
+ m_Calls: []
+ teleportTarget: {fileID: 0}
+ targetCameraState: 1
diff --git a/Assets/Prefabs/Levels/Dump/ControllerSwitchItem.prefab.meta b/Assets/Prefabs/Levels/Dump/TrashMazeSwitch_ToPulver.prefab.meta
similarity index 74%
rename from Assets/Prefabs/Levels/Dump/ControllerSwitchItem.prefab.meta
rename to Assets/Prefabs/Levels/Dump/TrashMazeSwitch_ToPulver.prefab.meta
index 9a6fc1eb..55eb3b6b 100644
--- a/Assets/Prefabs/Levels/Dump/ControllerSwitchItem.prefab.meta
+++ b/Assets/Prefabs/Levels/Dump/TrashMazeSwitch_ToPulver.prefab.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: 67a60833f9f205940a2308bd74a2863e
+guid: 842cf175dd9fcfa438021df8b9868fed
PrefabImporter:
externalObjects: {}
userData:
diff --git a/Assets/Scenes/Levels/Dump.unity b/Assets/Scenes/Levels/Dump.unity
index 628da413..69581ae0 100644
--- a/Assets/Scenes/Levels/Dump.unity
+++ b/Assets/Scenes/Levels/Dump.unity
@@ -250,6 +250,8 @@ MonoBehaviour:
camera: {fileID: 2103114177}
- state: 1
camera: {fileID: 1690472046}
+ - state: 2
+ camera: {fileID: 71927589}
inactivePriority: 10
activePriority: 20
cinemachineBrain: {fileID: 0}
@@ -534,7 +536,7 @@ Transform:
m_GameObject: {fileID: 34947687}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
- m_LocalPosition: {x: -2.8, y: 32.3, z: 0}
+ m_LocalPosition: {x: -32.5, y: 49, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
@@ -794,6 +796,122 @@ Transform:
m_Children: []
m_Father: {fileID: 1811781475}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &71927586
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 71927590}
+ - component: {fileID: 71927589}
+ - component: {fileID: 71927588}
+ - component: {fileID: 71927587}
+ m_Layer: 0
+ m_Name: PulverMainCamera
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &71927587
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 71927586}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f453f694addf4275988fac205bc91968, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ BoundingShape2D: {fileID: 260349092}
+ Damping: 3
+ SlowingDistance: 20
+ OversizeWindow:
+ Enabled: 0
+ MaxWindowSize: 0
+ Padding: 0
+ m_LegacyMaxWindowSize: -2
+--- !u!114 &71927588
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 71927586}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: b617507da6d07e749b7efdb34e1173e1, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ TrackerSettings:
+ BindingMode: 4
+ PositionDamping: {x: 2, y: 0.5, z: 1}
+ AngularDampingMode: 0
+ RotationDamping: {x: 1, y: 1, z: 1}
+ QuaternionDamping: 1
+ FollowOffset: {x: 0, y: 0, z: -10}
+--- !u!114 &71927589
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 71927586}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f9dfa5b682dcd46bda6128250e975f58, type: 3}
+ m_Name:
+ m_EditorClassIdentifier:
+ Priority:
+ Enabled: 0
+ m_Value: 0
+ OutputChannel: 1
+ StandbyUpdate: 2
+ m_StreamingVersion: 20241001
+ m_LegacyPriority: 0
+ Target:
+ TrackingTarget: {fileID: 0}
+ LookAtTarget: {fileID: 0}
+ CustomLookAtTarget: 0
+ Lens:
+ FieldOfView: 60
+ OrthographicSize: 15
+ NearClipPlane: 0.3
+ FarClipPlane: 1000
+ Dutch: 0
+ ModeOverride: 0
+ PhysicalProperties:
+ GateFit: 2
+ SensorSize: {x: 21.946, y: 16.002}
+ LensShift: {x: 0, y: 0}
+ FocusDistance: 10
+ Iso: 200
+ ShutterSpeed: 0.005
+ Aperture: 16
+ BladeCount: 5
+ Curvature: {x: 2, y: 11}
+ BarrelClipping: 0.25
+ Anamorphism: 0
+ BlendHint: 0
+--- !u!4 &71927590
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 71927586}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: -23.4, y: 60, z: -10}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &75198423
PrefabInstance:
m_ObjectHideFlags: 0
@@ -1239,6 +1357,10 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
+ - target: {fileID: 397845239581813408, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
+ propertyPath: revealMode
+ value: 0
+ objectReference: {fileID: 0}
- target: {fileID: 6259373434446242904, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
propertyPath: m_Name
value: RevealableObject_Full (2)
@@ -1247,6 +1369,10 @@ PrefabInstance:
propertyPath: m_SortingOrder
value: 5
objectReference: {fileID: 0}
+ - target: {fileID: 6487644332527623320, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
+ propertyPath: 'm_Materials.Array.data[0]'
+ value:
+ objectReference: {fileID: 2100000, guid: 07b06abfc5d910b4a8c525979cd29f29, type: 2}
- target: {fileID: 7983424933738472089, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
propertyPath: m_LocalScale.x
value: 1.4999999
@@ -1523,6 +1649,10 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
+ - target: {fileID: 397845239581813408, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
+ propertyPath: revealMode
+ value: 0
+ objectReference: {fileID: 0}
- target: {fileID: 6259373434446242904, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
propertyPath: m_Name
value: RevealableObject_Full (1)
@@ -1531,6 +1661,10 @@ PrefabInstance:
propertyPath: m_SortingOrder
value: 5
objectReference: {fileID: 0}
+ - target: {fileID: 6487644332527623320, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
+ propertyPath: 'm_Materials.Array.data[0]'
+ value:
+ objectReference: {fileID: 2100000, guid: 07b06abfc5d910b4a8c525979cd29f29, type: 2}
- target: {fileID: 7983424933738472089, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
propertyPath: m_LocalScale.x
value: 1.4999999
@@ -362638,7 +362772,7 @@ Transform:
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 279415745}
- - {fileID: 364374238}
+ - {fileID: 1375690799}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &321386744
@@ -362904,7 +363038,7 @@ Transform:
m_GameObject: {fileID: 335178887}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
- m_LocalPosition: {x: -2.88557, y: -13.7, z: 0}
+ m_LocalPosition: {x: -3.5, y: -21.6, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
@@ -363004,90 +363138,6 @@ Transform:
m_CorrespondingSourceObject: {fileID: 2279794774899604319, guid: dcf9c65ccd2fb8f4a9416f9c8c687efc, type: 3}
m_PrefabInstance: {fileID: 344619549}
m_PrefabAsset: {fileID: 0}
---- !u!1 &364374237
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 364374238}
- - component: {fileID: 364374240}
- - component: {fileID: 364374239}
- m_Layer: 0
- m_Name: GateLeverSM
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 1
---- !u!4 &364374238
-Transform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 364374237}
- serializedVersion: 2
- m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
- m_LocalPosition: {x: 4.41, y: 1.6, z: 0}
- m_LocalScale: {x: 1, y: 1, z: 1}
- m_ConstrainProportionsScale: 0
- m_Children:
- - {fileID: 1375690799}
- - {fileID: 2055391652}
- m_Father: {fileID: 314493343}
- m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!114 &364374239
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 364374237}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 6f56763d30b94bf6873d395a6c116eb5, type: 3}
- m_Name:
- m_EditorClassIdentifier: AppleHillsScripts::Core.SaveLoad.AppleMachine
- defaultState: {fileID: 1375690798}
- currentState: {fileID: 0}
- _unityEventsFolded: 0
- verbose: 0
- allowReentry: 0
- returnToDefaultOnDisable: 1
- OnStateExited:
- m_PersistentCalls:
- m_Calls: []
- OnStateEntered:
- m_PersistentCalls:
- m_Calls: []
- OnFirstStateEntered:
- m_PersistentCalls:
- m_Calls: []
- OnFirstStateExited:
- m_PersistentCalls:
- m_Calls: []
- OnLastStateEntered:
- m_PersistentCalls:
- m_Calls: []
- OnLastStateExited:
- m_PersistentCalls:
- m_Calls: []
- customSaveId:
---- !u!114 &364374240
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 364374237}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 55938fb1577dd4ad3af7e994048c86f6, type: 3}
- m_Name:
- m_EditorClassIdentifier: PixelplacementAssembly::Pixelplacement.Initialization
--- !u!1001 &387015772
PrefabInstance:
m_ObjectHideFlags: 0
@@ -363967,17 +364017,6 @@ Transform:
m_Children: []
m_Father: {fileID: 808652563}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!114 &422515281 stripped
-MonoBehaviour:
- m_CorrespondingSourceObject: {fileID: 5320225058563658919, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- m_PrefabInstance: {fileID: 1416739373}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 0}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 915abd653d714ea3ae11bbf14feafb1e, type: 3}
- m_Name:
- m_EditorClassIdentifier: AppleHillsScripts::Items.ControllerSwitchItem
--- !u!1 &431233784
GameObject:
m_ObjectHideFlags: 0
@@ -364149,78 +364188,6 @@ Transform:
m_CorrespondingSourceObject: {fileID: 5014539179916997503, guid: 8f64aad8c86323346b250b856c95a694, type: 3}
m_PrefabInstance: {fileID: 488001284}
m_PrefabAsset: {fileID: 0}
---- !u!1001 &493264642
-PrefabInstance:
- m_ObjectHideFlags: 0
- serializedVersion: 2
- m_Modification:
- serializedVersion: 3
- m_TransformParent: {fileID: 0}
- m_Modifications:
- - target: {fileID: 2771277034307921359, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
- propertyPath: m_LocalPosition.x
- value: 184.52
- objectReference: {fileID: 0}
- - target: {fileID: 2771277034307921359, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
- propertyPath: m_LocalPosition.y
- value: -18.65
- objectReference: {fileID: 0}
- - target: {fileID: 2771277034307921359, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
- propertyPath: m_LocalPosition.z
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 2771277034307921359, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
- propertyPath: m_LocalRotation.w
- value: 1
- objectReference: {fileID: 0}
- - target: {fileID: 2771277034307921359, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
- propertyPath: m_LocalRotation.x
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 2771277034307921359, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
- propertyPath: m_LocalRotation.y
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 2771277034307921359, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
- propertyPath: m_LocalRotation.z
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 2771277034307921359, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
- propertyPath: m_LocalEulerAnglesHint.x
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 2771277034307921359, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
- propertyPath: m_LocalEulerAnglesHint.y
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 2771277034307921359, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
- propertyPath: m_LocalEulerAnglesHint.z
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 4478761448117894178, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
- propertyPath: followerController
- value:
- objectReference: {fileID: 978182240}
- - target: {fileID: 7654873269754452578, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
- propertyPath: m_Name
- value: MazePulver
- objectReference: {fileID: 0}
- m_RemovedComponents: []
- m_RemovedGameObjects: []
- m_AddedGameObjects: []
- m_AddedComponents: []
- m_SourcePrefab: {fileID: 100100000, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
---- !u!114 &493264643 stripped
-MonoBehaviour:
- m_CorrespondingSourceObject: {fileID: 2461082630725827914, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
- m_PrefabInstance: {fileID: 493264642}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 0}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9, type: 3}
- m_Name:
- m_EditorClassIdentifier: AppleHillsScripts::Minigames.TrashMaze.Core.PulverController
--- !u!1001 &515214626
PrefabInstance:
m_ObjectHideFlags: 0
@@ -365157,83 +365124,6 @@ SpriteRenderer:
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
---- !u!1001 &612593024
-PrefabInstance:
- m_ObjectHideFlags: 0
- serializedVersion: 2
- m_Modification:
- serializedVersion: 3
- m_TransformParent: {fileID: 0}
- m_Modifications:
- - target: {fileID: 6196606079257550, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_AutoTiling
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalPosition.x
- value: 155.01
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalPosition.y
- value: 51.28
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalPosition.z
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalRotation.w
- value: 1
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalRotation.x
- value: -0
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalRotation.y
- value: -0
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalRotation.z
- value: -0
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalEulerAnglesHint.x
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalEulerAnglesHint.y
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalEulerAnglesHint.z
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 1190045438452732069, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_Name
- value: ControllerSwitchItem_To_trafalgar
- objectReference: {fileID: 0}
- - target: {fileID: 1190045438452732069, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_Layer
- value: 10
- objectReference: {fileID: 0}
- - target: {fileID: 5320225058563658919, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: targetCameraState
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 5320225058563658919, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: characterToInteract
- value: 2
- objectReference: {fileID: 0}
- - target: {fileID: 5320225058563658919, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: targetControllerName
- value: trafalgar
- objectReference: {fileID: 0}
- m_RemovedComponents: []
- m_RemovedGameObjects: []
- m_AddedGameObjects: []
- m_AddedComponents: []
- m_SourcePrefab: {fileID: 100100000, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
--- !u!1001 &616993880
PrefabInstance:
m_ObjectHideFlags: 0
@@ -368542,22 +368432,6 @@ PrefabInstance:
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 8ac0210dbf9d7754e9526d6d5c214f49, type: 3}
---- !u!114 &978182240 stripped
-MonoBehaviour:
- m_CorrespondingSourceObject: {fileID: 3435632802124758411, guid: 8ac0210dbf9d7754e9526d6d5c214f49, type: 3}
- m_PrefabInstance: {fileID: 978182239}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 0}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: f82afe7b57bd4e0b9f51a1cca06765f1, type: 3}
- m_Name:
- m_EditorClassIdentifier:
---- !u!4 &982261853 stripped
-Transform:
- m_CorrespondingSourceObject: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- m_PrefabInstance: {fileID: 1416739373}
- m_PrefabAsset: {fileID: 0}
--- !u!1001 &991820504
PrefabInstance:
m_ObjectHideFlags: 0
@@ -369691,14 +369565,13 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0, type: 3}
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::Minigames.TrashMaze.Core.TrashMazeController
- pulverController: {fileID: 493264643}
backgroundRenderer: {fileID: 1701992366}
exitPosition: {fileID: 34947688}
audioSource: {fileID: 1111361131}
mazeStartAudio: {fileID: 8300000, guid: 62991916c294dca4895a60d9d519826a, type: 3}
mazeEndAudio: {fileID: 8300000, guid: c9550c46c9189834e9d33789b30a29b1, type: 3}
- pulverControllerSwitch: {fileID: 422515281}
- trafalgarControllerSwitch: {fileID: 1181795917}
+ pulverControllerSwitch: {fileID: 7813271480150380656}
+ trafalgarControllerSwitch: {fileID: 1375690804}
--- !u!4 &1111361130
Transform:
m_ObjectHideFlags: 0
@@ -369714,6 +369587,8 @@ Transform:
m_Children:
- {fileID: 335178888}
- {fileID: 34947688}
+ - {fileID: 1464597613}
+ - {fileID: 3469485976163789742}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1111361131
@@ -370176,17 +370051,6 @@ MonoBehaviour:
m_EditorClassIdentifier: AppleHillsScripts::Interactions.CharacterMoveToTarget
characterType: 2
positionOffset: {x: 0, y: 0, z: 1}
---- !u!114 &1181795917 stripped
-MonoBehaviour:
- m_CorrespondingSourceObject: {fileID: 5320225058563658919, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- m_PrefabInstance: {fileID: 612593024}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 0}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 915abd653d714ea3ae11bbf14feafb1e, type: 3}
- m_Name:
- m_EditorClassIdentifier: AppleHillsScripts::Items.ControllerSwitchItem
--- !u!1 &1185671601
GameObject:
m_ObjectHideFlags: 0
@@ -371485,10 +371349,12 @@ GameObject:
- component: {fileID: 1375690799}
- component: {fileID: 1375690803}
- component: {fileID: 1375690802}
- - component: {fileID: 1375690801}
- component: {fileID: 1375690800}
+ - component: {fileID: 1375690804}
+ - component: {fileID: 1375690805}
+ - component: {fileID: 1375690806}
m_Layer: 0
- m_Name: Gate_Lever
+ m_Name: TriggerAnimationOnInteraction (PushLever)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -371503,11 +371369,11 @@ Transform:
m_GameObject: {fileID: 1375690798}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
- m_LocalPosition: {x: -16.209839, y: 10.90921, z: 0}
+ m_LocalPosition: {x: -11.799839, y: 12.5092125, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
- m_Father: {fileID: 364374238}
+ m_Father: {fileID: 314493343}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1375690800
MonoBehaviour:
@@ -371521,57 +371387,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 95e46aacea5b42888ee7881894193c11, type: 3}
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::Core.SaveLoad.AppleState
---- !u!114 &1375690801
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 1375690798}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 833a4ccef651449e973e623d9107bef5, type: 3}
- m_Name:
- m_EditorClassIdentifier: AppleHillsScripts::Interactions.OneClickInteraction
- isOneTime: 0
- cooldown: -1
- characterToInteract: 2
- interactionStarted:
- m_PersistentCalls:
- m_Calls: []
- interactionInterrupted:
- m_PersistentCalls:
- m_Calls: []
- characterArrived:
- m_PersistentCalls:
- m_Calls: []
- interactionComplete:
- m_PersistentCalls:
- m_Calls:
- - m_Target: {fileID: 279415743}
- m_TargetAssemblyTypeName: Core.SaveLoad.AppleMachine, AppleHillsScripts
- m_MethodName: ChangeState
- m_Mode: 5
- m_Arguments:
- m_ObjectArgument: {fileID: 0}
- m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
- m_IntArgument: 0
- m_FloatArgument: 0
- m_StringArgument: Gate_Unlocked
- m_BoolArgument: 0
- m_CallState: 2
- - m_Target: {fileID: 364374239}
- m_TargetAssemblyTypeName: Core.SaveLoad.AppleMachine, AppleHillsScripts
- m_MethodName: ChangeState
- m_Mode: 5
- m_Arguments:
- m_ObjectArgument: {fileID: 0}
- m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
- m_IntArgument: 0
- m_FloatArgument: 0
- m_StringArgument: Gate_Lever_Activated
- m_BoolArgument: 0
- m_CallState: 2
--- !u!61 &1375690802
BoxCollider2D:
m_ObjectHideFlags: 0
@@ -371677,6 +371492,88 @@ SpriteRenderer:
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_SpriteSortPoint: 0
+--- !u!114 &1375690804
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1375690798}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 60a323cce5144fe9bae5dd3b313315a1, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: AppleHillsScripts::Minigames.TrashMaze.Objects.TrashMazeSwitchToTrafalgar
+ isOneTime: 1
+ cooldown: -1
+ characterToInteract: 2
+ interactionStarted:
+ m_PersistentCalls:
+ m_Calls: []
+ interactionInterrupted:
+ m_PersistentCalls:
+ m_Calls: []
+ characterArrived:
+ m_PersistentCalls:
+ m_Calls: []
+ interactionComplete:
+ m_PersistentCalls:
+ m_Calls:
+ - m_Target: {fileID: 279415743}
+ m_TargetAssemblyTypeName: Core.SaveLoad.AppleMachine, AppleHillsScripts
+ m_MethodName: ChangeState
+ m_Mode: 5
+ m_Arguments:
+ m_ObjectArgument: {fileID: 0}
+ m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
+ m_IntArgument: 0
+ m_FloatArgument: 0
+ m_StringArgument: Gate_Unlocked
+ m_BoolArgument: 0
+ m_CallState: 2
+ targetControllerName: trafalgar
+ visualRepresentation: {fileID: 0}
+ OnCharacterSwitch:
+ m_PersistentCalls:
+ m_Calls: []
+ targetCameraState: 0
+--- !u!95 &1375690805
+Animator:
+ serializedVersion: 7
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1375690798}
+ m_Enabled: 1
+ m_Avatar: {fileID: 0}
+ m_Controller: {fileID: 9100000, guid: 1c7291e3bd94735488b7642ecbd96fda, type: 2}
+ m_CullingMode: 0
+ m_UpdateMode: 0
+ m_ApplyRootMotion: 0
+ m_LinearVelocityBlending: 0
+ m_StabilizeFeet: 0
+ m_AnimatePhysics: 0
+ m_WarningMessage:
+ m_HasTransformHierarchy: 1
+ m_AllowConstantClipSamplingOptimization: 1
+ m_KeepAnimatorStateOnDisable: 0
+ m_WriteDefaultValuesOnDisable: 0
+--- !u!114 &1375690806
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1375690798}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f7da1b8703214c4e813e672ba8fc3b8e, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: AppleHillsScripts::Interactions.TriggerAnimationOnInteraction
+ interactable: {fileID: 0}
+ animator: {fileID: 0}
+ triggerName: PushLever
--- !u!1001 &1405921638
PrefabInstance:
m_ObjectHideFlags: 0
@@ -371885,79 +371782,6 @@ Transform:
m_CorrespondingSourceObject: {fileID: 2279794774899604319, guid: dcf9c65ccd2fb8f4a9416f9c8c687efc, type: 3}
m_PrefabInstance: {fileID: 1414028416}
m_PrefabAsset: {fileID: 0}
---- !u!1001 &1416739373
-PrefabInstance:
- m_ObjectHideFlags: 0
- serializedVersion: 2
- m_Modification:
- serializedVersion: 3
- m_TransformParent: {fileID: 2046020906}
- m_Modifications:
- - target: {fileID: 6196606079257550, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_Size.x
- value: 0.75
- objectReference: {fileID: 0}
- - target: {fileID: 6196606079257550, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_Size.y
- value: 0.86
- objectReference: {fileID: 0}
- - target: {fileID: 6196606079257550, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_Offset.y
- value: 0.08
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalPosition.x
- value: -0.13
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalPosition.y
- value: -0.63
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalPosition.z
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalRotation.w
- value: 1
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalRotation.x
- value: -0
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalRotation.y
- value: -0
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalRotation.z
- value: -0
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalEulerAnglesHint.x
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalEulerAnglesHint.y
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 1136290793271151494, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_LocalEulerAnglesHint.z
- value: 0
- objectReference: {fileID: 0}
- - target: {fileID: 1190045438452732069, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_Name
- value: ControllerSwitchItem_To_pulver
- objectReference: {fileID: 0}
- - target: {fileID: 1190045438452732069, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
- propertyPath: m_Layer
- value: 10
- objectReference: {fileID: 0}
- m_RemovedComponents: []
- m_RemovedGameObjects: []
- m_AddedGameObjects: []
- m_AddedComponents: []
- m_SourcePrefab: {fileID: 100100000, guid: 67a60833f9f205940a2308bd74a2863e, type: 3}
--- !u!1001 &1427164836
PrefabInstance:
m_ObjectHideFlags: 0
@@ -372296,6 +372120,37 @@ Transform:
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1464597612
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 1464597613}
+ m_Layer: 0
+ m_Name: MazeExitPoint
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &1464597613
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1464597612}
+ serializedVersion: 2
+ m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+ m_LocalPosition: {x: -210.7, y: 58, z: 0}
+ m_LocalScale: {x: 1, y: 1, z: 1}
+ m_ConstrainProportionsScale: 0
+ m_Children: []
+ m_Father: {fileID: 1111361130}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &1484543257
PrefabInstance:
m_ObjectHideFlags: 0
@@ -372736,11 +372591,6 @@ SpriteRenderer:
m_CorrespondingSourceObject: {fileID: 163496279268562402, guid: 8ac0210dbf9d7754e9526d6d5c214f49, type: 3}
m_PrefabInstance: {fileID: 978182239}
m_PrefabAsset: {fileID: 0}
---- !u!4 &1566161568 stripped
-Transform:
- m_CorrespondingSourceObject: {fileID: 2771277034307921359, guid: 182ee38fc449c6342b8a401844067b5b, type: 3}
- m_PrefabInstance: {fileID: 493264642}
- m_PrefabAsset: {fileID: 0}
--- !u!1001 &1585675372
PrefabInstance:
m_ObjectHideFlags: 0
@@ -373099,7 +372949,7 @@ MonoBehaviour:
m_StreamingVersion: 20241001
m_LegacyPriority: 0
Target:
- TrackingTarget: {fileID: 1566161568}
+ TrackingTarget: {fileID: 0}
LookAtTarget: {fileID: 0}
CustomLookAtTarget: 0
Lens:
@@ -373225,7 +373075,7 @@ PrefabInstance:
m_Modifications:
- target: {fileID: 397845239581813408, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
propertyPath: revealMode
- value: 1
+ value: 0
objectReference: {fileID: 0}
- target: {fileID: 6259373434446242904, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
propertyPath: m_Name
@@ -373701,6 +373551,10 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
+ - target: {fileID: 397845239581813408, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
+ propertyPath: revealMode
+ value: 0
+ objectReference: {fileID: 0}
- target: {fileID: 6259373434446242904, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
propertyPath: m_Name
value: RevealableObject_Full (4)
@@ -373709,6 +373563,10 @@ PrefabInstance:
propertyPath: m_SortingOrder
value: 5
objectReference: {fileID: 0}
+ - target: {fileID: 6487644332527623320, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
+ propertyPath: 'm_Materials.Array.data[0]'
+ value:
+ objectReference: {fileID: 2100000, guid: 07b06abfc5d910b4a8c525979cd29f29, type: 2}
- target: {fileID: 7983424933738472089, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
propertyPath: m_LocalScale.x
value: 1.4999999
@@ -374762,6 +374620,10 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
+ - target: {fileID: 397845239581813408, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
+ propertyPath: revealMode
+ value: 0
+ objectReference: {fileID: 0}
- target: {fileID: 6259373434446242904, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
propertyPath: m_Name
value: RevealableObject_Full (3)
@@ -374770,6 +374632,10 @@ PrefabInstance:
propertyPath: m_SortingOrder
value: 5
objectReference: {fileID: 0}
+ - target: {fileID: 6487644332527623320, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
+ propertyPath: 'm_Materials.Array.data[0]'
+ value:
+ objectReference: {fileID: 2100000, guid: 07b06abfc5d910b4a8c525979cd29f29, type: 2}
- target: {fileID: 7983424933738472089, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
propertyPath: m_LocalScale.x
value: 1.4999999
@@ -375756,7 +375622,7 @@ Transform:
m_ConstrainProportionsScale: 1
m_Children:
- {fileID: 325338071}
- - {fileID: 982261853}
+ - {fileID: 1136290793736341914}
m_Father: {fileID: 1083848119}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &2046020908
@@ -375869,180 +375735,6 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 95e46aacea5b42888ee7881894193c11, type: 3}
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::Core.SaveLoad.AppleState
---- !u!1 &2055391651
-GameObject:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- serializedVersion: 6
- m_Component:
- - component: {fileID: 2055391652}
- - component: {fileID: 2055391657}
- - component: {fileID: 2055391656}
- - component: {fileID: 2055391655}
- - component: {fileID: 2055391653}
- m_Layer: 0
- m_Name: Gate_Lever_Activated
- m_TagString: Untagged
- m_Icon: {fileID: 0}
- m_NavMeshLayer: 0
- m_StaticEditorFlags: 0
- m_IsActive: 0
---- !u!4 &2055391652
-Transform:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2055391651}
- serializedVersion: 2
- m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
- m_LocalPosition: {x: -16.209839, y: 10.90921, z: 0}
- m_LocalScale: {x: 1, y: 1, z: 1}
- m_ConstrainProportionsScale: 0
- m_Children: []
- m_Father: {fileID: 364374238}
- m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
---- !u!114 &2055391653
-MonoBehaviour:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2055391651}
- m_Enabled: 1
- m_EditorHideFlags: 0
- m_Script: {fileID: 11500000, guid: 95e46aacea5b42888ee7881894193c11, type: 3}
- m_Name:
- m_EditorClassIdentifier: AppleHillsScripts::Core.SaveLoad.AppleState
---- !u!61 &2055391655
-BoxCollider2D:
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2055391651}
- m_Enabled: 1
- serializedVersion: 3
- m_Density: 1
- m_Material: {fileID: 0}
- m_IncludeLayers:
- serializedVersion: 2
- m_Bits: 0
- m_ExcludeLayers:
- serializedVersion: 2
- m_Bits: 0
- m_LayerOverridePriority: 0
- m_ForceSendLayers:
- serializedVersion: 2
- m_Bits: 4294967295
- m_ForceReceiveLayers:
- serializedVersion: 2
- m_Bits: 4294967295
- m_ContactCaptureLayers:
- serializedVersion: 2
- m_Bits: 4294967295
- m_CallbackLayers:
- serializedVersion: 2
- m_Bits: 4294967295
- m_IsTrigger: 0
- m_UsedByEffector: 0
- m_CompositeOperation: 0
- m_CompositeOrder: 0
- m_Offset: {x: 0, y: 0}
- m_SpriteTilingProperty:
- border: {x: 0, y: 0, z: 0, w: 0}
- pivot: {x: -0.8218391, y: -0.16904762}
- oldSize: {x: 4.35, y: 6.3}
- newSize: {x: 4.35, y: 6.3}
- adaptiveTilingThreshold: 0.5
- drawMode: 0
- adaptiveTiling: 0
- m_AutoTiling: 0
- m_Size: {x: 5.48, y: 4.67}
- m_EdgeRadius: 0
---- !u!95 &2055391656
-Animator:
- serializedVersion: 7
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2055391651}
- m_Enabled: 1
- m_Avatar: {fileID: 0}
- m_Controller: {fileID: 9100000, guid: 1c7291e3bd94735488b7642ecbd96fda, type: 2}
- m_CullingMode: 0
- m_UpdateMode: 0
- m_ApplyRootMotion: 0
- m_LinearVelocityBlending: 0
- m_StabilizeFeet: 0
- m_AnimatePhysics: 0
- m_WarningMessage:
- m_HasTransformHierarchy: 1
- m_AllowConstantClipSamplingOptimization: 1
- m_KeepAnimatorStateOnDisable: 0
- m_WriteDefaultValuesOnDisable: 0
---- !u!212 &2055391657
-SpriteRenderer:
- serializedVersion: 2
- m_ObjectHideFlags: 0
- m_CorrespondingSourceObject: {fileID: 0}
- m_PrefabInstance: {fileID: 0}
- m_PrefabAsset: {fileID: 0}
- m_GameObject: {fileID: 2055391651}
- m_Enabled: 1
- m_CastShadows: 0
- m_ReceiveShadows: 0
- m_DynamicOccludee: 1
- m_StaticShadowCaster: 0
- m_MotionVectors: 1
- m_LightProbeUsage: 1
- m_ReflectionProbeUsage: 1
- m_RayTracingMode: 0
- m_RayTraceProcedural: 0
- m_RayTracingAccelStructBuildFlagsOverride: 0
- m_RayTracingAccelStructBuildFlags: 1
- m_SmallMeshCulling: 1
- m_ForceMeshLod: -1
- m_MeshLodSelectionBias: 0
- m_RenderingLayerMask: 1
- m_RendererPriority: 0
- m_Materials:
- - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2}
- m_StaticBatchInfo:
- firstSubMesh: 0
- subMeshCount: 0
- m_StaticBatchRoot: {fileID: 0}
- m_ProbeAnchor: {fileID: 0}
- m_LightProbeVolumeOverride: {fileID: 0}
- m_ScaleInLightmap: 1
- m_ReceiveGI: 1
- m_PreserveUVs: 0
- m_IgnoreNormalsForChartDetection: 0
- m_ImportantGI: 0
- m_StitchLightmapSeams: 1
- m_SelectedEditorRenderState: 0
- m_MinimumChartSize: 4
- m_AutoUVMaxDistance: 0.5
- m_AutoUVMaxAngle: 89
- m_LightmapParameters: {fileID: 0}
- m_GlobalIlluminationMeshLod: 0
- m_SortingLayerID: 0
- m_SortingLayer: 0
- m_SortingOrder: 0
- m_MaskInteraction: 0
- m_Sprite: {fileID: 1983369653, guid: aa293e7c44a20ca40aa2cdd1c9989e53, type: 3}
- m_Color: {r: 1, g: 1, b: 1, a: 1}
- m_FlipX: 0
- m_FlipY: 0
- m_DrawMode: 0
- m_Size: {x: 4.35, y: 6.3}
- m_AdaptiveModeThreshold: 0.5
- m_SpriteTileMode: 0
- m_WasSpriteAssigned: 1
- m_SpriteSortPoint: 0
--- !u!1001 &2062953913
PrefabInstance:
m_ObjectHideFlags: 0
@@ -376477,6 +376169,10 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
+ - target: {fileID: 397845239581813408, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
+ propertyPath: revealMode
+ value: 0
+ objectReference: {fileID: 0}
- target: {fileID: 6259373434446242904, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
propertyPath: m_Name
value: RevealableObject_Full
@@ -376485,6 +376181,10 @@ PrefabInstance:
propertyPath: m_SortingOrder
value: 5
objectReference: {fileID: 0}
+ - target: {fileID: 6487644332527623320, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
+ propertyPath: 'm_Materials.Array.data[0]'
+ value:
+ objectReference: {fileID: 2100000, guid: 07b06abfc5d910b4a8c525979cd29f29, type: 2}
- target: {fileID: 7983424933738472089, guid: 07f826f001311e04984c3efc9ee2b897, type: 3}
propertyPath: m_LocalPosition.x
value: 281.2
@@ -376709,6 +376409,197 @@ BoxCollider2D:
m_AutoTiling: 0
m_Size: {x: 10.129412, y: 20.188236}
m_EdgeRadius: 0
+--- !u!4 &1136290793736341914 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 7174400527820218549, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ m_PrefabInstance: {fileID: 1519670137707491371}
+ m_PrefabAsset: {fileID: 0}
+--- !u!61 &1148295399314789409
+BoxCollider2D:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7508331423109164795}
+ m_Enabled: 1
+ serializedVersion: 3
+ m_Density: 1
+ m_Material: {fileID: 0}
+ m_IncludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_ExcludeLayers:
+ serializedVersion: 2
+ m_Bits: 0
+ m_LayerOverridePriority: 0
+ m_ForceSendLayers:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_ForceReceiveLayers:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_ContactCaptureLayers:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_CallbackLayers:
+ serializedVersion: 2
+ m_Bits: 4294967295
+ m_IsTrigger: 0
+ m_UsedByEffector: 0
+ m_CompositeOperation: 0
+ m_CompositeOrder: 0
+ m_Offset: {x: -0.002767995, y: -0.000000022351742}
+ m_SpriteTilingProperty:
+ border: {x: 0, y: 0, z: 0, w: 0}
+ pivot: {x: 0.5, y: 0.5}
+ oldSize: {x: 0.42, y: 0.42}
+ newSize: {x: 0.42, y: 0.42}
+ adaptiveTilingThreshold: 0.5
+ drawMode: 0
+ adaptiveTiling: 0
+ m_AutoTiling: 0
+ m_Size: {x: 0.44087836, y: 0.440879}
+ m_EdgeRadius: 0
+--- !u!1001 &1519670137707491371
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 2046020906}
+ m_Modifications:
+ - target: {fileID: 4288680281016853984, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: m_Name
+ value: TrashMazeSwitch_ToPulver
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: isOneTime
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: teleportTarget
+ value:
+ objectReference: {fileID: 335178888}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.size
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.data[0].m_Mode
+ value: 5
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.data[1].m_Mode
+ value: 5
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.data[0].m_Target
+ value:
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.data[1].m_Target
+ value:
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.data[0].m_CallState
+ value: 2
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.data[1].m_CallState
+ value: 2
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName
+ value: ChangeState
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.data[1].m_MethodName
+ value: ChangeState
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName
+ value: Core.SaveLoad.AppleMachine, AppleHillsScripts
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.data[1].m_TargetAssemblyTypeName
+ value: Core.SaveLoad.AppleMachine, AppleHillsScripts
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_StringArgument
+ value: Gate_Lever_Activated
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.data[1].m_Arguments.m_StringArgument
+ value: Gate_Lever_Activated
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName
+ value: UnityEngine.Object, UnityEngine
+ objectReference: {fileID: 0}
+ - target: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: interactionComplete.m_PersistentCalls.m_Calls.Array.data[1].m_Arguments.m_ObjectArgumentAssemblyTypeName
+ value: UnityEngine.Object, UnityEngine
+ objectReference: {fileID: 0}
+ - target: {fileID: 7174400527820218549, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7174400527820218549, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7174400527820218549, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7174400527820218549, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 7174400527820218549, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7174400527820218549, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7174400527820218549, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7174400527820218549, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7174400527820218549, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7174400527820218549, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+--- !u!4 &3469485976163789742
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7508331423109164795}
+ serializedVersion: 2
+ m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+ m_LocalPosition: {x: -32.2, y: 49, z: 0}
+ m_LocalScale: {x: 10, y: 10, z: 10}
+ m_ConstrainProportionsScale: 1
+ m_Children: []
+ m_Father: {fileID: 1111361130}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &3499746104239896964
PrefabInstance:
m_ObjectHideFlags: 0
@@ -376771,6 +376662,124 @@ Transform:
m_CorrespondingSourceObject: {fileID: 5014539179916997503, guid: 8f64aad8c86323346b250b856c95a694, type: 3}
m_PrefabInstance: {fileID: 3499746104239896964}
m_PrefabAsset: {fileID: 0}
+--- !u!1 &7508331423109164795
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 3469485976163789742}
+ - component: {fileID: 8263102232937677142}
+ - component: {fileID: 1148295399314789409}
+ - component: {fileID: 8263102232937677143}
+ m_Layer: 0
+ m_Name: MazeExit
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &7813271480150380656 stripped
+MonoBehaviour:
+ m_CorrespondingSourceObject: {fileID: 6351228451172460299, guid: 842cf175dd9fcfa438021df8b9868fed, type: 3}
+ m_PrefabInstance: {fileID: 1519670137707491371}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 0}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: fe2d6200d0d54638adb61befd932228f, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: AppleHillsScripts::Minigames.TrashMaze.Objects.TrashMazeSwitchToPulver
+--- !u!212 &8263102232937677142
+SpriteRenderer:
+ serializedVersion: 2
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7508331423109164795}
+ m_Enabled: 1
+ m_CastShadows: 0
+ m_ReceiveShadows: 0
+ m_DynamicOccludee: 1
+ m_StaticShadowCaster: 0
+ m_MotionVectors: 1
+ m_LightProbeUsage: 1
+ m_ReflectionProbeUsage: 1
+ m_RayTracingMode: 0
+ m_RayTraceProcedural: 0
+ m_RayTracingAccelStructBuildFlagsOverride: 0
+ m_RayTracingAccelStructBuildFlags: 1
+ m_SmallMeshCulling: 1
+ m_ForceMeshLod: -1
+ m_MeshLodSelectionBias: 0
+ m_RenderingLayerMask: 1
+ m_RendererPriority: 0
+ m_Materials:
+ - {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2}
+ m_StaticBatchInfo:
+ firstSubMesh: 0
+ subMeshCount: 0
+ m_StaticBatchRoot: {fileID: 0}
+ m_ProbeAnchor: {fileID: 0}
+ m_LightProbeVolumeOverride: {fileID: 0}
+ m_ScaleInLightmap: 1
+ m_ReceiveGI: 1
+ m_PreserveUVs: 0
+ m_IgnoreNormalsForChartDetection: 0
+ m_ImportantGI: 0
+ m_StitchLightmapSeams: 1
+ m_SelectedEditorRenderState: 0
+ m_MinimumChartSize: 4
+ m_AutoUVMaxDistance: 0.5
+ m_AutoUVMaxAngle: 89
+ m_LightmapParameters: {fileID: 0}
+ m_GlobalIlluminationMeshLod: 0
+ m_SortingLayerID: 0
+ m_SortingLayer: 0
+ m_SortingOrder: 0
+ m_MaskInteraction: 0
+ m_Sprite: {fileID: 2636902231072113825, guid: ee014bd71cac2bc4ab845f435726f383, type: 3}
+ m_Color: {r: 1, g: 1, b: 1, a: 1}
+ m_FlipX: 0
+ m_FlipY: 0
+ m_DrawMode: 0
+ m_Size: {x: 0.42, y: 0.42}
+ m_AdaptiveModeThreshold: 0.5
+ m_SpriteTileMode: 0
+ m_WasSpriteAssigned: 1
+ m_SpriteSortPoint: 0
+--- !u!114 &8263102232937677143
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 7508331423109164795}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 4543937f547b49ce8e506aac52442f73, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: AppleHillsScripts::Minigames.TrashMaze.Objects.MazeExit
+ isOneTime: 1
+ cooldown: -1
+ characterToInteract: 2
+ interactionStarted:
+ m_PersistentCalls:
+ m_Calls: []
+ interactionInterrupted:
+ m_PersistentCalls:
+ m_Calls: []
+ characterArrived:
+ m_PersistentCalls:
+ m_Calls: []
+ interactionComplete:
+ m_PersistentCalls:
+ m_Calls: []
+ teleportTarget: {fileID: 1464597613}
+ targetCameraState: 2
--- !u!1660057539 &9223372036854775807
SceneRoots:
m_ObjectHideFlags: 0
@@ -376792,9 +376801,9 @@ SceneRoots:
- {fileID: 431233785}
- {fileID: 5147849}
- {fileID: 2103114178}
+ - {fileID: 71927590}
- {fileID: 1690472047}
- {fileID: 826431953}
- - {fileID: 612593024}
- {fileID: 1451084253}
- {fileID: 1111361130}
- {fileID: 1701992365}
@@ -376804,7 +376813,6 @@ SceneRoots:
- {fileID: 1903450827}
- {fileID: 1768635206}
- {fileID: 1712644079}
- - {fileID: 493264642}
- {fileID: 748374783}
- {fileID: 911572953}
- {fileID: 1811781475}
diff --git a/Assets/Scripts/Input/BasePlayerMovementController.cs b/Assets/Scripts/Input/BasePlayerMovementController.cs
index ebd63a0a..9ee5fa38 100644
--- a/Assets/Scripts/Input/BasePlayerMovementController.cs
+++ b/Assets/Scripts/Input/BasePlayerMovementController.cs
@@ -406,6 +406,13 @@ namespace Input
while (!_interruptMoveTo)
{
+ // Use AIPath's built-in destination check if available
+ if (_aiPath != null && _aiPath.reachedDestination)
+ {
+ break;
+ }
+
+ // Fallback to distance check
Vector2 current2D = new Vector2(transform.position.x, transform.position.y);
Vector2 target2D = new Vector2(target.x, target.y);
float dist = Vector2.Distance(current2D, target2D);
@@ -425,6 +432,74 @@ namespace Input
}
#endregion
+
+ #region Controller Lifecycle
+
+ ///
+ /// Called when this controller is given input control.
+ /// Default implementation cleans up any active movement state.
+ /// Override to add controller-specific activation logic.
+ ///
+ public virtual void ActivateController()
+ {
+ // Stop any in-progress movement coroutines
+ if (_moveToCoroutine != null)
+ {
+ StopCoroutine(_moveToCoroutine);
+ _moveToCoroutine = null;
+ }
+
+ if (_pathfindingDragCoroutine != null)
+ {
+ StopCoroutine(_pathfindingDragCoroutine);
+ _pathfindingDragCoroutine = null;
+ }
+
+ // Reset movement state
+ _isHolding = false;
+ _directMoveVelocity = Vector3.zero;
+ _interruptMoveTo = false;
+
+ Logging.Debug($"[{GetType().Name}] Controller activated");
+ }
+
+ ///
+ /// Called when this controller loses input control.
+ /// Default implementation stops all movement and cleans up state.
+ /// Override to add controller-specific deactivation logic.
+ ///
+ public virtual void DeactivateController()
+ {
+ // Stop all movement coroutines
+ if (_moveToCoroutine != null)
+ {
+ StopCoroutine(_moveToCoroutine);
+ _moveToCoroutine = null;
+ }
+
+ if (_pathfindingDragCoroutine != null)
+ {
+ StopCoroutine(_pathfindingDragCoroutine);
+ _pathfindingDragCoroutine = null;
+ }
+
+ // Reset all movement state
+ _isHolding = false;
+ _directMoveVelocity = Vector3.zero;
+ _interruptMoveTo = false;
+ _isMoving = false;
+
+ // Stop AIPath movement
+ if (_aiPath != null)
+ {
+ _aiPath.enabled = false;
+ _aiPath.isStopped = true;
+ }
+
+ Logging.Debug($"[{GetType().Name}] Controller deactivated");
+ }
+
+ #endregion
}
}
diff --git a/Assets/Scripts/Input/PlayerTouchController.cs b/Assets/Scripts/Input/PlayerTouchController.cs
index 0e6b174d..231902d2 100644
--- a/Assets/Scripts/Input/PlayerTouchController.cs
+++ b/Assets/Scripts/Input/PlayerTouchController.cs
@@ -1,5 +1,4 @@
using UnityEngine;
-using AppleHills.Core.Settings;
using Core;
using Core.Settings;
@@ -45,6 +44,10 @@ namespace Input
InputManager.Instance.RegisterController("trafalgar", this, setAsDefaultConsumer: true);
Logging.Debug($"[PlayerTouchController] Registered controller '{gameObject.name}' as default consumer");
}
+
+ // Auto-activate as the default player controller
+ ActivateController();
+ Logging.Debug("[PlayerTouchController] Auto-activated as default player controller");
}
#region IInteractingCharacter Override
diff --git a/Assets/Scripts/Interactions/ControllerSwitchItem.cs b/Assets/Scripts/Interactions/ControllerSwitchItem.cs
index 9afc208b..010e8787 100644
--- a/Assets/Scripts/Interactions/ControllerSwitchItem.cs
+++ b/Assets/Scripts/Interactions/ControllerSwitchItem.cs
@@ -3,9 +3,6 @@ using System.Collections;
using Core;
using Input;
using Interactions;
-using Minigames.TrashMaze.Core;
-using Minigames.TrashMaze.Data;
-using Unity.Cinemachine;
using UnityEngine;
using UnityEngine.Events;
@@ -20,61 +17,27 @@ namespace Items
public bool hasBeenUsed;
}
- ///
- /// Camera switching mode for controller switch items
- ///
- public enum CameraSwitchMode
- {
- ///
- /// No camera switching - controller switch only
- ///
- None,
-
- ///
- /// Use a direct reference to a Cinemachine camera
- ///
- DirectReference,
-
- ///
- /// Use TrashMazeCameraController state manager API
- ///
- TrashMazeCameraState
- }
///
- /// An interactable item that switches control from one character controller to another.
- /// When clicked:
- /// 1. The selected character moves to this item's position
- /// 2. Upon arrival, the current controller is disabled
- /// 3. Camera blends to the target camera (based on camera mode)
- /// 4. Once the blend completes, control switches to the target controller
+ /// Base interactable item that switches control from one character controller to another.
+ /// Level-agnostic - handles only controller switching logic.
+ /// Derive from this class for level-specific behavior (camera switching, teleportation, etc.)
///
public class ControllerSwitchItem : SaveableInteractable
{
[Header("Controller Switch Settings")]
- [Tooltip("Name of the controller to switch to (must match GameObject name of the controller)")]
- [SerializeField] private string targetControllerName;
-
- [Header("Camera Settings")]
- [Tooltip("How to switch the camera when changing controllers")]
- [SerializeField] private CameraSwitchMode cameraSwitchMode = CameraSwitchMode.None;
-
- [Tooltip("Direct camera reference (only used if Camera Switch Mode is DirectReference)")]
- [SerializeField] private CinemachineCamera targetVirtualCamera;
-
- [Tooltip("Target camera state (only used if Camera Switch Mode is TrashMazeCameraState)")]
- [SerializeField] private TrashMazeCameraState targetCameraState;
+ [Tooltip("Name of the controller to switch to (must match registration name in InputManager)")]
+ [SerializeField] protected string targetControllerName;
[Header("Visual Feedback")]
[Tooltip("Visual representation to hide after use (optional)")]
- [SerializeField] private GameObject visualRepresentation;
+ [SerializeField] protected GameObject visualRepresentation;
public UnityEvent OnCharacterSwitch;
// State
- private bool _hasBeenUsed;
- private PlayerTouchController _currentPlayerController;
- private bool _isSwitching;
+ protected bool _hasBeenUsed;
+ protected bool _isSwitching;
public override string SaveId => $"{gameObject.scene.name}/ControllerSwitchItem/{gameObject.name}";
@@ -123,68 +86,50 @@ namespace Items
if (_isSwitching)
return false;
- // By the time this is called, the interacting character has already arrived at this item
- // We just need to perform the controller/camera switch
-
Logging.Debug("[ControllerSwitchItem] Starting controller switch sequence");
- // Start the async switch sequence (camera blend + controller switch)
StartCoroutine(SwitchControllerSequence());
- // Return true immediately - interaction is considered successful
- // The coroutine will handle the actual switching asynchronously
return true;
}
- private IEnumerator SwitchControllerSequence()
+ protected virtual IEnumerator SwitchControllerSequence()
{
_isSwitching = true;
- // Step 1: Get current player controller (the one we're switching FROM)
- _currentPlayerController = FindFirstObjectByType();
- if (_currentPlayerController == null)
+ // Step 1: Get controllers
+ var currentController = InputManager.Instance.GetActiveController();
+ var targetController = InputManager.Instance.GetController(targetControllerName);
+
+ if (currentController == null || targetController == null)
{
- Debug.LogError("[ControllerSwitchItem] Could not find PlayerTouchController in scene!");
+ Debug.LogError($"[ControllerSwitchItem] Failed to get controllers! Current: {currentController}, Target: {targetController} (name: {targetControllerName})");
_isSwitching = false;
yield break;
}
+
+ GameObject currentGameObject = (currentController as MonoBehaviour)?.gameObject;
+ GameObject targetGameObject = (targetController as MonoBehaviour)?.gameObject;
+
+ Logging.Debug($"[ControllerSwitchItem] Switching from {currentGameObject?.name} to {targetGameObject?.name}");
- Logging.Debug("[ControllerSwitchItem] Character has arrived, beginning switch");
+ // Step 2: Deactivate current controller
+ DeactivateCurrentController(currentController, currentGameObject);
- // Step 2: Disable current player controller
- _currentPlayerController.enabled = false;
- Logging.Debug("[ControllerSwitchItem] Disabled current player controller");
+ // Step 3: Activate target controller
+ ActivateTargetController(targetController, targetGameObject);
- // Step 3: Blend to target camera based on mode
- yield return SwitchCamera();
-
- // Step 4: Switch to target controller
- ITouchInputConsumer targetController = InputManager.Instance.GetController(targetControllerName);
- if (targetController != null)
+ // Step 4: Switch InputManager to target controller
+ bool switchSuccess = InputManager.Instance.SwitchToController(targetControllerName);
+
+ if (switchSuccess)
{
- // Enable the target controller if it's a MonoBehaviour
- if (targetController is MonoBehaviour targetMono)
- {
- targetMono.enabled = true;
- Logging.Debug($"[ControllerSwitchItem] Enabled target controller: {targetControllerName}");
- }
-
- // Switch input control to the target controller
- bool switchSuccess = InputManager.Instance.SwitchToController(targetControllerName);
-
- if (switchSuccess)
- {
- Logging.Debug($"[ControllerSwitchItem] Successfully switched input to controller: {targetControllerName}");
- OnCharacterSwitch.Invoke();
- }
- else
- {
- Debug.LogError($"[ControllerSwitchItem] Failed to switch to controller: {targetControllerName}");
- }
+ Logging.Debug($"[ControllerSwitchItem] Successfully switched input to controller: {targetControllerName}");
+ OnCharacterSwitch.Invoke();
}
else
{
- Debug.LogError($"[ControllerSwitchItem] Target controller '{targetControllerName}' not found!");
+ Debug.LogError($"[ControllerSwitchItem] Failed to switch to controller: {targetControllerName}");
}
// Step 5: Mark as used if one-time use
@@ -197,79 +142,65 @@ namespace Items
_isSwitching = false;
}
- private IEnumerator SwitchCamera()
+ protected virtual void DeactivateCurrentController(ITouchInputConsumer currentController, GameObject currentGameObject)
{
- switch (cameraSwitchMode)
+ // If current is a player controller, deactivate it
+ if (currentController is BasePlayerMovementController currentPlayerController)
{
- case CameraSwitchMode.None:
- // No camera switching
- Logging.Debug("[ControllerSwitchItem] No camera switching configured");
- break;
-
- case CameraSwitchMode.DirectReference:
- if (targetVirtualCamera != null)
- {
- Logging.Debug($"[ControllerSwitchItem] Blending to camera: {targetVirtualCamera.name}");
-
- // Set the target camera as highest priority
- targetVirtualCamera.Priority = 100;
-
- // Wait for camera blend to complete
- yield return WaitForCameraBlend();
- }
- else
- {
- Debug.LogWarning("[ControllerSwitchItem] DirectReference mode selected but no camera assigned!");
- }
- break;
-
- case CameraSwitchMode.TrashMazeCameraState:
- if (TrashMazeCameraController.Instance != null)
- {
- Logging.Debug($"[ControllerSwitchItem] Switching to camera state: {targetCameraState}");
-
- // Use the state manager API
- if (targetCameraState == TrashMazeCameraState.Gameplay)
- {
- TrashMazeCameraController.Instance.SwitchToGameplay();
- }
- else if (targetCameraState == TrashMazeCameraState.Maze)
- {
- TrashMazeCameraController.Instance.SwitchToMaze();
- }
-
- // Wait for camera blend to complete
- yield return WaitForCameraBlend();
- }
- else
- {
- Debug.LogError("[ControllerSwitchItem] TrashMazeCameraController instance not found in scene!");
- }
- break;
+ currentPlayerController.DeactivateController();
+ }
+
+ // If switching FROM follower mode, deactivate follower
+ if (currentGameObject != null)
+ {
+ var currentFollower = currentGameObject.GetComponent();
+ if (currentFollower != null && currentFollower.IsFollowerActive)
+ {
+ currentFollower.DeactivateFollower();
+ }
}
}
- private IEnumerator WaitForCameraBlend()
+ protected virtual void ActivateTargetController(ITouchInputConsumer targetController, GameObject targetGameObject)
{
- CinemachineBrain brain = Camera.main?.GetComponent();
- if (brain != null)
+ // Check if target GameObject has FollowerController component
+ FollowerController targetFollower = null;
+ if (targetGameObject != null)
{
- // Wait until blend is not active
- while (brain.IsBlending)
- {
- yield return null;
- }
+ targetFollower = targetGameObject.GetComponent();
+ }
+
+ // If switching TO a GameObject with FollowerController, we need special handling
+ if (targetFollower != null)
+ {
+ // Switching TO Pulver player control (Pulver has both FollowerController and PulverController)
+ // Deactivate follower mode, activate player control
+ targetFollower.DeactivateFollower();
- Logging.Debug("[ControllerSwitchItem] Camera blend completed");
+ if (targetController is BasePlayerMovementController targetPlayerController)
+ {
+ targetPlayerController.ActivateController();
+ }
}
else
{
- // If no brain, just wait a brief moment
- yield return new WaitForSeconds(0.5f);
+ // Switching TO Trafalgar (no FollowerController on Trafalgar)
+ // If there's a Pulver in the scene, activate its follower mode
+ var pulverFollower = FindFirstObjectByType();
+ if (pulverFollower != null)
+ {
+ pulverFollower.ActivateFollower();
+ }
+
+ // Activate the target player controller
+ if (targetController is BasePlayerMovementController targetPlayerController)
+ {
+ targetPlayerController.ActivateController();
+ }
}
}
- private void DisableVisual()
+ protected void DisableVisual()
{
if (visualRepresentation != null)
{
diff --git a/Assets/Scripts/Interactions/TriggerAnimationOnInteraction.cs b/Assets/Scripts/Interactions/TriggerAnimationOnInteraction.cs
new file mode 100644
index 00000000..2bf2e687
--- /dev/null
+++ b/Assets/Scripts/Interactions/TriggerAnimationOnInteraction.cs
@@ -0,0 +1,136 @@
+using Core;
+using UnityEngine;
+
+namespace Interactions
+{
+ ///
+ /// Triggers an animation when an interactable interaction completes successfully.
+ /// Auto-discovers Interactable and Animator components on the same GameObject or children.
+ ///
+ public class TriggerAnimationOnInteraction : MonoBehaviour
+ {
+ [Header("Component References (Optional)")]
+ [Tooltip("Interactable to listen to. Leave empty to auto-discover on this GameObject or children.")]
+ [SerializeField] private InteractableBase interactable;
+
+ [Tooltip("Animator to trigger. Leave empty to auto-discover on this GameObject or children.")]
+ [SerializeField] private Animator animator;
+
+ [Header("Animation Settings")]
+ [Tooltip("Name of the animation trigger to fire when interaction completes")]
+ [SerializeField] private string triggerName;
+
+ private InteractableBase _interactable;
+ private Animator _animator;
+ private bool _isInitialized;
+
+ private void Awake()
+ {
+ DiscoverComponents();
+ }
+
+ private void OnEnable()
+ {
+ if (_isInitialized && _interactable != null)
+ {
+ _interactable.interactionComplete.AddListener(OnInteractionComplete);
+ }
+ }
+
+ private void OnDisable()
+ {
+ if (_interactable != null)
+ {
+ _interactable.interactionComplete.RemoveListener(OnInteractionComplete);
+ }
+ }
+
+ ///
+ /// Auto-discover Interactable and Animator components if not manually assigned
+ ///
+ private void DiscoverComponents()
+ {
+ // Use assigned Interactable or try to find it
+ _interactable = interactable;
+ if (_interactable == null)
+ {
+ _interactable = GetComponent();
+ }
+ if (_interactable == null)
+ {
+ _interactable = GetComponentInChildren();
+ }
+
+ if (_interactable == null)
+ {
+ Debug.LogError($"[TriggerAnimationOnInteraction] No InteractableBase found on {gameObject.name} or its children!");
+ return;
+ }
+
+ // Use assigned Animator or try to find it
+ _animator = animator;
+ if (_animator == null)
+ {
+ _animator = GetComponent();
+ }
+ if (_animator == null)
+ {
+ _animator = GetComponentInChildren();
+ }
+
+ if (_animator == null)
+ {
+ Debug.LogError($"[TriggerAnimationOnInteraction] No Animator found on {gameObject.name} or its children!");
+ return;
+ }
+
+ if (string.IsNullOrEmpty(triggerName))
+ {
+ Debug.LogWarning($"[TriggerAnimationOnInteraction] Trigger name is empty on {gameObject.name}!");
+ }
+
+ _isInitialized = true;
+
+ string interactableSource = interactable != null ? "assigned" : "auto-discovered";
+ string animatorSource = animator != null ? "assigned" : "auto-discovered";
+ Logging.Debug($"[TriggerAnimationOnInteraction] Initialized on {gameObject.name} - Interactable: {_interactable.gameObject.name} ({interactableSource}), Animator: {_animator.gameObject.name} ({animatorSource})");
+ }
+
+ ///
+ /// Called when interaction completes
+ ///
+ /// Whether the interaction was successful
+ private void OnInteractionComplete(bool success)
+ {
+ if (!success)
+ {
+ Logging.Debug($"[TriggerAnimationOnInteraction] Interaction failed, not triggering animation");
+ return;
+ }
+
+ if (_animator == null || string.IsNullOrEmpty(triggerName))
+ {
+ return;
+ }
+
+ _animator.SetTrigger(triggerName);
+ Logging.Debug($"[TriggerAnimationOnInteraction] Triggered animation: {triggerName}");
+ }
+
+#if UNITY_EDITOR
+ private void OnValidate()
+ {
+ // Validate in editor
+ if (string.IsNullOrEmpty(triggerName))
+ {
+ name = "TriggerAnimationOnInteraction (NO TRIGGER)";
+ }
+ else
+ {
+ name = $"TriggerAnimationOnInteraction ({triggerName})";
+ }
+ }
+#endif
+ }
+}
+
diff --git a/Assets/Scripts/Interactions/TriggerAnimationOnInteraction.cs.meta b/Assets/Scripts/Interactions/TriggerAnimationOnInteraction.cs.meta
new file mode 100644
index 00000000..817100af
--- /dev/null
+++ b/Assets/Scripts/Interactions/TriggerAnimationOnInteraction.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: f7da1b8703214c4e813e672ba8fc3b8e
+timeCreated: 1766153752
\ No newline at end of file
diff --git a/Assets/Scripts/Minigames/TrashMaze/Core/PulverController.cs b/Assets/Scripts/Minigames/TrashMaze/Core/PulverController.cs
index 43f43f3b..3fcfce5d 100644
--- a/Assets/Scripts/Minigames/TrashMaze/Core/PulverController.cs
+++ b/Assets/Scripts/Minigames/TrashMaze/Core/PulverController.cs
@@ -23,6 +23,9 @@ namespace Minigames.TrashMaze.Core
// Vision radius loaded from settings
private float _visionRadius;
+ // Controller active state
+ private bool _isControllerActive = false;
+
// Public accessors for other systems
public static Vector2 PlayerPosition => Instance != null ? Instance.transform.position : Vector2.zero;
public static float VisionRadius => Instance != null ? Instance._visionRadius : 8f;
@@ -64,10 +67,18 @@ namespace Minigames.TrashMaze.Core
InputManager.Instance.RegisterController("pulver", this, setAsDefaultConsumer: false);
Logging.Debug($"[PulverController] Registered controller '{gameObject.name}'");
}
+
+ // Start deactivated - PulverController only activates when explicitly switched to
+ // This allows FollowerController to be the default mode for Pulver
+ DeactivateController();
+ Logging.Debug("[PulverController] Auto-deactivated - waiting for controller switch");
}
protected override void Update()
{
+ // Only process if this controller is active
+ if (!_isControllerActive) return;
+
base.Update(); // Call base for movement and animation
// Update global shader properties for vision system
@@ -127,6 +138,37 @@ namespace Minigames.TrashMaze.Core
}
#endregion
+
+ #region Controller Lifecycle Overrides
+
+ public override void ActivateController()
+ {
+ base.ActivateController();
+
+ _isControllerActive = true;
+
+ // Enable AIPath for player control
+ if (_aiPath != null)
+ {
+ _aiPath.enabled = true;
+ _aiPath.maxSpeed = Settings.MoveSpeed;
+ }
+
+ Logging.Debug("[PulverController] Controller activated - shader updates enabled");
+ }
+
+ public override void DeactivateController()
+ {
+ // DO NOT call base.DeactivateController() - it disables the shared AIPath
+ // that FollowerController needs for pickup dispatch!
+ // Just manage our own internal state instead
+
+ _isControllerActive = false;
+
+ Logging.Debug("[PulverController] Controller deactivated - shader updates paused (AIPath untouched for FollowerController)");
+ }
+
+ #endregion
}
}
diff --git a/Assets/Scripts/Minigames/TrashMaze/Core/TrashMazeCameraController.cs b/Assets/Scripts/Minigames/TrashMaze/Core/TrashMazeCameraController.cs
index 9601606d..defd7070 100644
--- a/Assets/Scripts/Minigames/TrashMaze/Core/TrashMazeCameraController.cs
+++ b/Assets/Scripts/Minigames/TrashMaze/Core/TrashMazeCameraController.cs
@@ -84,6 +84,17 @@ namespace Minigames.TrashMaze.Core
Logging.Debug("[TrashMazeCameraController] Switched to Maze camera");
}
+ ///
+ /// Switch to Pulver gameplay camera (Pulver in main level, player-controlled)
+ ///
+ public void SwitchToPulverGameplay()
+ {
+ SwitchToState(TrashMazeCameraState.PulverGameplay);
+
+ if (showDebugLogs)
+ Logging.Debug("[TrashMazeCameraController] Switched to PulverGameplay camera");
+ }
+
///
/// Get the gameplay camera
///
@@ -100,6 +111,14 @@ namespace Minigames.TrashMaze.Core
return GetCamera(TrashMazeCameraState.Maze);
}
+ ///
+ /// Get the Pulver gameplay camera
+ ///
+ public CinemachineCamera GetPulverGameplayCamera()
+ {
+ return GetCamera(TrashMazeCameraState.PulverGameplay);
+ }
+
#endregion
}
}
diff --git a/Assets/Scripts/Minigames/TrashMaze/Core/TrashMazeController.cs b/Assets/Scripts/Minigames/TrashMaze/Core/TrashMazeController.cs
index 4d542e8b..4a23d7ca 100644
--- a/Assets/Scripts/Minigames/TrashMaze/Core/TrashMazeController.cs
+++ b/Assets/Scripts/Minigames/TrashMaze/Core/TrashMazeController.cs
@@ -15,9 +15,6 @@ namespace Minigames.TrashMaze.Core
{
public static TrashMazeController Instance { get; private set; }
- [Header("Player")]
- [SerializeField] private PulverController pulverController;
-
[Header("Background")]
[Tooltip("Background sprite renderer - world size and center are inferred from its bounds")]
[SerializeField] private SpriteRenderer backgroundRenderer;
@@ -118,15 +115,6 @@ namespace Minigames.TrashMaze.Core
private void InitializePulver()
{
- if (pulverController == null)
- {
- Logging.Error("[TrashMazeController] PulverController reference not assigned! Please assign it in the Inspector.");
- return;
- }
-
- Logging.Debug($"[TrashMazeController] Pulver controller initialized at {pulverController.transform.position}");
-
- // TODO: Implement proper events for maze start and finish
pulverControllerSwitch.OnCharacterSwitch.AddListener(SwitchedToPulver);
trafalgarControllerSwitch.OnCharacterSwitch.AddListener(SwitchedToTrafalgar);
}
diff --git a/Assets/Scripts/Minigames/TrashMaze/Data/TrashMazeEnums.cs b/Assets/Scripts/Minigames/TrashMaze/Data/TrashMazeEnums.cs
index 1718247d..ed165942 100644
--- a/Assets/Scripts/Minigames/TrashMaze/Data/TrashMazeEnums.cs
+++ b/Assets/Scripts/Minigames/TrashMaze/Data/TrashMazeEnums.cs
@@ -13,7 +13,12 @@
///
/// Maze camera following Pulver when exploring the maze alone
///
- Maze
+ Maze,
+
+ ///
+ /// Gameplay camera following Pulver (after exiting maze while still player-controlled)
+ ///
+ PulverGameplay
}
}
diff --git a/Assets/Scripts/Minigames/TrashMaze/Objects/MazeExit.cs b/Assets/Scripts/Minigames/TrashMaze/Objects/MazeExit.cs
new file mode 100644
index 00000000..c373743a
--- /dev/null
+++ b/Assets/Scripts/Minigames/TrashMaze/Objects/MazeExit.cs
@@ -0,0 +1,92 @@
+using System.Collections;
+using Core;
+using Interactions;
+using Minigames.TrashMaze.Core;
+using Minigames.TrashMaze.Data;
+using UnityEngine;
+
+namespace Minigames.TrashMaze.Objects
+{
+ ///
+ /// Maze exit interactable that teleports Pulver out of the maze.
+ /// Uses camera blend with midway teleportation to create seamless transition.
+ /// Does NOT switch controllers - Pulver remains player-controlled.
+ ///
+ public class MazeExit : SaveableInteractable
+ {
+ [Header("Maze Exit Settings")]
+ [Tooltip("Transform where Pulver should be teleported to (maze exit position)")]
+ [SerializeField] private Transform teleportTarget;
+
+ [Tooltip("Camera state to blend to (typically PulverGameplay)")]
+ [SerializeField] private TrashMazeCameraState targetCameraState = TrashMazeCameraState.PulverGameplay;
+
+ public override string SaveId => $"{gameObject.scene.name}/MazeExit/{gameObject.name}";
+
+ protected override object GetSerializableState()
+ {
+ // MazeExit doesn't need to save state - it's a simple trigger
+ return null;
+ }
+
+ protected override void ApplySerializableState(string state)
+ {
+ // MazeExit doesn't need to restore state
+ }
+
+ protected override bool DoInteraction()
+ {
+ Logging.Debug("[MazeExit] Starting maze exit sequence");
+
+ StartCoroutine(ExitMazeSequence());
+
+ return true;
+ }
+
+ private IEnumerator ExitMazeSequence()
+ {
+ // Step 1: Find Pulver (should be the active player-controlled character)
+ var pulverController = FindFirstObjectByType();
+ if (pulverController == null)
+ {
+ Debug.LogError("[MazeExit] PulverController not found in scene!");
+ yield break;
+ }
+
+ GameObject pulverGameObject = pulverController.gameObject;
+ Logging.Debug($"[MazeExit] Found Pulver at {pulverGameObject.transform.position}");
+
+ // Step 2: Start camera blend to target state (PulverGameplay)
+ TeleportationHelper.StartCameraBlend(targetCameraState);
+
+ // Step 3: Wait for halfway through blend, teleport Pulver, and set tracking target
+ yield return TeleportationHelper.TeleportMidBlendAndSetTracking(pulverGameObject, teleportTarget, targetCameraState);
+
+ // Step 4: Wait for camera blend to complete
+ yield return TeleportationHelper.WaitForCameraBlend();
+
+ // Step 5: Stop Pulver movement to prevent it from continuing with cached input
+ if (pulverController != null)
+ {
+ pulverController.InterruptMoveTo();
+ Logging.Debug("[MazeExit] Stopped Pulver movement after teleportation");
+ }
+
+ Logging.Debug("[MazeExit] Maze exit sequence completed");
+ }
+
+#if UNITY_EDITOR
+ private void OnValidate()
+ {
+ name = "MazeExit";
+
+ // Default to PulverGameplay camera
+ if (targetCameraState == TrashMazeCameraState.Gameplay)
+ {
+ targetCameraState = TrashMazeCameraState.PulverGameplay;
+ }
+ }
+#endif
+ }
+}
+
diff --git a/Assets/Scripts/Minigames/TrashMaze/Objects/MazeExit.cs.meta b/Assets/Scripts/Minigames/TrashMaze/Objects/MazeExit.cs.meta
new file mode 100644
index 00000000..8d7da568
--- /dev/null
+++ b/Assets/Scripts/Minigames/TrashMaze/Objects/MazeExit.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 4543937f547b49ce8e506aac52442f73
+timeCreated: 1766151078
\ No newline at end of file
diff --git a/Assets/Scripts/Minigames/TrashMaze/Objects/TeleportationHelper.cs b/Assets/Scripts/Minigames/TrashMaze/Objects/TeleportationHelper.cs
new file mode 100644
index 00000000..79334ba4
--- /dev/null
+++ b/Assets/Scripts/Minigames/TrashMaze/Objects/TeleportationHelper.cs
@@ -0,0 +1,158 @@
+using System.Collections;
+using Core;
+using Minigames.TrashMaze.Core;
+using Minigames.TrashMaze.Data;
+using Unity.Cinemachine;
+using UnityEngine;
+
+namespace Minigames.TrashMaze.Objects
+{
+ ///
+ /// Static helper class for trash maze teleportation logic.
+ /// Provides reusable methods for:
+ /// - Starting camera blend to a target state
+ /// - Teleporting a character midway through blend
+ /// - Repositioning camera to teleported character
+ /// - Setting up camera tracking after blend completes
+ ///
+ public static class TeleportationHelper
+ {
+ ///
+ /// Get the camera for the target camera state
+ ///
+ private static CinemachineCamera GetTargetCamera(TrashMazeCameraState cameraState)
+ {
+ if (TrashMazeCameraController.Instance == null)
+ return null;
+
+ return cameraState switch
+ {
+ TrashMazeCameraState.Gameplay => TrashMazeCameraController.Instance.GetGameplayCamera(),
+ TrashMazeCameraState.Maze => TrashMazeCameraController.Instance.GetMazeCamera(),
+ TrashMazeCameraState.PulverGameplay => TrashMazeCameraController.Instance.GetPulverGameplayCamera(),
+ _ => null
+ };
+ }
+
+ ///
+ /// Start the camera blend to the target state
+ ///
+ public static void StartCameraBlend(TrashMazeCameraState targetState)
+ {
+ if (TrashMazeCameraController.Instance != null)
+ {
+ Logging.Debug($"[TeleportationHelper] Starting camera blend to {targetState}");
+
+ switch (targetState)
+ {
+ case TrashMazeCameraState.Gameplay:
+ TrashMazeCameraController.Instance.SwitchToGameplay();
+ break;
+ case TrashMazeCameraState.Maze:
+ TrashMazeCameraController.Instance.SwitchToMaze();
+ break;
+ case TrashMazeCameraState.PulverGameplay:
+ TrashMazeCameraController.Instance.SwitchToPulverGameplay();
+ break;
+ }
+ }
+ else
+ {
+ Debug.LogError($"[TeleportationHelper] TrashMazeCameraController instance not found!");
+ }
+ }
+
+ ///
+ /// Coroutine that waits for halfway through camera blend, then teleports the character
+ /// and immediately sets it as the tracking target for the camera
+ ///
+ public static IEnumerator TeleportMidBlendAndSetTracking(GameObject character, Transform teleportTarget, TrashMazeCameraState targetCameraState)
+ {
+ CinemachineBrain brain = Camera.main?.GetComponent();
+
+ if (brain != null && brain.IsBlending)
+ {
+ // Get blend duration from brain
+ float blendDuration = brain.ActiveBlend != null ? brain.ActiveBlend.Duration : 1f;
+ float halfBlendTime = blendDuration / 2f;
+
+ Logging.Debug($"[TeleportationHelper] Waiting {halfBlendTime:F2}s (half of {blendDuration:F2}s blend) before teleport");
+
+ // Wait for halfway through the blend
+ yield return new WaitForSeconds(halfBlendTime);
+ }
+ else
+ {
+ // Fallback: wait a short moment if no blend is detected
+ yield return new WaitForSeconds(0.25f);
+ }
+
+ // Teleport character
+ if (character != null && teleportTarget != null)
+ {
+ character.transform.position = teleportTarget.position;
+ character.transform.rotation = teleportTarget.rotation;
+ Logging.Debug($"[TeleportationHelper] Teleported {character.name} to {teleportTarget.position}");
+
+ // Immediately set as tracking target - let the blend finish naturally
+ SetCameraTrackingTarget(character, targetCameraState);
+ }
+ else
+ {
+ if (character == null)
+ Debug.LogError($"[TeleportationHelper] Character GameObject is null!");
+ if (teleportTarget == null)
+ Debug.LogError($"[TeleportationHelper] Teleport target not assigned!");
+ }
+ }
+
+ ///
+ /// Wait for camera blend to complete
+ ///
+ public static IEnumerator WaitForCameraBlend()
+ {
+ CinemachineBrain brain = Camera.main?.GetComponent();
+
+ if (brain != null)
+ {
+ // Wait until blend is complete
+ while (brain.IsBlending)
+ {
+ yield return null;
+ }
+
+ Logging.Debug($"[TeleportationHelper] Camera blend completed");
+ }
+ else
+ {
+ // Fallback: wait a brief moment
+ yield return new WaitForSeconds(0.5f);
+ }
+ }
+
+ ///
+ /// Set a character as the tracking target for the target camera
+ ///
+ public static void SetCameraTrackingTarget(GameObject character, TrashMazeCameraState targetCameraState)
+ {
+ if (character == null)
+ {
+ Debug.LogError($"[TeleportationHelper] Cannot set tracking target - character is null");
+ return;
+ }
+
+ var targetCamera = GetTargetCamera(targetCameraState);
+ if (targetCamera != null)
+ {
+ targetCamera.Follow = character.transform;
+ targetCamera.LookAt = character.transform;
+ Logging.Debug($"[TeleportationHelper] Set {character.name} as tracking target for {targetCameraState} camera");
+ }
+ else
+ {
+ Debug.LogError($"[TeleportationHelper] Target camera for state {targetCameraState} not found!");
+ }
+ }
+ }
+}
+
diff --git a/Assets/Scripts/Minigames/TrashMaze/Objects/TeleportationHelper.cs.meta b/Assets/Scripts/Minigames/TrashMaze/Objects/TeleportationHelper.cs.meta
new file mode 100644
index 00000000..6600368e
--- /dev/null
+++ b/Assets/Scripts/Minigames/TrashMaze/Objects/TeleportationHelper.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 1cf42e4c3a1e3c345aaef352bf84c762
\ No newline at end of file
diff --git a/Assets/Scripts/Minigames/TrashMaze/Objects/TrashMazeSwitchToPulver.cs b/Assets/Scripts/Minigames/TrashMaze/Objects/TrashMazeSwitchToPulver.cs
new file mode 100644
index 00000000..afe36e87
--- /dev/null
+++ b/Assets/Scripts/Minigames/TrashMaze/Objects/TrashMazeSwitchToPulver.cs
@@ -0,0 +1,109 @@
+using System.Collections;
+using Core;
+using Input;
+using Items;
+using Minigames.TrashMaze.Core;
+using Minigames.TrashMaze.Data;
+using Unity.Cinemachine;
+using UnityEngine;
+
+namespace Minigames.TrashMaze.Objects
+{
+ ///
+ /// Trash Maze specific controller switch that transitions TO Pulver (maze entrance).
+ /// Handles camera blend with midway teleportation to create the illusion of entering the maze.
+ ///
+ public class TrashMazeSwitchToPulver : ControllerSwitchItem
+ {
+ [Header("Trash Maze - To Pulver Settings")]
+ [Tooltip("Transform where Pulver should be teleported to (maze entrance)")]
+ [SerializeField] private Transform teleportTarget;
+
+ [Tooltip("Camera state to blend to (Maze camera)")]
+ [SerializeField] private TrashMazeCameraState targetCameraState = TrashMazeCameraState.Maze;
+
+ protected override IEnumerator SwitchControllerSequence()
+ {
+ _isSwitching = true;
+
+ // Step 1: Get controllers
+ var currentController = InputManager.Instance.GetActiveController();
+ var targetController = InputManager.Instance.GetController("pulver");
+
+ if (currentController == null || targetController == null)
+ {
+ Debug.LogError($"[TrashMazeSwitchToPulver] Failed to get controllers!");
+ _isSwitching = false;
+ yield break;
+ }
+
+ GameObject currentGameObject = (currentController as MonoBehaviour)?.gameObject;
+ GameObject targetGameObject = (targetController as MonoBehaviour)?.gameObject;
+
+ Logging.Debug($"[TrashMazeSwitchToPulver] Switching from {currentGameObject?.name} to Pulver");
+
+ // Step 2: Deactivate current controller (Trafalgar)
+ DeactivateCurrentController(currentController, currentGameObject);
+
+ // Step 3: Deactivate Pulver's follower controller (will be teleported)
+ if (targetGameObject != null)
+ {
+ var pulverFollower = targetGameObject.GetComponent();
+ if (pulverFollower != null)
+ {
+ pulverFollower.DeactivateFollower();
+ }
+ }
+
+ // Step 4: Start camera blend to maze
+ TeleportationHelper.StartCameraBlend(targetCameraState);
+
+ // Step 5: Wait for halfway through the blend, teleport Pulver, and set tracking target
+ yield return TeleportationHelper.TeleportMidBlendAndSetTracking(targetGameObject, teleportTarget, targetCameraState);
+
+ // Step 6: Wait for camera blend to complete
+ yield return TeleportationHelper.WaitForCameraBlend();
+
+ // Step 7: Activate Pulver controller
+ if (targetController is BasePlayerMovementController targetPlayerController)
+ {
+ targetPlayerController.ActivateController();
+ }
+
+ // Step 8: Switch InputManager to Pulver controller
+ bool switchSuccess = InputManager.Instance.SwitchToController("pulver");
+
+ if (switchSuccess)
+ {
+ Logging.Debug($"[TrashMazeSwitchToPulver] Successfully switched to Pulver controller");
+ OnCharacterSwitch.Invoke();
+ }
+ else
+ {
+ Debug.LogError($"[TrashMazeSwitchToPulver] Failed to switch to Pulver controller");
+ }
+
+ // Step 9: Mark as used if one-time use
+ if (isOneTime)
+ {
+ DisableVisual();
+ }
+
+ _isSwitching = false;
+ }
+
+#if UNITY_EDITOR
+ private void OnValidate()
+ {
+ name = "TrashMazeSwitch_ToPulver";
+
+ // Default to Maze camera
+ if (targetCameraState != TrashMazeCameraState.Maze)
+ {
+ targetCameraState = TrashMazeCameraState.Maze;
+ }
+ }
+#endif
+ }
+}
+
diff --git a/Assets/Scripts/Minigames/TrashMaze/Objects/TrashMazeSwitchToPulver.cs.meta b/Assets/Scripts/Minigames/TrashMaze/Objects/TrashMazeSwitchToPulver.cs.meta
new file mode 100644
index 00000000..ba4c57ad
--- /dev/null
+++ b/Assets/Scripts/Minigames/TrashMaze/Objects/TrashMazeSwitchToPulver.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: fe2d6200d0d54638adb61befd932228f
+timeCreated: 1766149622
\ No newline at end of file
diff --git a/Assets/Scripts/Minigames/TrashMaze/Objects/TrashMazeSwitchToTrafalgar.cs b/Assets/Scripts/Minigames/TrashMaze/Objects/TrashMazeSwitchToTrafalgar.cs
new file mode 100644
index 00000000..8bbb72ed
--- /dev/null
+++ b/Assets/Scripts/Minigames/TrashMaze/Objects/TrashMazeSwitchToTrafalgar.cs
@@ -0,0 +1,180 @@
+using System.Collections;
+using Core;
+using Input;
+using Items;
+using Minigames.TrashMaze.Core;
+using Minigames.TrashMaze.Data;
+using Unity.Cinemachine;
+using UnityEngine;
+
+namespace Minigames.TrashMaze.Objects
+{
+ ///
+ /// Trash Maze specific controller switch that transitions FROM Pulver back TO Trafalgar (maze exit).
+ /// Handles camera blend back to gameplay view and re-enables follower mode.
+ ///
+ public class TrashMazeSwitchToTrafalgar : ControllerSwitchItem
+ {
+ [Header("Trash Maze - To Trafalgar Settings")]
+ [Tooltip("Camera state to blend to (Gameplay camera)")]
+ [SerializeField] private TrashMazeCameraState targetCameraState = TrashMazeCameraState.Gameplay;
+
+ protected override IEnumerator SwitchControllerSequence()
+ {
+ _isSwitching = true;
+
+ // Step 1: Get controllers
+ var currentController = InputManager.Instance.GetActiveController();
+ var targetController = InputManager.Instance.GetController("trafalgar");
+
+ if (currentController == null || targetController == null)
+ {
+ Debug.LogError($"[TrashMazeSwitchToTrafalgar] Failed to get controllers!");
+ _isSwitching = false;
+ yield break;
+ }
+
+ GameObject currentGameObject = (currentController as MonoBehaviour)?.gameObject;
+ GameObject targetGameObject = (targetController as MonoBehaviour)?.gameObject;
+
+ Logging.Debug($"[TrashMazeSwitchToTrafalgar] Switching from Pulver to {targetGameObject?.name}");
+
+ // Step 2: Deactivate current controller (Pulver)
+ DeactivateCurrentController(currentController, currentGameObject);
+
+ // Explicitly deactivate PulverController to ensure it stops receiving input
+ if (currentGameObject != null)
+ {
+ var pulverController = currentGameObject.GetComponent();
+ if (pulverController != null)
+ {
+ pulverController.DeactivateController();
+ Logging.Debug("[TrashMazeSwitchToTrafalgar] Explicitly deactivated PulverController");
+ }
+ }
+
+ // Step 3: Start camera blend back to gameplay
+ StartCameraBlend();
+
+ // Step 4: Wait for camera blend to complete
+ yield return WaitForCameraBlend();
+
+ // Step 5: Unset Pulver as tracking target and set Trafalgar for gameplay camera
+ SetTrafalgarAsTrackingTarget(targetGameObject);
+
+ // Step 6: Activate Pulver's follower mode (so it follows Trafalgar)
+ if (currentGameObject != null)
+ {
+ var pulverFollower = currentGameObject.GetComponent();
+ if (pulverFollower != null)
+ {
+ pulverFollower.ActivateFollower();
+ }
+ }
+
+ // Step 7: Activate Trafalgar controller
+ if (targetController is BasePlayerMovementController targetPlayerController)
+ {
+ targetPlayerController.ActivateController();
+ }
+
+ // Step 8: Switch InputManager to Trafalgar controller
+ bool switchSuccess = InputManager.Instance.SwitchToController("trafalgar");
+
+ if (switchSuccess)
+ {
+ Logging.Debug($"[TrashMazeSwitchToTrafalgar] Successfully switched to Trafalgar controller");
+ OnCharacterSwitch.Invoke();
+ }
+ else
+ {
+ Debug.LogError($"[TrashMazeSwitchToTrafalgar] Failed to switch to Trafalgar controller");
+ }
+
+ // Step 8: Mark as used if one-time use
+ if (isOneTime)
+ {
+ DisableVisual();
+ }
+
+ _isSwitching = false;
+ }
+
+ private void StartCameraBlend()
+ {
+ if (TrashMazeCameraController.Instance != null)
+ {
+ Logging.Debug($"[TrashMazeSwitchToTrafalgar] Starting camera blend to {targetCameraState}");
+
+ if (targetCameraState == TrashMazeCameraState.Gameplay)
+ {
+ TrashMazeCameraController.Instance.SwitchToGameplay();
+ }
+ else
+ {
+ Logging.Warning($"[TrashMazeSwitchToTrafalgar] Unexpected camera state: {targetCameraState}");
+ }
+ }
+ else
+ {
+ Debug.LogError("[TrashMazeSwitchToTrafalgar] TrashMazeCameraController instance not found!");
+ }
+ }
+
+ private IEnumerator WaitForCameraBlend()
+ {
+ CinemachineBrain brain = Camera.main?.GetComponent();
+
+ if (brain != null)
+ {
+ // Wait until blend is complete
+ while (brain.IsBlending)
+ {
+ yield return null;
+ }
+
+ Logging.Debug("[TrashMazeSwitchToTrafalgar] Camera blend completed");
+ }
+ else
+ {
+ // Fallback: wait a brief moment
+ yield return new WaitForSeconds(0.5f);
+ }
+ }
+
+ private void SetTrafalgarAsTrackingTarget(GameObject trafalgarGameObject)
+ {
+ if (TrashMazeCameraController.Instance != null)
+ {
+ // Clear maze camera tracking target
+ var mazeCamera = TrashMazeCameraController.Instance.GetMazeCamera();
+ if (mazeCamera != null)
+ {
+ mazeCamera.Follow = null;
+ mazeCamera.LookAt = null;
+ Logging.Debug($"[TrashMazeSwitchToTrafalgar] Cleared Pulver as tracking target from maze camera");
+ }
+
+ // Set Trafalgar as tracking target for gameplay camera
+ if (trafalgarGameObject != null)
+ {
+ var gameplayCamera = TrashMazeCameraController.Instance.GetGameplayCamera();
+ if (gameplayCamera != null)
+ {
+ gameplayCamera.Follow = trafalgarGameObject.transform;
+ gameplayCamera.LookAt = trafalgarGameObject.transform;
+ Logging.Debug($"[TrashMazeSwitchToTrafalgar] Set Trafalgar as tracking target for gameplay camera");
+ }
+ }
+ }
+ }
+
+#if UNITY_EDITOR
+ private void OnValidate()
+ {
+ name = "TrashMazeSwitch_ToTrafalgar";
+ }
+#endif
+ }
+}
+
diff --git a/Assets/Scripts/Minigames/TrashMaze/Objects/TrashMazeSwitchToTrafalgar.cs.meta b/Assets/Scripts/Minigames/TrashMaze/Objects/TrashMazeSwitchToTrafalgar.cs.meta
new file mode 100644
index 00000000..480e5cc1
--- /dev/null
+++ b/Assets/Scripts/Minigames/TrashMaze/Objects/TrashMazeSwitchToTrafalgar.cs.meta
@@ -0,0 +1,3 @@
+fileFormatVersion: 2
+guid: 60a323cce5144fe9bae5dd3b313315a1
+timeCreated: 1766149639
\ No newline at end of file
diff --git a/Assets/Scripts/Movement/FollowerController.cs b/Assets/Scripts/Movement/FollowerController.cs
index 7c31d7df..f8580db4 100644
--- a/Assets/Scripts/Movement/FollowerController.cs
+++ b/Assets/Scripts/Movement/FollowerController.cs
@@ -42,6 +42,9 @@ public class FollowerController : ManagedBehaviour
private IFollowerSettings _settings;
private IInteractionSettings _interactionSettings;
+ // Follower active state
+ private bool _isFollowerActive = false;
+
private GameObject _playerRef;
private Transform _playerTransform;
private AIPath _playerAIPath;
@@ -133,10 +136,18 @@ public class FollowerController : ManagedBehaviour
{
// Find player reference when scene is ready (called for every scene load)
FindPlayerReference();
+
+ // Auto-activate follower mode when scene is ready
+ // This ensures Pulver automatically follows Trafalgar in any scene by default
+ ActivateFollower();
+ Logging.Debug("[FollowerController] Auto-activated follower mode on scene ready");
}
void Update()
{
+ // Only process if follower is active
+ if (!_isFollowerActive) return;
+
if (_playerTransform == null)
{
return;
@@ -274,6 +285,118 @@ public class FollowerController : ManagedBehaviour
}
}
+#region Follower Lifecycle
+
+ ///
+ /// Activate follower behavior - starts following the player.
+ ///
+ public void ActivateFollower()
+ {
+ _isFollowerActive = true;
+
+ // Find/refresh player reference
+ FindPlayerReference();
+
+ // Check if a pickup is currently in progress
+ bool pickupInProgress = _pickupCoroutine != null;
+
+ if (!pickupInProgress)
+ {
+ // Only reset to manual following mode if no pickup is active
+ _isManualFollowing = true;
+ _isReturningToPlayer = false;
+ _isPlayingStationaryAnimation = false;
+ _currentSpeed = 0f;
+ _timer = 0f;
+
+ // Stop stationary animation coroutine if active
+ if (_stationaryAnimationCoroutine != null)
+ {
+ StopCoroutine(_stationaryAnimationCoroutine);
+ _stationaryAnimationCoroutine = null;
+ }
+
+ // Disable AIPath for manual following
+ if (_aiPath != null)
+ {
+ _aiPath.enabled = false;
+ }
+
+ // Initialize follow target position
+ UpdateFollowTarget();
+ }
+ else
+ {
+ // Pickup in progress - don't interfere, just mark as active
+ Logging.Debug("[FollowerController] Follower activated but pickup in progress - not resetting state");
+ }
+
+ // Always enable TrackableTarget when follower is active
+ var trackableTarget = GetComponent();
+ if (trackableTarget != null)
+ {
+ trackableTarget.enabled = true;
+ }
+
+ Logging.Debug("[FollowerController] Follower activated");
+ }
+
+ ///
+ /// Deactivate follower behavior - stops all following and movement.
+ ///
+ public void DeactivateFollower()
+ {
+ _isFollowerActive = false;
+
+ // Stop all coroutines
+ if (_pickupCoroutine != null)
+ {
+ StopCoroutine(_pickupCoroutine);
+ _pickupCoroutine = null;
+ }
+
+ if (_stationaryAnimationCoroutine != null)
+ {
+ StopCoroutine(_stationaryAnimationCoroutine);
+ _stationaryAnimationCoroutine = null;
+ }
+
+ // Reset movement state
+ _isManualFollowing = false;
+ _isReturningToPlayer = false;
+ _isPlayingStationaryAnimation = false;
+ _currentSpeed = 0f;
+
+ // Disable AIPath
+ if (_aiPath != null)
+ {
+ _aiPath.enabled = false;
+ _aiPath.isStopped = true;
+ }
+
+ // Disable TrackableTarget component if present
+ var trackableTarget = GetComponent();
+ if (trackableTarget != null)
+ {
+ trackableTarget.enabled = false;
+ }
+
+ // Set animator to idle
+ if (_animator != null)
+ {
+ _animator.SetFloat("Speed", 0f);
+ }
+
+ Logging.Debug("[FollowerController] Follower deactivated");
+ }
+
+ ///
+ /// Check if follower is currently active.
+ ///
+ public bool IsFollowerActive => _isFollowerActive;
+
+#endregion
+
#region Movement
///
/// Updates the follower's target point to follow the player at a specified distance,