Unity Timeline Interaction System Integration #17

Merged
tschesky merged 4 commits from unity_timeline_on_interact into main 2025-10-07 10:57:11 +00:00
41 changed files with 2787 additions and 254 deletions
Showing only changes of commit e1ab0ea937 - Show all commits

View File

@@ -20,7 +20,76 @@ MonoBehaviour:
m_Curves: {fileID: 0}
m_Parent: {fileID: 11400000}
m_Children: []
m_Clips: []
m_Clips:
- m_Version: 1
m_Start: 0.06666666666666667
m_ClipIn: 0
m_Asset: {fileID: -2070454477998879764}
m_Duration: 1.0333333333333334
m_TimeScale: 1
m_ParentTrack: {fileID: -7584736085941489071}
m_EaseInDuration: 0
m_EaseOutDuration: 0
m_BlendInDuration: -1
m_BlendOutDuration: -1
m_MixInCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 1
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
m_MixOutCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
m_BlendInCurveMode: 0
m_BlendOutCurveMode: 0
m_ExposedParameterNames: []
m_AnimationCurves: {fileID: 0}
m_Recordable: 0
m_PostExtrapolationMode: 1
m_PreExtrapolationMode: 1
m_PostExtrapolationTime: Infinity
m_PreExtrapolationTime: 0.06666666666666667
m_DisplayName: BalltreeHit
m_Markers:
m_Objects: []
m_InfiniteClipPreExtrapolation: 0
@@ -41,398 +110,7 @@ MonoBehaviour:
m_OpenClipOffsetRotation: {x: 0, y: 0, z: 0, w: 1}
m_Rotation: {x: 0, y: 0, z: 0, w: 1}
m_ApplyOffsets: 0
--- !u!74 &-7150935952859310220
AnimationClip:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Recorded (1)
serializedVersion: 7
m_Legacy: 0
m_Compressed: 0
m_UseHighQualityCurve: 1
m_RotationCurves: []
m_CompressedRotationCurves: []
m_EulerCurves: []
m_PositionCurves:
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0.083333336
value: {x: 0, y: -0.40000153, z: 0}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.15
value: {x: -2.7999992, y: 3.199997, z: 0}
inSlope: {x: -47.999985, y: 0, z: 0}
outSlope: {x: -47.999985, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.21666667
value: {x: -6.3999977, y: -0.20000458, z: 0}
inSlope: {x: -42.461525, y: -62.769257, z: 0}
outSlope: {x: -42.461525, y: -62.769257, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.36666667
value: {x: -11.999996, y: -13.400002, z: 0}
inSlope: {x: -14.769217, y: 0, z: 0}
outSlope: {x: -14.769217, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.43333334
value: {x: -12.799995, y: -12.200005, z: 0}
inSlope: {x: -13.499995, y: 0, z: 0}
outSlope: {x: -13.499995, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.5
value: {x: -13.799995, y: -14.000008, z: 0}
inSlope: {x: -8.727264, y: 0, z: 0}
outSlope: {x: -8.727264, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.6166667
value: {x: -14.399994, y: -13.200005, z: 0}
inSlope: {x: -8.727264, y: 0, z: 0}
outSlope: {x: -8.727264, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.68333334
value: {x: -15.399994, y: -14.200005, z: 0}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
path:
m_ScaleCurves: []
m_FloatCurves: []
m_PPtrCurves: []
m_SampleRate: 60
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: 1
script: {fileID: 0}
typeID: 4
customType: 0
isPPtrCurve: 0
isIntCurve: 0
isSerializeReferenceCurve: 0
pptrCurveMapping: []
m_AnimationClipSettings:
serializedVersion: 2
m_AdditiveReferencePoseClip: {fileID: 0}
m_AdditiveReferencePoseTime: 0
m_StartTime: 0
m_StopTime: 0.68333334
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:
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0.083333336
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.15
value: -2.7999992
inSlope: -47.999985
outSlope: -47.999985
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.21666667
value: -6.3999977
inSlope: -42.461525
outSlope: -42.461525
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.36666667
value: -11.999996
inSlope: -14.769217
outSlope: -14.769217
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.43333334
value: -12.799995
inSlope: -13.499995
outSlope: -13.499995
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.5
value: -13.799995
inSlope: -8.727264
outSlope: -8.727264
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.6166667
value: -14.399994
inSlope: -8.727264
outSlope: -8.727264
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.68333334
value: -15.399994
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.x
path:
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0.083333336
value: -0.40000153
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.15
value: 3.199997
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.21666667
value: -0.20000458
inSlope: -62.769257
outSlope: -62.769257
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.36666667
value: -13.400002
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.43333334
value: -12.200005
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.5
value: -14.000008
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.6166667
value: -13.200005
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.68333334
value: -14.200005
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.y
path:
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0.083333336
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.15
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.21666667
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.36666667
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.43333334
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.5
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.6166667
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.68333334
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.z
path:
classID: 4
script: {fileID: 0}
flags: 0
m_EulerEditorCurves: []
m_HasGenericRootTransform: 1
m_HasMotionFloatCurves: 0
m_Events: []
--- !u!114 &-4100604165561699402
--- !u!114 &-4664548104421960294
MonoBehaviour:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
@@ -441,38 +119,9 @@ MonoBehaviour:
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d21dcc2386d650c4597f3633c75a1f98, type: 3}
m_Name: Animation Track (3)
m_EditorClassIdentifier: Unity.Timeline::UnityEngine.Timeline.AnimationTrack
m_Version: 3
m_AnimClip: {fileID: 0}
m_Locked: 0
m_Muted: 0
m_CustomPlayableFullTypename:
m_Curves: {fileID: 0}
m_Parent: {fileID: 11400000}
m_Children: []
m_Clips: []
m_Markers:
m_Objects: []
m_InfiniteClipPreExtrapolation: 1
m_InfiniteClipPostExtrapolation: 1
m_InfiniteClipOffsetPosition: {x: -38.92, y: 104.64, z: 0}
m_InfiniteClipOffsetEulerAngles: {x: -0, y: 0, z: 0}
m_InfiniteClipTimeOffset: 0
m_InfiniteClipRemoveOffset: 0
m_InfiniteClipApplyFootIK: 1
mInfiniteClipLoop: 0
m_MatchTargetFields: 63
m_Position: {x: 0, y: 0, z: 0}
m_EulerAngles: {x: 0, y: 0, z: 0}
m_AvatarMask: {fileID: 0}
m_ApplyAvatarMask: 1
m_TrackOffset: 0
m_InfiniteClip: {fileID: -7150935952859310220}
m_OpenClipOffsetRotation: {x: 0, y: 0, z: 0, w: 1}
m_Rotation: {x: 0, y: 0, z: 0, w: 1}
m_ApplyOffsets: 0
m_Script: {fileID: 11500000, guid: fde0d25a170598d46a0b9dc16b4527a5, type: 3}
m_Name: ActivationPlayableAsset
m_EditorClassIdentifier: Unity.Timeline::UnityEngine.Timeline.ActivationPlayableAsset
--- !u!114 &-2395336864975438248
MonoBehaviour:
m_ObjectHideFlags: 1
@@ -583,6 +232,28 @@ MonoBehaviour:
m_OpenClipOffsetRotation: {x: 0, y: 0, z: 0, w: 1}
m_Rotation: {x: 0, y: 0, z: 0, w: 1}
m_ApplyOffsets: 0
--- !u!114 &-2070454477998879764
MonoBehaviour:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 030f85c3f73729f4f976f66ffb23b875, type: 3}
m_Name: AnimationPlayableAsset
m_EditorClassIdentifier: Unity.Timeline::UnityEngine.Timeline.AnimationPlayableAsset
m_Clip: {fileID: 7400000, guid: c77ba8b4bbb8013478339a542995d25b, type: 2}
m_Position: {x: 0, y: 0, z: 0}
m_EulerAngles: {x: 0, y: 0, z: 0}
m_UseTrackMatchFields: 1
m_MatchTargetFields: 63
m_RemoveStartOffset: 1
m_ApplyFootIK: 1
m_Loop: 0
m_Version: 1
m_Rotation: {x: 0, y: 0, z: 0, w: 1}
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -599,7 +270,7 @@ MonoBehaviour:
m_Tracks:
- {fileID: -7584736085941489071}
- {fileID: -2395336864975438248}
- {fileID: -4100604165561699402}
- {fileID: 3942302933360259000}
m_FixedDuration: 0
m_EditorSettings:
m_Framerate: 60
@@ -628,3 +299,96 @@ MonoBehaviour:
m_Loop: 0
m_Version: 1
m_Rotation: {x: 0, y: 0, z: 0, w: 1}
--- !u!114 &3942302933360259000
MonoBehaviour:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 21bf7f712d84d26478ebe6a299f21738, type: 3}
m_Name: Activation Track
m_EditorClassIdentifier: Unity.Timeline::UnityEngine.Timeline.ActivationTrack
m_Version: 3
m_AnimClip: {fileID: 0}
m_Locked: 0
m_Muted: 0
m_CustomPlayableFullTypename:
m_Curves: {fileID: 0}
m_Parent: {fileID: 11400000}
m_Children: []
m_Clips:
- m_Version: 1
m_Start: 1.0166666666666666
m_ClipIn: 0
m_Asset: {fileID: -4664548104421960294}
m_Duration: 0.8999999999999999
m_TimeScale: 1
m_ParentTrack: {fileID: 3942302933360259000}
m_EaseInDuration: 0
m_EaseOutDuration: 0
m_BlendInDuration: 0
m_BlendOutDuration: 0
m_MixInCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 1
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
m_MixOutCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
m_BlendInCurveMode: 0
m_BlendOutCurveMode: 0
m_ExposedParameterNames: []
m_AnimationCurves: {fileID: 0}
m_Recordable: 0
m_PostExtrapolationMode: 0
m_PreExtrapolationMode: 0
m_PostExtrapolationTime: 0
m_PreExtrapolationTime: 0
m_DisplayName: Active
m_Markers:
m_Objects: []
m_PostPlaybackState: 3

View File

@@ -1,666 +0,0 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-7584736085941489071
MonoBehaviour:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d21dcc2386d650c4597f3633c75a1f98, type: 3}
m_Name: Animation Track
m_EditorClassIdentifier: Unity.Timeline::UnityEngine.Timeline.AnimationTrack
m_Version: 3
m_AnimClip: {fileID: 0}
m_Locked: 0
m_Muted: 0
m_CustomPlayableFullTypename:
m_Curves: {fileID: 0}
m_Parent: {fileID: 11400000}
m_Children: []
m_Clips: []
m_Markers:
m_Objects: []
m_InfiniteClipPreExtrapolation: 0
m_InfiniteClipPostExtrapolation: 0
m_InfiniteClipOffsetPosition: {x: 0, y: 0, z: 0}
m_InfiniteClipOffsetEulerAngles: {x: 0, y: 0, z: 0}
m_InfiniteClipTimeOffset: 0
m_InfiniteClipRemoveOffset: 0
m_InfiniteClipApplyFootIK: 1
mInfiniteClipLoop: 0
m_MatchTargetFields: 63
m_Position: {x: 0, y: 0, z: 0}
m_EulerAngles: {x: 0, y: 0, z: 0}
m_AvatarMask: {fileID: 0}
m_ApplyAvatarMask: 1
m_TrackOffset: 0
m_InfiniteClip: {fileID: 0}
m_OpenClipOffsetRotation: {x: 0, y: 0, z: 0, w: 1}
m_Rotation: {x: 0, y: 0, z: 0, w: 1}
m_ApplyOffsets: 0
--- !u!74 &-7150935952859310220
AnimationClip:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Recorded (1)
serializedVersion: 7
m_Legacy: 0
m_Compressed: 0
m_UseHighQualityCurve: 1
m_RotationCurves: []
m_CompressedRotationCurves: []
m_EulerCurves: []
m_PositionCurves:
- curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: {x: -0.000011444092, y: 0, z: 0}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.11666667
value: {x: 0, y: 0, z: 0}
inSlope: {x: 0.00024968927, y: 0, z: 0}
outSlope: {x: 0.00024968927, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.18333334
value: {x: 3, y: 2.2000046, z: 0}
inSlope: {x: 31.500008, y: 0, z: 0}
outSlope: {x: 31.500008, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.25
value: {x: 4.200001, y: -1.3999939, z: 0}
inSlope: {x: 3.200012, y: -57.599976, z: 0}
outSlope: {x: 3.200012, y: -57.599976, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.43333334
value: {x: 4.4000015, y: -12.399994, z: 0}
inSlope: {x: 3.0000045, y: 0, z: 0}
outSlope: {x: 3.0000045, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.51666665
value: {x: 5.000002, y: -11.199997, z: 0}
inSlope: {x: 9.333332, y: 0, z: 0}
outSlope: {x: 9.333332, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.5833333
value: {x: 5.800001, y: -12.799995, z: 0}
inSlope: {x: 7.199992, y: 0, z: 0}
outSlope: {x: 7.199992, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.68333334
value: {x: 6.200001, y: -11.999992, z: 0}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
- serializedVersion: 3
time: 0.76666665
value: {x: 6.200001, y: -12.799995, z: 0}
inSlope: {x: 0, y: 0, z: 0}
outSlope: {x: 0, y: 0, z: 0}
tangentMode: 0
weightedMode: 0
inWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
outWeight: {x: 0.33333334, y: 0.33333334, z: 0.33333334}
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
path:
m_ScaleCurves: []
m_FloatCurves: []
m_PPtrCurves: []
m_SampleRate: 60
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: 1
script: {fileID: 0}
typeID: 4
customType: 0
isPPtrCurve: 0
isIntCurve: 0
isSerializeReferenceCurve: 0
pptrCurveMapping: []
m_AnimationClipSettings:
serializedVersion: 2
m_AdditiveReferencePoseClip: {fileID: 0}
m_AdditiveReferencePoseTime: 0
m_StartTime: 0
m_StopTime: 0.76666665
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:
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: -0.000011444092
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.11666667
value: 0
inSlope: 0.00024968927
outSlope: 0.00024968927
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.18333334
value: 3
inSlope: 31.500008
outSlope: 31.500008
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.25
value: 4.200001
inSlope: 3.200012
outSlope: 3.200012
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.43333334
value: 4.4000015
inSlope: 3.0000045
outSlope: 3.0000045
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.51666665
value: 5.000002
inSlope: 9.333332
outSlope: 9.333332
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.5833333
value: 5.800001
inSlope: 7.199992
outSlope: 7.199992
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.68333334
value: 6.200001
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.76666665
value: 6.200001
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.x
path:
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.11666667
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.18333334
value: 2.2000046
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.25
value: -1.3999939
inSlope: -57.599976
outSlope: -57.599976
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.43333334
value: -12.399994
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.51666665
value: -11.199997
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.5833333
value: -12.799995
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.68333334
value: -11.999992
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.76666665
value: -12.799995
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.y
path:
classID: 4
script: {fileID: 0}
flags: 0
- serializedVersion: 2
curve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.11666667
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.18333334
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.25
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.43333334
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.51666665
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.5833333
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.68333334
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
- serializedVersion: 3
time: 0.76666665
value: 0
inSlope: 0
outSlope: 0
tangentMode: 136
weightedMode: 0
inWeight: 0.33333334
outWeight: 0.33333334
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
attribute: m_LocalPosition.z
path:
classID: 4
script: {fileID: 0}
flags: 0
m_EulerEditorCurves: []
m_HasGenericRootTransform: 1
m_HasMotionFloatCurves: 0
m_Events: []
--- !u!114 &-4100604165561699402
MonoBehaviour:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d21dcc2386d650c4597f3633c75a1f98, type: 3}
m_Name: Animation Track (3)
m_EditorClassIdentifier: Unity.Timeline::UnityEngine.Timeline.AnimationTrack
m_Version: 3
m_AnimClip: {fileID: 0}
m_Locked: 0
m_Muted: 0
m_CustomPlayableFullTypename:
m_Curves: {fileID: 0}
m_Parent: {fileID: 11400000}
m_Children: []
m_Clips: []
m_Markers:
m_Objects: []
m_InfiniteClipPreExtrapolation: 1
m_InfiniteClipPostExtrapolation: 1
m_InfiniteClipOffsetPosition: {x: -32.90073, y: 103.51327, z: 0}
m_InfiniteClipOffsetEulerAngles: {x: -0, y: 0, z: 0}
m_InfiniteClipTimeOffset: 0
m_InfiniteClipRemoveOffset: 0
m_InfiniteClipApplyFootIK: 1
mInfiniteClipLoop: 0
m_MatchTargetFields: 63
m_Position: {x: 0, y: 0, z: 0}
m_EulerAngles: {x: 0, y: 0, z: 0}
m_AvatarMask: {fileID: 0}
m_ApplyAvatarMask: 1
m_TrackOffset: 0
m_InfiniteClip: {fileID: -7150935952859310220}
m_OpenClipOffsetRotation: {x: 0, y: 0, z: 0, w: 1}
m_Rotation: {x: 0, y: 0, z: 0, w: 1}
m_ApplyOffsets: 0
--- !u!114 &-2395336864975438248
MonoBehaviour:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d21dcc2386d650c4597f3633c75a1f98, type: 3}
m_Name: Animation Track (1)
m_EditorClassIdentifier: Unity.Timeline::UnityEngine.Timeline.AnimationTrack
m_Version: 3
m_AnimClip: {fileID: 0}
m_Locked: 0
m_Muted: 0
m_CustomPlayableFullTypename:
m_Curves: {fileID: 0}
m_Parent: {fileID: 11400000}
m_Children: []
m_Clips:
- m_Version: 1
m_Start: 0
m_ClipIn: 0
m_Asset: {fileID: 3115908604919352715}
m_Duration: 0.8333333333333334
m_TimeScale: 1
m_ParentTrack: {fileID: -2395336864975438248}
m_EaseInDuration: 0
m_EaseOutDuration: 0
m_BlendInDuration: -1
m_BlendOutDuration: -1
m_MixInCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 1
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
m_MixOutCurve:
serializedVersion: 2
m_Curve:
- serializedVersion: 3
time: 0
value: 1
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
- serializedVersion: 3
time: 1
value: 0
inSlope: 0
outSlope: 0
tangentMode: 0
weightedMode: 0
inWeight: 0
outWeight: 0
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
m_BlendInCurveMode: 0
m_BlendOutCurveMode: 0
m_ExposedParameterNames: []
m_AnimationCurves: {fileID: 0}
m_Recordable: 0
m_PostExtrapolationMode: 1
m_PreExtrapolationMode: 1
m_PostExtrapolationTime: Infinity
m_PreExtrapolationTime: 0
m_DisplayName: Pulver_Cucumbatacc
m_Markers:
m_Objects: []
m_InfiniteClipPreExtrapolation: 0
m_InfiniteClipPostExtrapolation: 0
m_InfiniteClipOffsetPosition: {x: 0, y: 0, z: 0}
m_InfiniteClipOffsetEulerAngles: {x: 0, y: 0, z: 0}
m_InfiniteClipTimeOffset: 0
m_InfiniteClipRemoveOffset: 0
m_InfiniteClipApplyFootIK: 1
mInfiniteClipLoop: 0
m_MatchTargetFields: 63
m_Position: {x: 0, y: 0, z: 0}
m_EulerAngles: {x: 0, y: 0, z: 0}
m_AvatarMask: {fileID: 0}
m_ApplyAvatarMask: 1
m_TrackOffset: 0
m_InfiniteClip: {fileID: 0}
m_OpenClipOffsetRotation: {x: 0, y: 0, z: 0, w: 1}
m_Rotation: {x: 0, y: 0, z: 0, w: 1}
m_ApplyOffsets: 0
--- !u!114 &11400000
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: bfda56da833e2384a9677cd3c976a436, type: 3}
m_Name: PulverCucumberSmack2
m_EditorClassIdentifier: Unity.Timeline::UnityEngine.Timeline.TimelineAsset
m_Version: 0
m_Tracks:
- {fileID: -7584736085941489071}
- {fileID: -2395336864975438248}
- {fileID: -4100604165561699402}
m_FixedDuration: 0
m_EditorSettings:
m_Framerate: 60
m_ScenePreview: 1
m_DurationMode: 0
m_MarkerTrack: {fileID: 0}
--- !u!114 &3115908604919352715
MonoBehaviour:
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 0}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 030f85c3f73729f4f976f66ffb23b875, type: 3}
m_Name: AnimationPlayableAsset
m_EditorClassIdentifier: Unity.Timeline::UnityEngine.Timeline.AnimationPlayableAsset
m_Clip: {fileID: 7400000, guid: 09d7dd4e84cbed54bb4ca4e63ad0c6fa, type: 2}
m_Position: {x: 0, y: 0, z: 0}
m_EulerAngles: {x: 0, y: 0, z: 0}
m_UseTrackMatchFields: 1
m_MatchTargetFields: 63
m_RemoveStartOffset: 1
m_ApplyFootIK: 1
m_Loop: 0
m_Version: 1
m_Rotation: {x: 0, y: 0, z: 0, w: 1}

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: dd9566026364e814a8dad109e6c365ca
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: a591b28d7cd18274b9cca9511b96261a
guid: ee609df51f47bd541a23d5425e289e30
NativeFormatImporter:
externalObjects: {}
mainObjectFileID: 11400000

View File

@@ -447648,18 +447648,6 @@ MonoBehaviour:
stepData: {fileID: 11400000, guid: 8ac614a698631554ab8ac39aed04a189, type: 2}
puzzleIndicator: {fileID: 0}
drawPromptRangeGizmo: 1
--- !u!114 &1182494941
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1182494929}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 833a4ccef651449e973e623d9107bef5, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!95 &1182494942
Animator:
serializedVersion: 7
@@ -447670,7 +447658,7 @@ Animator:
m_GameObject: {fileID: 1182494929}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 9100000, guid: 4587ce13b65b5154c853fe4bddbd6247, type: 2}
m_Controller: {fileID: 0}
m_CullingMode: 0
m_UpdateMode: 0
m_ApplyRootMotion: 0
@@ -449505,6 +449493,14 @@ PrefabInstance:
propertyPath: m_Name
value: FootballBall
objectReference: {fileID: 0}
- target: {fileID: 3606875748053192296, guid: 30285f2632211504484661965ed61c57, type: 3}
propertyPath: m_IsActive
value: 0
objectReference: {fileID: 0}
- target: {fileID: 4386785291364665203, guid: 30285f2632211504484661965ed61c57, type: 3}
propertyPath: characterToInteract
value: 2
objectReference: {fileID: 0}
- target: {fileID: 4419731015739629793, guid: 30285f2632211504484661965ed61c57, type: 3}
propertyPath: m_Sprite
value:
@@ -449515,7 +449511,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 5572894649736340512, guid: 30285f2632211504484661965ed61c57, type: 3}
propertyPath: m_LocalPosition.y
value: 92.757
value: 92.79
objectReference: {fileID: 0}
- target: {fileID: 5572894649736340512, guid: 30285f2632211504484661965ed61c57, type: 3}
propertyPath: m_LocalPosition.z
@@ -449560,8 +449556,38 @@ PrefabInstance:
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_AddedComponents:
- targetCorrespondingSourceObject: {fileID: 3606875748053192296, guid: 30285f2632211504484661965ed61c57, type: 3}
insertIndex: -1
addedObject: {fileID: 1295249128}
m_SourcePrefab: {fileID: 100100000, guid: 30285f2632211504484661965ed61c57, type: 3}
--- !u!1 &1295249127 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 3606875748053192296, guid: 30285f2632211504484661965ed61c57, type: 3}
m_PrefabInstance: {fileID: 1295249126}
m_PrefabAsset: {fileID: 0}
--- !u!95 &1295249128
Animator:
serializedVersion: 7
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1295249127}
m_Enabled: 1
m_Avatar: {fileID: 0}
m_Controller: {fileID: 0}
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!1001 &1313372821
PrefabInstance:
m_ObjectHideFlags: 0
@@ -450508,11 +450534,11 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 2264394306674147778, guid: 8ac0210dbf9d7754e9526d6d5c214f49, type: 3}
propertyPath: m_LocalPosition.x
value: -40.250267
value: -36.1
objectReference: {fileID: 0}
- target: {fileID: 2264394306674147778, guid: 8ac0210dbf9d7754e9526d6d5c214f49, type: 3}
propertyPath: m_LocalPosition.y
value: -44.838055
value: -41.5
objectReference: {fileID: 0}
- target: {fileID: 2264394306674147778, guid: 8ac0210dbf9d7754e9526d6d5c214f49, type: 3}
propertyPath: m_LocalPosition.z
@@ -450555,6 +450581,11 @@ PrefabInstance:
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 8ac0210dbf9d7754e9526d6d5c214f49, type: 3}
--- !u!95 &1363194739 stripped
Animator:
m_CorrespondingSourceObject: {fileID: 1798693240065965692, guid: 8ac0210dbf9d7754e9526d6d5c214f49, type: 3}
m_PrefabInstance: {fileID: 1363194738}
m_PrefabAsset: {fileID: 0}
--- !u!4 &1370055784 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 7815739457642955130, guid: f645a67c7970b124cacb6450fefdebad, type: 3}
@@ -461610,6 +461641,10 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 1682591185}
m_Modifications:
- target: {fileID: 1597866798502552092, guid: 0b255c6ea64a74240a8db4d9e8f820be, type: 3}
propertyPath: characterToInteract
value: 2
objectReference: {fileID: 0}
- target: {fileID: 1784002662241348359, guid: 0b255c6ea64a74240a8db4d9e8f820be, type: 3}
propertyPath: m_Name
value: Nails
@@ -463989,6 +464024,10 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 2491802807835645092, guid: 3346526f3046f424196615241a307104, type: 3}
propertyPath: characterToInteract
value: 2
objectReference: {fileID: 0}
- target: {fileID: 2531688711670838070, guid: 3346526f3046f424196615241a307104, type: 3}
propertyPath: m_Sprite
value:
@@ -464041,6 +464080,10 @@ PrefabInstance:
propertyPath: isOneTime
value: 1
objectReference: {fileID: 0}
- target: {fileID: 4289780218821574471, guid: 3346526f3046f424196615241a307104, type: 3}
propertyPath: characterToInteract
value: 2
objectReference: {fileID: 0}
- target: {fileID: 5236930998804014616, guid: 3346526f3046f424196615241a307104, type: 3}
propertyPath: m_Layer
value: 10
@@ -464188,6 +464231,10 @@ PrefabInstance:
propertyPath: isOneTime
value: 1
objectReference: {fileID: 0}
- target: {fileID: 519585874127847016, guid: df01157608cce6447b7ccde0bfa290e1, type: 3}
propertyPath: characterToInteract
value: 2
objectReference: {fileID: 0}
- target: {fileID: 1638886621542193701, guid: df01157608cce6447b7ccde0bfa290e1, type: 3}
propertyPath: characterArrived.m_PersistentCalls.m_Calls.Array.data[0].m_Mode
value: 2
@@ -464574,6 +464621,10 @@ PrefabInstance:
propertyPath: isOneTime
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2767794910448825193, guid: 1fda7fccaa5fbd04695f4c98d29bcbe0, type: 3}
propertyPath: characterToInteract
value: 1
objectReference: {fileID: 0}
- target: {fileID: 2767794910448825193, guid: 1fda7fccaa5fbd04695f4c98d29bcbe0, type: 3}
propertyPath: characterArrived.m_PersistentCalls.m_Calls.Array.size
value: 2
@@ -465069,6 +465120,58 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 1569498917964935965, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_PlayableAsset
value:
objectReference: {fileID: 11400000, guid: ee609df51f47bd541a23d5425e289e30, type: 2}
- target: {fileID: 1569498917964935965, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_SceneBindings.Array.size
value: 8
objectReference: {fileID: 0}
- target: {fileID: 1569498917964935965, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_SceneBindings.Array.data[3].key
value:
objectReference: {fileID: -2395336864975438248, guid: 1791fd5a24a3142418ed441a2a25b374, type: 2}
- target: {fileID: 1569498917964935965, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_SceneBindings.Array.data[4].key
value:
objectReference: {fileID: -7584736085941489071, guid: 1791fd5a24a3142418ed441a2a25b374, type: 2}
- target: {fileID: 1569498917964935965, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_SceneBindings.Array.data[5].key
value:
objectReference: {fileID: 3942302933360259000, guid: 1791fd5a24a3142418ed441a2a25b374, type: 2}
- target: {fileID: 1569498917964935965, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_SceneBindings.Array.data[6].key
value:
objectReference: {fileID: -7584736085941489071, guid: ee609df51f47bd541a23d5425e289e30, type: 2}
- target: {fileID: 1569498917964935965, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_SceneBindings.Array.data[7].key
value:
objectReference: {fileID: -2395336864975438248, guid: ee609df51f47bd541a23d5425e289e30, type: 2}
- target: {fileID: 1569498917964935965, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_SceneBindings.Array.data[0].value
value:
objectReference: {fileID: 0}
- target: {fileID: 1569498917964935965, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_SceneBindings.Array.data[3].value
value:
objectReference: {fileID: 1363194739}
- target: {fileID: 1569498917964935965, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_SceneBindings.Array.data[4].value
value:
objectReference: {fileID: 1182494942}
- target: {fileID: 1569498917964935965, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_SceneBindings.Array.data[5].value
value:
objectReference: {fileID: 1295249127}
- target: {fileID: 1569498917964935965, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_SceneBindings.Array.data[6].value
value:
objectReference: {fileID: 1182494942}
- target: {fileID: 1569498917964935965, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_SceneBindings.Array.data[7].value
value:
objectReference: {fileID: 1363194739}
- target: {fileID: 2720557426779044373, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_Sprite
value:
@@ -465133,6 +465236,14 @@ PrefabInstance:
propertyPath: m_LocalPosition.y
value: -0.16
objectReference: {fileID: 0}
- target: {fileID: 7371967679236352629, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_LocalPosition.x
value: -1.606
objectReference: {fileID: 0}
- target: {fileID: 7371967679236352629, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_LocalPosition.y
value: -0
objectReference: {fileID: 0}
- target: {fileID: 7379304988657006554, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: m_Name
value: BallTree
@@ -465201,6 +465312,82 @@ PrefabInstance:
propertyPath: m_SpriteTilingProperty.oldSize.y
value: 9.060193
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: playableDirector
value:
objectReference: {fileID: 7530821580781571561}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.size
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: 'respondToEvents.Array.data[0]'
value: 2
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.data[0].loopLast
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.data[0].eventType
value: 2
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.data[1].eventType
value: 4
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.data[1].timeoutSeconds
value: 30
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.data[0].playerTrackName
value: Player
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.data[0].pulverTrackName
value: Pulver
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.data[1].playerTrackName
value: Player
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.data[1].pulverTrackName
value: Pulver
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.data[0].bindPlayerCharacter
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.data[0].bindPulverCharacter
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.data[1].bindPlayerCharacter
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.data[1].bindPulverCharacter
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.data[0].timelines.Array.size
value: 2
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: timelineMappings.Array.data[1].timelines.Array.size
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: 'timelineMappings.Array.data[0].timelines.Array.data[0]'
value:
objectReference: {fileID: 11400000, guid: 1791fd5a24a3142418ed441a2a25b374, type: 2}
- target: {fileID: 8984729148657672365, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
propertyPath: 'timelineMappings.Array.data[0].timelines.Array.data[1]'
value:
objectReference: {fileID: 11400000, guid: ee609df51f47bd541a23d5425e289e30, type: 2}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
@@ -465213,11 +465400,28 @@ PrefabInstance:
addedObject: {fileID: 1182494937}
- targetCorrespondingSourceObject: {fileID: 7379304988657006554, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
insertIndex: -1
addedObject: {fileID: 1182494941}
addedObject: {fileID: 1182494942}
- targetCorrespondingSourceObject: {fileID: 7379304988657006554, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
insertIndex: -1
addedObject: {fileID: 1182494942}
addedObject: {fileID: 7530821580781571568}
m_SourcePrefab: {fileID: 100100000, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
--- !u!320 &7530821580781571561 stripped
PlayableDirector:
m_CorrespondingSourceObject: {fileID: 1569498917964935965, guid: c36b48a324dcaef4cb5ee0f8ca57f0d6, type: 3}
m_PrefabInstance: {fileID: 7530821580781571560}
m_PrefabAsset: {fileID: 0}
--- !u!114 &7530821580781571568
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1182494929}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 833a4ccef651449e973e623d9107bef5, type: 3}
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::OneClickInteraction
--- !u!1001 &7535757761066548300
PrefabInstance:
m_ObjectHideFlags: 0
@@ -465535,6 +465739,10 @@ PrefabInstance:
propertyPath: isOneTime
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8818689886719637838, guid: 3144c6bbac26fbd49a1608152821cc5f, type: 3}
propertyPath: characterToInteract
value: 2
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []

View File

@@ -106,6 +106,8 @@ namespace Interactions
return true;
}
follower.DropHeldItemAt(follower.transform.position);
// Play the current timeline in the sequence
bool result = await PlaySingleTimeline(_currentMapping.timelines[_currentTimelineIndex], _currentMapping, player, follower);

View File

@@ -198,16 +198,36 @@ namespace PuzzleS
}
/// <summary>
/// Unlocks all initial steps (those with no dependencies).
/// Unlocks all initial steps (those with no dependencies) and any steps whose dependencies are already met.
/// </summary>
private void UnlockInitialSteps()
{
// First, unlock all steps with no dependencies (initial steps)
var initialSteps = PuzzleGraphUtility.FindInitialSteps(_runtimeDependencies);
foreach (var step in initialSteps)
{
Debug.Log($"[Puzzles] Initial step unlocked: {step.stepId}");
UnlockStep(step);
}
// Keep trying to unlock steps as long as we're making progress
bool madeProgress;
do
{
madeProgress = false;
// Check all steps that haven't been unlocked yet
foreach (var step in _runtimeDependencies.Keys.Where(s => !_unlockedSteps.Contains(s)))
{
// Check if all dependencies have been completed
if (AreRuntimeDependenciesMet(step))
{
Debug.Log($"[Puzzles] Chain step unlocked: {step.stepId}");
UnlockStep(step);
madeProgress = true;
}
}
} while (madeProgress);
}
/// <summary>

257
README.md
View File

@@ -1,211 +1,92 @@
# Apple Hills Dialogue System
# Apple Hills
This document provides an overview of the dialogue system used in Apple Hills, intended primarily for designers working with the dialogue creation tools.
Apple Hills is a Unity-based adventure game featuring interactive puzzle mechanics, dialogue systems, and item interactions.
## Overview
## Project Overview
The Apple Hills dialogue system is a node-based dialogue management system that allows for interactive conversations with NPCs. The system currently supports linear, condition-guarded dialogue paths that can respond to various game conditions such as puzzle completion, item pickups, and item combinations. While the architecture was designed to facilitate branching dialogue in future extensions, the current implementation follows a linear progression through nodes.
Apple Hills provides a unique gaming experience with:
## Dialogue Structure
- Node-based dialogue system for interactive NPC conversations
- Puzzle mechanics with condition-based progression
- Item pickup, combination, and interaction systems
- Custom Universal Render Pipeline setup
The dialogue system uses a graph-based structure with different types of nodes that control the flow of conversation. Each dialogue is represented as a graph containing multiple nodes connected through defined paths.
## Repository Structure
### Core Components
```
AppleHills/
├── Assets/ # Unity asset files
│ ├── Art/ # Visual assets, models, textures
│ ├── Dialogue/ # Dialogue system and dialogue data
│ ├── Scripts/ # C# code for game systems
│ │ ├── Core/ # Core managers and services
│ │ ├── Dialogue/ # Dialogue system implementation
│ │ ├── Input/ # Input handling systems
│ │ ├── Interactions/ # Object interaction systems
│ │ ├── Movement/ # Character movement controllers
│ │ ├── PuzzleS/ # Puzzle mechanics and systems
│ │ └── UI/ # User interface components
│ ├── Scenes/ # Game scenes and levels
│ ├── Prefabs/ # Reusable game objects
│ └── ... # Other asset folders
├── Packages/ # Unity package dependencies
├── ProjectSettings/ # Unity project settings
└── docs/ # Project documentation
├── media/ # Images and other media for documentation
└── dialogue_readme.md # Detailed documentation about the dialogue system
```
1. **RuntimeDialogueGraph**: The container for all dialogue nodes that make up a conversation
2. **DialogueComponent**: Attached to game objects to manage dialogue state and progression
3. **SpeechBubble**: Handles the visual presentation of dialogue text
## Code Structure
## QuickStart Guide
### Scripts Organization
Setting up a dialogue interaction in your scene is straightforward:
The game's codebase is organized into several key modules:
### 1. Component Setup
| Module | Purpose |
|--------|---------|
| Animation | Animation controllers and state machines |
| Bootstrap | Game initialization and scene loading |
| Core | Core game managers and services |
| Dialogue | Dialogue tree implementation and text handling |
| Input | Player input processing and mapping |
| Interactions | Interactive object behaviors and triggers |
| Movement | Character controllers and navigation |
| Pooling | Object pooling for performance optimization |
| PuzzleS | Puzzle mechanics, conditions, and validators |
| Settings | Configurable game parameters and constants |
| UI | User interface elements and controllers |
| Utilities | Helper classes and extension methods |
1. **Place the Dialogue Component**:
- Add the `DialogueComponent` to any game object that has an `Interactable` component
- The `Interactable` component handles player proximity and interaction triggers
- Make sure the interactable is properly configured with appropriate interaction radius
### Core Systems Highlight
2. **Add DialogueCanvas**:
- Add the "DialogueCanvas" prefab from the project assets as a child of your object
- Position the speech bubble appropriately above or near the interactable object
- The speech bubble should be clearly visible but not obstruct important scene elements
- You can adjust the scale and position to fit your specific character or object
The `Assets/Scripts/Core` directory contains critical managers that orchestrate the game's systems:
3. **Assign Dialogue Graph**:
- Create a `RuntimeDialogueGraph` scriptable object (Right Click > Create > Dialogue Graph)
- Set up your dialogue nodes in the graph (see Node Types for details)
- Assign the created graph to the `DialogueComponent` on your object
- Make sure to set the entry node ID in the dialogue graph
#### Key Managers
### 2. Testing Your Dialogue
- **GameManager**: Central hub managing game state, scene transitions, and system coordination
- **ItemManager**: Handles inventory system, item pickup, combination, and usage logic
- **SceneManagerService**: Controls scene loading, unloading, and transitions
1. Enter play mode and approach the interactable object
2. When the component has any lines to serve, the speech bubble should display the prompt ("...")
3. Interact with the object to advance through dialogue lines
4. Test any conditional nodes by completing their requirements
5. Verify that the dialogue progresses as expected
#### Settings Framework
### 3. Common Issues
The `Core/Settings` system provides a robust configuration framework:
- **No speech bubble appears**: Check that the DialogueCanvas is properly added as a child and is active
- **Dialogue doesn't advance**: Ensure the node connections (in/out) are properly set in the dialogue graph
- **Condition not triggering**: Verify that the condition IDs (puzzle step, item, etc.) match exactly with your game systems
- **ServiceLocator**: Dependency injection system for accessing game services
- **SettingsProvider**: Central access point for game configuration values
- **BaseSettings/BaseDeveloperSettings**: Foundation for creating configurable parameters
- **InteractionSettings**: Configuration for player-object interactions
- **MovementModeTypes**: Movement parameters for different locomotion modes
## Node Types
## Documentation
The dialogue system supports several node types, each serving a specific purpose in the conversation flow:
Detailed documentation about specific systems can be found in the `docs` folder:
### 1. Dialogue Node
- [Dialogue System Documentation](docs/dialogue_readme.md)
Simple dialogue nodes display text to the player. They can contain multiple lines that are shown sequentially when the player interacts with the NPC.
## Development
**Key features:**
- Multiple dialogue lines displayed in sequence
- Optional looping through lines
- Automatic progression to the next node when all lines are exhausted
The project is structured using standard Unity practices. Key components:
### 2. WaitOnPuzzleStep Node
This node pauses dialogue progression until a specific puzzle step has been completed by the player.
**Key features:**
- Automatically advances when the specified puzzle step is completed
- Displays dialogue while waiting for the condition to be met
- Visual prompt appears when the condition is met, indicating available dialogue
### 3. WaitOnPickup Node
This node waits until the player has picked up a specific item before advancing the dialogue.
**Key features:**
- Automatically advances when the player picks up the specified item
- Shows dialogue while waiting for the item pickup
- Visual prompt appears when the item is picked up, indicating available dialogue
### 4. WaitOnSlot Node
This node requires the player to place a specific item in a designated slot before the dialogue can progress.
**Key features:**
- Supports different dialogue lines for different slot states:
- Default lines when no item is slotted
- Incorrect item lines when the wrong item is placed
- Forbidden item lines when a specifically disallowed item is placed
- Visual prompt appears when the correct item is slotted, indicating available dialogue
### 5. WaitOnCombination Node
This node waits for the player to create a specific item through the combination system.
**Key features:**
- Automatically advances when the player creates the specified item through combination
- Shows dialogue while waiting for the item combination
- Visual prompt appears when the item is created, indicating available dialogue
### 6. End Node
Terminates the dialogue sequence.
**Key features:**
- Marks the dialogue as completed
- No further interaction available until the dialogue is restarted
## Dialogue Flow
1. **Dialogue Initialization**
- When a dialogue is started (often through character interaction), the system begins at the entry node
- Each node's dialogue lines are displayed in sequence as the player interacts
2. **Interaction Mechanism**
- Dialogue advances when the player interacts with the NPC
- Each interaction displays the next line of dialogue
- When all lines in a node are displayed, the system moves to the next node (unless waiting on a condition)
3. **Conditional Progress**
- When the dialogue reaches a conditional node (like WaitOnPuzzleStep), it waits for the condition to be met
- Once the condition is satisfied, the speech bubble shows a prompt
- The next interaction after the condition is met advances to the next node
4. **Visual Indicators**
- Speech bubbles show ellipses ("...") as a prompt when dialogue is available
- The dialogue text can be displayed instantly or with a typewriter effect
- The speech bubble hides when no dialogue is available
## Designer Tips
1. **Node Organization**
- Start every dialogue graph with a standard Dialogue node as the entry point
- End every dialogue path with an End node to properly terminate the conversation
- Use conditional nodes strategically to create gameplay-driven dialogue experiences
2. **Dialogue Writing**
- Keep individual dialogue lines concise for better readability
- Consider using the looping option for nodes when you want to repeat information
- For WaitOnSlot nodes, write unique dialogue for incorrect/forbidden items to provide clear feedback
3. **Flow Control**
- Ensure all nodes (except End nodes) have a valid next node specified
- Test dialogue paths to verify all conditions can be met during gameplay
- Consider using multiple dialogue lines within a single node rather than creating separate nodes for sequential lines
4. **Best Practices**
- Name your nodes descriptively in the editor for easier management
- Group related dialogue sequences into separate dialogue graphs
- Use the speaker name field to clearly identify who is speaking
## Technical Details
### Public Events and APIs
The dialogue system exposes several events that can be used by other systems:
#### DialogueComponent
- **Events**:
- `OnDialogueChanged`: Triggered when the dialogue text changes
- **Properties**:
- `IsActive`: Indicates whether the dialogue is currently active
- `IsCompleted`: Indicates whether the dialogue has reached an End node
- `CurrentSpeakerName`: Returns the name of the current speaker
- **Public Methods**:
- `StartDialogue()`: Initiates the dialogue from the beginning
- `GetCurrentDialogueLine()`: Retrieves the current dialogue line text
- `HasAnyLines()`: Checks if the dialogue component has any lines available
- `SetDialogueGraph(RuntimeDialogueGraph)`: Sets the dialogue graph for the component
#### SpeechBubble
- **Public Methods**:
- `Show()`: Makes the speech bubble visible
- `Hide()`: Hides the speech bubble
- `Toggle()`: Toggles the visibility of the speech bubble
- `SetText(string)`: Sets the text displayed in the speech bubble
- `DisplayDialogueLine(string, bool)`: Displays a dialogue line and handles prompt visibility
- `UpdatePromptVisibility(bool)`: Updates the speech bubble to show a prompt or hide based on dialogue availability
- `SetDisplayMode(TextDisplayMode)`: Changes how text is displayed (instant or typewriter)
- `SkipTypewriter()`: Immediately displays the full text, skipping the typewriter effect
- `SetTypewriterSpeed(float)`: Sets the speed of the typewriter effect
### Integration with Other Systems
The dialogue system integrates with several other game systems:
1. **Puzzle System**: Monitors puzzle completion events to advance WaitOnPuzzleStep nodes
2. **Item System**: Tracks item pickups, combinations, and slot interactions to advance respective node types
3. **Interaction System**: Responds to player interaction with the NPC to progress through dialogue lines
### Technical Workflow
1. Create a RuntimeDialogueGraph asset in the Unity editor
2. Add nodes and connections using the dialogue editor
3. Assign the graph to a DialogueComponent on an NPC GameObject
4. Ensure a SpeechBubble component is available (as a child object or referenced)
5. Set up any necessary puzzle steps, items, or slots that the dialogue will reference
## Summary
The Apple Hills dialogue system provides a powerful and flexible way to create interactive conversations that respond to player actions and game state. By using different node types and conditions, designers can craft engaging dialogues that feel natural and responsive within the game world.
- Universal Render Pipeline for consistent visuals
- Input System for configurable controls
- Addressable Assets for asset management

277
docs/dialogue_readme.md Normal file
View File

@@ -0,0 +1,277 @@
# Apple Hills Dialogue System
This document provides an overview of the dialogue system used in Apple Hills, intended primarily for designers (Damian) working with the dialogue creation tools.
## Overview
The Apple Hills dialogue system is a node-based dialogue management system that allows for interactive conversations with NPCs. The system currently supports linear, condition-guarded dialogue paths that can respond to various game conditions such as puzzle completion, item pickups, and item combinations. While the architecture was designed to facilitate branching dialogue in future extensions, the current implementation follows a linear progression through nodes.
## Dialogue Structure
The dialogue system uses a graph-based structure with different types of nodes that control the flow of conversation. Each dialogue is represented as a graph containing multiple nodes connected through defined paths.
![Dialogue Graph Example](media/dialogue_graph_example.png)
### Core Components
1. **RuntimeDialogueGraph**: The container for all dialogue nodes that make up a conversation
- Defined in `Assets/Scripts/Dialogue/RuntimeDialogueGraph.cs`
- Contains the entry point node ID and a list of all dialogue nodes
- Holds the speaker name that appears in dialogue UI
2. **DialogueComponent**: Attached to game objects to manage dialogue state and progression
- Defined in `Assets/Scripts/Dialogue/DialogueComponent.cs`
- Manages the current state of dialogue (active node, line index)
- Responds to game events like puzzle completion, item pickup, etc.
- Controls dialogue advancement through player interaction
3. **SpeechBubble**: Handles the visual presentation of dialogue text
- Defined in `Assets/Scripts/Dialogue/SpeechBubble.cs`
- Manages the dialogue UI elements and text display
- Implements typewriter effects and visual prompts
## QuickStart Guide
Setting up a dialogue interaction in your scene is straightforward:
### 1. Component Setup
1. **Place the Dialogue Component**:
- Add the `DialogueComponent` to any game object that has an `Interactable` component
- The `Interactable` component handles player proximity and interaction triggers
- Make sure the interactable is properly configured with appropriate interaction radius
![Dialogue Component Inspector](media/dialogue_component_inspector.png)
2. **Add DialogueCanvas**:
- Add the "DialogueCanvas" prefab from the project assets as a child of your object
- Position the speech bubble appropriately above or near the interactable object
- The speech bubble should be clearly visible but not obstruct important scene elements
- You can adjust the scale and position to fit your specific character or object
![Speech Bubble Setup](media/speech_bubble_setup.png)
3. **Assign Dialogue Graph**:
- Create a `RuntimeDialogueGraph` scriptable object (Right Click > Create > Dialogue Graph)
- Set up your dialogue nodes in the graph (see Node Types for details)
- Assign the created graph to the `DialogueComponent` on your object
- Make sure to set the entry node ID in the dialogue graph
![Creating Dialogue Graph](media/create_dialogue_graph.png)
### 2. Testing Your Dialogue
1. Enter play mode and approach the interactable object
2. When the component has any lines to serve, the speech bubble should display the prompt ("...")
3. Interact with the object to advance through dialogue lines
4. Test any conditional nodes by completing their requirements
5. Verify that the dialogue progresses as expected
![Testing Dialogue Flow](media/dialogue_testing_flow.png)
### 3. Common Issues
- **No speech bubble appears**: Check that the DialogueCanvas is properly added as a child and is active
- **Dialogue doesn't advance**: Ensure the node connections (in/out) are properly set in the dialogue graph
- **Condition not triggering**: Verify that the condition IDs (puzzle step, item, etc.) match exactly with your game systems
## Node Types
The dialogue system supports several node types, each serving a specific purpose in the conversation flow:
### 1. Dialogue Node
Simple dialogue nodes display text to the player. They can contain multiple lines that are shown sequentially when the player interacts with the NPC.
**Key features:**
- Multiple dialogue lines displayed in sequence
- Optional looping through lines
- Automatic progression to the next node when all lines are exhausted
![Dialogue Node Example](media/dialogue_node_example.png)
**Implementation details:**
- Defined as `RuntimeDialogueNodeType.Dialogue` in `RuntimeDialogueGraph.cs`
- Uses `dialogueLines` list to store sequential lines of text
- The `loopThroughLines` boolean controls whether the dialogue returns to the first line after reaching the end
### 2. WaitOnPuzzleStep Node
This node pauses dialogue progression until a specific puzzle step has been completed by the player.
**Key features:**
- Automatically advances when the specified puzzle step is completed
- Displays dialogue while waiting for the condition to be met
- Visual prompt appears when the condition is met, indicating available dialogue
![WaitOnPuzzleStep Node Example](media/wait_on_puzzle_node.png)
**Implementation details:**
- Defined as `RuntimeDialogueNodeType.WaitOnPuzzleStep` in `RuntimeDialogueGraph.cs`
- Links to `PuzzleManager.OnStepCompleted` event through the `puzzleStepID` property
- The `DialogueComponent` listens for puzzle completion events through `OnAnyPuzzleStepCompleted` method
### 3. WaitOnPickup Node
This node waits until the player has picked up a specific item before advancing the dialogue.
**Key features:**
- Automatically advances when the player picks up the specified item
- Shows dialogue while waiting for the item pickup
- Visual prompt appears when the item is picked up, indicating available dialogue
![WaitOnPickup Node Example](media/wait_on_pickup_node.png)
**Implementation details:**
- Defined as `RuntimeDialogueNodeType.WaitOnPickup` in `RuntimeDialogueGraph.cs`
- Links to `ItemManager.OnItemPickedUp` event through the `pickupItemID` property
- The `DialogueComponent` listens for item pickup events through `OnAnyItemPickedUp` method
### 4. WaitOnSlot Node
This node requires the player to place a specific item in a designated slot before the dialogue can progress.
**Key features:**
- Supports different dialogue lines for different slot states:
- Default lines when no item is slotted
- Incorrect item lines when the wrong item is placed
- Forbidden item lines when a specifically disallowed item is placed
- Visual prompt appears when the correct item is slotted, indicating available dialogue
![WaitOnSlot Node Example](media/wait_on_slot_node.png)
**Implementation details:**
- Defined as `RuntimeDialogueNodeType.WaitOnSlot` in `RuntimeDialogueGraph.cs`
- Uses multiple events from `ItemManager` including:
- `OnCorrectItemSlotted` - Triggered when the matching `slotItemID` is placed
- `OnIncorrectItemSlotted` - For displaying incorrect item dialogue
- `OnForbiddenItemSlotted` - For displaying forbidden item dialogue
- `OnItemSlotCleared` - For resetting to default dialogue
### 5. WaitOnCombination Node
This node waits for the player to create a specific item through the combination system.
**Key features:**
- Automatically advances when the player creates the specified item through combination
- Shows dialogue while waiting for the item combination
- Visual prompt appears when the item is created, indicating available dialogue
![WaitOnCombination Node Example](media/wait_on_combination_node.png)
**Implementation details:**
- Defined as `RuntimeDialogueNodeType.WaitOnCombination` in `RuntimeDialogueGraph.cs`
- Links to `ItemManager.OnItemsCombined` event through the `combinationResultItemID` property
- The `DialogueComponent` listens for item combination events through `OnAnyItemsCombined` method
### 6. End Node
Terminates the dialogue sequence.
**Key features:**
- Marks the dialogue as completed
- No further interaction available until the dialogue is restarted
![End Node Example](media/end_node.png)
**Implementation details:**
- Defined as `RuntimeDialogueNodeType.End` in `RuntimeDialogueGraph.cs`
- When reached, sets the `IsCompleted` flag on the `DialogueComponent`
- No next node connection is required for this node type
## Dialogue Editor
The dialogue editor is a custom Unity tool that allows for visual creation and editing of dialogue graphs.
![Dialogue Editor Interface](media/dialogue_editor_interface.png)
### Key Editor Features
- **Visual Node Editing**: Add and connect nodes in a visual graph
- **Node Type Selection**: Choose from the six supported node types
- **Dialogue Text Entry**: Add multiple lines of dialogue for each node
- **Condition Setup**: Specify condition IDs for conditional nodes
- **Node Connections**: Create the flow between dialogue nodes
### Editor Workflow
1. **Create New Graph**: Right-click in Project view and select Create > Dialogue Graph
2. **Open Editor**: Double-click the created asset to open the dialogue editor
3. **Add Nodes**: Right-click in the editor and select Add Node > [Node Type]
4. **Configure Nodes**: Enter dialogue text and set conditions as needed
5. **Connect Nodes**: Drag from output ports to input ports to create connections
6. **Set Entry Node**: Mark one node as the entry point for the dialogue
7. **Save**: Save your dialogue graph when finished
## Designer Tips
1. **Node Organization**
- Start every dialogue graph with a standard Dialogue node as the entry point
- End every dialogue path with an End node to properly terminate the conversation
- Use conditional nodes strategically to create gameplay-driven dialogue experiences
2. **Dialogue Writing**
- Keep individual dialogue lines concise for better readability
- Consider using the looping option for nodes when you want to repeat information
- For WaitOnSlot nodes, write unique dialogue for incorrect/forbidden items to provide clear feedback
3. **Flow Control**
- Ensure all nodes (except End nodes) have a valid next node specified
- Test dialogue paths to verify all conditions can be met during gameplay
- Consider using multiple dialogue lines within a single node rather than creating separate nodes for sequential lines
4. **Best Practices**
- Name your nodes descriptively in the editor for easier management
- Group related dialogue sequences into separate dialogue graphs
- Use the speaker name field to clearly identify who is speaking
## Technical Details
### Public Events and APIs
The dialogue system exposes several events that can be used by other systems:
#### DialogueComponent
- **Events**:
- `OnDialogueChanged`: Triggered when the dialogue text changes
- **Properties**:
- `IsActive`: Indicates whether the dialogue is currently active
- `IsCompleted`: Indicates whether the dialogue has reached an End node
- `CurrentSpeakerName`: Returns the name of the current speaker
- **Public Methods**:
- `StartDialogue()`: Initiates the dialogue from the beginning
- `GetCurrentDialogueLine()`: Retrieves the current dialogue line text
- `HasAnyLines()`: Checks if the dialogue component has any lines available
- `SetDialogueGraph(RuntimeDialogueGraph)`: Sets the dialogue graph for the component
#### SpeechBubble
- **Public Methods**:
- `Show()`: Makes the speech bubble visible
- `Hide()`: Hides the speech bubble
- `Toggle()`: Toggles the visibility of the speech bubble
- `SetText(string)`: Sets the text displayed in the speech bubble
- `DisplayDialogueLine(string, bool)`: Displays a dialogue line and handles prompt visibility
- `UpdatePromptVisibility(bool)`: Updates the speech bubble to show a prompt or hide based on dialogue availability
- `SetDisplayMode(TextDisplayMode)`: Changes how text is displayed (instant or typewriter)
- `SkipTypewriter()`: Immediately displays the full text, skipping the typewriter effect
- `SetTypewriterSpeed(float)`: Sets the speed of the typewriter effect
### Integration with Other Systems
The dialogue system integrates with several other game systems:
1. **Puzzle System**: Monitors puzzle completion events to advance WaitOnPuzzleStep nodes
2. **Item System**: Tracks item pickups, combinations, and slot interactions to advance respective node types
3. **Interaction System**: Responds to player interaction with the NPC to progress through dialogue lines
### Technical Workflow
1. Create a RuntimeDialogueGraph asset in the Unity editor
2. Add nodes and connections using the dialogue editor
3. Assign the graph to a DialogueComponent on an NPC GameObject
4. Ensure a SpeechBubble component is available (as a child object or referenced)
5. Set up any necessary puzzle steps, items, or slots that the dialogue will reference

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
docs/media/end_node.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB