Compare commits

...

10 Commits

Author SHA1 Message Date
Michal Pikulski
1224d1ba03 Add text field support for wrap 2025-10-08 11:31:40 +02:00
Michal Pikulski
5ad3ae8815 Working dialogue images mixed with text 2025-10-08 11:27:27 +02:00
Michal Pikulski
1a05f89226 First pass on the image drawing 2025-10-08 10:51:14 +02:00
Michal Pikulski
d6ed35969d Fix quarry level 2025-10-07 14:26:33 +02:00
0a553162a6 Pull from Michal Stuff 2025-10-07 13:14:45 +02:00
dea470f93f Replaced almost all placeholders with final art
Some animations still need to be added and replaced, but most of the sprites are final now.
2025-10-07 13:04:14 +02:00
Michal Pikulski
d0d785d605 te-he, compile error 2025-10-07 13:00:58 +02:00
Michal Pikulski
eb938f9adb Merge branch 'main' of https://homelab.tailf7f81b.ts.net/tschesky/AppleHillsProduction 2025-10-07 12:57:23 +02:00
10992b43cc Unity Timeline Interaction System Integration (#17)
- Added InteractionTimelineAction component for timeline-driven interactions
- Implemented custom editor for timeline event mapping
- Updated interaction event flow to support timeline actions
- Enhanced character move target configuration
- Improved inspector UI for interactable components
- Added technical documentation for interaction system
- Refactored interaction action base classes for extensibility
- Fixed issues with character binding in timelines

Co-authored-by: Michal Pikulski <michal@foolhardyhorizons.com>
Co-authored-by: Michal Pikulski <michal.a.pikulski@gmail.com>
Reviewed-on: #17
2025-10-07 10:57:11 +00:00
Michal Pikulski
f845673eca Remove dependencies on legacy variables in GameManager.Instance 2025-10-07 10:44:26 +02:00
110 changed files with 7288 additions and 2912 deletions

View File

@@ -1,5 +1,31 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1102 &-6841130024917635350
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: WolterBushIdle
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: 9f6badd41620fcc4ca57350469e3cd8c, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:
--- !u!1107 &-4566849210467046986
AnimatorStateMachine:
serializedVersion: 6
@@ -8,7 +34,13 @@ AnimatorStateMachine:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: Base Layer
m_ChildStates: []
m_ChildStates:
- serializedVersion: 1
m_State: {fileID: 5529887278422423141}
m_Position: {x: 30, y: 310, z: 0}
- serializedVersion: 1
m_State: {fileID: -6841130024917635350}
m_Position: {x: 290, y: 310, z: 0}
m_ChildStateMachines: []
m_AnyStateTransitions: []
m_EntryTransitions: []
@@ -18,7 +50,7 @@ AnimatorStateMachine:
m_EntryPosition: {x: 50, y: 120, z: 0}
m_ExitPosition: {x: 800, y: 120, z: 0}
m_ParentStateMachinePosition: {x: 800, y: 20, z: 0}
m_DefaultState: {fileID: 0}
m_DefaultState: {fileID: 5529887278422423141}
--- !u!91 &9100000
AnimatorController:
m_ObjectHideFlags: 0
@@ -27,7 +59,13 @@ AnimatorController:
m_PrefabAsset: {fileID: 0}
m_Name: WolterBushAnimController
serializedVersion: 5
m_AnimatorParameters: []
m_AnimatorParameters:
- m_Name: wolterisout
m_Type: 9
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 9100000}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
@@ -41,3 +79,55 @@ AnimatorController:
m_IKPass: 0
m_SyncedLayerAffectsTiming: 0
m_Controller: {fileID: 9100000}
--- !u!1101 &4202584828236461532
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: wolterisout
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -6841130024917635350}
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 &5529887278422423141
AnimatorState:
serializedVersion: 6
m_ObjectHideFlags: 1
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: WolterBushShaky
m_Speed: 1
m_CycleOffset: 0
m_Transitions:
- {fileID: 4202584828236461532}
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: 8c3c7d49344be8b41a6c0567329570fa, type: 2}
m_Tag:
m_SpeedParameter:
m_MirrorParameter:
m_CycleOffsetParameter:
m_TimeParameter:

View File

@@ -17,21 +17,40 @@ AnimationClip:
m_PositionCurves: []
m_ScaleCurves: []
m_FloatCurves: []
m_PPtrCurves: []
m_PPtrCurves:
- serializedVersion: 2
curve:
- time: 0
value: {fileID: 5790909876540137479, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
attribute: m_Sprite
path:
classID: 212
script: {fileID: 0}
flags: 2
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: []
pptrCurveMapping: []
genericBindings:
- serializedVersion: 2
path: 0
attribute: 0
script: {fileID: 0}
typeID: 212
customType: 23
isPPtrCurve: 1
isIntCurve: 0
isSerializeReferenceCurve: 0
pptrCurveMapping:
- {fileID: 5790909876540137479, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
m_AnimationClipSettings:
serializedVersion: 2
m_AdditiveReferencePoseClip: {fileID: 0}
m_AdditiveReferencePoseTime: 0
m_StartTime: 0
m_StopTime: 1
m_StopTime: 0.016666668
m_OrientationOffsetY: 0
m_Level: 0
m_CycleOffset: 0

View File

@@ -17,21 +17,70 @@ AnimationClip:
m_PositionCurves: []
m_ScaleCurves: []
m_FloatCurves: []
m_PPtrCurves: []
m_PPtrCurves:
- serializedVersion: 2
curve:
- time: 0
value: {fileID: 5790909876540137479, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- time: 0.11666667
value: {fileID: 356313213695173180, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- time: 0.25
value: {fileID: -8142908360652288411, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- time: 0.35
value: {fileID: -8752346798096107195, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- time: 0.46666667
value: {fileID: -6324821020194428341, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- time: 0.5833333
value: {fileID: 196032492730712452, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- time: 0.7
value: {fileID: -6324821020194428341, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- time: 0.81666666
value: {fileID: -8752346798096107195, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- time: 0.9166667
value: {fileID: -8142908360652288411, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- time: 1.05
value: {fileID: 356313213695173180, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- time: 1.1666666
value: {fileID: 5790909876540137479, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
attribute: m_Sprite
path:
classID: 212
script: {fileID: 0}
flags: 2
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: []
pptrCurveMapping: []
genericBindings:
- serializedVersion: 2
path: 0
attribute: 0
script: {fileID: 0}
typeID: 212
customType: 23
isPPtrCurve: 1
isIntCurve: 0
isSerializeReferenceCurve: 0
pptrCurveMapping:
- {fileID: 5790909876540137479, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- {fileID: 356313213695173180, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- {fileID: -8142908360652288411, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- {fileID: -8752346798096107195, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- {fileID: -6324821020194428341, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- {fileID: 196032492730712452, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- {fileID: -6324821020194428341, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- {fileID: -8752346798096107195, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- {fileID: -8142908360652288411, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- {fileID: 356313213695173180, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
- {fileID: 5790909876540137479, guid: d27cc24bf161b644d8152e74a52d8310, type: 3}
m_AnimationClipSettings:
serializedVersion: 2
m_AdditiveReferencePoseClip: {fileID: 0}
m_AdditiveReferencePoseTime: 0
m_StartTime: 0
m_StopTime: 1
m_StopTime: 1.1833333
m_OrientationOffsetY: 0
m_Level: 0
m_CycleOffset: 0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 216 KiB

View File

@@ -1,455 +0,0 @@
fileFormatVersion: 2
guid: f1a921cb376a6d043a796234c306ba68
TextureImporter:
internalIDToNameTable:
- first:
213: -189743790578022737
second: Luringspot0080_0
- first:
213: 6634189543822600794
second: Luringspot0080_1
- first:
213: -231093529369419673
second: Luringspot0080_2
- first:
213: 2511414595236032001
second: Luringspot0080_3
- first:
213: 7490609438194625126
second: Luringspot0080_4
- first:
213: -6794908659002637049
second: Luringspot0080_5
- first:
213: 567636739033421879
second: Luringspot0080_6
- first:
213: 2856833346655728983
second: Luringspot0080_7
- first:
213: 1284371567033583602
second: Luringspot0080_8
- first:
213: -2704272121687727977
second: Luringspot0080_9
- first:
213: -6980304613595511497
second: Luringspot0080_10
- first:
213: 3462249222720182602
second: Luringspot0080_11
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: Luringspot0080_0
rect:
serializedVersion: 2
x: 1206
y: 509
width: 1152
height: 760
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: fa6c24c1705ed5df0800000000000000
internalID: -189743790578022737
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0080_1
rect:
serializedVersion: 2
x: 2332
y: 876
width: 211
height: 155
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: a5a282c9d30611c50800000000000000
internalID: 6634189543822600794
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0080_2
rect:
serializedVersion: 2
x: 416
y: 661
width: 235
height: 146
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 7606b00d8adfaccf0800000000000000
internalID: -231093529369419673
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0080_3
rect:
serializedVersion: 2
x: 933
y: 580
width: 219
height: 132
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 10e66c0b4465ad220800000000000000
internalID: 2511414595236032001
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0080_4
rect:
serializedVersion: 2
x: 2489
y: 617
width: 229
height: 159
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 66a67cad89df3f760800000000000000
internalID: 7490609438194625126
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0080_5
rect:
serializedVersion: 2
x: 655
y: 505
width: 230
height: 137
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 7050cea5392a3b1a0800000000000000
internalID: -6794908659002637049
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0080_6
rect:
serializedVersion: 2
x: 2823
y: 381
width: 235
height: 146
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 7385c8f4b96a0e700800000000000000
internalID: 567636739033421879
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0080_7
rect:
serializedVersion: 2
x: 1401
y: 233
width: 165
height: 153
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 755b7e9eac285a720800000000000000
internalID: 2856833346655728983
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0080_8
rect:
serializedVersion: 2
x: 1709
y: 314
width: 235
height: 146
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 2f706a4a22103d110800000000000000
internalID: 1284371567033583602
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0080_9
rect:
serializedVersion: 2
x: 2436
y: 227
width: 166
height: 214
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 790afca45de787ad0800000000000000
internalID: -2704272121687727977
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0080_10
rect:
serializedVersion: 2
x: 3021
y: 275
width: 235
height: 146
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 7358e9aefe9f02f90800000000000000
internalID: -6980304613595511497
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0080_11
rect:
serializedVersion: 2
x: 1038
y: 101
width: 235
height: 146
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: a49db1403516c0030800000000000000
internalID: 3462249222720182602
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
Luringspot0080_0: -189743790578022737
Luringspot0080_1: 6634189543822600794
Luringspot0080_10: -6980304613595511497
Luringspot0080_11: 3462249222720182602
Luringspot0080_2: -231093529369419673
Luringspot0080_3: 2511414595236032001
Luringspot0080_4: 7490609438194625126
Luringspot0080_5: -6794908659002637049
Luringspot0080_6: 567636739033421879
Luringspot0080_7: 2856833346655728983
Luringspot0080_8: 1284371567033583602
Luringspot0080_9: -2704272121687727977
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 KiB

View File

@@ -1,611 +0,0 @@
fileFormatVersion: 2
guid: fca81b1ec6b01924caffce1a19764e06
TextureImporter:
internalIDToNameTable:
- first:
213: 425945789233119077
second: Luringspot0081_0
- first:
213: -5739697896091322602
second: Luringspot0081_1
- first:
213: 4636477264175952403
second: Luringspot0081_2
- first:
213: 291184454042733084
second: Luringspot0081_3
- first:
213: 5319380130674477576
second: Luringspot0081_4
- first:
213: -3840690440587144844
second: Luringspot0081_5
- first:
213: 7784354390229609529
second: Luringspot0081_6
- first:
213: 3110403909336789395
second: Luringspot0081_7
- first:
213: 1334686067146006931
second: Luringspot0081_8
- first:
213: 2887345882747352
second: Luringspot0081_9
- first:
213: 8916561625827917006
second: Luringspot0081_10
- first:
213: -8275576412640565326
second: Luringspot0081_11
- first:
213: 7740462440668012793
second: Luringspot0081_12
- first:
213: -3751976571882609409
second: Luringspot0081_13
- first:
213: 6322729528144262865
second: Luringspot0081_14
- first:
213: 8132922268536676421
second: Luringspot0081_15
- first:
213: 5019937858172960382
second: Luringspot0081_16
- first:
213: 4689594823402432708
second: Luringspot0081_17
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: Luringspot0081_0
rect:
serializedVersion: 2
x: 1077
y: 748
width: 169
height: 205
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 56f30d4407349e500800000000000000
internalID: 425945789233119077
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_1
rect:
serializedVersion: 2
x: 1589
y: 462
width: 689
height: 913
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 6177b697c2f7850b0800000000000000
internalID: -5739697896091322602
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_2
rect:
serializedVersion: 2
x: 2405
y: 712
width: 243
height: 165
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 312f164b183185040800000000000000
internalID: 4636477264175952403
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_3
rect:
serializedVersion: 2
x: 2791
y: 634
width: 211
height: 152
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: c1a455bd7be7a0400800000000000000
internalID: 291184454042733084
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_4
rect:
serializedVersion: 2
x: 769
y: 470
width: 212
height: 155
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 80a8f1aab0c32d940800000000000000
internalID: 5319380130674477576
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_5
rect:
serializedVersion: 2
x: 891
y: 612
width: 187
height: 132
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 4719094a46023bac0800000000000000
internalID: -3840690440587144844
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_6
rect:
serializedVersion: 2
x: 1296
y: 592
width: 218
height: 152
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 93c636b1315970c60800000000000000
internalID: 7784354390229609529
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_7
rect:
serializedVersion: 2
x: 2284
y: 381
width: 378
height: 277
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 391710c30ef5a2b20800000000000000
internalID: 3110403909336789395
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_8
rect:
serializedVersion: 2
x: 1250
y: 350
width: 396
height: 242
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 391a6e618e1c58210800000000000000
internalID: 1334686067146006931
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_9
rect:
serializedVersion: 2
x: 1532
y: 548
width: 78
height: 50
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 8d15fa996024a0000800000000000000
internalID: 2887345882747352
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_10
rect:
serializedVersion: 2
x: 1148
y: 448
width: 78
height: 46
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: ecc3a558e8dfdbb70800000000000000
internalID: 8916561625827917006
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_11
rect:
serializedVersion: 2
x: 2680
y: 494
width: 68
height: 44
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 2b725fc391f372d80800000000000000
internalID: -8275576412640565326
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_12
rect:
serializedVersion: 2
x: 2954
y: 387
width: 226
height: 146
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 9f0254d3495ab6b60800000000000000
internalID: 7740462440668012793
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_13
rect:
serializedVersion: 2
x: 1608
y: 244
width: 235
height: 146
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: ff4695bcf2d4eebc0800000000000000
internalID: -3751976571882609409
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_14
rect:
serializedVersion: 2
x: 2638
y: 376
width: 80
height: 56
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 1d679efa109deb750800000000000000
internalID: 6322729528144262865
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_15
rect:
serializedVersion: 2
x: 927
y: 211
width: 229
height: 159
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 5402ef196b1fdd070800000000000000
internalID: 8132922268536676421
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_16
rect:
serializedVersion: 2
x: 2061
y: 102
width: 166
height: 214
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: e7e3fee92e66aa540800000000000000
internalID: 5019937858172960382
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0081_17
rect:
serializedVersion: 2
x: 2342
y: 314
width: 90
height: 56
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 4c8a96535a9c41140800000000000000
internalID: 4689594823402432708
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
Luringspot0081_0: 425945789233119077
Luringspot0081_1: -5739697896091322602
Luringspot0081_10: 8916561625827917006
Luringspot0081_11: -8275576412640565326
Luringspot0081_12: 7740462440668012793
Luringspot0081_13: -3751976571882609409
Luringspot0081_14: 6322729528144262865
Luringspot0081_15: 8132922268536676421
Luringspot0081_16: 5019937858172960382
Luringspot0081_17: 4689594823402432708
Luringspot0081_2: 4636477264175952403
Luringspot0081_3: 291184454042733084
Luringspot0081_4: 5319380130674477576
Luringspot0081_5: -3840690440587144844
Luringspot0081_6: 7784354390229609529
Luringspot0081_7: 3110403909336789395
Luringspot0081_8: 1334686067146006931
Luringspot0081_9: 2887345882747352
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

Before

Width:  |  Height:  |  Size: 365 KiB

View File

@@ -1,663 +0,0 @@
fileFormatVersion: 2
guid: 23bdf1cb4c92e59499b5375c5cfff20e
TextureImporter:
internalIDToNameTable:
- first:
213: -5025521861736725676
second: Luringspot0082_0
- first:
213: -992055388833163618
second: Luringspot0082_1
- first:
213: 5713939621973605566
second: Luringspot0082_2
- first:
213: -1496327516344575284
second: Luringspot0082_3
- first:
213: -8935868224838253308
second: Luringspot0082_4
- first:
213: 6886278549429677833
second: Luringspot0082_5
- first:
213: -1997921213772081958
second: Luringspot0082_6
- first:
213: -7309286936359493210
second: Luringspot0082_7
- first:
213: -7544908485840830073
second: Luringspot0082_8
- first:
213: 2866146533646128686
second: Luringspot0082_9
- first:
213: 8211507920910758529
second: Luringspot0082_10
- first:
213: 5694715799992700377
second: Luringspot0082_11
- first:
213: 2714711395726943910
second: Luringspot0082_12
- first:
213: -3610955057293593613
second: Luringspot0082_13
- first:
213: 5320305906798982167
second: Luringspot0082_14
- first:
213: 1276444889289157053
second: Luringspot0082_15
- first:
213: -81678692351163310
second: Luringspot0082_16
- first:
213: 323858330673094317
second: Luringspot0082_17
- first:
213: -988497236834035925
second: Luringspot0082_18
- first:
213: 6009270068323059372
second: Luringspot0082_19
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: Luringspot0082_0
rect:
serializedVersion: 2
x: 1036
y: 748
width: 170
height: 205
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 453093c3e72c14ab0800000000000000
internalID: -5025521861736725676
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_1
rect:
serializedVersion: 2
x: 1250
y: 702
width: 346
height: 240
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: e96561741e28b32f0800000000000000
internalID: -992055388833163618
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_2
rect:
serializedVersion: 2
x: 1532
y: 898
width: 78
height: 50
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: ebc34cbffcdfb4f40800000000000000
internalID: 5713939621973605566
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_3
rect:
serializedVersion: 2
x: 1561
y: 461
width: 796
height: 1014
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: cca93a04d0afb3be0800000000000000
internalID: -1496327516344575284
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_4
rect:
serializedVersion: 2
x: 2329
y: 903
width: 387
height: 228
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 405c0da913b6df380800000000000000
internalID: -8935868224838253308
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_5
rect:
serializedVersion: 2
x: 1148
y: 798
width: 78
height: 46
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 90fe52b0bd9f09f50800000000000000
internalID: 6886278549429677833
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_6
rect:
serializedVersion: 2
x: 2397
y: 676
width: 259
height: 134
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: ad4d5e3dd35f544e0800000000000000
internalID: -1997921213772081958
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_7
rect:
serializedVersion: 2
x: 2794
y: 697
width: 224
height: 130
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 6a1a3e4f142309a90800000000000000
internalID: -7309286936359493210
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_8
rect:
serializedVersion: 2
x: 594
y: 470
width: 212
height: 155
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 78180aee4b91b4790800000000000000
internalID: -7544908485840830073
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_9
rect:
serializedVersion: 2
x: 716
y: 612
width: 187
height: 132
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: e26d13c361996c720800000000000000
internalID: 2866146533646128686
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_10
rect:
serializedVersion: 2
x: 1321
y: 592
width: 218
height: 152
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 182313892f225f170800000000000000
internalID: 8211507920910758529
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_11
rect:
serializedVersion: 2
x: 1087
y: 296
width: 339
height: 307
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 9dd8e5329d1b70f40800000000000000
internalID: 5694715799992700377
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_12
rect:
serializedVersion: 2
x: 1436
y: 350
width: 235
height: 146
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 6a6620a91a79ca520800000000000000
internalID: 2714711395726943910
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_13
rect:
serializedVersion: 2
x: 1608
y: 244
width: 235
height: 146
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 3f37d1ec18f43edc0800000000000000
internalID: -3610955057293593613
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_14
rect:
serializedVersion: 2
x: 2309
y: 366
width: 69
height: 49
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 7147a27b80685d940800000000000000
internalID: 5320305906798982167
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_15
rect:
serializedVersion: 2
x: 2356
y: 370
width: 319
height: 234
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: db961792dd7d6b110800000000000000
internalID: 1276444889289157053
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_16
rect:
serializedVersion: 2
x: 2954
y: 387
width: 226
height: 146
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 254c0bc79a1dddef0800000000000000
internalID: -81678692351163310
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_17
rect:
serializedVersion: 2
x: 927
y: 211
width: 229
height: 159
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: dae12559f639e7400800000000000000
internalID: 323858330673094317
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_18
rect:
serializedVersion: 2
x: 2061
y: 102
width: 166
height: 214
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: b275d0910072842f0800000000000000
internalID: -988497236834035925
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082_19
rect:
serializedVersion: 2
x: 2548
y: 314
width: 78
height: 49
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: ca688c5e947356350800000000000000
internalID: 6009270068323059372
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
Luringspot0082_0: -5025521861736725676
Luringspot0082_1: -992055388833163618
Luringspot0082_10: 8211507920910758529
Luringspot0082_11: 5694715799992700377
Luringspot0082_12: 2714711395726943910
Luringspot0082_13: -3610955057293593613
Luringspot0082_14: 5320305906798982167
Luringspot0082_15: 1276444889289157053
Luringspot0082_16: -81678692351163310
Luringspot0082_17: 323858330673094317
Luringspot0082_18: -988497236834035925
Luringspot0082_19: 6009270068323059372
Luringspot0082_2: 5713939621973605566
Luringspot0082_3: -1496327516344575284
Luringspot0082_4: -8935868224838253308
Luringspot0082_5: 6886278549429677833
Luringspot0082_6: -1997921213772081958
Luringspot0082_7: -7309286936359493210
Luringspot0082_8: -7544908485840830073
Luringspot0082_9: 2866146533646128686
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 KiB

View File

@@ -0,0 +1,299 @@
fileFormatVersion: 2
guid: 46b2fe6896b27cc4c8bd9f0da3f0de50
TextureImporter:
internalIDToNameTable:
- first:
213: -2184305063030378797
second: Luringspot0082 1_0
- first:
213: -1125559343802010594
second: Luringspot0082 1_1
- first:
213: -3126590882606850531
second: Luringspot0082 1_2
- first:
213: 8025829151665581729
second: Luringspot0082 1_3
- first:
213: -4642567369727099706
second: Luringspot0082 1_4
- first:
213: -8560188491584682866
second: Luringspot0082 1_5
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: Luringspot0082 1_0
rect:
serializedVersion: 2
x: 638
y: 803
width: 242
height: 113
alignment: 0
pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 3deacfc3e1acfa1e0800000000000000
internalID: -2184305063030378797
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082 1_1
rect:
serializedVersion: 2
x: 566
y: 79
width: 2887
height: 1416
alignment: 9
pivot: {x: 0.5088555, y: 0.82942355}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: e143f038db53160f0800000000000000
internalID: -1125559343802010594
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082 1_2
rect:
serializedVersion: 2
x: 594
y: 470
width: 212
height: 155
alignment: 0
pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: d1e5e3c582e1c94d0800000000000000
internalID: -3126590882606850531
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082 1_3
rect:
serializedVersion: 2
x: 716
y: 612
width: 187
height: 132
alignment: 0
pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 1ae600d3719716f60800000000000000
internalID: 8025829151665581729
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082 1_4
rect:
serializedVersion: 2
x: 3064
y: 574
width: 366
height: 165
alignment: 0
pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 6ccb8991399429fb0800000000000000
internalID: -4642567369727099706
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0082 1_5
rect:
serializedVersion: 2
x: 2954
y: 387
width: 226
height: 146
alignment: 0
pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: e8445b4bbe9143980800000000000000
internalID: -8560188491584682866
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 35efb6b54f8f50547ba348d4e796463a
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
Luringspot0082 1_0: -2184305063030378797
Luringspot0082 1_1: -1125559343802010594
Luringspot0082 1_2: -3126590882606850531
Luringspot0082 1_3: 8025829151665581729
Luringspot0082 1_4: -4642567369727099706
Luringspot0082 1_5: -8560188491584682866
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 KiB

View File

@@ -0,0 +1,169 @@
fileFormatVersion: 2
guid: 95d6dbee5cb1f694c971791ee60cad14
TextureImporter:
internalIDToNameTable:
- first:
213: -642587728066523507
second: Luringspot0081 1_0
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: Luringspot0081 1_0
rect:
serializedVersion: 2
x: 765
y: 7
width: 2463
height: 1368
alignment: 9
pivot: {x: 0.491691, y: 0.83455706}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: d8ec19badd11517f0800000000000000
internalID: -642587728066523507
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 4f5830a63fe63b2408dab3fe91c4c068
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
Luringspot0081 1_0: -642587728066523507
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 KiB

View File

@@ -0,0 +1,195 @@
fileFormatVersion: 2
guid: 27419b0e3639a3e4184d676890da073a
TextureImporter:
internalIDToNameTable:
- first:
213: -4803891911566685267
second: Luringspot0080 1_0
- first:
213: 4728896231509914993
second: Luringspot0080 1_1
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: Luringspot0080 1_0
rect:
serializedVersion: 2
x: 416
y: 661
width: 235
height: 146
alignment: 0
pivot: {x: 0.5, y: 0.5}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: dab02bf22c5255db0800000000000000
internalID: -4803891911566685267
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Luringspot0080 1_1
rect:
serializedVersion: 2
x: 402
y: 92
width: 2854
height: 1177
alignment: 9
pivot: {x: 0.5, y: 0.85}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 175f4da511a60a140800000000000000
internalID: 4728896231509914993
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 839b47c5d100feb46adfec4cfcbc3bf3
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
Luringspot0080 1_0: -4803891911566685267
Luringspot0080 1_1: 4728896231509914993
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 KiB

View File

@@ -0,0 +1,169 @@
fileFormatVersion: 2
guid: 774aa67620143f44eb34689c040d0ee6
TextureImporter:
internalIDToNameTable:
- first:
213: -3949104700904280293
second: PicnicBasket0001_0
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: PicnicBasket0001_0
rect:
serializedVersion: 2
x: 1008
y: 715
width: 712
height: 689
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: b1f66c1a236f139c0800000000000000
internalID: -3949104700904280293
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
PicnicBasket0001_0: -3949104700904280293
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

View File

@@ -0,0 +1,169 @@
fileFormatVersion: 2
guid: 152bf92088cbe83409df9f3769619097
TextureImporter:
internalIDToNameTable:
- first:
213: 277634131431117102
second: PicnicBasket0002_0
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: PicnicBasket0002_0
rect:
serializedVersion: 2
x: 1099
y: 715
width: 621
height: 654
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: e21d97585ca5ad300800000000000000
internalID: 277634131431117102
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
PicnicBasket0002_0: 277634131431117102
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

View File

@@ -0,0 +1,169 @@
fileFormatVersion: 2
guid: 2d1aeda288c7b1b429fbfca82c59c8e1
TextureImporter:
internalIDToNameTable:
- first:
213: -6996254108146645158
second: PicnicBasket0003_0
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: PicnicBasket0003_0
rect:
serializedVersion: 2
x: 1061
y: 1009
width: 290
height: 393
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: a574d85d4ff48ee90800000000000000
internalID: -6996254108146645158
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
PicnicBasket0003_0: -6996254108146645158
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

View File

@@ -0,0 +1,169 @@
fileFormatVersion: 2
guid: cf5af87e6a25e9442b89f069b894a5fd
TextureImporter:
internalIDToNameTable:
- first:
213: -3811075571101519331
second: PicnicBasket0004_0
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: PicnicBasket0004_0
rect:
serializedVersion: 2
x: 1008
y: 1008
width: 368
height: 396
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: d123354c5f65c1bc0800000000000000
internalID: -3811075571101519331
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
PicnicBasket0004_0: -3811075571101519331
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

View File

@@ -0,0 +1,221 @@
fileFormatVersion: 2
guid: 78693b3f90dcf884da247f3aa1fd92a8
TextureImporter:
internalIDToNameTable:
- first:
213: 5362986125728758211
second: PicnicBasket0005_0
- first:
213: -364760000446031797
second: PicnicBasket0005_1
- first:
213: 6384599752901787320
second: PicnicBasket0005_2
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: PicnicBasket0005_0
rect:
serializedVersion: 2
x: 1230
y: 1157
width: 307
height: 278
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 3c9396f87772d6a40800000000000000
internalID: 5362986125728758211
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: PicnicBasket0005_1
rect:
serializedVersion: 2
x: 1535
y: 1039
width: 304
height: 276
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: b48942156bc10faf0800000000000000
internalID: -364760000446031797
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: PicnicBasket0005_2
rect:
serializedVersion: 2
x: 1203
y: 942
width: 348
height: 205
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 8bef1c0f5a7aa9850800000000000000
internalID: 6384599752901787320
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
PicnicBasket0005_0: 5362986125728758211
PicnicBasket0005_1: -364760000446031797
PicnicBasket0005_2: 6384599752901787320
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

View File

@@ -0,0 +1,195 @@
fileFormatVersion: 2
guid: 44a64b7a80921694790236bab7765357
TextureImporter:
internalIDToNameTable:
- first:
213: -8897872742393391051
second: TennisBall_0
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: WindowsStoreApps
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: TennisBall_0
rect:
serializedVersion: 2
x: 21
y: 29
width: 219
height: 190
alignment: 0
pivot: {x: 0, y: 0}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 538d20d32e7648480800000000000000
internalID: -8897872742393391051
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID:
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable:
TennisBall_0: -8897872742393391051
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 634e7866ae732e74db3e535eac99e179
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 KiB

View File

@@ -0,0 +1,327 @@
fileFormatVersion: 2
guid: d27cc24bf161b644d8152e74a52d8310
TextureImporter:
internalIDToNameTable:
- first:
213: 5790909876540137479
second: Wolterbush_0
- first:
213: 356313213695173180
second: Wolterbush_1
- first:
213: -8142908360652288411
second: Wolterbush_2
- first:
213: -8752346798096107195
second: Wolterbush_3
- first:
213: -6324821020194428341
second: Wolterbush_4
- first:
213: 196032492730712452
second: Wolterbush_5
- first:
213: -2337357357073190330
second: Wolterbush_6
externalObjects: {}
serializedVersion: 13
mipmaps:
mipMapMode: 0
enableMipMap: 0
sRGBTexture: 1
linearTexture: 0
fadeOut: 0
borderMipMap: 0
mipMapsPreserveCoverage: 0
alphaTestReferenceValue: 0.5
mipMapFadeDistanceStart: 1
mipMapFadeDistanceEnd: 3
bumpmap:
convertToNormalMap: 0
externalNormalMap: 0
heightScale: 0.25
normalMapFilter: 0
flipGreenChannel: 0
isReadable: 0
streamingMipmaps: 0
streamingMipmapsPriority: 0
vTOnly: 0
ignoreMipmapLimit: 0
grayScaleToAlpha: 0
generateCubemap: 6
cubemapConvolution: 0
seamlessCubemap: 0
textureFormat: 1
maxTextureSize: 2048
textureSettings:
serializedVersion: 2
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapW: 1
nPOTScale: 0
lightmap: 0
compressionQuality: 50
spriteMode: 2
spriteExtrude: 1
spriteMeshType: 1
alignment: 0
spritePivot: {x: 0.5, y: 0.5}
spritePixelsToUnits: 100
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
spriteTessellationDetail: -1
textureType: 8
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
flipbookColumns: 1
maxTextureSizeSet: 0
compressionQualitySet: 0
textureFormatSet: 0
ignorePngGamma: 0
applyGammaDecoding: 0
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 4
buildTarget: iOS
maxTextureSize: 2048
resizeAlgorithm: 0
textureFormat: -1
textureCompression: 1
compressionQuality: 50
crunchedCompression: 0
allowsAlphaSplitting: 0
overridden: 0
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
spriteSheet:
serializedVersion: 2
sprites:
- serializedVersion: 2
name: Wolterbush_0
rect:
serializedVersion: 2
x: 0
y: 2295
width: 1175
height: 765
alignment: 9
pivot: {x: 0.5, y: 0.2}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 700e975e9d17d5050800000000000000
internalID: 5790909876540137479
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Wolterbush_1
rect:
serializedVersion: 2
x: 1175
y: 2295
width: 1175
height: 765
alignment: 9
pivot: {x: 0.5, y: 0.2}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: c322413eaf0e1f400800000000000000
internalID: 356313213695173180
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Wolterbush_2
rect:
serializedVersion: 2
x: 0
y: 1530
width: 1175
height: 765
alignment: 9
pivot: {x: 0.5, y: 0.2}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 56e03cc2df39efe80800000000000000
internalID: -8142908360652288411
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Wolterbush_3
rect:
serializedVersion: 2
x: 1175
y: 1530
width: 1175
height: 765
alignment: 9
pivot: {x: 0.5, y: 0.2}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 549347485fa698680800000000000000
internalID: -8752346798096107195
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Wolterbush_4
rect:
serializedVersion: 2
x: 0
y: 765
width: 1175
height: 765
alignment: 9
pivot: {x: 0.5, y: 0.2}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: b4a236fdac8b938a0800000000000000
internalID: -6324821020194428341
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Wolterbush_5
rect:
serializedVersion: 2
x: 1175
y: 765
width: 1175
height: 765
alignment: 9
pivot: {x: 0.5, y: 0.2}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 48106a5738278b200800000000000000
internalID: 196032492730712452
vertices: []
indices:
edges: []
weights: []
- serializedVersion: 2
name: Wolterbush_6
rect:
serializedVersion: 2
x: 0
y: 0
width: 1175
height: 765
alignment: 9
pivot: {x: 0.5, y: 0.2}
border: {x: 0, y: 0, z: 0, w: 0}
customData:
outline: []
physicsShape: []
tessellationDetail: -1
bones: []
spriteID: 642b18a1ed9009fd0800000000000000
internalID: -2337357357073190330
vertices: []
indices:
edges: []
weights: []
outline: []
customData:
physicsShape: []
bones: []
spriteID: 00f249ef84207ac409e2e007e3b28481
internalID: 0
vertices: []
indices:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries:
- key: SpriteEditor.SliceSettings
value: '{"sliceOnImport":false,"gridCellCount":{"x":1.0,"y":1.0},"gridSpriteSize":{"x":1175.0,"y":765.0},"gridSpriteOffset":{"x":0.0,"y":0.0},"gridSpritePadding":{"x":0.0,"y":0.0},"pivot":{"x":0.5,"y":0.20000000298023225},"pivotPixels":{"x":0.0,"y":0.0},"autoSlicingMethod":0,"spriteAlignment":9,"pivotUnitMode":0,"slicingType":1,"keepEmptyRects":false,"isAlternate":false}'
nameFileIdTable:
Wolterbush_0: 5790909876540137479
Wolterbush_1: 356313213695173180
Wolterbush_2: -8142908360652288411
Wolterbush_3: -8752346798096107195
Wolterbush_4: -6324821020194428341
Wolterbush_5: 196032492730712452
Wolterbush_6: -2337357357073190330
mipmapLimitGroupName:
pSDRemoveMatte: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -15,4 +15,4 @@ MonoBehaviour:
_itemId: chocolate_4f2011c6
itemName: Chocolate
description: sweet nectar of gods that lures the beasts from bushes
mapSprite: {fileID: -509776585262497855, guid: c648336c825f7d7479582bbe4d95d0bc, type: 3}
mapSprite: {fileID: -3811075571101519331, guid: 4a1a1ea0011e5644c917aaa7255ab48f, type: 3}

View File

@@ -15,4 +15,4 @@ MonoBehaviour:
_itemId: lurespotb_92c24cf9
itemName: LureSpotB
description: Place where we atract the chocobird
mapSprite: {fileID: 2640071299338251634, guid: 7c4c9881382767047aac78ca51b82923, type: 3}
mapSprite: {fileID: -1125559343802010594, guid: 46b2fe6896b27cc4c8bd9f0da3f0de50, type: 3}

View File

@@ -15,4 +15,4 @@ MonoBehaviour:
_itemId: lurespotc_559f54b7
itemName: LureSpotC
description: Place where we atract the hammerbird
mapSprite: {fileID: 3009302558630513478, guid: 3aefb78ee1b7f6e4685d0fff00e24e3d, type: 3}
mapSprite: {fileID: -642587728066523507, guid: 95d6dbee5cb1f694c971791ee60cad14, type: 3}

View File

@@ -40,14 +40,14 @@ MonoBehaviour:
- __option_DialogueLineType
- __option_NoLines
- RequiredPuzzleStep
- DefaultDialogueLine
- LoopThroughDefaultLines
- DefaultDialogueContent
m_ValueList:
- rid: 4008004731853340754
- rid: 4008004731853340755
- rid: 4008004731853340756
- rid: 4008004731853340757
- rid: 4008004731853340758
- rid: 7545629632211976319
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
@@ -82,10 +82,6 @@ MonoBehaviour:
type: {class: 'Constant`1[[PuzzleStepSO, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: {fileID: 11400000, guid: ea383d1dee861f54c9a1d4f32a2f6afc, type: 2}
- rid: 4008004731853340757
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: That Lawnmower is out of control!
- rid: 4008004731853340758
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
@@ -125,6 +121,41 @@ MonoBehaviour:
m_PortDirection: 1
m_PortOrientation: 0
m_Title: in
- rid: 7545629632211976315
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text:
_image: {fileID: 0}
- rid: 7545629632211976316
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text:
_image: {fileID: 0}
- rid: 7545629632211976317
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text:
_image: {fileID: 0}
- rid: 7545629632211976318
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text:
_image: {fileID: 0}
- rid: 7545629632211976319
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text:
_image: {fileID: 0}
- rid: 7772910664224079872
type: {class: GraphModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
data:
@@ -351,17 +382,17 @@ MonoBehaviour:
m_KeyList:
- __option_DialogueLineType
- __option_NoLines
- DefaultDialogueLine2
- LoopThroughDefaultLines
- DefaultDialogueLine1
- DefaultDialogueLine3
- DefaultDialogueContent1
- DefaultDialogueContent2
- DefaultDialogueContent3
m_ValueList:
- rid: 7772910664224079887
- rid: 7772910664224079888
- rid: 7772910664224079894
- rid: 7772910664224079890
- rid: 7772910664224079893
- rid: 7772910664224079895
- rid: 7545629632211976315
- rid: 7545629632211976316
- rid: 7545629632211976317
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
@@ -431,19 +462,6 @@ MonoBehaviour:
m_PortDirection: 1
m_PortOrientation: 0
m_Title: in
- rid: 7772910664224079893
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: Ok Guys! Let's get these birds out in the open!
- rid: 7772910664224079894
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: Place things the Birds might like in their nests.
- rid: 7772910664224079895
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: I guess what you find in th enests can give you a clue of what they
like?
- rid: 7772910664224079896
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
data:
@@ -464,13 +482,13 @@ MonoBehaviour:
m_KeyList:
- __option_DialogueLineType
- __option_NoLines
- DefaultDialogueLine
- LoopThroughDefaultLines
- DefaultDialogueContent
m_ValueList:
- rid: 7772910664224079897
- rid: 7772910664224079898
- rid: 7772910664224079899
- rid: 7772910664224079900
- rid: 7545629632211976318
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
@@ -501,10 +519,6 @@ MonoBehaviour:
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 1
- rid: 7772910664224079899
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: Go on, get them out of their hiding spots.
- rid: 7772910664224079900
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:

View File

@@ -19,6 +19,20 @@ MonoBehaviour:
RefIds:
- rid: -2
type: {class: , ns: , asm: }
- rid: 7545629632211976320
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text:
_image: {fileID: 0}
- rid: 7545629632211976321
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text:
_image: {fileID: 0}
- rid: 7772910664224079994
type: {class: GraphModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
data:
@@ -296,15 +310,15 @@ MonoBehaviour:
m_KeyList:
- __option_DialogueLineType
- __option_NoLines
- DefaultDialogueLine2
- LoopThroughDefaultLines
- DefaultDialogueLine1
- DefaultDialogueContent1
- DefaultDialogueContent2
m_ValueList:
- rid: 7772910664224080006
- rid: 7772910664224080007
- rid: 7772910664224080012
- rid: 7772910664224080009
- rid: 7772910664224080011
- rid: 7545629632211976320
- rid: 7545629632211976321
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
@@ -374,14 +388,6 @@ MonoBehaviour:
- rid: 7772910664224080010
type: {class: DialogueNode, ns: Editor.Dialogue, asm: AppleHillsEditor}
data:
- rid: 7772910664224080011
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: My lawnmower is on a break so i'm also on a break...
- rid: 7772910664224080012
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: I ain't moving until she decides to move...
- rid: 7772910664224080013
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
data:

View File

@@ -58,10 +58,10 @@ MonoBehaviour:
m_LocalSubgraphs: []
m_LastKnownBounds:
serializedVersion: 2
x: 115
y: 7
width: 3353
height: 399
x: -36
y: 12
width: 3787.2
height: 559.19995
m_GraphElementMetaData:
- m_Guid:
m_Value0: 15250916379536742066
@@ -237,7 +237,7 @@ MonoBehaviour:
serializedVersion: 2
Hash: b25679f5a423a6d30df98cd989cabcf0
m_Version: 2
m_Position: {x: 303.87872, y: 210.33638}
m_Position: {x: 152.62463, y: 208.7273}
m_Title:
m_Tooltip:
m_NodePreviewModel:
@@ -280,7 +280,7 @@ MonoBehaviour:
serializedVersion: 2
Hash: 4c15a501ab0b3876663348bd143a160c
m_Version: 2
m_Position: {x: 115.3345, y: 263.23343}
m_Position: {x: -35.919586, y: 261.62433}
m_Title: SpeakerName
m_Tooltip:
m_NodePreviewModel:
@@ -376,7 +376,7 @@ MonoBehaviour:
serializedVersion: 2
Hash: 63e5eb3c34667babc753a8b79a9a6d99
m_Version: 2
m_Position: {x: 513.6555, y: 168.80977}
m_Position: {x: 362.40143, y: 167.20068}
m_Title:
m_Tooltip:
m_NodePreviewModel:
@@ -386,13 +386,13 @@ MonoBehaviour:
m_KeyList:
- __option_DialogueLineType
- __option_NoLines
- DefaultDialogueLine
- LoopThroughDefaultLines
- DefaultDialogueContent
m_ValueList:
- rid: 1226592702090707077
- rid: 1226592702090707078
- rid: 1226592702090707079
- rid: 1226592702090707080
- rid: 7545629632211976303
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
@@ -423,10 +423,6 @@ MonoBehaviour:
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 1
- rid: 1226592702090707079
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: Psst boy... Why don't you pick up THAT ASS over there?
- rid: 1226592702090707080
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
@@ -476,7 +472,7 @@ MonoBehaviour:
serializedVersion: 2
Hash: d897c8a6890a4ec4f5f614a0a23bfb0b
m_Version: 2
m_Position: {x: 906.1956, y: 144.21957}
m_Position: {x: 832.17773, y: 142.61052}
m_Title:
m_Tooltip:
m_NodePreviewModel:
@@ -487,18 +483,18 @@ MonoBehaviour:
- __option_DialogueLineType
- __option_NoLines
- RequiredPickup
- DefaultDialogueLine2
- LoopThroughDefaultLines
- DefaultDialogueLine1
- DefaultDialogueLine3
- DefaultDialogueContent1
- DefaultDialogueContent2
- DefaultDialogueContent3
m_ValueList:
- rid: 1226592702090707084
- rid: 1226592702090707085
- rid: 1226592702090707086
- rid: 1226592702090707092
- rid: 1226592702090707088
- rid: 1226592702090707091
- rid: 1226592702090707093
- rid: 7545629632211976304
- rid: 7545629632211976305
- rid: 7545629632211976306
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
@@ -572,18 +568,6 @@ MonoBehaviour:
m_PortDirection: 1
m_PortOrientation: 0
m_Title: in
- rid: 1226592702090707091
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: I said pick it up!
- rid: 1226592702090707092
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: Cmon, don't be like this!
- rid: 1226592702090707093
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: The ass is waiting there for you!
- rid: 1226592702090707099
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
data:
@@ -594,7 +578,7 @@ MonoBehaviour:
serializedVersion: 2
Hash: 3b750432bd23177050f4f1fac360a6c3
m_Version: 2
m_Position: {x: 1376.4679, y: 141.66953}
m_Position: {x: 1300.841, y: 142.06729}
m_Title: DialogueNode
m_Tooltip:
m_NodePreviewModel:
@@ -605,14 +589,14 @@ MonoBehaviour:
- __option_DialogueLineType
- __option_NoLines
- LoopThroughDefaultLines
- DefaultDialogueLine1
- DefaultDialogueLine2
- DefaultDialogueContent1
- DefaultDialogueContent2
m_ValueList:
- rid: 1226592702090707100
- rid: 1226592702090707101
- rid: 1226592702090707103
- rid: 1226592702090707106
- rid: 1226592702090707107
- rid: 7545629632211976307
- rid: 7545629632211976308
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
@@ -682,14 +666,6 @@ MonoBehaviour:
m_PortDirection: 1
m_PortOrientation: 0
m_Title: in
- rid: 1226592702090707106
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: Ohhhh yeah, that's the stuff.
- rid: 1226592702090707107
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: Now, go on, chop it!
- rid: 1226592736610877523
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
data:
@@ -700,7 +676,7 @@ MonoBehaviour:
serializedVersion: 2
Hash: f3e06bfaeec3029fe7bcecfcb7e96ae8
m_Version: 2
m_Position: {x: 1763.6455, y: 116.19321}
m_Position: {x: 1771.6909, y: 116.19321}
m_Title:
m_Tooltip:
m_NodePreviewModel:
@@ -711,14 +687,14 @@ MonoBehaviour:
- __option_DialogueLineType
- __option_NoLines
- RequiredResultItem
- DefaultDialogueLine
- LoopThroughDefaultLines
- DefaultDialogueContent
m_ValueList:
- rid: 1226592736610877524
- rid: 1226592736610877525
- rid: 1226592736610877526
- rid: 1226592736610877527
- rid: 1226592736610877528
- rid: 7545629632211976309
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
@@ -753,14 +729,10 @@ MonoBehaviour:
type: {class: 'Constant`1[[PickupItemData, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: {fileID: 11400000, guid: ecae2d83a5ab2a047a2733ebff607380, type: 2}
- rid: 1226592736610877527
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: I need my meat :(
- rid: 1226592736610877528
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 1
m_Value: 0
- rid: 1226592736610877529
type: {class: WaitOnCombination, ns: Editor.Dialogue, asm: AppleHillsEditor}
data:
@@ -817,12 +789,12 @@ MonoBehaviour:
- __option_DialogueLineType
- __option_NoLines
- LoopThroughDefaultLines
- DefaultDialogueLine
- DefaultDialogueContent
m_ValueList:
- rid: 1226592736610877538
- rid: 1226592736610877539
- rid: 1226592736610877540
- rid: 1226592736610877545
- rid: 7545629632211976310
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
@@ -892,10 +864,6 @@ MonoBehaviour:
m_PortDirection: 1
m_PortOrientation: 0
m_Title: in
- rid: 1226592736610877545
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: Nice, that's the stuff! Now go cook it for me!
- rid: 1226592736610877546
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
data:
@@ -906,7 +874,7 @@ MonoBehaviour:
serializedVersion: 2
Hash: 69712d8f46502fa577433f59c2c1f85c
m_Version: 2
m_Position: {x: 2650.1987, y: 6.86882}
m_Position: {x: 2752.9822, y: 11.763229}
m_Title:
m_Tooltip:
m_NodePreviewModel:
@@ -921,12 +889,12 @@ MonoBehaviour:
- __option_ForbiddenItemDialogueLineType
- __option_ForbiddenItemNoLines
- RequiredSlot
- DefaultDialogueLine
- LoopThroughDefaultLines
- IncorrectItemDialogueLine
- LoopThroughIncorrectItemLines
- ForbiddenItemDialogueLine
- LoopThroughForbiddenItemLines
- DefaultDialogueContent
- IncorrectItemDialogueContent
- ForbiddenItemDialogueContent
m_ValueList:
- rid: 1226592736610877547
- rid: 1226592736610877548
@@ -935,12 +903,12 @@ MonoBehaviour:
- rid: 1226592736610877551
- rid: 1226592736610877552
- rid: 1226592736610877553
- rid: 1226592736610877554
- rid: 1226592736610877555
- rid: 1226592736610877556
- rid: 1226592736610877557
- rid: 1226592736610877558
- rid: 1226592736610877559
- rid: 7545629632211976311
- rid: 7545629632211976312
- rid: 7545629632211976313
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
@@ -1005,30 +973,18 @@ MonoBehaviour:
type: {class: 'Constant`1[[PickupItemData, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: {fileID: 11400000, guid: e0fad48a84a6b6346ac17c84bc512500, type: 2}
- rid: 1226592736610877554
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: Cmon, it's not gonna cook itself!
- rid: 1226592736610877555
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 1
- rid: 1226592736610877556
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: What do you think you're cooking?!
- rid: 1226592736610877557
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 1
- rid: 1226592736610877558
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
- rid: 1226592736610877559
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 0
m_Value: 1
- rid: 1226592736610877560
type: {class: WaitOnSlot, ns: Editor.Dialogue, asm: AppleHillsEditor}
data:
@@ -1074,7 +1030,7 @@ MonoBehaviour:
serializedVersion: 2
Hash: 91bec6fb97b9d7d954d9847f1c7dfdce
m_Version: 2
m_Position: {x: 3164.9407, y: 88.21074}
m_Position: {x: 3317.6943, y: 96.60597}
m_Title: DialogueNode
m_Tooltip:
m_NodePreviewModel:
@@ -1085,12 +1041,12 @@ MonoBehaviour:
- __option_DialogueLineType
- __option_NoLines
- LoopThroughDefaultLines
- DefaultDialogueLine
- DefaultDialogueContent
m_ValueList:
- rid: 1226592736610877568
- rid: 1226592736610877569
- rid: 1226592736610877570
- rid: 1226592736610877571
- rid: 7545629632211976314
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
@@ -1125,10 +1081,6 @@ MonoBehaviour:
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 0
- rid: 1226592736610877571
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: Sweat, delicions steak!
- rid: 1226592736610877572
type: {class: DialogueNode, ns: Editor.Dialogue, asm: AppleHillsEditor}
data:
@@ -1164,3 +1116,87 @@ MonoBehaviour:
m_PortDirection: 1
m_PortOrientation: 0
m_Title: in
- rid: 7545629632211976303
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text: Hey boy, go on and pick up that ass over there!
_image: {fileID: 0}
- rid: 7545629632211976304
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text: "Go on, it's right there!\t\t"
_image: {fileID: 0}
- rid: 7545629632211976305
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text: I need ASS!
_image: {fileID: 0}
- rid: 7545629632211976306
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text: C'mon, don't be like this!
_image: {fileID: 0}
- rid: 7545629632211976307
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text: Yessss, that's the stuff, now chop it!
_image: {fileID: 0}
- rid: 7545629632211976308
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 1
_text:
_image: {fileID: 6282751622250221668, guid: 204325ac88be74d4d882a078c64cf5e1, type: 3}
- rid: 7545629632211976309
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text: Chop it!!
_image: {fileID: 0}
- rid: 7545629632211976310
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text: Good, shit now cook!
_image: {fileID: 0}
- rid: 7545629632211976311
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 1
_text:
_image: {fileID: 6282751622250221668, guid: 204325ac88be74d4d882a078c64cf5e1, type: 3}
- rid: 7545629632211976312
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text: What exactly are you cooking?!
_image: {fileID: 0}
- rid: 7545629632211976313
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text: What exactly are you cooking?!
_image: {fileID: 0}
- rid: 7545629632211976314
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text: Yessssss, thanks!
_image: {fileID: 0}

View File

@@ -36,14 +36,12 @@ MonoBehaviour:
- rid: 1219994508087787764
- rid: 1219994508087787770
- rid: 1219994508087787776
- rid: 1226592702090706949
m_GraphWireModels:
- rid: 1219994508087787755
- rid: 1219994508087787773
- rid: 1219994508087787779
- rid: 1219994508087787813
- rid: 1226592702090706955
- rid: 1226592702090706956
- rid: 7545629632211976322
m_GraphStickyNoteModels: []
m_GraphPlacematModels: []
m_GraphVariableModels:
@@ -54,10 +52,10 @@ MonoBehaviour:
m_LocalSubgraphs: []
m_LastKnownBounds:
serializedVersion: 2
x: 128
y: -65
width: 2055
height: 243
x: -163.2
y: -62.4
width: 2048.8
height: 514.4
m_GraphElementMetaData:
- m_Guid:
m_Value0: 13346176596883742728
@@ -148,29 +146,13 @@ MonoBehaviour:
m_Category: 2
m_Index: 3
- m_Guid:
m_Value0: 3534792673092891566
m_Value1: 6472493350207860515
m_Value0: 3747411033454993788
m_Value1: 16062730125593257019
m_HashGuid:
serializedVersion: 2
Hash: aef35a42351b0e3123af37c668ead259
m_Category: 0
m_Index: 6
- m_Guid:
m_Value0: 1069232297653548642
m_Value1: 12871763382231758094
m_HashGuid:
serializedVersion: 2
Hash: 62b603141cadd60e0ef5cd3e99b0a1b2
Hash: 7ce176f47a7a01343ba4f3faf147eade
m_Category: 2
m_Index: 4
- m_Guid:
m_Value0: 6652862542851746443
m_Value1: 1010545699289270970
m_HashGuid:
serializedVersion: 2
Hash: 8b2a2efe3bb7535cba8a6f9bf52d060e
m_Category: 2
m_Index: 5
m_EntryPoint:
rid: 1219994508087787747
m_Graph:
@@ -201,7 +183,7 @@ MonoBehaviour:
serializedVersion: 2
Hash: 0820e35ee72437b996f6e8e25ecef5fa
m_Version: 2
m_Position: {x: 316.4595, y: -65.01193}
m_Position: {x: 6.237854, y: -6.821892}
m_Title:
m_Tooltip:
m_NodePreviewModel:
@@ -240,7 +222,7 @@ MonoBehaviour:
serializedVersion: 2
Hash: be46cc430316f2042ae9853a1220f241
m_Version: 2
m_Position: {x: 2070.2, y: 1.3479004}
m_Position: {x: 1771.3995, y: -14.25327}
m_Title:
m_Tooltip:
m_NodePreviewModel:
@@ -277,7 +259,7 @@ MonoBehaviour:
serializedVersion: 2
Hash: e77ae5c2cfec4277e8e3c20e1d1da05f
m_Version: 2
m_Position: {x: 530.97986, y: -60.683594}
m_Position: {x: 220.75827, y: -61.741615}
m_Title:
m_Tooltip:
m_NodePreviewModel:
@@ -287,13 +269,15 @@ MonoBehaviour:
m_KeyList:
- __option_DialogueLineType
- __option_NoLines
- DefaultDialogueLine
- LoopThroughDefaultLines
- DefaultDialogueContent1
- DefaultDialogueContent2
m_ValueList:
- rid: 1219994508087787857
- rid: 1219994508087787858
- rid: 1219994508087787897
- rid: 1219994508087787904
- rid: 7545629632211976301
- rid: 7545629632211976302
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
@@ -381,7 +365,7 @@ MonoBehaviour:
serializedVersion: 2
Hash: 85d948457f20a43a3e0d65b11e3e1a96
m_Version: 2
m_Position: {x: 128.085, y: -12.860001}
m_Position: {x: -163.09268, y: 58.026043}
m_Title: Anna-Lyse
m_Tooltip:
m_NodePreviewModel:
@@ -422,7 +406,7 @@ MonoBehaviour:
serializedVersion: 2
Hash: 3cbfd8ef332fa01b78a5ecc384f2e5e7
m_Version: 2
m_Position: {x: 914.5827, y: -60.08837}
m_Position: {x: 714.5492, y: -62.216354}
m_Title: DialogueNode
m_Tooltip:
m_NodePreviewModel:
@@ -432,17 +416,17 @@ MonoBehaviour:
m_KeyList:
- __option_DialogueLineType
- __option_NoLines
- DefaultDialogueLine1
- DefaultDialogueLine2
- DefaultDialogueLine3
- LoopThroughDefaultLines
- DefaultDialogueContent1
- DefaultDialogueContent2
- DefaultDialogueContent3
m_ValueList:
- rid: 1219994508087787860
- rid: 1219994508087787861
- rid: 1219994508087787900
- rid: 1219994508087787901
- rid: 1219994508087787902
- rid: 1219994508087787905
- rid: 7545629632211976294
- rid: 7545629632211976295
- rid: 7545629632211976296
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
@@ -503,7 +487,7 @@ MonoBehaviour:
serializedVersion: 2
Hash: 05c5ff0463a83c928482c30dbf7a2c0b
m_Version: 2
m_Position: {x: 1294.008, y: -60.75061}
m_Position: {x: 1210.0558, y: -60.75061}
m_Title: DialogueNode
m_Tooltip:
m_NodePreviewModel:
@@ -513,13 +497,19 @@ MonoBehaviour:
m_KeyList:
- __option_DialogueLineType
- __option_NoLines
- DefaultDialogueLine
- LoopThroughDefaultLines
- DefaultDialogueContent1
- DefaultDialogueContent2
- DefaultDialogueContent3
- DefaultDialogueContent4
m_ValueList:
- rid: 1219994508087787863
- rid: 1219994508087787864
- rid: 1219994508087787898
- rid: 1219994508087787906
- rid: 7545629632211976297
- rid: 7545629632211976298
- rid: 7545629632211976323
- rid: 7545629632211976324
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
@@ -609,14 +599,14 @@ MonoBehaviour:
m_EnumType:
m_Identification: Editor.Dialogue.DialogueType, AppleHillsEditor, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
m_Value: 0
m_Value: 1
m_EnumType:
m_Identification: Editor.Dialogue.DialogueType, AppleHillsEditor, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
- rid: 1219994508087787858
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 1
m_Value: 2
- rid: 1219994508087787860
type: {class: EnumConstant, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
@@ -639,34 +629,14 @@ MonoBehaviour:
m_EnumType:
m_Identification: Editor.Dialogue.DialogueType, AppleHillsEditor, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
m_Value: 0
m_Value: 1
m_EnumType:
m_Identification: Editor.Dialogue.DialogueType, AppleHillsEditor, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
- rid: 1219994508087787864
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 1
- rid: 1219994508087787897
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: This is a first line of dialogue
- rid: 1219994508087787898
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: Another regular line
- rid: 1219994508087787900
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: One multiline
- rid: 1219994508087787901
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: Two multiline
- rid: 1219994508087787902
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: Three multiline
m_Value: 4
- rid: 1219994508087787904
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
@@ -678,82 +648,65 @@ MonoBehaviour:
- rid: 1219994508087787906
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 0
- rid: 1226592702090706949
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
data:
m_Guid:
m_Value0: 3534792673092891566
m_Value1: 6472493350207860515
m_HashGuid:
serializedVersion: 2
Hash: aef35a42351b0e3123af37c668ead259
m_Version: 2
m_Position: {x: 1675.55, y: -47.149998}
m_Title: DialogueNode
m_Tooltip:
m_NodePreviewModel:
rid: -2
m_State: 0
m_InputConstantsById:
m_KeyList:
- __option_DialogueLineType
- __option_NoLines
- DefaultDialogueLine2
- LoopThroughDefaultLines
- DefaultDialogueLine1
m_ValueList:
- rid: 1226592702090706950
- rid: 1226592702090706951
- rid: 1226592702090706958
- rid: 1226592702090706953
- rid: 1226592702090706957
m_InputPortInfos:
expandedPortsById:
m_KeyList: []
m_ValueList:
m_OutputPortInfos:
expandedPortsById:
m_KeyList: []
m_ValueList:
m_Collapsed: 0
m_CurrentModeIndex: 0
m_ElementColor:
m_Color: {r: 0, g: 0, b: 0, a: 0}
m_HasUserColor: 0
m_Node:
rid: 1226592702090706954
- rid: 1226592702090706950
type: {class: EnumConstant, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
m_Value: 1
- rid: 7545629632211976294
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
m_EnumType:
m_Identification: Editor.Dialogue.DialogueType, AppleHillsEditor, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
m_Value: 1
m_EnumType:
m_Identification: Editor.Dialogue.DialogueType, AppleHillsEditor, Version=0.0.0.0,
Culture=neutral, PublicKeyToken=null
- rid: 1226592702090706951
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
_contentType: 0
_text: Some other test
_image: {fileID: 0}
- rid: 7545629632211976295
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 2
- rid: 1226592702090706953
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
m_Value:
_contentType: 0
_text: Some much longer text in here etc.
_image: {fileID: 0}
- rid: 7545629632211976296
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: 1
- rid: 1226592702090706954
type: {class: DialogueNode, ns: Editor.Dialogue, asm: AppleHillsEditor}
data:
- rid: 1226592702090706955
m_Value:
_contentType: 0
_text: Some oooother text
_image: {fileID: 0}
- rid: 7545629632211976297
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 1
_text:
_image: {fileID: -765527507412255412, guid: f70246e6148769846aaea223ec0c2a55, type: 3}
- rid: 7545629632211976298
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text: Now it's text
_image: {fileID: -9213056636207805707, guid: 00354ded9d8f8d643acc14837a229544, type: 3}
- rid: 7545629632211976301
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 0
_text: Psst, I'm just testing some stuff df
_image: {fileID: 0}
- rid: 7545629632211976302
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value:
_contentType: 1
_text:
_image: {fileID: -9213056636207805707, guid: 00354ded9d8f8d643acc14837a229544, type: 3}
- rid: 7545629632211976322
type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Guid:
m_Value0: 1069232297653548642
m_Value1: 12871763382231758094
m_Value0: 3747411033454993788
m_Value1: 16062730125593257019
m_HashGuid:
serializedVersion: 2
Hash: 62b603141cadd60e0ef5cd3e99b0a1b2
Hash: 7ce176f47a7a01343ba4f3faf147eade
m_Version: 2
m_FromPortReference:
m_NodeModelGuid:
@@ -766,38 +719,6 @@ MonoBehaviour:
m_PortDirection: 2
m_PortOrientation: 0
m_Title: out
m_ToPortReference:
m_NodeModelGuid:
m_Value0: 3534792673092891566
m_Value1: 6472493350207860515
m_NodeModelHashGuid:
serializedVersion: 2
Hash: aef35a42351b0e3123af37c668ead259
m_UniqueId: in
m_PortDirection: 1
m_PortOrientation: 0
m_Title: in
- rid: 1226592702090706956
type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Guid:
m_Value0: 6652862542851746443
m_Value1: 1010545699289270970
m_HashGuid:
serializedVersion: 2
Hash: 8b2a2efe3bb7535cba8a6f9bf52d060e
m_Version: 2
m_FromPortReference:
m_NodeModelGuid:
m_Value0: 3534792673092891566
m_Value1: 6472493350207860515
m_NodeModelHashGuid:
serializedVersion: 2
Hash: aef35a42351b0e3123af37c668ead259
m_UniqueId: out
m_PortDirection: 2
m_PortOrientation: 0
m_Title: out
m_ToPortReference:
m_NodeModelGuid:
m_Value0: 356371523793864382
@@ -809,11 +730,17 @@ MonoBehaviour:
m_PortDirection: 1
m_PortOrientation: 0
m_Title: in
- rid: 1226592702090706957
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
- rid: 7545629632211976323
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: And we're...
- rid: 1226592702090706958
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
m_Value:
_contentType: 1
_text:
_image: {fileID: -9213056636207805707, guid: 00354ded9d8f8d643acc14837a229544, type: 3}
- rid: 7545629632211976324
type: {class: 'Constant`1[[Dialogue.DialogueContent, AppleHillsScripts]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
data:
m_Value: ...in a loop
m_Value:
_contentType: 0
_text: Now it's text again and it should loop!
_image: {fileID: -9213056636207805707, guid: 00354ded9d8f8d643acc14837a229544, type: 3}

View File

@@ -0,0 +1,130 @@
using UnityEditor;
using UnityEngine;
namespace Dialogue.Editor
{
/// <summary>
/// Custom property drawer for DialogueContent that displays either text or image fields based on content type
/// </summary>
[CustomPropertyDrawer(typeof(DialogueContent))]
public class DialogueContentDrawer : PropertyDrawer
{
// Height constants
private const float TypeSelectorHeight = 20f;
private const float PropertySpacing = 2f;
private const float TextFieldHeight = 40f; // Taller for multi-line text
private const float ImageFieldHeight = 18f;
private const float PreviewHeight = 64f;
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
var contentTypeProperty = property.FindPropertyRelative("_contentType");
var height = TypeSelectorHeight + PropertySpacing;
// Add height based on content type
if (contentTypeProperty.enumValueIndex == (int)DialogueContentType.Text)
{
height += TextFieldHeight;
}
else // Image
{
height += ImageFieldHeight;
// Add preview height if an image is assigned
var imageProperty = property.FindPropertyRelative("_image");
if (imageProperty.objectReferenceValue != null)
{
height += PropertySpacing + PreviewHeight;
}
}
return height;
}
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
EditorGUI.BeginProperty(position, label, property);
// Create a property field and indent it
var contentRect = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), label);
var indent = EditorGUI.indentLevel;
EditorGUI.indentLevel = 0;
// Get properties
var contentTypeProperty = property.FindPropertyRelative("_contentType");
var textProperty = property.FindPropertyRelative("_text");
var imageProperty = property.FindPropertyRelative("_image");
// Calculate rects
var typeRect = new Rect(contentRect.x, contentRect.y, contentRect.width, TypeSelectorHeight);
var contentFieldRect = new Rect(
contentRect.x,
contentRect.y + TypeSelectorHeight + PropertySpacing,
contentRect.width,
contentTypeProperty.enumValueIndex == (int)DialogueContentType.Text ? TextFieldHeight : ImageFieldHeight);
// Draw the content type dropdown
EditorGUI.PropertyField(typeRect, contentTypeProperty, GUIContent.none);
// Draw the appropriate field based on content type
if (contentTypeProperty.enumValueIndex == (int)DialogueContentType.Text)
{
// Create a custom style with word wrap enabled
GUIStyle wordWrapStyle = new GUIStyle(EditorStyles.textArea);
wordWrapStyle.wordWrap = true;
// Text field with word wrap for multi-line input
textProperty.stringValue = EditorGUI.TextArea(contentFieldRect, textProperty.stringValue, wordWrapStyle);
}
else // Image
{
// Draw the image field
EditorGUI.PropertyField(contentFieldRect, imageProperty, GUIContent.none);
// Draw a preview if an image is assigned
if (imageProperty.objectReferenceValue != null)
{
var sprite = imageProperty.objectReferenceValue as Sprite;
if (sprite != null)
{
var previewRect = new Rect(
contentRect.x,
contentFieldRect.y + contentFieldRect.height + PropertySpacing,
contentRect.width,
PreviewHeight);
// Draw the preview with preserved aspect ratio
DrawSpritePreview(previewRect, sprite);
}
}
}
EditorGUI.indentLevel = indent;
EditorGUI.EndProperty();
}
private void DrawSpritePreview(Rect position, Sprite sprite)
{
if (sprite == null || sprite.texture == null) return;
// Calculate aspect-preserved rect
float aspectRatio = sprite.rect.width / sprite.rect.height;
float targetWidth = Mathf.Min(position.width, position.height * aspectRatio);
float targetHeight = targetWidth / aspectRatio;
// Center the preview
Rect previewRect = new Rect(
position.x + (position.width - targetWidth) * 0.5f,
position.y + (position.height - targetHeight) * 0.5f,
targetWidth,
targetHeight
);
// Draw the sprite preview
EditorGUI.DrawPreviewTexture(previewRect, sprite.texture, null, ScaleMode.ScaleToFit);
// Draw a border around the preview
GUI.Box(previewRect, GUIContent.none);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: f77e7b681b7f464f96242172ea625ed4
timeCreated: 1759912655

View File

@@ -111,24 +111,42 @@ namespace Editor.Dialogue
var lineCountOption = node.GetNodeOptionByName("NoLines");
lineCountOption.TryGetValue<int>(out var lineCount);
// Process dialogue lines based on line type
// Process dialogue content
if (lineType == DialogueType.SayMultipleLines)
{
for (var i = 0; i < lineCount; i++)
{
var lineValue = GetPortValue<string>(node.GetInputPortByName($"DefaultDialogueLine{i + 1}"));
if (!string.IsNullOrEmpty(lineValue))
var contentPort = node.GetInputPortByName($"DefaultDialogueContent{i + 1}");
var contentValue = GetPortValue<DialogueContent>(contentPort);
if (contentValue != null)
{
runtimeNode.dialogueLines.Add(lineValue);
// Add to dialogueContent list
runtimeNode.dialogueContent.Add(contentValue);
// Also add to legacy dialogueLines list for backward compatibility
if (contentValue.ContentType == DialogueContentType.Text && !string.IsNullOrEmpty(contentValue.Text))
{
runtimeNode.dialogueLines.Add(contentValue.Text);
}
}
}
}
else
{
var lineValue = GetPortValue<string>(node.GetInputPortByName("DefaultDialogueLine"));
if (!string.IsNullOrEmpty(lineValue))
var contentPort = node.GetInputPortByName("DefaultDialogueContent");
var contentValue = GetPortValue<DialogueContent>(contentPort);
if (contentValue != null)
{
runtimeNode.dialogueLines.Add(lineValue);
// Add to dialogueContent list
runtimeNode.dialogueContent.Add(contentValue);
// Also add to legacy dialogueLines list for backward compatibility
if (contentValue.ContentType == DialogueContentType.Text && !string.IsNullOrEmpty(contentValue.Text))
{
runtimeNode.dialogueLines.Add(contentValue.Text);
}
}
}
@@ -169,60 +187,98 @@ namespace Editor.Dialogue
runtimeNode.slotItemID = slot.itemId;
}
// Process incorrect item lines
// Get line type and count options for incorrect items
var incorrectItemLineTypeOption = node.GetNodeOptionByName("IncorrectItemDialogueLineType");
incorrectItemLineTypeOption.TryGetValue<DialogueType>(out var incorrectItemLineType);
var incorrectItemLineCountOption = node.GetNodeOptionByName("IncorrectItemNoLines");
incorrectItemLineCountOption.TryGetValue<int>(out var incorrectItemLineCount);
// Process incorrect item content
if (incorrectItemLineType == DialogueType.SayMultipleLines)
{
for (var i = 0; i < incorrectItemLineCount; i++)
{
var lineValue = GetPortValue<string>(node.GetInputPortByName($"IncorrectItemDialogueLine{i + 1}"));
if (!string.IsNullOrEmpty(lineValue))
var contentPort = node.GetInputPortByName($"IncorrectItemDialogueContent{i + 1}");
var contentValue = GetPortValue<DialogueContent>(contentPort);
if (contentValue != null)
{
runtimeNode.incorrectItemLines.Add(lineValue);
// Add to incorrectItemContent list
runtimeNode.incorrectItemContent.Add(contentValue);
// Also add to legacy incorrectItemLines list for backward compatibility
if (contentValue.ContentType == DialogueContentType.Text && !string.IsNullOrEmpty(contentValue.Text))
{
runtimeNode.incorrectItemLines.Add(contentValue.Text);
}
}
}
}
else
{
var lineValue = GetPortValue<string>(node.GetInputPortByName("IncorrectItemDialogueLine"));
if (!string.IsNullOrEmpty(lineValue))
var contentPort = node.GetInputPortByName("IncorrectItemDialogueContent");
var contentValue = GetPortValue<DialogueContent>(contentPort);
if (contentValue != null)
{
runtimeNode.incorrectItemLines.Add(lineValue);
// Add to incorrectItemContent list
runtimeNode.incorrectItemContent.Add(contentValue);
// Also add to legacy incorrectItemLines list for backward compatibility
if (contentValue.ContentType == DialogueContentType.Text && !string.IsNullOrEmpty(contentValue.Text))
{
runtimeNode.incorrectItemLines.Add(contentValue.Text);
}
}
}
runtimeNode.loopThroughIncorrectLines =
GetPortValue<bool>(node.GetInputPortByName("LoopThroughIncorrectItemLines"));
// Process forbidden item lines
// Get line type and count options for forbidden items
var forbiddenItemLineTypeOption = node.GetNodeOptionByName("ForbiddenItemDialogueLineType");
forbiddenItemLineTypeOption.TryGetValue<DialogueType>(out var forbiddenItemLineType);
var forbiddenItemLineCountOption = node.GetNodeOptionByName("ForbiddenItemNoLines");
forbiddenItemLineCountOption.TryGetValue<int>(out var forbiddenItemLineCount);
// Process forbidden item content
if (forbiddenItemLineType == DialogueType.SayMultipleLines)
{
for (var i = 0; i < forbiddenItemLineCount; i++)
{
var lineValue = GetPortValue<string>(node.GetInputPortByName($"ForbiddenItemDialogueLine{i + 1}"));
if (!string.IsNullOrEmpty(lineValue))
var contentPort = node.GetInputPortByName($"ForbiddenItemDialogueContent{i + 1}");
var contentValue = GetPortValue<DialogueContent>(contentPort);
if (contentValue != null)
{
runtimeNode.forbiddenItemLines.Add(lineValue);
// Add to forbiddenItemContent list
runtimeNode.forbiddenItemContent.Add(contentValue);
// Also add to legacy forbiddenItemLines list for backward compatibility
if (contentValue.ContentType == DialogueContentType.Text && !string.IsNullOrEmpty(contentValue.Text))
{
runtimeNode.forbiddenItemLines.Add(contentValue.Text);
}
}
}
}
else
{
var lineValue = GetPortValue<string>(node.GetInputPortByName("ForbiddenItemDialogueLine"));
if (!string.IsNullOrEmpty(lineValue))
var contentPort = node.GetInputPortByName("ForbiddenItemDialogueContent");
var contentValue = GetPortValue<DialogueContent>(contentPort);
if (contentValue != null)
{
runtimeNode.forbiddenItemLines.Add(lineValue);
// Add to forbiddenItemContent list
runtimeNode.forbiddenItemContent.Add(contentValue);
// Also add to legacy forbiddenItemLines list for backward compatibility
if (contentValue.ContentType == DialogueContentType.Text && !string.IsNullOrEmpty(contentValue.Text))
{
runtimeNode.forbiddenItemLines.Add(contentValue.Text);
}
}
}
@@ -259,4 +315,4 @@ namespace Editor.Dialogue
return fallbackValue;
}
}
}
}

View File

@@ -1,6 +1,7 @@
using UnityEngine;
using Unity.GraphToolkit.Editor;
using System;
using Dialogue;
namespace Editor.Dialogue
{
@@ -37,8 +38,7 @@ namespace Editor.Dialogue
const string LineTypeOptionName = "DialogueLineType";
const string NoLinesOptionName = "NoLines";
const string LoopThroughDefaultLinesOptionName = "LoopThroughDefaultLines";
const string DefaultDialogueLineOptionName = "DefaultDialogueLine";
const string DefaultDialogueContentOptionName = "DefaultDialogueContent";
protected override void OnDefineOptions(IOptionDefinitionContext context)
{
@@ -47,7 +47,6 @@ namespace Editor.Dialogue
.WithDefaultValue(DialogueType.SayOneLine)
.Delayed();
context.AddOption<int>(NoLinesOptionName)
.WithDisplayName("Number of Default Lines")
.WithDefaultValue(1)
@@ -59,6 +58,7 @@ namespace Editor.Dialogue
context.AddInputPort("in").Build();
context.AddOutputPort("out").Build();
// Get line type and count options
var lineTypeOption = GetNodeOptionByName(LineTypeOptionName);
lineTypeOption.TryGetValue<DialogueType>(out var lineType);
var lineCountOption = GetNodeOptionByName(NoLinesOptionName);
@@ -68,15 +68,21 @@ namespace Editor.Dialogue
{
for (var i = 0; i < lineCount; i++)
{
context.AddInputPort<string>($"{DefaultDialogueLineOptionName}{i + 1}").WithDisplayName($"Default Dialogue Line {i + 1}").Build();
context.AddInputPort<DialogueContent>($"{DefaultDialogueContentOptionName}{i + 1}")
.WithDisplayName($"Dialogue Content {i + 1}")
.Build();
}
}
else
{
context.AddInputPort<string>($"{DefaultDialogueLineOptionName}").WithDisplayName("Default Dialogue Line").Build();
context.AddInputPort<DialogueContent>($"{DefaultDialogueContentOptionName}")
.WithDisplayName("Dialogue Content")
.Build();
}
context.AddInputPort<bool>($"{LoopThroughDefaultLinesOptionName}").WithDisplayName("Loop Through Default Lines?").Build();
context.AddInputPort<bool>($"{LoopThroughDefaultLinesOptionName}")
.WithDisplayName("Loop Through Content?")
.Build();
}
}
@@ -110,38 +116,39 @@ namespace Editor.Dialogue
public class WaitOnSlot : DialogueNode
{
const string RequiredSlotOptionName = "RequiredSlot";
// Incorrect item - i.e. not the correct one but also not forbidden
const string IncorrectItemLineTypeOptionName = "IncorrectItemDialogueLineType";
const string IncorrectItemNoLinesOptionName = "IncorrectItemNoLines";
const string LoopThroughIncorrectItemLinesOptionName = "LoopThroughIncorrectItemLines";
const string IncorrectIteDialogueLineOptionName = "IncorrectItemDialogueLine";
// Explicitely forbidden item
const string IncorrectItemDialogueContentOptionName = "IncorrectItemDialogueContent";
const string ForbiddenItemLineTypeOptionName = "ForbiddenItemDialogueLineType";
const string ForbiddenItemNoLinesOptionName = "ForbiddenItemNoLines";
const string LoopThroughForbiddenItemLinesOptionName = "LoopThroughForbiddenItemLines";
const string ForbiddenIteDialogueLineOptionName = "ForbiddenItemDialogueLine";
const string ForbiddenItemDialogueContentOptionName = "ForbiddenItemDialogueContent";
protected override void OnDefineOptions(IOptionDefinitionContext context)
{
base.OnDefineOptions(context);
// Incorrect
// Incorrect item options
context.AddOption<DialogueType>(IncorrectItemLineTypeOptionName)
.WithDisplayName("Incorrect Item Line Type")
.WithDefaultValue(DialogueType.SayOneLine)
.Delayed();
context.AddOption<int>(IncorrectItemNoLinesOptionName)
.WithDisplayName("Number of Incorrect Item Lines")
.WithDefaultValue(1)
.Delayed();
// Forbidden
// Forbidden item options
context.AddOption<DialogueType>(ForbiddenItemLineTypeOptionName)
.WithDisplayName("Forbidden Item Line Type")
.WithDefaultValue(DialogueType.SayOneLine)
.Delayed();
context.AddOption<int>(ForbiddenItemNoLinesOptionName)
.WithDisplayName("Forbidden of Incorrect Item Lines")
.WithDisplayName("Number of Forbidden Item Lines")
.WithDefaultValue(1)
.Delayed();
}
@@ -152,45 +159,59 @@ namespace Editor.Dialogue
base.OnDefinePorts(context);
// Incorrect
// Process Incorrect Item content
var incorrectItemLineTypeOption = GetNodeOptionByName(IncorrectItemLineTypeOptionName);
incorrectItemLineTypeOption.TryGetValue<DialogueType>(out var incorrectItemLineType);
var incorrectItemLineCountOption = GetNodeOptionByName(IncorrectItemNoLinesOptionName);
incorrectItemLineCountOption.TryGetValue<int>(out var incorrectItemLineCount);
// Add DialogueContent ports for incorrect item content
if (incorrectItemLineType == DialogueType.SayMultipleLines)
{
for (var i = 0; i < incorrectItemLineCount; i++)
{
context.AddInputPort<string>($"{IncorrectIteDialogueLineOptionName}{i + 1}").WithDisplayName($"Incorrect Item Dialogue Line {i + 1}").Build();
context.AddInputPort<DialogueContent>($"{IncorrectItemDialogueContentOptionName}{i + 1}")
.WithDisplayName($"Incorrect Item Content {i + 1}")
.Build();
}
}
else
{
context.AddInputPort<string>($"{IncorrectIteDialogueLineOptionName}").WithDisplayName("Incorrect Item Dialogue Line").Build();
context.AddInputPort<DialogueContent>($"{IncorrectItemDialogueContentOptionName}")
.WithDisplayName("Incorrect Item Content")
.Build();
}
context.AddInputPort<bool>($"{LoopThroughIncorrectItemLinesOptionName}").WithDisplayName("Loop Through Incorrect Item Lines?").Build();
context.AddInputPort<bool>($"{LoopThroughIncorrectItemLinesOptionName}")
.WithDisplayName("Loop Through Incorrect Content?")
.Build();
// Forbidden
// Process Forbidden Item content
var forbiddenItemLineTypeOption = GetNodeOptionByName(ForbiddenItemLineTypeOptionName);
forbiddenItemLineTypeOption.TryGetValue<DialogueType>(out var forbiddenItemLineType);
var forbiddenItemLineCountOption = GetNodeOptionByName(ForbiddenItemNoLinesOptionName);
forbiddenItemLineCountOption.TryGetValue<int>(out var forbiddenItemLineCount);
// Add DialogueContent ports for forbidden item content
if (forbiddenItemLineType == DialogueType.SayMultipleLines)
{
for (var i = 0; i < forbiddenItemLineCount; i++)
{
context.AddInputPort<string>($"{ForbiddenIteDialogueLineOptionName}{i + 1}").WithDisplayName($"Forbidden Item Dialogue Line {i + 1}").Build();
context.AddInputPort<DialogueContent>($"{ForbiddenItemDialogueContentOptionName}{i + 1}")
.WithDisplayName($"Forbidden Item Content {i + 1}")
.Build();
}
}
else
{
context.AddInputPort<string>($"{ForbiddenIteDialogueLineOptionName}").WithDisplayName("Forbidden Item Dialogue Line").Build();
context.AddInputPort<DialogueContent>($"{ForbiddenItemDialogueContentOptionName}")
.WithDisplayName("Forbidden Item Content")
.Build();
}
context.AddInputPort<bool>($"{LoopThroughForbiddenItemLinesOptionName}").WithDisplayName("Loop Through Forbidden Item Lines?").Build();
context.AddInputPort<bool>($"{LoopThroughForbiddenItemLinesOptionName}")
.WithDisplayName("Loop Through Forbidden Content?")
.Build();
}
}

View File

@@ -0,0 +1,127 @@
using UnityEngine;
using UnityEditor;
namespace Interactions
{
[CustomEditor(typeof(Interactable))]
public class InteractableEditor : UnityEditor.Editor
{
SerializedProperty isOneTimeProp;
SerializedProperty cooldownProp;
SerializedProperty characterToInteractProp;
SerializedProperty interactionStartedProp;
SerializedProperty interactionInterruptedProp;
SerializedProperty characterArrivedProp;
SerializedProperty interactionCompleteProp;
private void OnEnable()
{
isOneTimeProp = serializedObject.FindProperty("isOneTime");
cooldownProp = serializedObject.FindProperty("cooldown");
characterToInteractProp = serializedObject.FindProperty("characterToInteract");
interactionStartedProp = serializedObject.FindProperty("interactionStarted");
interactionInterruptedProp = serializedObject.FindProperty("interactionInterrupted");
characterArrivedProp = serializedObject.FindProperty("characterArrived");
interactionCompleteProp = serializedObject.FindProperty("interactionComplete");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
EditorGUILayout.LabelField("Interaction Settings", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(isOneTimeProp);
EditorGUILayout.PropertyField(cooldownProp);
EditorGUILayout.PropertyField(characterToInteractProp);
// Add the buttons for creating move targets
EditorGUILayout.Space(10);
EditorGUILayout.LabelField("Character Move Targets", EditorStyles.boldLabel);
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("Add Trafalgar Target"))
{
CreateMoveTarget(CharacterToInteract.Trafalgar);
}
if (GUILayout.Button("Add Pulver Target"))
{
CreateMoveTarget(CharacterToInteract.Pulver);
}
EditorGUILayout.EndHorizontal();
// Add a button for creating a "Both" target
if (GUILayout.Button("Add Both Characters Target"))
{
CreateMoveTarget(CharacterToInteract.Both);
}
// Display character target counts
Interactable interactable = (Interactable)target;
CharacterMoveToTarget[] moveTargets = interactable.GetComponentsInChildren<CharacterMoveToTarget>();
int trafalgarTargets = 0;
int pulverTargets = 0;
int bothTargets = 0;
foreach (var target in moveTargets)
{
if (target.characterType == CharacterToInteract.Trafalgar)
trafalgarTargets++;
else if (target.characterType == CharacterToInteract.Pulver)
pulverTargets++;
else if (target.characterType == CharacterToInteract.Both)
bothTargets++;
}
EditorGUILayout.LabelField($"Trafalgar Targets: {trafalgarTargets}, Pulver Targets: {pulverTargets}, Both Targets: {bothTargets}");
if (trafalgarTargets > 1 || pulverTargets > 1 || bothTargets > 1 ||
(bothTargets > 0 && (trafalgarTargets > 0 || pulverTargets > 0)))
{
EditorGUILayout.HelpBox("Warning: Multiple move targets found that may conflict. Priority order: Both > Character-specific targets.", MessageType.Warning);
}
EditorGUILayout.Space(10);
EditorGUILayout.LabelField("Interaction Events", EditorStyles.boldLabel);
EditorGUILayout.PropertyField(interactionStartedProp);
EditorGUILayout.PropertyField(interactionInterruptedProp);
EditorGUILayout.PropertyField(characterArrivedProp);
EditorGUILayout.PropertyField(interactionCompleteProp);
serializedObject.ApplyModifiedProperties();
}
private void CreateMoveTarget(CharacterToInteract characterType)
{
Interactable interactable = (Interactable)target;
// Create a new GameObject
GameObject targetObj = new GameObject($"{characterType}MoveTarget");
// Set parent
targetObj.transform.SetParent(interactable.transform);
targetObj.transform.localPosition = Vector3.zero; // Start at the same position as the interactable
// Add CharacterMoveToTarget component
CharacterMoveToTarget moveTarget = targetObj.AddComponent<CharacterMoveToTarget>();
moveTarget.characterType = characterType;
// Position it based on character type (offset for better visibility)
switch (characterType)
{
case CharacterToInteract.Trafalgar:
moveTarget.positionOffset = new Vector3(1.0f, 0, 0);
break;
case CharacterToInteract.Pulver:
moveTarget.positionOffset = new Vector3(0, 0, 1.0f);
break;
case CharacterToInteract.Both:
moveTarget.positionOffset = new Vector3(0.7f, 0, 0.7f);
break;
}
// Select the newly created object
Selection.activeGameObject = targetObj;
Undo.RegisterCreatedObjectUndo(targetObj, $"Create {characterType} Move Target");
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: e2011e96b1b84886825d0509dd0a5cee
timeCreated: 1759744192

View File

@@ -0,0 +1,184 @@
using UnityEngine;
using UnityEditor;
using UnityEditor.Playables;
using UnityEngine.Playables;
namespace Interactions
{
[CustomEditor(typeof(InteractionTimelineAction))]
public class InteractionTimelineActionEditor : UnityEditor.Editor
{
private SerializedProperty respondToEventsProp;
private SerializedProperty pauseInteractionFlowProp;
private SerializedProperty playableDirectorProp;
private SerializedProperty timelineMappingsProp;
private void OnEnable()
{
respondToEventsProp = serializedObject.FindProperty("respondToEvents");
pauseInteractionFlowProp = serializedObject.FindProperty("pauseInteractionFlow");
playableDirectorProp = serializedObject.FindProperty("playableDirector");
timelineMappingsProp = serializedObject.FindProperty("timelineMappings");
}
public override void OnInspectorGUI()
{
serializedObject.Update();
// Basic properties from the base class
EditorGUILayout.LabelField("Basic Settings", EditorStyles.boldLabel);
// Show the pause interaction flow property
EditorGUILayout.PropertyField(pauseInteractionFlowProp, new GUIContent("Pause Interaction Flow",
"If true, the interaction will wait for the timeline to complete before proceeding"));
// Show the respondToEvents list
EditorGUILayout.PropertyField(respondToEventsProp, new GUIContent("Respond To Events",
"Select which interaction events this timeline action should respond to"), true);
// Show the playable director reference
EditorGUILayout.PropertyField(playableDirectorProp, new GUIContent("Playable Director",
"The director component that will play the timeline. Auto-assigned if not specified."));
// Show the timeline mappings
EditorGUILayout.Space(10);
EditorGUILayout.LabelField("Timeline Mappings", EditorStyles.boldLabel);
if (timelineMappingsProp.arraySize == 0)
{
EditorGUILayout.HelpBox("No timeline mappings added yet. Add one to assign timeline assets to specific interaction events.", MessageType.Info);
}
EditorGUILayout.PropertyField(timelineMappingsProp, new GUIContent("Timeline Mappings"), true);
// Add buttons for quickly adding timeline mappings for common events
EditorGUILayout.Space(10);
EditorGUILayout.LabelField("Quick Add Mappings", EditorStyles.boldLabel);
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("Add Player Arrival"))
{
AddTimelineMapping(InteractionEventType.PlayerArrived);
}
if (GUILayout.Button("Add Interacting Character"))
{
AddTimelineMapping(InteractionEventType.InteractingCharacterArrived);
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("Add Interaction Started"))
{
AddTimelineMapping(InteractionEventType.InteractionStarted);
}
if (GUILayout.Button("Add Interaction Complete"))
{
AddTimelineMapping(InteractionEventType.InteractionComplete);
}
EditorGUILayout.EndHorizontal();
// Check for configuration issues
InteractionTimelineAction timelineAction = (InteractionTimelineAction)target;
ValidateConfiguration(timelineAction);
serializedObject.ApplyModifiedProperties();
}
private void AddTimelineMapping(InteractionEventType eventType)
{
int index = timelineMappingsProp.arraySize;
timelineMappingsProp.InsertArrayElementAtIndex(index);
SerializedProperty newElement = timelineMappingsProp.GetArrayElementAtIndex(index);
// Set default values
newElement.FindPropertyRelative("eventType").enumValueIndex = (int)eventType;
// Create a default array with one empty slot for the timeline
SerializedProperty timelinesArray = newElement.FindPropertyRelative("timelines");
timelinesArray.ClearArray();
timelinesArray.InsertArrayElementAtIndex(0);
timelinesArray.GetArrayElementAtIndex(0).objectReferenceValue = null;
// Set default binding values
newElement.FindPropertyRelative("bindPlayerCharacter").boolValue = false;
newElement.FindPropertyRelative("bindPulverCharacter").boolValue = false;
newElement.FindPropertyRelative("playerTrackName").stringValue = "Player";
newElement.FindPropertyRelative("pulverTrackName").stringValue = "Pulver";
newElement.FindPropertyRelative("timeoutSeconds").floatValue = 30f;
newElement.FindPropertyRelative("loopLast").boolValue = false;
newElement.FindPropertyRelative("loopAll").boolValue = false;
// Also add the event to the respondToEvents list if it's not already there
bool found = false;
for (int i = 0; i < respondToEventsProp.arraySize; i++)
{
if (respondToEventsProp.GetArrayElementAtIndex(i).enumValueIndex == (int)eventType)
{
found = true;
break;
}
}
if (!found)
{
int responseIndex = respondToEventsProp.arraySize;
respondToEventsProp.InsertArrayElementAtIndex(responseIndex);
respondToEventsProp.GetArrayElementAtIndex(responseIndex).enumValueIndex = (int)eventType;
}
}
private void ValidateConfiguration(InteractionTimelineAction timelineAction)
{
// Check if we have a PlayableDirector component
PlayableDirector director = timelineAction.GetComponent<PlayableDirector>();
if (director == null)
{
EditorGUILayout.HelpBox("This GameObject is missing a PlayableDirector component, which is required for timeline playback.", MessageType.Error);
}
// Check if we have mappings but no events to respond to
if (timelineMappingsProp.arraySize > 0 && respondToEventsProp.arraySize == 0)
{
EditorGUILayout.HelpBox("You have timeline mappings but no events to respond to. Add events to the 'Respond To Events' list.", MessageType.Warning);
}
// Check if we have events to respond to but no mappings for them
bool hasUnmappedEvents = false;
for (int i = 0; i < respondToEventsProp.arraySize; i++)
{
InteractionEventType eventType = (InteractionEventType)respondToEventsProp.GetArrayElementAtIndex(i).enumValueIndex;
bool found = false;
for (int j = 0; j < timelineMappingsProp.arraySize; j++)
{
SerializedProperty mappingProp = timelineMappingsProp.GetArrayElementAtIndex(j);
InteractionEventType mappingEventType = (InteractionEventType)mappingProp.FindPropertyRelative("eventType").enumValueIndex;
if (mappingEventType == eventType)
{
found = true;
// Check if the mapping has timelines assigned
SerializedProperty timelinesArray = mappingProp.FindPropertyRelative("timelines");
if (timelinesArray.arraySize == 0 || timelinesArray.GetArrayElementAtIndex(0).objectReferenceValue == null)
{
EditorGUILayout.HelpBox($"The mapping for {eventType} has no timeline assets assigned.", MessageType.Warning);
}
break;
}
}
if (!found)
{
hasUnmappedEvents = true;
break;
}
}
if (hasUnmappedEvents)
{
EditorGUILayout.HelpBox("Some events in 'Respond To Events' have no timeline mapping.", MessageType.Warning);
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 6ab56ee48f1445529a62d30c1985f059
timeCreated: 1759746824

View File

@@ -0,0 +1,48 @@
using UnityEngine;
using UnityEditor;
using Interactions;
using System;
[CustomPropertyDrawer(typeof(InteractionTimelineAction.TimelineEventMapping))]
public class TimelineEventMappingDrawer : PropertyDrawer
{
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
// Use default property drawer, but initialize values if needed
InitializeDefaultValues(property);
EditorGUI.PropertyField(position, property, label, true);
}
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
{
return EditorGUI.GetPropertyHeight(property, label, true);
}
// Called when property is created to initialize default values
private void InitializeDefaultValues(SerializedProperty property)
{
// Check if this is a new/empty property that needs initialization
SerializedProperty timelinesArray = property.FindPropertyRelative("timelines");
if (timelinesArray != null && timelinesArray.arraySize == 0)
{
// This appears to be a new property, so initialize default values
// Initialize timelines array with one empty element
timelinesArray.ClearArray();
timelinesArray.InsertArrayElementAtIndex(0);
timelinesArray.GetArrayElementAtIndex(0).objectReferenceValue = null;
// Set default binding values
property.FindPropertyRelative("bindPlayerCharacter").boolValue = true;
property.FindPropertyRelative("bindPulverCharacter").boolValue = true;
property.FindPropertyRelative("playerTrackName").stringValue = "Player";
property.FindPropertyRelative("pulverTrackName").stringValue = "Pulver";
property.FindPropertyRelative("timeoutSeconds").floatValue = 30f;
property.FindPropertyRelative("loopLast").boolValue = false;
property.FindPropertyRelative("loopAll").boolValue = false;
// Make sure to apply modifications
property.serializedObject.ApplyModifiedProperties();
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: c5a227e33ab14a0f86bf391016c57b00
timeCreated: 1759756346

View File

@@ -0,0 +1,394 @@
%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_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
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 &-4664548104421960294
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: fde0d25a170598d46a0b9dc16b4527a5, type: 3}
m_Name: ActivationPlayableAsset
m_EditorClassIdentifier: Unity.Timeline::UnityEngine.Timeline.ActivationPlayableAsset
--- !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 &-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
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: PulverCucumberSmack1
m_EditorClassIdentifier: Unity.Timeline::UnityEngine.Timeline.TimelineAsset
m_Version: 0
m_Tracks:
- {fileID: -7584736085941489071}
- {fileID: -2395336864975438248}
- {fileID: 3942302933360259000}
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}
--- !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

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

View File

@@ -0,0 +1,197 @@
%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!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: PulverCucumberSmack_empty
m_EditorClassIdentifier: Unity.Timeline::UnityEngine.Timeline.TimelineAsset
m_Version: 0
m_Tracks:
- {fileID: -7584736085941489071}
- {fileID: -2395336864975438248}
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

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

View File

@@ -313,6 +313,14 @@ PrefabInstance:
propertyPath: m_Layer
value: 7
objectReference: {fileID: 0}
- target: {fileID: 6109476811019011833, guid: 361ccc9ef82acef4784b24b72013d971, type: 3}
propertyPath: m_Size.x
value: 3.8700001
objectReference: {fileID: 0}
- target: {fileID: 6109476811019011833, guid: 361ccc9ef82acef4784b24b72013d971, type: 3}
propertyPath: m_Size.y
value: 7.55122
objectReference: {fileID: 0}
- target: {fileID: 6109476811019011833, guid: 361ccc9ef82acef4784b24b72013d971, type: 3}
propertyPath: m_SortingOrder
value: 1

View File

@@ -136,7 +136,7 @@ MonoBehaviour:
radius: 2
height: 2
canMove: 1
maxSpeed: 15
maxSpeed: 30
gravity: {x: 0, y: 0, z: 0}
groundMask:
serializedVersion: 2
@@ -236,6 +236,8 @@ SpriteRenderer:
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -257,6 +259,7 @@ SpriteRenderer:
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 2

View File

@@ -1,5 +1,51 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1646387898454772943
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7371967679236352629}
- component: {fileID: 2280359367130513804}
m_Layer: 0
m_Name: PulverMoveTarget
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7371967679236352629
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1646387898454772943}
serializedVersion: 2
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: -4.4615383, y: 0.61538696, z: 0}
m_LocalScale: {x: 0.7692308, y: 0.7692308, z: 0.7692308}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 4937390562043858043}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &2280359367130513804
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1646387898454772943}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 2bcf343b3ef74f0fb3c64be6fd2893b6, type: 3}
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::Interactions.CharacterMoveToTarget
characterType: 2
positionOffset: {x: 0, y: 0, z: 1}
--- !u!1 &3591802784221671576
GameObject:
m_ObjectHideFlags: 0
@@ -94,6 +140,11 @@ GameObject:
- component: {fileID: 4937390562043858043}
- component: {fileID: 2720557426779044373}
- component: {fileID: 8897661028274890141}
- component: {fileID: 8437452310832126615}
- component: {fileID: 492578671844741631}
- component: {fileID: 8984729148657672365}
- component: {fileID: 1569498917964935965}
- component: {fileID: 3871210969445384207}
m_Layer: 10
m_Name: BallTree
m_TagString: Untagged
@@ -115,6 +166,7 @@ Transform:
m_ConstrainProportionsScale: 1
m_Children:
- {fileID: 6631072601870453588}
- {fileID: 7371967679236352629}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &2720557426779044373
@@ -137,6 +189,8 @@ SpriteRenderer:
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
@@ -158,6 +212,7 @@ SpriteRenderer:
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 1
@@ -218,3 +273,115 @@ BoxCollider2D:
m_AutoTiling: 0
m_Size: {x: 3.437712, y: 7.532383}
m_EdgeRadius: 0
--- !u!114 &8437452310832126615
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7379304988657006554}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 73d6494a73174ffabc6a7d3089d51e73, type: 3}
m_Name:
m_EditorClassIdentifier:
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: []
--- !u!114 &492578671844741631
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7379304988657006554}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1101f6c4eb04423b89dc78dc7c9f1aae, type: 3}
m_Name:
m_EditorClassIdentifier:
stepData: {fileID: 11400000, guid: 8ac614a698631554ab8ac39aed04a189, type: 2}
puzzleIndicator: {fileID: 0}
drawPromptRangeGizmo: 1
--- !u!114 &8984729148657672365
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7379304988657006554}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 42e77a0c97604b6eb7674e58726c831a, type: 3}
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::Interactions.InteractionTimelineAction
respondToEvents: 04000000
pauseInteractionFlow: 1
playableDirector: {fileID: 0}
timelineMappings:
- eventType: 4
timelines: []
bindPlayerCharacter: 0
bindPulverCharacter: 0
playerTrackName:
pulverTrackName:
timeoutSeconds: 30
loopLast: 0
loopAll: 0
--- !u!320 &1569498917964935965
PlayableDirector:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7379304988657006554}
m_Enabled: 1
serializedVersion: 3
m_PlayableAsset: {fileID: 11400000, guid: dd9566026364e814a8dad109e6c365ca, type: 2}
m_InitialState: 0
m_WrapMode: 2
m_DirectorUpdateMode: 1
m_InitialTime: 0
m_SceneBindings:
- key: {fileID: -7584736085941489071, guid: dd9566026364e814a8dad109e6c365ca, type: 2}
value: {fileID: 3871210969445384207}
- key: {fileID: -2395336864975438248, guid: dd9566026364e814a8dad109e6c365ca, type: 2}
value: {fileID: 0}
- key: {fileID: -7231857257271738743, guid: dd9566026364e814a8dad109e6c365ca, type: 2}
value: {fileID: 0}
m_ExposedReferences:
m_References: []
--- !u!95 &3871210969445384207
Animator:
serializedVersion: 7
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7379304988657006554}
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

View File

@@ -267,7 +267,7 @@ SpriteRenderer:
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_Sprite: {fileID: 2640071299338251634, guid: 7c4c9881382767047aac78ca51b82923, type: 3}
m_Sprite: {fileID: -1125559343802010594, guid: 46b2fe6896b27cc4c8bd9f0da3f0de50, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
@@ -315,8 +315,8 @@ BoxCollider2D:
m_Offset: {x: 0, y: 0}
m_SpriteTilingProperty:
border: {x: 0, y: 0, z: 0, w: 0}
pivot: {x: 0.5, y: 0.5}
oldSize: {x: 5.75, y: 2.78}
pivot: {x: 0.5088555, y: 0.82942355}
oldSize: {x: 28.869999, y: 14.16}
newSize: {x: 5.75, y: 2.78}
adaptiveTilingThreshold: 0.5
drawMode: 0

View File

@@ -262,7 +262,7 @@ SpriteRenderer:
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_Sprite: {fileID: 3009302558630513478, guid: 3aefb78ee1b7f6e4685d0fff00e24e3d, type: 3}
m_Sprite: {fileID: -642587728066523507, guid: 95d6dbee5cb1f694c971791ee60cad14, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
@@ -310,8 +310,8 @@ BoxCollider2D:
m_Offset: {x: 0, y: 0}
m_SpriteTilingProperty:
border: {x: 0, y: 0, z: 0, w: 0}
pivot: {x: 0.5, y: 0.5}
oldSize: {x: 5.75, y: 3.38}
pivot: {x: 0.491691, y: 0.83455706}
oldSize: {x: 24.630001, y: 13.68}
newSize: {x: 5.75, y: 2.78}
adaptiveTilingThreshold: 0.5
drawMode: 0

View File

@@ -94,11 +94,11 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 3070149615425714466, guid: bf4b9d7045397f946b2125b1ad4a3fbd, type: 3}
propertyPath: m_SpriteTilingProperty.oldSize.x
value: 1.34
value: 3.68
objectReference: {fileID: 0}
- target: {fileID: 3070149615425714466, guid: bf4b9d7045397f946b2125b1ad4a3fbd, type: 3}
propertyPath: m_SpriteTilingProperty.oldSize.y
value: 1.53
value: 3.96
objectReference: {fileID: 0}
- target: {fileID: 3070149615425714466, guid: bf4b9d7045397f946b2125b1ad4a3fbd, type: 3}
propertyPath: m_SpriteTilingProperty.adaptiveTilingThreshold
@@ -119,7 +119,7 @@ PrefabInstance:
- target: {fileID: 7494677664706785084, guid: bf4b9d7045397f946b2125b1ad4a3fbd, type: 3}
propertyPath: m_Sprite
value:
objectReference: {fileID: -509776585262497855, guid: c648336c825f7d7479582bbe4d95d0bc, type: 3}
objectReference: {fileID: -3811075571101519331, guid: 4a1a1ea0011e5644c917aaa7255ab48f, type: 3}
- target: {fileID: 7494677664706785084, guid: bf4b9d7045397f946b2125b1ad4a3fbd, type: 3}
propertyPath: m_WasSpriteAssigned
value: 1

View File

@@ -12,6 +12,7 @@ GameObject:
- component: {fileID: 9002038557409323574}
- component: {fileID: 4498241824153346754}
- component: {fileID: 3123748273643935430}
- component: {fileID: 8484489322432759371}
m_Layer: 5
m_Name: SpeechBubble
m_TagString: Untagged
@@ -34,11 +35,11 @@ RectTransform:
- {fileID: 1539728007164444029}
m_Father: {fileID: 3484825090253933040}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: 50}
m_SizeDelta: {x: 400, y: 0}
m_Pivot: {x: 0.5, y: 1}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 600, y: 0}
m_Pivot: {x: 0, y: 0}
--- !u!114 &9002038557409323574
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -99,6 +100,123 @@ MonoBehaviour:
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!114 &8484489322432759371
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1494212192306772670}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: cb3605ae81a54d2689504e0cd456ac27, type: 3}
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::Dialogue.SpeechBubble
textDisplay: {fileID: 4573570654593171780}
imageDisplay: {fileID: 4814676392695871198}
displayMode: 1
typewriterSpeed: 0.05
typingSoundSource: {fileID: 0}
typingSoundFrequency: 3
useRichText: 1
dialogueDisplayTime: 3
dialoguePromptText: . . .
--- !u!1 &3571537114331005905
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7453431659909988258}
- component: {fileID: 7239040132725875785}
- component: {fileID: 4814676392695871198}
- component: {fileID: 7738447742327076413}
m_Layer: 5
m_Name: Image
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!224 &7453431659909988258
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3571537114331005905}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1539728007164444029}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 300, y: -125}
m_SizeDelta: {x: 200, y: 200}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7239040132725875785
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3571537114331005905}
m_CullTransparentMesh: 1
--- !u!114 &4814676392695871198
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3571537114331005905}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: -9213056636207805707, guid: 00354ded9d8f8d643acc14837a229544, type: 3}
m_Type: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &7738447742327076413
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3571537114331005905}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.LayoutElement
m_IgnoreLayout: 0
m_MinWidth: -1
m_MinHeight: -1
m_PreferredWidth: 200
m_PreferredHeight: 200
m_FlexibleWidth: -1
m_FlexibleHeight: -1
m_LayoutPriority: 1
--- !u!1 &5048280843231724144
GameObject:
m_ObjectHideFlags: 0
@@ -164,7 +282,7 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: Hey there buster!
m_text: Hey there, buster!
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
@@ -191,8 +309,8 @@ MonoBehaviour:
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 35
m_fontSizeBase: 35
m_fontSize: 55
m_fontSizeBase: 55
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
@@ -364,18 +482,19 @@ RectTransform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8341977934938436915}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: -1}
m_LocalPosition: {x: 0, y: 0, z: -0.9999999}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 7704981663008171144}
- {fileID: 7453431659909988258}
m_Father: {fileID: 8307219291215824345}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
m_Pivot: {x: 0, y: 0}
--- !u!222 &2528298462582055986
CanvasRenderer:
m_ObjectHideFlags: 0
@@ -433,7 +552,7 @@ MonoBehaviour:
m_Bottom: 70
m_ChildAlignment: 4
m_Spacing: 0
m_ChildForceExpandWidth: 1
m_ChildForceExpandWidth: 0
m_ChildForceExpandHeight: 0
m_ChildControlWidth: 1
m_ChildControlHeight: 1

View File

@@ -309,7 +309,7 @@ PrefabInstance:
objectReference: {fileID: 517425340}
- target: {fileID: 6254953093500072797, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
propertyPath: characterToInteract
value: 1
value: 2
objectReference: {fileID: 0}
- target: {fileID: 6303063351359542479, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
propertyPath: m_Sprite
@@ -603,7 +603,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 6254953093500072797, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
propertyPath: characterToInteract
value: 1
value: 2
objectReference: {fileID: 0}
- target: {fileID: 6350287859698694726, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
propertyPath: m_Name
@@ -777,7 +777,7 @@ PrefabInstance:
objectReference: {fileID: 11400000, guid: 9de0c57af6191384e96e2ba7c04a3d0d, type: 2}
- target: {fileID: 6254953093500072797, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
propertyPath: characterToInteract
value: 1
value: 2
objectReference: {fileID: 0}
- target: {fileID: 6303063351359542479, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
propertyPath: m_Sprite
@@ -972,11 +972,11 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 3484825090253933040, guid: a8b0a1c6cf21352439dc24d3b03182db, type: 3}
propertyPath: m_AnchoredPosition.x
value: 2.55
value: 0.6806664
objectReference: {fileID: 0}
- target: {fileID: 3484825090253933040, guid: a8b0a1c6cf21352439dc24d3b03182db, type: 3}
propertyPath: m_AnchoredPosition.y
value: 3.17
value: 1.4252888
objectReference: {fileID: 0}
- target: {fileID: 3484825090253933040, guid: a8b0a1c6cf21352439dc24d3b03182db, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
@@ -1068,6 +1068,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::Dialogue.SpeechBubble
textDisplay: {fileID: 677854361}
imageDisplay: {fileID: 0}
displayMode: 1
typewriterSpeed: 0.02
typingSoundSource: {fileID: 0}
@@ -1286,7 +1287,7 @@ PrefabInstance:
objectReference: {fileID: 11400000, guid: a84cbe9804e13f74e857c55d90cc10d1, type: 2}
- target: {fileID: 6254953093500072797, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
propertyPath: characterToInteract
value: 1
value: 2
objectReference: {fileID: 0}
- target: {fileID: 6303063351359542479, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
propertyPath: m_Sprite
@@ -1411,7 +1412,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 7616859841301711022, guid: bf4b9d7045397f946b2125b1ad4a3fbd, type: 3}
propertyPath: characterToInteract
value: 1
value: 2
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
@@ -1832,6 +1833,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: AppleHillsScripts::Dialogue.SpeechBubble
textDisplay: {fileID: 614125440}
imageDisplay: {fileID: 0}
displayMode: 1
typewriterSpeed: 0.02
typingSoundSource: {fileID: 0}
@@ -1970,7 +1972,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 7616859841301711022, guid: bf4b9d7045397f946b2125b1ad4a3fbd, type: 3}
propertyPath: characterToInteract
value: 1
value: 2
objectReference: {fileID: 0}
m_RemovedComponents:
- {fileID: 592045584872845087, guid: bf4b9d7045397f946b2125b1ad4a3fbd, type: 3}
@@ -2281,7 +2283,7 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 7616859841301711022, guid: bf4b9d7045397f946b2125b1ad4a3fbd, type: 3}
propertyPath: characterToInteract
value: 1
value: 2
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
@@ -2892,11 +2894,11 @@ PrefabInstance:
objectReference: {fileID: 0}
- target: {fileID: 3484825090253933040, guid: a8b0a1c6cf21352439dc24d3b03182db, type: 3}
propertyPath: m_AnchoredPosition.x
value: 2.55
value: 0.5560436
objectReference: {fileID: 0}
- target: {fileID: 3484825090253933040, guid: a8b0a1c6cf21352439dc24d3b03182db, type: 3}
propertyPath: m_AnchoredPosition.y
value: 3.17
value: 1.3006666
objectReference: {fileID: 0}
- target: {fileID: 3484825090253933040, guid: a8b0a1c6cf21352439dc24d3b03182db, type: 3}
propertyPath: m_LocalEulerAnglesHint.x

File diff suppressed because it is too large Load Diff

View File

@@ -6,6 +6,7 @@ public class BirdEyesBehavior : MonoBehaviour
private StateMachine statemachine;
private Animator animator;
public bool correctItemIsIn;
[SerializeField] private Animator bushAnimator; // Assign in Inspector
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
@@ -36,6 +37,7 @@ public class BirdEyesBehavior : MonoBehaviour
}
public void BirdReveal()
{
statemachine.ChangeState ("BirdSpawned");
bushAnimator.SetTrigger("wolterisout");
statemachine.ChangeState ("BirdSpawned");
}
}

View File

@@ -159,72 +159,10 @@ public class GameManager : MonoBehaviour
{
return DeveloperSettingsProvider.Instance?.GetSettings<T>();
}
// PLAYER & FOLLOWER SETTINGS
// Player settings
public float MoveSpeed => GetSettings<IPlayerFollowerSettings>()?.MoveSpeed ?? 5f;
public float StopDistance => GetSettings<IPlayerFollowerSettings>()?.StopDistance ?? 0.1f;
public bool UseRigidbody => GetSettings<IPlayerFollowerSettings>()?.UseRigidbody ?? true;
public HoldMovementMode DefaultHoldMovementMode =>
GetSettings<IPlayerFollowerSettings>()?.DefaultHoldMovementMode ?? HoldMovementMode.Pathfinding;
// Follower settings
public float FollowDistance => GetSettings<IPlayerFollowerSettings>()?.FollowDistance ?? 1.5f;
public float ManualMoveSmooth => GetSettings<IPlayerFollowerSettings>()?.ManualMoveSmooth ?? 8f;
public float ThresholdFar => GetSettings<IPlayerFollowerSettings>()?.ThresholdFar ?? 2.5f;
public float ThresholdNear => GetSettings<IPlayerFollowerSettings>()?.ThresholdNear ?? 0.5f;
public float StopThreshold => GetSettings<IPlayerFollowerSettings>()?.StopThreshold ?? 0.1f;
public float FollowUpdateInterval => GetSettings<IPlayerFollowerSettings>()?.FollowUpdateInterval ?? 0.1f;
public float FollowerSpeedMultiplier => GetSettings<IPlayerFollowerSettings>()?.FollowerSpeedMultiplier ?? 1.2f;
public float HeldIconDisplayHeight => GetSettings<IPlayerFollowerSettings>()?.HeldIconDisplayHeight ?? 2.0f;
// INTERACTION SETTINGS
// LEFTOVER LEGACY SETTINGS
public float PlayerStopDistance => GetSettings<IInteractionSettings>()?.PlayerStopDistance ?? 6.0f;
public float PlayerStopDistanceDirectInteraction => GetSettings<IInteractionSettings>()?.PlayerStopDistanceDirectInteraction ?? 2.0f;
public float FollowerPickupDelay => GetSettings<IInteractionSettings>()?.FollowerPickupDelay ?? 0.2f;
public LayerMask InteractableLayerMask => GetSettings<IInteractionSettings>()?.InteractableLayerMask ?? -1;
public GameObject BasePickupPrefab => GetSettings<IInteractionSettings>()?.BasePickupPrefab;
public GameObject LevelSwitchMenuPrefab => GetSettings<IInteractionSettings>()?.LevelSwitchMenuPrefab;
// PUZZLE SETTINGS
public float DefaultPuzzlePromptRange => GetSettings<IInteractionSettings>()?.DefaultPuzzlePromptRange ?? 3.0f;
public GameObject DefaultPuzzleIndicatorPrefab => GetSettings<IInteractionSettings>()?.DefaultPuzzleIndicatorPrefab;
/// <summary>
/// Returns the combination rule for two items, if any.
/// </summary>
public CombinationRule GetCombinationRule(PickupItemData item1, PickupItemData item2)
{
var settings = GetSettings<IInteractionSettings>();
if (settings == null || settings.CombinationRules == null) return null;
foreach (var rule in settings.CombinationRules)
{
if ((PickupItemData.AreEquivalent(rule.itemA, item1) && PickupItemData.AreEquivalent(rule.itemB, item2)) ||
(PickupItemData.AreEquivalent(rule.itemA, item2) && PickupItemData.AreEquivalent(rule.itemB, item1)))
{
return rule;
}
}
return null;
}
/// <summary>
/// Returns the slot item config for a given slot item.
/// </summary>
public SlotItemConfig GetSlotItemConfig(PickupItemData slotItem)
{
var settings = GetSettings<IInteractionSettings>();
if (settings == null || settings.SlotItemConfigs == null || slotItem == null) return null;
foreach (var config in settings.SlotItemConfigs)
{
if (PickupItemData.AreEquivalent(slotItem, config.slotItem))
return config;
}
return null;
}
}

View File

@@ -53,5 +53,38 @@ namespace AppleHills.Core.Settings
followerPickupDelay = Mathf.Max(0f, followerPickupDelay);
defaultPuzzlePromptRange = Mathf.Max(0.1f, defaultPuzzlePromptRange);
}
/// <summary>
/// Returns the combination rule for two items, if any.
/// </summary>
public CombinationRule GetCombinationRule(PickupItemData item1, PickupItemData item2)
{
if (combinationRules == null) return null;
foreach (var rule in combinationRules)
{
if ((PickupItemData.AreEquivalent(rule.itemA, item1) && PickupItemData.AreEquivalent(rule.itemB, item2)) ||
(PickupItemData.AreEquivalent(rule.itemA, item2) && PickupItemData.AreEquivalent(rule.itemB, item1)))
{
return rule;
}
}
return null;
}
/// <summary>
/// Returns the slot item config for a given slot item.
/// </summary>
public SlotItemConfig GetSlotItemConfig(PickupItemData slotItem)
{
if (slotItemConfigs == null || slotItem == null) return null;
foreach (var config in slotItemConfigs)
{
if (PickupItemData.AreEquivalent(slotItem, config.slotItem))
return config;
}
return null;
}
}
}

View File

@@ -43,6 +43,10 @@ namespace AppleHills.Core.Settings
// Puzzle settings
GameObject DefaultPuzzleIndicatorPrefab { get; }
float DefaultPuzzlePromptRange { get; }
// Methods to query item configurations
CombinationRule GetCombinationRule(PickupItemData item1, PickupItemData item2);
SlotItemConfig GetSlotItemConfig(PickupItemData slotItem);
}
/// <summary>

View File

@@ -19,7 +19,7 @@ public class PicnicBehaviour : MonoBehaviour
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
StartCoroutine(RandomFirstMethodRoutine());
StartCoroutine(StateCycleRoutine());
}
void Awake()
@@ -34,38 +34,24 @@ public class PicnicBehaviour : MonoBehaviour
}
private IEnumerator RandomFirstMethodRoutine()
private IEnumerator StateCycleRoutine()
{
while (true)
{
float waitTime = Random.Range(getDistractedMin, getDistractedMax);
yield return new WaitForSeconds(waitTime);
FirstMethod();
// Distracted state
float distractedWait = Random.Range(getDistractedMin, getDistractedMax);
stateMachine.ChangeState("Picnic PPL Distracted");
animator.SetBool("theyDistracted", true);
yield return new WaitForSeconds(distractedWait);
// Chilling state
float chillingWait = Random.Range(getFlirtyMin, getFlirtyMax);
stateMachine.ChangeState("Picnic PPL Chilling");
animator.SetBool("theyDistracted", false);
yield return new WaitForSeconds(chillingWait);
}
}
private void FirstMethod()
{
Debug.Log("First method called!");
stateMachine.ChangeState("Picnic PPL Distracted");
animator.SetBool("theyDistracted", true);
StartCoroutine(RandomSecondMethodRoutine());
}
private IEnumerator RandomSecondMethodRoutine()
{
float waitTime = Random.Range(getFlirtyMin, getFlirtyMax);
yield return new WaitForSeconds(waitTime);
SecondMethod();
}
private void SecondMethod()
{
Debug.Log("Second method called!");
stateMachine.ChangeState("Picnic PPL Chilling");
animator.SetBool("theyDistracted", false);
}
public void triedToStealChocolate()
{
animator.SetTrigger("theyAngry");

View File

@@ -74,19 +74,96 @@ namespace Dialogue
private void OnCharacterArrived()
{
if (speechBubble == null || ! HasAnyLines()) return;
if (speechBubble == null || !HasAnyLines()) return;
// Advance the dialogue state to move to the next content
AdvanceDialogueState();
// Get the current dialogue line
string line = GetCurrentDialogueLine();
// Check if we have DialogueContent available (prioritizing the new content system)
DialogueContent content = GetCurrentDialogueContent();
// Display the line with the new method that handles timed updates
speechBubble.DisplayDialogueLine(line, HasAnyLines());
// Advance dialogue state for next interaction
if (content != null)
{
// Display the content with the method that handles both text and images
// and pass whether there are more lines available for prompt display
speechBubble.DisplayDialogueContent(content, HasAnyLines());
// Log the content type for debugging
Debug.Log($"Displaying content type: {content.ContentType} - {(content.ContentType == DialogueContentType.Text ? content.Text : content.Image?.name)}");
}
else
{
// Fall back to legacy text-only method if no DialogueContent is available
string line = GetCurrentDialogueLine();
speechBubble.DisplayDialogueLine(line, HasAnyLines());
// Log for debugging
Debug.Log($"Displaying legacy text: {line}");
}
}
/// <summary>
/// Get the current dialogue content (text or image)
/// </summary>
/// <returns>DialogueContent or null if only legacy text content is available</returns>
private DialogueContent GetCurrentDialogueContent()
{
// Initialize if needed
if (!initialized)
{
StartDialogue();
}
if (!IsActive || IsCompleted || currentNode == null)
return null;
// Check if we have DialogueContent available
if (currentNode.dialogueContent != null && currentNode.dialogueContent.Count > 0)
{
// For WaitOnSlot nodes, use the appropriate content based on slot state
if (currentNode.nodeType == RuntimeDialogueNodeType.WaitOnSlot)
{
// Choose the appropriate content collection based on the current slot state
List<DialogueContent> contentForState = currentNode.dialogueContent; // Default content
switch (_currentSlotState)
{
case ItemSlotState.Incorrect:
// Use incorrect item content if available
if (currentNode.incorrectItemContent != null && currentNode.incorrectItemContent.Count > 0)
contentForState = currentNode.incorrectItemContent;
break;
case ItemSlotState.Forbidden:
// Use forbidden item content if available
if (currentNode.forbiddenItemContent != null && currentNode.forbiddenItemContent.Count > 0)
contentForState = currentNode.forbiddenItemContent;
break;
}
// If we have content for this state, return the current one
if (contentForState != null && contentForState.Count > 0)
{
// Make sure index is within bounds
int index = Mathf.Clamp(currentLineIndex, 0, contentForState.Count - 1);
return contentForState[index];
}
return null; // No content for this slot state
}
else
{
// For other node types, use the default dialogueContent
if (currentLineIndex >= 0 && currentLineIndex < currentNode.dialogueContent.Count)
{
return currentNode.dialogueContent[currentLineIndex];
}
}
}
// No DialogueContent available, will fall back to legacy text handling
return null;
}
private void OnDestroy()
{
// Unregister from events
@@ -205,7 +282,7 @@ namespace Dialogue
{
if (!IsActive || IsCompleted || currentNode == null)
return;
// If the condition was satisfied earlier, move to the next node immediately
if (_conditionSatisfiedPendingAdvance)
{
@@ -213,21 +290,44 @@ namespace Dialogue
MoveToNextNode();
return;
}
// First check if we have any dialogueContent to process
bool hasDialogueContent = currentNode.dialogueContent != null && currentNode.dialogueContent.Count > 0;
// If we have more lines in the current node, advance to the next line
if (currentLineIndex < currentNode.dialogueLines.Count - 1)
if (hasDialogueContent)
{
currentLineIndex++;
return;
// If we have dialogueContent and there are more entries, advance to the next one
if (currentLineIndex < currentNode.dialogueContent.Count - 1)
{
currentLineIndex++;
return;
}
// If we should loop through content, reset the index
if (currentNode.loopThroughLines && currentNode.dialogueContent.Count > 0)
{
currentLineIndex = 0;
return;
}
}
// If we should loop through lines, reset the index
if (currentNode.loopThroughLines && currentNode.dialogueLines.Count > 0)
else
{
currentLineIndex = 0;
return;
// Fall back to legacy dialogueLines
// If we have more lines in the current node, advance to the next line
if (currentLineIndex < currentNode.dialogueLines.Count - 1)
{
currentLineIndex++;
return;
}
// If we should loop through lines, reset the index
if (currentNode.loopThroughLines && currentNode.dialogueLines.Count > 0)
{
currentLineIndex = 0;
return;
}
}
// If we're at a node that doesn't have a next node, we're done
if (string.IsNullOrEmpty(currentNode.nextNodeID))
{
@@ -235,7 +335,7 @@ namespace Dialogue
IsCompleted = true;
return;
}
// Move to the next node only if no conditions to wait for
if (!IsWaitingForCondition())
{
@@ -560,60 +660,110 @@ namespace Dialogue
// Special case: if condition has been satisfied but not yet advanced, we should show lines
if (_conditionSatisfiedPendingAdvance && !string.IsNullOrEmpty(currentNode.nextNodeID))
{
// Check if the next node would have lines
// Check if the next node would have lines or content
RuntimeDialogueNode nextNode = dialogueGraph.GetNodeByID(currentNode.nextNodeID);
return nextNode != null && (nextNode.dialogueLines.Count > 0 || nextNode.nodeType != RuntimeDialogueNodeType.End);
return nextNode != null &&
((nextNode.dialogueLines != null && nextNode.dialogueLines.Count > 0) ||
(nextNode.dialogueContent != null && nextNode.dialogueContent.Count > 0) ||
nextNode.nodeType != RuntimeDialogueNodeType.End);
}
// For WaitOnSlot nodes, check for lines based on current slot state
// For WaitOnSlot nodes, check for lines or content based on current slot state
if (currentNode.nodeType == RuntimeDialogueNodeType.WaitOnSlot)
{
// Choose the appropriate line collection based on the current slot state
List<string> linesForState = currentNode.dialogueLines; // Default lines
// First check for DialogueContent
if (currentNode.dialogueContent != null && currentNode.dialogueContent.Count > 0)
{
// Choose the appropriate content collection based on the current slot state
List<DialogueContent> contentForState = currentNode.dialogueContent;
switch (_currentSlotState)
{
case ItemSlotState.Incorrect:
if (currentNode.incorrectItemContent != null && currentNode.incorrectItemContent.Count > 0)
contentForState = currentNode.incorrectItemContent;
break;
case ItemSlotState.Forbidden:
if (currentNode.forbiddenItemContent != null && currentNode.forbiddenItemContent.Count > 0)
contentForState = currentNode.forbiddenItemContent;
break;
}
if (contentForState.Count > 0)
{
if (currentLineIndex < contentForState.Count - 1 || currentNode.loopThroughLines)
{
return true;
}
}
}
// Fall back to legacy text lines
List<string> linesForState = currentNode.dialogueLines;
switch (_currentSlotState)
{
case ItemSlotState.Incorrect:
// Use incorrect item lines if available, otherwise fall back to default lines
if (currentNode.incorrectItemLines != null && currentNode.incorrectItemLines.Count > 0)
linesForState = currentNode.incorrectItemLines;
break;
case ItemSlotState.Forbidden:
// Use forbidden item lines if available, otherwise fall back to default lines
if (currentNode.forbiddenItemLines != null && currentNode.forbiddenItemLines.Count > 0)
linesForState = currentNode.forbiddenItemLines;
break;
}
// Check if we have any lines for the current state
if (linesForState != null && linesForState.Count > 0)
{
// If we're not at the end of the lines or we loop through them
if (currentLineIndex < linesForState.Count - 1 || currentNode.loopThroughLines)
{
return true;
}
}
}
// For other node types, use the standard check
else if (currentNode.dialogueLines.Count > 0)
// For other node types, check for DialogueContent first, then fall back to legacy text
else
{
// If we're not at the end of the lines or we loop through them
if (currentLineIndex < currentNode.dialogueLines.Count - 1 || currentNode.loopThroughLines)
// Check for DialogueContent
if (currentNode.dialogueContent != null && currentNode.dialogueContent.Count > 0)
{
return true;
if (currentLineIndex < currentNode.dialogueContent.Count - 1 || currentNode.loopThroughLines)
{
return true;
}
// If we're at the end of content but not waiting for a condition and have a next node
if (!IsWaitingForCondition() && !string.IsNullOrEmpty(currentNode.nextNodeID))
{
RuntimeDialogueNode nextNode = dialogueGraph.GetNodeByID(currentNode.nextNodeID);
return nextNode != null &&
((nextNode.dialogueContent != null && nextNode.dialogueContent.Count > 0) ||
(nextNode.dialogueLines != null && nextNode.dialogueLines.Count > 0) ||
nextNode.nodeType != RuntimeDialogueNodeType.End);
}
}
// If we're at the end of lines but not waiting for a condition and have a next node
if (!IsWaitingForCondition() && !string.IsNullOrEmpty(currentNode.nextNodeID))
// Fall back to legacy text lines
if (currentNode.dialogueLines != null && currentNode.dialogueLines.Count > 0)
{
// We need to check if the next node would have lines
RuntimeDialogueNode nextNode = dialogueGraph.GetNodeByID(currentNode.nextNodeID);
return nextNode != null && (nextNode.dialogueLines.Count > 0 || nextNode.nodeType != RuntimeDialogueNodeType.End);
if (currentLineIndex < currentNode.dialogueLines.Count - 1 || currentNode.loopThroughLines)
{
return true;
}
// If we're at the end of lines but not waiting for a condition and have a next node
if (!IsWaitingForCondition() && !string.IsNullOrEmpty(currentNode.nextNodeID))
{
RuntimeDialogueNode nextNode = dialogueGraph.GetNodeByID(currentNode.nextNodeID);
return nextNode != null &&
((nextNode.dialogueContent != null && nextNode.dialogueContent.Count > 0) ||
(nextNode.dialogueLines != null && nextNode.dialogueLines.Count > 0) ||
nextNode.nodeType != RuntimeDialogueNodeType.End);
}
}
}
return false;
}

View File

@@ -0,0 +1,76 @@
using System;
using UnityEngine;
namespace Dialogue
{
/// <summary>
/// Content type for dialogue entries
/// </summary>
public enum DialogueContentType
{
Text,
Image
}
/// <summary>
/// Wrapper class for dialogue content that can be either text or image
/// </summary>
[Serializable]
public class DialogueContent
{
[SerializeField] private DialogueContentType _contentType = DialogueContentType.Text;
[SerializeField] private string _text = string.Empty;
[SerializeField] private Sprite _image = null;
/// <summary>
/// The type of content this entry contains
/// </summary>
public DialogueContentType ContentType => _contentType;
/// <summary>
/// The text content (valid when ContentType is Text)
/// </summary>
public string Text => _text;
/// <summary>
/// The image content (valid when ContentType is Image)
/// </summary>
public Sprite Image => _image;
/// <summary>
/// Create text content
/// </summary>
/// <param name="text">The text to display</param>
public static DialogueContent CreateText(string text)
{
return new DialogueContent
{
_contentType = DialogueContentType.Text,
_text = text
};
}
/// <summary>
/// Create image content
/// </summary>
/// <param name="image">The image to display</param>
public static DialogueContent CreateImage(Sprite image)
{
return new DialogueContent
{
_contentType = DialogueContentType.Image,
_image = image
};
}
/// <summary>
/// Returns a string representation of this content
/// </summary>
public override string ToString()
{
return ContentType == DialogueContentType.Text
? $"Text: {_text}"
: $"Image: {_image?.name ?? "None"}";
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 6b479dc736d44dea83d4d2cf4d940d8b
timeCreated: 1759912630

View File

@@ -36,10 +36,14 @@ namespace Dialogue
public RuntimeDialogueNodeType nodeType;
public string nextNodeID;
// Basic dialogue
// Basic dialogue - legacy text-only field
[HideInInspector]
public List<string> dialogueLines = new List<string>();
public bool loopThroughLines;
// New mixed content field that supports both text and images
public List<DialogueContent> dialogueContent = new List<DialogueContent>();
// Conditional nodes
public string puzzleStepID; // For WaitOnPuzzleStep
public string pickupItemID; // For WaitOnPickup
@@ -47,9 +51,14 @@ namespace Dialogue
public string combinationResultItemID; // For WaitOnCombination
// For WaitOnSlot - different responses
[HideInInspector]
public List<string> incorrectItemLines = new List<string>();
public bool loopThroughIncorrectLines;
public List<DialogueContent> incorrectItemContent = new List<DialogueContent>();
[HideInInspector]
public List<string> forbiddenItemLines = new List<string>();
public bool loopThroughForbiddenLines;
public List<DialogueContent> forbiddenItemContent = new List<DialogueContent>();
}
}

View File

@@ -2,6 +2,7 @@
using System.Collections;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
namespace Dialogue
{
@@ -18,6 +19,7 @@ namespace Dialogue
public class SpeechBubble : MonoBehaviour
{
[SerializeField] private TextMeshProUGUI textDisplay;
[SerializeField] private Image imageDisplay; // New field for displaying images
[SerializeField] private TextDisplayMode displayMode = TextDisplayMode.Typewriter;
[SerializeField] private float typewriterSpeed = 0.05f; // Time between characters in seconds
[SerializeField] private AudioSource typingSoundSource;
@@ -29,11 +31,18 @@ namespace Dialogue
private Coroutine typewriterCoroutine;
private Coroutine promptUpdateCoroutine;
private string currentFullText = string.Empty;
private Sprite currentImage = null;
private bool isVisible = false;
private DialogueContentType currentContentType = DialogueContentType.Text;
private void Awake()
{
// Ensure we have both components
if (textDisplay == null)
Debug.LogError("SpeechBubble: TextMeshProUGUI component is not assigned!");
if (imageDisplay == null)
Debug.LogError("SpeechBubble: Image component is not assigned!");
}
/// <summary>
@@ -92,6 +101,7 @@ namespace Dialogue
}
currentFullText = text;
currentContentType = DialogueContentType.Text;
// Stop any existing typewriter effect
if (typewriterCoroutine != null)
@@ -100,6 +110,13 @@ namespace Dialogue
typewriterCoroutine = null;
}
// Activate text display, deactivate image display
textDisplay.gameObject.SetActive(true);
if (imageDisplay != null)
{
imageDisplay.gameObject.SetActive(false);
}
// Display text based on the selected mode
if (displayMode == TextDisplayMode.Instant)
{
@@ -259,5 +276,117 @@ namespace Dialogue
typewriterCoroutine = null;
}
/// <summary>
/// Set the image to display in the speech bubble
/// </summary>
/// <param name="sprite">Sprite to display</param>
public void SetImage(Sprite sprite)
{
if (imageDisplay == null)
{
Debug.LogError("SpeechBubble: Image component is not assigned!");
return;
}
currentImage = sprite;
currentContentType = DialogueContentType.Image;
// Activate image display, set the sprite
imageDisplay.gameObject.SetActive(true);
imageDisplay.sprite = sprite;
// Deactivate text display
if (textDisplay != null)
{
textDisplay.gameObject.SetActive(false);
}
// Make sure the bubble is visible when setting image
if (!isVisible)
Show();
}
/// <summary>
/// Clear the displayed image
/// </summary>
public void ClearImage()
{
SetImage(null);
}
/// <summary>
/// Set the content of the speech bubble (text or image)
/// </summary>
/// <param name="text">Text content</param>
/// <param name="image">Image content</param>
public void SetContent(string text, Sprite image)
{
if (!string.IsNullOrEmpty(text))
{
currentContentType = DialogueContentType.Text;
SetText(text);
}
else if (image != null)
{
currentContentType = DialogueContentType.Image;
SetImage(image);
}
}
/// <summary>
/// Get the current content type of the speech bubble
/// </summary>
/// <returns>Current content type</returns>
public DialogueContentType GetCurrentContentType()
{
return currentContentType;
}
/// <summary>
/// Display dialogue content (text or image)
/// </summary>
/// <param name="content">The dialogue content to display</param>
/// <param name="hasMoreDialogue">Whether there are more dialogue content items available</param>
public void DisplayDialogueContent(DialogueContent content, bool hasMoreDialogue)
{
// Cancel any existing prompt update
if (promptUpdateCoroutine != null)
{
StopCoroutine(promptUpdateCoroutine);
promptUpdateCoroutine = null;
}
if (content == null)
{
UpdatePromptVisibility(hasMoreDialogue);
return;
}
// Display the content based on its type
currentContentType = content.ContentType;
if (content.ContentType == DialogueContentType.Text)
{
// Show text display, hide image display
textDisplay.gameObject.SetActive(true);
if (imageDisplay != null) imageDisplay.gameObject.SetActive(false);
// Display the text
DisplayDialogueLine(content.Text, hasMoreDialogue);
}
else // Image content
{
// Hide text display, show image display
textDisplay.gameObject.SetActive(false);
if (imageDisplay != null) imageDisplay.gameObject.SetActive(true);
// Set the image
SetImage(content.Image);
// After a delay, update the prompt visibility
promptUpdateCoroutine = StartCoroutine(UpdatePromptAfterDelay(hasMoreDialogue));
}
}
}
}

View File

@@ -1 +0,0 @@


View File

@@ -1,3 +0,0 @@
fileFormatVersion: 2
guid: 877344c7a0014922bc3a2a469e03792d
timeCreated: 1759050622

View File

@@ -3,6 +3,7 @@ using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.SceneManagement;
using AppleHills.Core.Settings; // Added for IInteractionSettings
namespace Input
{
@@ -44,6 +45,9 @@ namespace Input
}
}
// Settings reference
private IInteractionSettings _interactionSettings;
private PlayerInput playerInput;
private InputAction tapMoveAction;
private InputAction holdMoveAction;
@@ -55,6 +59,10 @@ namespace Input
{
_instance = this;
// DontDestroyOnLoad(gameObject);
// Initialize settings reference
_interactionSettings = GameManager.GetSettingsObject<IInteractionSettings>();
playerInput = GetComponent<PlayerInput>();
if (playerInput == null)
{
@@ -217,7 +225,7 @@ namespace Input
/// </summary>
private bool TryDelegateToInteractable(Vector2 worldPos)
{
LayerMask mask = GameManager.Instance != null ? GameManager.Instance.InteractableLayerMask : -1;
LayerMask mask = _interactionSettings != null ? _interactionSettings.InteractableLayerMask : -1;
Collider2D hit = Physics2D.OverlapPoint(worldPos, mask);
if (hit != null)
{

View File

@@ -0,0 +1,58 @@
using UnityEngine;
namespace Interactions
{
/// <summary>
/// Defines a target position for character movement during interaction.
/// Attach this to an interactable object's child to specify where
/// characters should move during interaction rather than using the default calculations.
/// </summary>
public class CharacterMoveToTarget : MonoBehaviour
{
[Tooltip("Which character this target position is for")]
public CharacterToInteract characterType = CharacterToInteract.Pulver;
[Tooltip("Optional offset from this transform's position")]
public Vector3 positionOffset = Vector3.zero;
/// <summary>
/// Get the target position for this character to move to
/// </summary>
public Vector3 GetTargetPosition()
{
return transform.position + positionOffset;
}
#if UNITY_EDITOR
private void OnDrawGizmos()
{
// Draw a different colored sphere based on which character this target is for
switch (characterType)
{
case CharacterToInteract.Trafalgar:
Gizmos.color = new Color(0f, 0.5f, 1f, 0.8f); // Blue for player
break;
case CharacterToInteract.Pulver:
Gizmos.color = new Color(1f, 0.5f, 0f, 0.8f); // Orange for follower
break;
case CharacterToInteract.Both:
Gizmos.color = new Color(0.7f, 0f, 0.7f, 0.8f); // Purple for both
break;
default:
Gizmos.color = new Color(0.5f, 0.5f, 0.5f, 0.8f); // Gray for none
break;
}
Vector3 targetPos = GetTargetPosition();
Gizmos.DrawSphere(targetPos, 0.2f);
// Draw a line from the parent interactable to this target
Interactable parentInteractable = GetComponentInParent<Interactable>();
if (parentInteractable != null)
{
Gizmos.DrawLine(parentInteractable.transform.position, targetPos);
}
}
#endif
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2bcf343b3ef74f0fb3c64be6fd2893b6
timeCreated: 1759744130

View File

@@ -1,22 +1,27 @@
using Input;
using UnityEngine;
using System;
using System.Collections.Generic;
using UnityEngine.Events;
using System.Threading.Tasks;
namespace Interactions
{
public enum CharacterToInteract
{
None,
Trafalgar,
Pulver
Pulver,
Both
}
/// <summary>
/// Represents an interactable object that can respond to tap input events.
/// </summary>
public class Interactable : MonoBehaviour, ITouchInputConsumer
{
[Header("Interaction Settings")]
public bool isOneTime = false;
public bool isOneTime;
public float cooldown = -1f;
public CharacterToInteract characterToInteract = CharacterToInteract.Pulver;
@@ -30,15 +35,64 @@ namespace Interactions
private bool _interactionInProgress;
private PlayerTouchController _playerRef;
private FollowerController _followerController;
private bool _isActive = true;
private InteractionEventType _currentEventType;
// Action component system
private List<InteractionActionBase> _registeredActions = new List<InteractionActionBase>();
private void Awake()
{
// Subscribe to interactionComplete event
interactionComplete.AddListener(OnInteractionComplete);
}
/// <summary>
/// Register an action component with this interactable
/// </summary>
public void RegisterAction(InteractionActionBase action)
{
if (!_registeredActions.Contains(action))
{
_registeredActions.Add(action);
}
}
/// <summary>
/// Unregister an action component from this interactable
/// </summary>
public void UnregisterAction(InteractionActionBase action)
{
_registeredActions.Remove(action);
}
/// <summary>
/// Dispatch an interaction event to all registered actions and await their completion
/// </summary>
private async Task DispatchEventAsync(InteractionEventType eventType)
{
_currentEventType = eventType;
// Collect all tasks from actions that want to respond
List<Task<bool>> tasks = new List<Task<bool>>();
foreach (var action in _registeredActions)
{
Task<bool> task = action.OnInteractionEvent(eventType, _playerRef, _followerController);
if (task != null)
{
tasks.Add(task);
}
}
if (tasks.Count > 0)
{
// Wait for all tasks to complete
await Task.WhenAll(tasks);
}
// If no tasks were added, the method will complete immediately (no need for await)
}
/// <summary>
/// Handles tap input. Triggers interaction logic.
/// </summary>
@@ -50,11 +104,12 @@ namespace Interactions
return;
}
Debug.Log($"[Interactable] OnTap at {worldPosition} on {gameObject.name}");
// Broadcast interaction started event
TryInteract();
// Start the interaction process asynchronously
_ = TryInteractAsync();
}
public void TryInteract()
private async Task TryInteractAsync()
{
_interactionInProgress = true;
@@ -63,68 +118,302 @@ namespace Interactions
interactionStarted?.Invoke(_playerRef, _followerController);
// Dispatch the InteractionStarted event to action components
await DispatchEventAsync(InteractionEventType.InteractionStarted);
// After all InteractionStarted actions complete, proceed to player movement
await StartPlayerMovementAsync();
}
private async Task StartPlayerMovementAsync()
{
if (_playerRef == null)
{
Debug.Log($"[Interactable] Player character could not be found. Aborting interaction.");
interactionInterrupted.Invoke();
await DispatchEventAsync(InteractionEventType.InteractionInterrupted);
return;
}
// If characterToInteract is None, immediately trigger the characterArrived event
if (characterToInteract == CharacterToInteract.None)
{
await BroadcastCharacterArrivedAsync();
return;
}
// Compute closest point on the interaction radius
Vector3 interactablePos = transform.position;
Vector3 playerPos = _playerRef.transform.position;
float stopDistance = characterToInteract == CharacterToInteract.Pulver
? GameManager.Instance.PlayerStopDistance
: GameManager.Instance.PlayerStopDistanceDirectInteraction;
Vector3 toPlayer = (playerPos - interactablePos).normalized;
Vector3 stopPoint = interactablePos + toPlayer * stopDistance;
// Check for a CharacterMoveToTarget component for Trafalgar (player) or Both
Vector3 stopPoint;
bool customTargetFound = false;
CharacterMoveToTarget[] moveTargets = GetComponentsInChildren<CharacterMoveToTarget>();
foreach (var target in moveTargets)
{
// Target is valid if it matches Trafalgar specifically or is set to Both
if (target.characterType == CharacterToInteract.Trafalgar || target.characterType == CharacterToInteract.Both)
{
stopPoint = target.GetTargetPosition();
customTargetFound = true;
// We need to wait for the player to arrive, so use a TaskCompletionSource
var tcs = new TaskCompletionSource<bool>();
// Use local functions instead of circular lambda references
void OnPlayerArrivedLocal()
{
// First remove both event handlers to prevent memory leaks
if (_playerRef != null)
{
_playerRef.OnArrivedAtTarget -= OnPlayerArrivedLocal;
_playerRef.OnMoveToCancelled -= OnPlayerMoveCancelledLocal;
}
// Then continue with the interaction flow
OnPlayerArrivedAsync().ContinueWith(_ => tcs.TrySetResult(true));
}
void OnPlayerMoveCancelledLocal()
{
// First remove both event handlers to prevent memory leaks
if (_playerRef != null)
{
_playerRef.OnArrivedAtTarget -= OnPlayerArrivedLocal;
_playerRef.OnMoveToCancelled -= OnPlayerMoveCancelledLocal;
}
// Then handle the cancellation
OnPlayerMoveCancelledAsync().ContinueWith(_ => tcs.TrySetResult(false));
}
// Unsubscribe previous handlers (if any)
_playerRef.OnArrivedAtTarget -= OnPlayerArrived;
_playerRef.OnMoveToCancelled -= OnPlayerMoveCancelled;
// Subscribe our new handlers
_playerRef.OnArrivedAtTarget += OnPlayerArrivedLocal;
_playerRef.OnMoveToCancelled += OnPlayerMoveCancelledLocal;
// Start the player movement
_playerRef.MoveToAndNotify(stopPoint);
// Await player arrival
await tcs.Task;
return;
}
}
// If no custom target was found, use the default behavior
if (!customTargetFound)
{
// Compute closest point on the interaction radius
Vector3 interactablePos = transform.position;
Vector3 playerPos = _playerRef.transform.position;
float stopDistance = characterToInteract == CharacterToInteract.Pulver
? GameManager.Instance.PlayerStopDistance
: GameManager.Instance.PlayerStopDistanceDirectInteraction;
Vector3 toPlayer = (playerPos - interactablePos).normalized;
stopPoint = interactablePos + toPlayer * stopDistance;
// Unsubscribe previous to avoid duplicate calls
_playerRef.OnArrivedAtTarget -= OnPlayerArrived;
_playerRef.OnMoveToCancelled -= OnPlayerMoveCancelled;
_playerRef.OnArrivedAtTarget += OnPlayerArrived;
_playerRef.OnMoveToCancelled += OnPlayerMoveCancelled;
_playerRef.MoveToAndNotify(stopPoint);
// We need to wait for the player to arrive, so use a TaskCompletionSource
var tcs = new TaskCompletionSource<bool>();
// Use local functions instead of circular lambda references
void OnPlayerArrivedLocal()
{
// First remove both event handlers to prevent memory leaks
if (_playerRef != null)
{
_playerRef.OnArrivedAtTarget -= OnPlayerArrivedLocal;
_playerRef.OnMoveToCancelled -= OnPlayerMoveCancelledLocal;
}
// Then continue with the interaction flow
OnPlayerArrivedAsync().ContinueWith(_ => tcs.TrySetResult(true));
}
void OnPlayerMoveCancelledLocal()
{
// First remove both event handlers to prevent memory leaks
if (_playerRef != null)
{
_playerRef.OnArrivedAtTarget -= OnPlayerArrivedLocal;
_playerRef.OnMoveToCancelled -= OnPlayerMoveCancelledLocal;
}
// Then handle the cancellation
OnPlayerMoveCancelledAsync().ContinueWith(_ => tcs.TrySetResult(false));
}
// Unsubscribe previous handlers (if any)
_playerRef.OnArrivedAtTarget -= OnPlayerArrived;
_playerRef.OnMoveToCancelled -= OnPlayerMoveCancelled;
// Subscribe our new handlers
_playerRef.OnArrivedAtTarget += OnPlayerArrivedLocal;
_playerRef.OnMoveToCancelled += OnPlayerMoveCancelledLocal;
// Start the player movement
_playerRef.MoveToAndNotify(stopPoint);
// Await player arrival
await tcs.Task;
}
}
private void OnPlayerMoveCancelled()
private async Task OnPlayerMoveCancelledAsync()
{
_interactionInProgress = false;
interactionInterrupted?.Invoke();
await DispatchEventAsync(InteractionEventType.InteractionInterrupted);
}
private void OnPlayerArrived()
private async Task OnPlayerArrivedAsync()
{
if (!_interactionInProgress)
return;
// Unsubscribe to avoid memory leaks
_playerRef.OnArrivedAtTarget -= OnPlayerArrived;
// Dispatch PlayerArrived event
await DispatchEventAsync(InteractionEventType.PlayerArrived);
// After all PlayerArrived actions complete, proceed to character interaction
await HandleCharacterInteractionAsync();
}
private async Task HandleCharacterInteractionAsync()
{
if (characterToInteract == CharacterToInteract.Pulver)
{
_followerController.OnPickupArrived -= OnFollowerArrived;
_followerController.OnPickupArrived += OnFollowerArrived;
_followerController.GoToPointAndReturn(transform.position, _playerRef.transform);
// We need to wait for the follower to arrive, so use a TaskCompletionSource
var tcs = new TaskCompletionSource<bool>();
// Create a proper local function for the event handler
void OnFollowerArrivedLocal()
{
// First remove the event handler to prevent memory leaks
if (_followerController != null)
{
_followerController.OnPickupArrived -= OnFollowerArrivedLocal;
}
// Then continue with the interaction flow
OnFollowerArrivedAsync().ContinueWith(_ => tcs.TrySetResult(true));
}
// Register our new local function handler
_followerController.OnPickupArrived += OnFollowerArrivedLocal;
// Check for a CharacterMoveToTarget component for Pulver or Both
Vector3 targetPosition = transform.position;
CharacterMoveToTarget[] moveTargets = GetComponentsInChildren<CharacterMoveToTarget>();
foreach (var target in moveTargets)
{
if (target.characterType == CharacterToInteract.Pulver || target.characterType == CharacterToInteract.Both)
{
targetPosition = target.GetTargetPosition();
break;
}
}
// Use the new GoToPoint method instead of GoToPointAndReturn
_followerController.GoToPoint(targetPosition);
// Await follower arrival
await tcs.Task;
}
else if (characterToInteract == CharacterToInteract.Trafalgar)
{
BroadcastCharacterArrived();
await BroadcastCharacterArrivedAsync();
}
else if (characterToInteract == CharacterToInteract.Both)
{
// We need to wait for the follower to arrive, so use a TaskCompletionSource
var tcs = new TaskCompletionSource<bool>();
// Create a proper local function for the event handler
void OnFollowerArrivedLocal()
{
// First remove the event handler to prevent memory leaks
if (_followerController != null)
{
_followerController.OnPickupArrived -= OnFollowerArrivedLocal;
}
// Then continue with the interaction flow
OnFollowerArrivedAsync().ContinueWith(_ => tcs.TrySetResult(true));
}
// Register our new local function handler
_followerController.OnPickupArrived += OnFollowerArrivedLocal;
// Check for a CharacterMoveToTarget component for Pulver or Both
Vector3 targetPosition = transform.position;
CharacterMoveToTarget[] moveTargets = GetComponentsInChildren<CharacterMoveToTarget>();
foreach (var target in moveTargets)
{
if (target.characterType == CharacterToInteract.Pulver || target.characterType == CharacterToInteract.Both)
{
targetPosition = target.GetTargetPosition();
break;
}
}
// Use the new GoToPoint method instead of GoToPointAndReturn
_followerController.GoToPoint(targetPosition);
// Await follower arrival
await tcs.Task;
}
}
private void OnFollowerArrived()
private async Task OnFollowerArrivedAsync()
{
if (!_interactionInProgress)
return;
// Unsubscribe to avoid memory leaks
_followerController.OnPickupArrived -= OnFollowerArrived;
// Dispatch InteractingCharacterArrived event and WAIT for all actions to complete
// This ensures we wait for any timeline animations to finish before proceeding
Debug.Log("[Interactable] Follower arrived, dispatching InteractingCharacterArrived event and waiting for completion");
await DispatchEventAsync(InteractionEventType.InteractingCharacterArrived);
Debug.Log("[Interactable] All InteractingCharacterArrived actions completed, proceeding with interaction");
BroadcastCharacterArrived();
// Check if we have any components that might have paused the interaction flow
bool hasTimelineActions = false;
foreach (var action in _registeredActions)
{
if (action is InteractionTimelineAction timelineAction &&
timelineAction.respondToEvents.Contains(InteractionEventType.InteractingCharacterArrived) &&
timelineAction.pauseInteractionFlow)
{
hasTimelineActions = true;
break;
}
}
// Tell the follower to return to the player
if (_followerController != null && _playerRef != null)
{
_followerController.ReturnToPlayer(_playerRef.transform);
}
// After all InteractingCharacterArrived actions complete, proceed to character arrived
await BroadcastCharacterArrivedAsync();
}
private void BroadcastCharacterArrived()
// Legacy non-async method to maintain compatibility with existing code
private void OnPlayerArrived()
{
// This is now just a wrapper for the async version
_ = OnPlayerArrivedAsync();
}
// Legacy non-async method to maintain compatibility with existing code
private void OnPlayerMoveCancelled()
{
// This is now just a wrapper for the async version
_ = OnPlayerMoveCancelledAsync();
}
private async Task BroadcastCharacterArrivedAsync()
{
// Check for ObjectiveStepBehaviour and lock state
var step = GetComponent<PuzzleS.ObjectiveStepBehaviour>();
@@ -138,16 +427,24 @@ namespace Interactions
_followerController = null;
return;
}
// Dispatch CharacterArrived event
// await DispatchEventAsync(InteractionEventType.InteractingCharacterArrived);
// Broadcast appropriate event
characterArrived?.Invoke();
// Reset variables for next time
_interactionInProgress = false;
_playerRef = null;
_followerController = null;
}
private void OnInteractionComplete(bool success)
private async void OnInteractionComplete(bool success)
{
// Dispatch InteractionComplete event
await DispatchEventAsync(InteractionEventType.InteractionComplete);
if (success)
{
if (isOneTime)

View File

@@ -0,0 +1,91 @@
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
using System.Threading.Tasks;
using Input;
namespace Interactions
{
/// <summary>
/// Base class for all interaction action components
/// These components respond to interaction events and can control the interaction flow
/// </summary>
public abstract class InteractionActionBase : MonoBehaviour
{
[Tooltip("Which interaction events this action should respond to")]
public List<InteractionEventType> respondToEvents = new List<InteractionEventType>();
[Tooltip("Whether the interaction flow should wait for this action to complete")]
public bool pauseInteractionFlow = true;
protected Interactable parentInteractable;
protected virtual void Awake()
{
// Get the parent interactable component
parentInteractable = GetComponentInParent<Interactable>();
if (parentInteractable == null)
{
Debug.LogError($"[{GetType().Name}] Cannot find parent Interactable component!");
enabled = false;
return;
}
}
protected virtual void OnEnable()
{
if (parentInteractable != null)
{
parentInteractable.RegisterAction(this);
}
}
protected virtual void OnDisable()
{
if (parentInteractable != null)
{
parentInteractable.UnregisterAction(this);
}
}
/// <summary>
/// Called when an interaction event occurs that this action is registered for
/// </summary>
/// <param name="eventType">The type of event that occurred</param>
/// <returns>A task that completes when the action is finished, or null if action won't execute</returns>
public Task<bool> OnInteractionEvent(InteractionEventType eventType, PlayerTouchController player, FollowerController follower)
{
if (respondToEvents.Contains(eventType) && ShouldExecute(eventType, player, follower))
{
if (pauseInteractionFlow)
{
return ExecuteAsync(eventType, player, follower);
}
else
{
// If we don't need to pause the flow, execute in the background
// and return a completed task
_ = ExecuteAsync(eventType, player, follower);
return Task.FromResult(false);
}
}
return null;
}
/// <summary>
/// Execute the action for the given event asynchronously
/// </summary>
protected abstract Task<bool> ExecuteAsync(InteractionEventType eventType, PlayerTouchController player, FollowerController follower);
/// <summary>
/// Called to determine if this action should execute for the given event
/// Override this to add additional conditions for execution
/// </summary>
protected virtual bool ShouldExecute(InteractionEventType eventType, PlayerTouchController player, FollowerController follower)
{
return true;
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 5cf351d32dac4169a9db20609727a70f
timeCreated: 1759746705

View File

@@ -0,0 +1,16 @@
using System;
namespace Interactions
{
/// <summary>
/// Defines the different types of events that can occur during an interaction
/// </summary>
public enum InteractionEventType
{
InteractionStarted,
PlayerArrived,
InteractingCharacterArrived,
InteractionComplete,
InteractionInterrupted
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 78684d31bd4d4636834a494c7cb74f48
timeCreated: 1759746690

View File

@@ -0,0 +1,258 @@
using System;
using UnityEngine;
using UnityEngine.Playables;
using System.Linq;
using System.Threading.Tasks;
using Input;
namespace Interactions
{
/// <summary>
/// Component that plays timeline animations in response to interaction events
/// </summary>
[RequireComponent(typeof(PlayableDirector))]
public class InteractionTimelineAction : InteractionActionBase
{
[System.Serializable]
public class TimelineEventMapping
{
public InteractionEventType eventType;
public PlayableAsset[] timelines;
[Tooltip("Whether to bind the player character to the track named 'Player'")]
public bool bindPlayerCharacter = false;
[Tooltip("Whether to bind the follower character to the track named 'Pulver'")]
public bool bindPulverCharacter = false;
[Tooltip("Custom track name for player character binding")]
public string playerTrackName = "Player";
[Tooltip("Custom track name for follower character binding")]
public string pulverTrackName = "Pulver";
[Tooltip("Time in seconds before the timeline is automatically completed (safety feature)")]
public float timeoutSeconds = 30f;
[Tooltip("Whether to loop the last timeline in the sequence")]
public bool loopLast = false;
[Tooltip("Whether to loop through all timelines in the sequence")]
public bool loopAll = false;
// Helper property to check if we have valid timelines
public bool HasValidTimelines => timelines != null && timelines.Length > 0 && timelines[0] != null;
}
[Header("Timeline Configuration")] [SerializeField]
private PlayableDirector playableDirector;
[SerializeField] private TimelineEventMapping[] timelineMappings;
private TaskCompletionSource<bool> _currentPlaybackTCS;
private int _currentTimelineIndex = 0;
private TimelineEventMapping _currentMapping = null;
protected override void Awake()
{
base.Awake();
if (playableDirector == null)
{
playableDirector = GetComponent<PlayableDirector>();
}
if (playableDirector == null)
{
Debug.LogError("[InteractionTimelineAction] PlayableDirector component is missing!");
enabled = false;
return;
}
// Subscribe to the director's stopped event
playableDirector.stopped += OnPlayableDirectorStopped;
}
private void OnDestroy()
{
if (playableDirector != null)
{
playableDirector.stopped -= OnPlayableDirectorStopped;
}
}
protected override async Task<bool> ExecuteAsync(InteractionEventType eventType, PlayerTouchController player,
FollowerController follower)
{
// Find the timeline for this event type
TimelineEventMapping mapping = Array.Find(timelineMappings, m => m.eventType == eventType);
if (mapping == null || !mapping.HasValidTimelines)
{
// No timeline configured for this event
return true;
}
_currentMapping = mapping;
// _currentTimelineIndex = 0;
return await PlayTimelineSequence(player, follower);
}
private async Task<bool> PlayTimelineSequence(PlayerTouchController player, FollowerController follower)
{
if (_currentMapping == null || !_currentMapping.HasValidTimelines)
{
return true;
}
follower.DropHeldItemAt(follower.transform.position);
// Play the current timeline in the sequence
bool result = await PlaySingleTimeline(_currentMapping.timelines[_currentTimelineIndex], _currentMapping, player, follower);
// Return false if the playback failed
if (!result)
{
return false;
}
// Increment the timeline index for next playback
_currentTimelineIndex++;
// Check if we've reached the end of the sequence
if (_currentTimelineIndex >= _currentMapping.timelines.Length)
{
// If loop all is enabled, start over
if (_currentMapping.loopAll)
{
_currentTimelineIndex = 0;
// Don't continue automatically, wait for next interaction
return true;
}
// If loop last is enabled, replay the last timeline
else if (_currentMapping.loopLast)
{
_currentTimelineIndex = _currentMapping.timelines.Length - 1;
// Don't continue automatically, wait for next interaction
return true;
}
// Otherwise, we're done with the sequence
else
{
_currentTimelineIndex = 0;
_currentMapping = null;
return true;
}
}
// If we have more timelines in the sequence, we're done for now
// Next interaction will pick up where we left off
return true;
}
private async Task<bool> PlaySingleTimeline(PlayableAsset timelineAsset, TimelineEventMapping mapping,
PlayerTouchController player, FollowerController follower)
{
if (timelineAsset == null)
{
Debug.LogWarning("[InteractionTimelineAction] Timeline asset is null");
return true; // Return true to continue the interaction flow
}
// Set the timeline asset
playableDirector.playableAsset = timelineAsset;
// Bind characters if needed
if (mapping.bindPlayerCharacter && player != null)
{
try
{
var trackOutput = playableDirector.playableAsset.outputs.FirstOrDefault(o => o.streamName == mapping.playerTrackName);
if (trackOutput.sourceObject != null)
{
playableDirector.SetGenericBinding(trackOutput.sourceObject, player.gameObject);
}
else
{
Debug.LogWarning($"[InteractionTimelineAction] Could not find track named '{mapping.playerTrackName}' for player binding");
}
}
catch (Exception ex)
{
Debug.LogError($"[InteractionTimelineAction] Error binding player to timeline: {ex.Message}");
}
}
if (mapping.bindPulverCharacter && follower != null)
{
try
{
var trackOutput = playableDirector.playableAsset.outputs.FirstOrDefault(o => o.streamName == mapping.pulverTrackName);
if (trackOutput.sourceObject != null)
{
playableDirector.SetGenericBinding(trackOutput.sourceObject, follower.gameObject);
}
else
{
Debug.LogWarning($"[InteractionTimelineAction] Could not find track named '{mapping.pulverTrackName}' for follower binding");
}
}
catch (Exception ex)
{
Debug.LogError($"[InteractionTimelineAction] Error binding follower to timeline: {ex.Message}");
}
}
// Create a task completion source to await the timeline completion
_currentPlaybackTCS = new TaskCompletionSource<bool>();
// Register for the stopped event if not already registered
playableDirector.stopped -= OnPlayableDirectorStopped;
playableDirector.stopped += OnPlayableDirectorStopped;
// Log the timeline playback
Debug.Log($"[InteractionTimelineAction] Playing timeline {timelineAsset.name} for event {mapping.eventType}");
// Play the timeline
playableDirector.Play();
// Start a timeout coroutine for safety using the mapping's timeout
StartCoroutine(TimeoutCoroutine(mapping.timeoutSeconds));
// Await the timeline completion (will be signaled by the OnPlayableDirectorStopped callback)
bool result = await _currentPlaybackTCS.Task;
// Log completion
Debug.Log($"[InteractionTimelineAction] Timeline {timelineAsset.name} playback completed with result: {result}");
// Clear the task completion source
_currentPlaybackTCS = null;
return result;
}
private void OnPlayableDirectorStopped(PlayableDirector director)
{
if (director != playableDirector || _currentPlaybackTCS == null)
return;
Debug.Log($"[InteractionTimelineAction] PlayableDirector stopped. Signaling completion.");
// Signal completion when the director stops
_currentPlaybackTCS.TrySetResult(true);
}
private System.Collections.IEnumerator TimeoutCoroutine(float timeoutDuration)
{
yield return new WaitForSeconds(timeoutDuration);
// If the TCS still exists after timeout, complete it with failure
if (_currentPlaybackTCS != null)
{
Debug.LogWarning($"[InteractionTimelineAction] Timeline playback timed out after {timeoutDuration} seconds");
_currentPlaybackTCS.TrySetResult(false);
}
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 42e77a0c97604b6eb7674e58726c831a
timeCreated: 1759746720

View File

@@ -3,6 +3,7 @@ using UnityEngine;
using UnityEngine.Events;
using System; // for Action<T>
using Core; // register with ItemManager
using AppleHills.Core.Settings; // Added for IInteractionSettings
namespace Interactions
{
@@ -24,6 +25,10 @@ namespace Interactions
// Tracks the current state of the slotted item
private ItemSlotState _currentState = ItemSlotState.None;
// Settings reference
private IInteractionSettings _interactionSettings;
private IPlayerFollowerSettings _playerFollowerSettings;
/// <summary>
/// Read-only access to the current slotted item state.
/// </summary>
@@ -64,13 +69,22 @@ namespace Interactions
}
}
public override void Awake()
{
base.Awake();
// Initialize settings references
_interactionSettings = GameManager.GetSettingsObject<IInteractionSettings>();
_playerFollowerSettings = GameManager.GetSettingsObject<IPlayerFollowerSettings>();
}
protected override void OnCharacterArrived()
{
Debug.Log("[ItemSlot] OnCharacterArrived");
var heldItemData = FollowerController.CurrentlyHeldItemData;
var heldItemObj = FollowerController.GetHeldPickupObject();
var config = GameManager.Instance.GetSlotItemConfig(itemData);
var config = _interactionSettings?.GetSlotItemConfig(itemData);
var forbidden = config?.forbiddenItems ?? new List<PickupItemData>();
// Held item, slot empty -> try to slot item
@@ -120,7 +134,7 @@ namespace Interactions
{
slottedItemRenderer.sprite = _currentlySlottedItemData.mapSprite;
// Scale sprite to desired height, preserve aspect ratio, compensate for parent scale
float desiredHeight = GameManager.Instance.HeldIconDisplayHeight;
float desiredHeight = _playerFollowerSettings?.HeldIconDisplayHeight ?? 2.0f;
var sprite = _currentlySlottedItemData.mapSprite;
float spriteHeight = sprite.bounds.size.y;
float spriteWidth = sprite.bounds.size.x;
@@ -175,7 +189,7 @@ namespace Interactions
// Once an item is slotted, we know it is not forbidden, so we can skip that check, but now check if it was
// the correct item we're looking for
var config = GameManager.Instance.GetSlotItemConfig(itemData);
var config = _interactionSettings?.GetSlotItemConfig(itemData);
var allowed = config?.allowedItems ?? new List<PickupItemData>();
if (itemToSlotData != null && PickupItemData.ListContainsEquivalent(allowed, itemToSlotData))
{

View File

@@ -26,7 +26,7 @@ namespace Interactions
/// <summary>
/// Unity Awake callback. Sets up icon, interactable, and event handlers.
/// </summary>
void Awake()
public virtual void Awake()
{
if (iconRenderer == null)
iconRenderer = GetComponent<SpriteRenderer>();

View File

@@ -2,6 +2,7 @@
using Input;
using Interactions;
using UnityEngine;
using AppleHills.Core.Settings; // Added for IInteractionSettings
/// <summary>
/// Handles level switching when interacted with. Applies switch data and triggers scene transitions.
@@ -14,6 +15,9 @@ public class LevelSwitch : MonoBehaviour
public LevelSwitchData switchData;
private SpriteRenderer _iconRenderer;
private Interactable _interactable;
// Settings reference
private IInteractionSettings _interactionSettings;
private bool _isActive = true;
@@ -30,6 +34,10 @@ public class LevelSwitch : MonoBehaviour
{
_interactable.characterArrived.AddListener(OnCharacterArrived);
}
// Initialize settings reference
_interactionSettings = GameManager.GetSettingsObject<IInteractionSettings>();
ApplySwitchData();
}
@@ -78,10 +86,10 @@ public class LevelSwitch : MonoBehaviour
if (switchData == null || string.IsNullOrEmpty(switchData.targetLevelSceneName) || !_isActive)
return;
var menuPrefab = GameManager.Instance.LevelSwitchMenuPrefab;
var menuPrefab = _interactionSettings?.LevelSwitchMenuPrefab;
if (menuPrefab == null)
{
Debug.LogError("LevelSwitchMenu prefab not assigned in GameSettings!");
Debug.LogError("LevelSwitchMenu prefab not assigned in InteractionSettings!");
return;
}
// Spawn the menu overlay (assume Canvas parent is handled in prefab setup)

View File

@@ -3,6 +3,7 @@ using UnityEngine;
using Pathfinding;
using UnityEngine.SceneManagement;
using Utils;
using AppleHills.Core.Settings;
/// <summary>
/// Controls the follower character, including following the player, handling pickups, and managing held items.
@@ -20,6 +21,10 @@ public class FollowerController: MonoBehaviour
/// </summary>
public float manualMoveSmooth = 8f;
// Settings reference
private IPlayerFollowerSettings _settings;
private IInteractionSettings _interactionSettings;
private GameObject _playerRef;
private Transform _playerTransform;
private AIPath _playerAIPath;
@@ -80,6 +85,10 @@ public class FollowerController: MonoBehaviour
_animator = GetComponentInChildren<Animator>(); // fallback
_spriteRenderer = GetComponentInChildren<SpriteRenderer>();
}
// Initialize settings references
_settings = GameManager.GetSettingsObject<IPlayerFollowerSettings>();
_interactionSettings = GameManager.GetSettingsObject<IInteractionSettings>();
}
void OnEnable()
@@ -108,7 +117,7 @@ public class FollowerController: MonoBehaviour
}
_timer += Time.deltaTime;
if (_timer >= GameManager.Instance.FollowUpdateInterval)
if (_timer >= _settings.FollowUpdateInterval)
{
_timer = 0f;
UpdateFollowTarget();
@@ -120,24 +129,24 @@ public class FollowerController: MonoBehaviour
Vector2 target2D = new Vector2(_targetPoint.x, _targetPoint.y);
float dist = Vector2.Distance(current2D, target2D);
float minSpeed = _followerMaxSpeed * 0.3f;
float lerpFactor = GameManager.Instance.ManualMoveSmooth * Time.deltaTime;
float lerpFactor = _settings.ManualMoveSmooth * Time.deltaTime;
float targetSpeed = 0f;
if (dist > GameManager.Instance.StopThreshold)
if (dist > _settings.StopThreshold)
{
if (dist > GameManager.Instance.ThresholdFar)
if (dist > _settings.ThresholdFar)
{
targetSpeed = _followerMaxSpeed;
}
else if (dist > GameManager.Instance.ThresholdNear && dist <= GameManager.Instance.ThresholdFar)
else if (dist > _settings.ThresholdNear && dist <= _settings.ThresholdFar)
{
targetSpeed = _followerMaxSpeed;
}
else if (dist > GameManager.Instance.StopThreshold && dist <= GameManager.Instance.ThresholdNear)
else if (dist > _settings.StopThreshold && dist <= _settings.ThresholdNear)
{
targetSpeed = minSpeed;
}
_currentSpeed = Mathf.Lerp(_currentSpeed, targetSpeed, lerpFactor);
if (dist > GameManager.Instance.StopThreshold && dist <= GameManager.Instance.ThresholdNear)
if (dist > _settings.StopThreshold && dist <= _settings.ThresholdNear)
{
_currentSpeed = Mathf.Max(_currentSpeed, minSpeed);
}
@@ -215,7 +224,7 @@ public class FollowerController: MonoBehaviour
{
_playerMaxSpeed = _playerAIPath.maxSpeed;
_defaultFollowerMaxSpeed = _playerMaxSpeed;
_followerMaxSpeed = _playerMaxSpeed * GameManager.Instance.FollowerSpeedMultiplier;
_followerMaxSpeed = _playerMaxSpeed * _settings.FollowerSpeedMultiplier;
}
}
else
@@ -258,8 +267,8 @@ public class FollowerController: MonoBehaviour
{
moveDir = _lastMoveDir;
}
// Use GameSettings for followDistance
_targetPoint = playerPos - moveDir * GameManager.Instance.FollowDistance;
// Use settings for followDistance
_targetPoint = playerPos - moveDir * _settings.FollowDistance;
_targetPoint.z = 0;
if (_aiPath != null)
{
@@ -268,25 +277,22 @@ public class FollowerController: MonoBehaviour
}
}
// Command follower to go to a specific point (pathfinding mode)
/// <summary>
/// Command follower to go to a specific point (pathfinding mode).
/// Make the follower move to a specific point only. Will not automatically return.
/// </summary>
/// <param name="worldPosition">The world position to move to.</param>
public void GoToPoint(Vector2 worldPosition)
/// <param name="targetPosition">The position to move to.</param>
public void GoToPoint(Vector2 targetPosition)
{
_isManualFollowing = false;
if (_pickupCoroutine != null)
StopCoroutine(_pickupCoroutine);
if (_aiPath != null)
{
_aiPath.enabled = true;
_aiPath.maxSpeed = _followerMaxSpeed;
_aiPath.destination = new Vector3(worldPosition.x, worldPosition.y, 0);
}
_pickupCoroutine = StartCoroutine(GoToPointSequence(targetPosition));
}
// Command follower to go to a specific point and return to player
/// <summary>
/// Command follower to go to a specific point and return to player.
/// Command follower to go to a specific point and return to player after a brief delay.
/// Legacy method that combines GoToPoint and ReturnToPlayer for backward compatibility.
/// </summary>
/// <param name="itemPosition">The position of the item to pick up.</param>
/// <param name="playerTransform">The transform of the player.</param>
@@ -299,6 +305,19 @@ public class FollowerController: MonoBehaviour
_pickupCoroutine = StartCoroutine(PickupSequence(itemPosition, playerTransform));
}
/// <summary>
/// Make the follower return to the player after it has reached a point.
/// </summary>
/// <param name="playerTransform">The transform of the player to return to.</param>
public void ReturnToPlayer(Transform playerTransform)
{
if (_pickupCoroutine != null)
StopCoroutine(_pickupCoroutine);
if (_aiPath != null)
_aiPath.maxSpeed = _followerMaxSpeed;
_pickupCoroutine = StartCoroutine(ReturnToPlayerSequence(playerTransform));
}
private System.Collections.IEnumerator PickupSequence(Vector2 itemPosition, Transform playerTransform)
{
_isManualFollowing = false;
@@ -310,14 +329,14 @@ public class FollowerController: MonoBehaviour
_aiPath.destination = new Vector3(itemPosition.x, itemPosition.y, 0);
}
// Wait until follower reaches item (2D distance)
while (Vector2.Distance(new Vector2(transform.position.x, transform.position.y), new Vector2(itemPosition.x, itemPosition.y)) > GameManager.Instance.StopThreshold)
while (Vector2.Distance(new Vector2(transform.position.x, transform.position.y), new Vector2(itemPosition.x, itemPosition.y)) > _settings.StopThreshold)
{
yield return null;
}
OnPickupArrived?.Invoke();
// Wait briefly, then return to player
yield return new WaitForSeconds(0.2f);
yield return new WaitForSeconds(_interactionSettings.FollowerPickupDelay);
if (_aiPath != null && playerTransform != null)
{
_aiPath.maxSpeed = _followerMaxSpeed;
@@ -325,7 +344,7 @@ public class FollowerController: MonoBehaviour
}
_isReturningToPlayer = true;
// Wait until follower returns to player (2D distance)
while (playerTransform != null && Vector2.Distance(new Vector2(transform.position.x, transform.position.y), new Vector2(playerTransform.position.x, playerTransform.position.y)) > GameManager.Instance.StopThreshold)
while (playerTransform != null && Vector2.Distance(new Vector2(transform.position.x, transform.position.y), new Vector2(playerTransform.position.x, playerTransform.position.y)) > _settings.StopThreshold)
{
yield return null;
}
@@ -340,6 +359,63 @@ public class FollowerController: MonoBehaviour
_aiPath.enabled = false;
_pickupCoroutine = null;
}
private System.Collections.IEnumerator GoToPointSequence(Vector2 targetPosition)
{
_isManualFollowing = false;
_isReturningToPlayer = false;
if (_aiPath != null)
{
_aiPath.enabled = true;
_aiPath.maxSpeed = _followerMaxSpeed;
_aiPath.destination = new Vector3(targetPosition.x, targetPosition.y, 0);
}
// Wait until follower reaches target
while (Vector2.Distance(new Vector2(transform.position.x, transform.position.y),
new Vector2(targetPosition.x, targetPosition.y)) > _settings.StopThreshold)
{
yield return null;
}
// Signal arrival
OnPickupArrived?.Invoke();
_pickupCoroutine = null;
}
private System.Collections.IEnumerator ReturnToPlayerSequence(Transform playerTransform)
{
if (_aiPath != null && playerTransform != null)
{
_aiPath.maxSpeed = _followerMaxSpeed;
_aiPath.destination = playerTransform.position;
}
_isReturningToPlayer = true;
// Wait until follower returns to player
while (playerTransform != null &&
Vector2.Distance(new Vector2(transform.position.x, transform.position.y),
new Vector2(playerTransform.position.x, playerTransform.position.y)) > _settings.StopThreshold)
{
yield return null;
}
_isReturningToPlayer = false;
OnPickupReturned?.Invoke();
// Reset follower speed to normal after pickup
_followerMaxSpeed = _defaultFollowerMaxSpeed;
if (_aiPath != null)
_aiPath.maxSpeed = _followerMaxSpeed;
_isManualFollowing = true;
if (_aiPath != null)
_aiPath.enabled = false;
_pickupCoroutine = null;
}
#endregion Movement
#region ItemInteractions
@@ -375,15 +451,18 @@ public class FollowerController: MonoBehaviour
{
return CombinationResult.NotApplicable;
}
var rule = GameManager.Instance.GetCombinationRule(pickupA.itemData, pickupB.itemData);
// Use the InteractionSettings directly instead of GameManager
CombinationRule matchingRule = _interactionSettings.GetCombinationRule(pickupA.itemData, pickupB.itemData);
Vector3 spawnPos = pickupA.gameObject.transform.position;
if (rule != null && rule.resultPrefab != null)
if (matchingRule != null && matchingRule.resultPrefab != null)
{
newItem = Instantiate(rule.resultPrefab, spawnPos, Quaternion.identity);
newItem = Instantiate(matchingRule.resultPrefab, spawnPos, Quaternion.identity);
PickupItemData itemData = newItem.GetComponent<Pickup>().itemData;
Destroy(pickupA.gameObject);
Destroy(pickupB.gameObject);
TryPickupItem(newItem,itemData);
TryPickupItem(newItem, itemData);
return CombinationResult.Successful;
}

View File

@@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;
using AppleHills.Core.Settings; // Added for IInteractionSettings
namespace PuzzleS
{
@@ -21,6 +22,9 @@ namespace PuzzleS
private Transform _playerTransform;
private Coroutine _proximityCheckCoroutine;
// Settings reference
private IInteractionSettings _interactionSettings;
/// <summary>
/// Singleton instance of the PuzzleManager.
/// </summary>
@@ -58,6 +62,9 @@ namespace PuzzleS
_instance = this;
// DontDestroyOnLoad(gameObject);
SceneManager.sceneLoaded += OnSceneLoaded;
// Initialize settings reference
_interactionSettings = GameManager.GetSettingsObject<IInteractionSettings>();
}
void Start()
@@ -123,8 +130,8 @@ namespace PuzzleS
{
if (_playerTransform != null)
{
// Get the proximity threshold from settings (half of the prompt range)
float proximityThreshold = GameManager.Instance.DefaultPuzzlePromptRange;
// Get the proximity threshold from settings directly using our settings reference
float proximityThreshold = _interactionSettings?.DefaultPuzzlePromptRange ?? 3.0f;
// Check distance to each step behavior
foreach (var kvp in _stepBehaviours)
@@ -198,16 +205,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>

View File

@@ -7,10 +7,34 @@ namespace UI
{
public class PauseMenu : MonoBehaviour
{
private static PauseMenu _instance;
private static bool _isQuitting;
public static PauseMenu Instance
{
get
{
if (_instance == null && Application.isPlaying && !_isQuitting)
{
_instance = FindAnyObjectByType<PauseMenu>();
if (_instance == null)
{
var go = new GameObject("PauseMenu");
_instance = go.AddComponent<PauseMenu>();
// DontDestroyOnLoad(go);
}
}
return _instance;
}
}
[Header("UI References")]
[SerializeField] private GameObject pauseMenuPanel;
[SerializeField] private GameObject pauseButton;
public event Action OnGamePaused;
public event Action OnGameResumed;
private void Start()
{
// Subscribe to scene loaded events
@@ -32,6 +56,11 @@ namespace UI
}
}
void OnApplicationQuit()
{
_isQuitting = true;
}
/// <summary>
/// Sets the pause menu game object active or inactive based on the current level
/// </summary>

View File

@@ -12,7 +12,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 32cd6d14d9304d5ba0fd590da1346654, type: 3}
m_Name: PlayerFollowerSettings
m_EditorClassIdentifier:
moveSpeed: 25
moveSpeed: 15
moveAcceleration: 10000
stopDistance: 2
useRigidbody: 1

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

View File

@@ -0,0 +1,275 @@
# Apple Hills Interaction System
This document provides a comprehensive overview of the interaction system in Apple Hills, detailing how interactions are structured, configured, and extended with custom actions.
## Overview
The Apple Hills interaction system allows players to interact with objects in the game world. It supports character movement to interaction points, timed and conditional interactions, and complex behaviors through a component-based architecture. The system is particularly powerful when combined with the Timeline feature for creating cinematic sequences during interactions.
## Core Components
The interaction system consists of several key components that work together:
### Interactable
The `Interactable` component is the foundation of the interaction system. It:
- Handles player input (tapping/clicking)
- Manages which character(s) should interact (Trafalgar, Pulver, or both)
- Coordinates character movement to interaction points
- Dispatches events during the interaction lifecycle
- Manages one-time interactions and cooldowns
![Interactable Inspector](media/interactable_inspector.png)
### CharacterMoveToTarget
The `CharacterMoveToTarget` component defines positions where characters should move when interacting:
- Can be configured for specific characters (Trafalgar, Pulver, or both)
- Supports position offsets for fine-tuning
- Provides visual gizmos in the editor for easy positioning
- Multiple targets can be set up for complex interactions
![Character Move Target Inspector](media/character_move_target_inspector.png)
### Interaction Actions
Actions are components that respond to interaction events and execute custom behavior:
- Derive from the abstract `InteractionActionBase` class
- Can be attached to interactable objects
- Multiple actions can be added to a single interactable
- Actions can optionally block the interaction flow until completion
The inspector for all interaction action components shows the key parameters from InteractionActionBase, with custom configuration options for specific action types:
![InteractionTimelineAction Inspector](media/interaction_timeline_action_inspector.png)
### Interaction Requirements
Requirements are components that determine whether an interaction can occur:
- Derive from the abstract `InteractionRequirementBase` class
- Can prevent interactions based on custom conditions
- Multiple requirements can be added to a single interactable
- Used for creating conditional interactions (e.g., requiring an item)
## Interaction Event Flow
Interactions follow a defined event flow:
1. **InteractionStarted**: Triggered when the player initiates an interaction
2. **PlayerArrived**: Triggered when the player character reaches the interaction point
3. **InteractingCharacterArrived**: Triggered when the interacting character (often Pulver) reaches the interaction point
4. **InteractionComplete**: Triggered when the interaction is completed
5. **InteractionInterrupted**: Triggered if the interaction is interrupted before completion
## InteractionActionBase
The `InteractionActionBase` is the abstract base class for all interaction actions. It provides the framework for creating custom behaviors that respond to interaction events.
### Key Features
- **Event Filtering**: Actions can choose which interaction events to respond to
- **Flow Control**: Actions can optionally pause the interaction flow until completion
- **Asynchronous Execution**: Actions use `async/await` pattern for time-consuming operations
- **Character References**: Actions receive references to both player and follower characters
### Implementation
```csharp
public abstract class InteractionActionBase : MonoBehaviour
{
// Which events this action should respond to
public List<InteractionEventType> respondToEvents;
// Whether to pause the interaction flow during execution
public bool pauseInteractionFlow;
// The main execution method that must be implemented by derived classes
protected abstract Task<bool> ExecuteAsync(
InteractionEventType eventType,
PlayerTouchController player,
FollowerController follower);
// Optional method for adding execution conditions
protected virtual bool ShouldExecute(
InteractionEventType eventType,
PlayerTouchController player,
FollowerController follower)
{
return true;
}
}
```
## InteractionTimelineAction
The `InteractionTimelineAction` is a powerful action that plays Unity Timeline sequences during interactions. It enables cinematic sequences, character animations, camera movements, and more.
### Key Features
- **Multiple Timeline Support**: Can play different timelines for different interaction events
- **Timeline Sequences**: Can play multiple timelines in sequence for a single event
- **Character Binding**: Automatically binds player and follower characters to timeline tracks
- **Flow Control**: Waits for timeline completion before continuing interaction flow
- **Timeout Safety**: Includes a configurable timeout to prevent interactions from getting stuck
- **Looping Options**: Supports looping all timelines or just the last timeline in a sequence
### Timeline Event Mapping
Each mapping connects an interaction event to one or more timeline assets:
```csharp
public class TimelineEventMapping
{
// The event that triggers this timeline
public InteractionEventType eventType;
// The timeline assets to play (in sequence)
public PlayableAsset[] timelines;
// Character binding options
public bool bindPlayerCharacter;
public bool bindPulverCharacter;
public string playerTrackName = "Player";
public string pulverTrackName = "Pulver";
// Playback options
public float timeoutSeconds = 30f;
public bool loopLast = false;
public bool loopAll = false;
}
```
### Custom Editor
The `InteractionTimelineAction` includes a custom editor that makes it easy to configure:
- Quick buttons to add mappings for common events
- Character binding options
- Timeline sequence configuration
- Validation warnings for misconfigured timelines
![Timeline Mapping Editor](media/timeline_mapping_editor.png)
### Implementation Pattern
For a cinematic interaction with timelines:
1. Add an `Interactable` component to your object
2. Add an `InteractionTimelineAction` component to the same object
3. Set up character move targets if needed
4. Create timeline assets for each interaction phase
5. Configure the timeline mappings in the inspector
6. Test the interaction in play mode
### Timeline Configuration
When setting up a timeline for interaction, you'll need to create a Timeline asset and configure it in Unity's Timeline editor:
![Timeline Editor](media/timeline_editor.png)
## Working with the Interactable Editor
The `Interactable` component includes a custom editor that enhances the workflow:
### Character Move Target Creation
The editor provides buttons to easily create character move targets:
- "Add Trafalgar Target" - Creates a move target for the player character
- "Add Pulver Target" - Creates a move target for the follower character
- "Add Both Characters Target" - Creates a move target for both characters
![Interactable Custom Editor](media/interactable_inspector.png)
### Target Visualization
The editor displays the number of targets for each character type and warns about potential conflicts:
```
Trafalgar Targets: 1, Pulver Targets: 1, Both Targets: 0
```
If multiple conflicting targets are detected, a warning is displayed to help prevent unexpected behavior.
## Best Practices
### Target Positioning
- Place character targets with appropriate spacing to prevent characters from overlapping
- Consider the character's facing direction (targets automatically make characters face the interactable)
- Use the position offset for fine-tuning without moving the actual target GameObject
![Target Positioning In Scene](media/target_positioning_scene.png)
### Timeline Design
- Keep timelines modular and focused on specific actions
- Use signals to trigger game events from timelines
- Consider using director notification tracks for advanced timeline integration
- Test timelines with actual characters to ensure animations blend correctly
### Action Combinations
- Combine multiple actions for complex behaviors (e.g., dialogue + timeline)
- Order actions in the Inspector to control execution priority
- Use the `pauseInteractionFlow` option strategically to control sequence flow
## Technical Reference
### InteractionEventType
```csharp
public enum InteractionEventType
{
InteractionStarted, // When interaction is first triggered
PlayerArrived, // When player arrives at interaction point
InteractingCharacterArrived, // When interacting character arrives
InteractionComplete, // When interaction is successfully completed
InteractionInterrupted // When interaction is interrupted
}
```
### CharacterToInteract
```csharp
public enum CharacterToInteract
{
None, // No character interactions
Trafalgar, // Player character only
Pulver, // Follower character only
Both // Both characters
}
```
## Troubleshooting
### Common Issues
- **Characters not moving to targets**: Ensure targets have the correct CharacterToInteract type set
- **Timeline not playing**: Check that the PlayableDirector has a reference to the timeline asset
- **Characters not appearing in timeline**: Verify the track names match the binding configuration
- **Interaction getting stuck**: Make sure timelines have a reasonable timeout value set
- **Multiple timelines playing simultaneously**: Check that the event mappings are correctly configured
## Setup Example
Here's how a typical interaction setup might look in the Inspector:
1. Interactable component with appropriate settings
2. Character move targets positioned in the scene
3. InteractionTimelineAction component configured with timeline mappings
4. PlayableDirector component referencing timeline assets
## Advanced Topics
### Timeline Integration with Dialogue
Timeline actions can be synchronized with dialogue using:
- Animation tracks to trigger dialogue displays
- Signal tracks to advance dialogue
- Custom markers to synchronize dialogue with character animations
### Interaction Sequences
Complex interaction sequences can be created by:
- Using multiple interactables in sequence
- Enabling/disabling interactables based on game state
- Using timelines to guide the player through sequential interactions

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

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

Some files were not shown because too many files have changed in this diff Show More