Compare commits
4 Commits
47d942d176
...
7fc3ca12f3
| Author | SHA1 | Date | |
|---|---|---|---|
| 7fc3ca12f3 | |||
| abeb5060f9 | |||
| f380b6fa54 | |||
| b781a1656d |
@@ -19,3 +19,4 @@ MonoBehaviour:
|
|||||||
- {fileID: 552225285624929822, guid: e39992796d5459442be9967c77e27066, type: 3}
|
- {fileID: 552225285624929822, guid: e39992796d5459442be9967c77e27066, type: 3}
|
||||||
- {fileID: 7644433920135100480, guid: 12d242e44fe80ab44af852254b7cab0f, type: 3}
|
- {fileID: 7644433920135100480, guid: 12d242e44fe80ab44af852254b7cab0f, type: 3}
|
||||||
- {fileID: 1794231825201849485, guid: 6fb0d7fc6faad154b8c3e3cb7abb7c15, type: 3}
|
- {fileID: 1794231825201849485, guid: 6fb0d7fc6faad154b8c3e3cb7abb7c15, type: 3}
|
||||||
|
- {fileID: 6399527186463168339, guid: ac41583865245bc4bb3de6c15929b9fc, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: Chocolate
|
m_Name: Chocolate
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: chocolate_4f2011c6
|
||||||
itemName: Chocolate
|
itemName: Chocolate
|
||||||
description: sweet nectar of gods that lures the beasts from bushes
|
description: sweet nectar of gods that lures the beasts from bushes
|
||||||
mapSprite: {fileID: -509776585262497855, guid: c648336c825f7d7479582bbe4d95d0bc, type: 3}
|
mapSprite: {fileID: -509776585262497855, guid: c648336c825f7d7479582bbe4d95d0bc, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: LureSpotB
|
m_Name: LureSpotB
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: lurespotb_92c24cf9
|
||||||
itemName: LureSpotB
|
itemName: LureSpotB
|
||||||
description: Place where we atract the chocobird
|
description: Place where we atract the chocobird
|
||||||
mapSprite: {fileID: 2640071299338251634, guid: 7c4c9881382767047aac78ca51b82923, type: 3}
|
mapSprite: {fileID: 2640071299338251634, guid: 7c4c9881382767047aac78ca51b82923, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: Ass
|
m_Name: Ass
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: ass_41f5d715
|
||||||
itemName: TestAss
|
itemName: TestAss
|
||||||
description: Well... how do you like 'em?
|
description: Well... how do you like 'em?
|
||||||
mapSprite: {fileID: -5471482676633547895, guid: 77ab3d770c92d5344b36eee3293a0f94, type: 3}
|
mapSprite: {fileID: -5471482676633547895, guid: 77ab3d770c92d5344b36eee3293a0f94, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: Ass1
|
m_Name: Ass1
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
itemName: TestAss
|
_itemId: ass1_5469eaae
|
||||||
|
itemName: TestAss1
|
||||||
description: Well... how do you like 'em?
|
description: Well... how do you like 'em?
|
||||||
mapSprite: {fileID: -5471482676633547895, guid: 77ab3d770c92d5344b36eee3293a0f94, type: 3}
|
mapSprite: {fileID: -5471482676633547895, guid: 77ab3d770c92d5344b36eee3293a0f94, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: Ass2
|
m_Name: Ass2
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
itemName: TestAss
|
_itemId: ass2_c4e69d34
|
||||||
|
itemName: TestAss2
|
||||||
description: Well... how do you like 'em?
|
description: Well... how do you like 'em?
|
||||||
mapSprite: {fileID: 4013237533433454447, guid: 77ab3d770c92d5344b36eee3293a0f94, type: 3}
|
mapSprite: {fileID: 4013237533433454447, guid: 77ab3d770c92d5344b36eee3293a0f94, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: Ass3
|
m_Name: Ass3
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
itemName: TestAss
|
_itemId: ass3_cb8f9cfb
|
||||||
|
itemName: TestAss3
|
||||||
description: Well... how do you like 'em?
|
description: Well... how do you like 'em?
|
||||||
mapSprite: {fileID: -8109988653212156562, guid: 77ab3d770c92d5344b36eee3293a0f94, type: 3}
|
mapSprite: {fileID: -8109988653212156562, guid: 77ab3d770c92d5344b36eee3293a0f94, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: Axe
|
m_Name: Axe
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: axe_bf031e9e
|
||||||
itemName: Axe
|
itemName: Axe
|
||||||
description: Well... how do you like 'em?
|
description: Well... how do you like 'em?
|
||||||
mapSprite: {fileID: 6674386295937086461, guid: 3bd1c178a78fcd144965cd1731dc309b, type: 3}
|
mapSprite: {fileID: 6674386295937086461, guid: 3bd1c178a78fcd144965cd1731dc309b, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: Bonfire
|
m_Name: Bonfire
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: bonfire_818563eb
|
||||||
itemName: Bonfire
|
itemName: Bonfire
|
||||||
description: Well... how do you like 'em?
|
description: Well... how do you like 'em?
|
||||||
mapSprite: {fileID: 6277786745957211492, guid: 016288f704d38e747a8eac9795051717, type: 3}
|
mapSprite: {fileID: 6277786745957211492, guid: 016288f704d38e747a8eac9795051717, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: Head
|
m_Name: Head
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: head_c827d69b
|
||||||
itemName: Axe
|
itemName: Axe
|
||||||
description: Well... how do you like 'em?
|
description: Well... how do you like 'em?
|
||||||
mapSprite: {fileID: -1693247529382600072, guid: 77ab3d770c92d5344b36eee3293a0f94, type: 3}
|
mapSprite: {fileID: -1693247529382600072, guid: 77ab3d770c92d5344b36eee3293a0f94, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: Meat
|
m_Name: Meat
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: meat_6500cc13
|
||||||
itemName: Meat
|
itemName: Meat
|
||||||
description: Well... how do you like 'em?
|
description: Well... how do you like 'em?
|
||||||
mapSprite: {fileID: 6282751622250221668, guid: 204325ac88be74d4d882a078c64cf5e1, type: 3}
|
mapSprite: {fileID: 6282751622250221668, guid: 204325ac88be74d4d882a078c64cf5e1, type: 3}
|
||||||
|
|||||||
18
Assets/Data/Items/ExampleAss/PickupItemData.asset
Normal file
18
Assets/Data/Items/ExampleAss/PickupItemData.asset
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
|
m_Name: PickupItemData
|
||||||
|
m_EditorClassIdentifier: AppleHillsScripts::PickupItemData
|
||||||
|
_itemId: pickupitemdata_10de237f
|
||||||
|
itemName:
|
||||||
|
description:
|
||||||
|
mapSprite: {fileID: 0}
|
||||||
8
Assets/Data/Items/ExampleAss/PickupItemData.asset.meta
Normal file
8
Assets/Data/Items/ExampleAss/PickupItemData.asset.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b1cd8267212dd2349ad7e2b91ec5be11
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: FootballBall
|
m_Name: FootballBall
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: footballball_b37968c2
|
||||||
itemName: FootballBall
|
itemName: FootballBall
|
||||||
description: Ball that is used to attract the football bird.
|
description: Ball that is used to attract the football bird.
|
||||||
mapSprite: {fileID: -6720685004267932717, guid: 88acd207b6a9e114ca3d3e59ac3aa550, type: 3}
|
mapSprite: {fileID: -6720685004267932717, guid: 88acd207b6a9e114ca3d3e59ac3aa550, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: LureSpotA
|
m_Name: LureSpotA
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: lurespota_19a6cf7c
|
||||||
itemName: LureSpotA
|
itemName: LureSpotA
|
||||||
description: Place where we atract the footballbird
|
description: Place where we atract the footballbird
|
||||||
mapSprite: {fileID: -8438005379329254897, guid: fe735eb4f8856904caec179520dcb92f, type: 3}
|
mapSprite: {fileID: -8438005379329254897, guid: fe735eb4f8856904caec179520dcb92f, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: LureSpotC
|
m_Name: LureSpotC
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: lurespotc_559f54b7
|
||||||
itemName: LureSpotC
|
itemName: LureSpotC
|
||||||
description: Place where we atract the hammerbird
|
description: Place where we atract the hammerbird
|
||||||
mapSprite: {fileID: 3009302558630513478, guid: 3aefb78ee1b7f6e4685d0fff00e24e3d, type: 3}
|
mapSprite: {fileID: 3009302558630513478, guid: 3aefb78ee1b7f6e4685d0fff00e24e3d, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: Nails
|
m_Name: Nails
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: nails_2ecaef33
|
||||||
itemName: Nails
|
itemName: Nails
|
||||||
description: Nails used to lure the hammer bird out.
|
description: Nails used to lure the hammer bird out.
|
||||||
mapSprite: {fileID: 21300000, guid: 34b9ddb77aae2df4ab489b7bb8f16cff, type: 3}
|
mapSprite: {fileID: 21300000, guid: 34b9ddb77aae2df4ab489b7bb8f16cff, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: Bunfflers
|
m_Name: Bunfflers
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: bunfflers_07f2a135
|
||||||
itemName: Bunfflers
|
itemName: Bunfflers
|
||||||
description: Ear Mufflers made to put on the soundbird so it doesn't fly away.
|
description: Ear Mufflers made to put on the soundbird so it doesn't fly away.
|
||||||
mapSprite: {fileID: -8848419083337551572, guid: b285cfb6530624a44a95ec99a59d7215, type: 3}
|
mapSprite: {fileID: -8848419083337551572, guid: b285cfb6530624a44a95ec99a59d7215, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: BurgerBuns
|
m_Name: BurgerBuns
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: burgerbuns_4ccd8772
|
||||||
itemName: BurgerBuns
|
itemName: BurgerBuns
|
||||||
description: A pack of Burguer Buns, they need to be combined with the headband
|
description: A pack of Burguer Buns, they need to be combined with the headband
|
||||||
to get "Bunfflers"
|
to get "Bunfflers"
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: Headband
|
m_Name: Headband
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: headband_9a56f411
|
||||||
itemName: Headband
|
itemName: Headband
|
||||||
description: Item dropped by Uncle Kunt!
|
description: Item dropped by Uncle Kunt!
|
||||||
mapSprite: {fileID: 743298078511449570, guid: 6f463983177b1404ca39fa222f03a3b2, type: 3}
|
mapSprite: {fileID: 743298078511449570, guid: 6f463983177b1404ca39fa222f03a3b2, type: 3}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ MonoBehaviour:
|
|||||||
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
m_Script: {fileID: 11500000, guid: 951b5c8af5114086a865d4bb7eae4548, type: 3}
|
||||||
m_Name: SoundBird
|
m_Name: SoundBird
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
|
_itemId: soundbird_16b17ba9
|
||||||
itemName: SoundBird
|
itemName: SoundBird
|
||||||
description: Objective Bird, escapes if player makes sound when close to it, stays
|
description: Objective Bird, escapes if player makes sound when close to it, stays
|
||||||
quiet if earmufflers are applied.
|
quiet if earmufflers are applied.
|
||||||
|
|||||||
8
Assets/Dialogue.meta
Normal file
8
Assets/Dialogue.meta
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: dcec43b1a5d809b4187eb91cabd6b657
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
695
Assets/Dialogue/TestDialogue.dialoguegraph
Normal file
695
Assets/Dialogue/TestDialogue.dialoguegraph
Normal file
@@ -0,0 +1,695 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &1
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 61
|
||||||
|
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: 790b4d75d92f4b0984310a268dbd952f, type: 3}
|
||||||
|
m_Name: TestDialogue
|
||||||
|
m_EditorClassIdentifier: Unity.GraphToolkit.Editor::Unity.GraphToolkit.Editor.Implementation.GraphObjectImp
|
||||||
|
m_GraphModel:
|
||||||
|
rid: 1219994508087787734
|
||||||
|
references:
|
||||||
|
version: 2
|
||||||
|
RefIds:
|
||||||
|
- rid: -2
|
||||||
|
type: {class: , ns: , asm: }
|
||||||
|
- rid: 1219994508087787734
|
||||||
|
type: {class: GraphModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 12720528336768607292
|
||||||
|
m_Value1: 4541789886294233460
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 3c246244206588b074910791d6ad073f
|
||||||
|
m_Name:
|
||||||
|
m_GraphNodeModels:
|
||||||
|
- rid: 1219994508087787747
|
||||||
|
- rid: 1219994508087787749
|
||||||
|
- rid: 1219994508087787751
|
||||||
|
- rid: 1219994508087787764
|
||||||
|
- rid: 1219994508087787770
|
||||||
|
- rid: 1219994508087787776
|
||||||
|
m_GraphWireModels:
|
||||||
|
- rid: 1219994508087787755
|
||||||
|
- rid: 1219994508087787773
|
||||||
|
- rid: 1219994508087787779
|
||||||
|
- rid: 1219994508087787780
|
||||||
|
- rid: 1219994508087787813
|
||||||
|
m_GraphStickyNoteModels: []
|
||||||
|
m_GraphPlacematModels: []
|
||||||
|
m_GraphVariableModels:
|
||||||
|
- rid: 1219994508087787760
|
||||||
|
m_GraphPortalModels: []
|
||||||
|
m_SectionModels:
|
||||||
|
- rid: 1219994508087787735
|
||||||
|
m_LocalSubgraphs: []
|
||||||
|
m_LastKnownBounds:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 123
|
||||||
|
y: -65
|
||||||
|
width: 1698
|
||||||
|
height: 244
|
||||||
|
m_GraphElementMetaData:
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 13346176596883742728
|
||||||
|
m_Value1: 18083586785705260694
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 0820e35ee72437b996f6e8e25ecef5fa
|
||||||
|
m_Category: 0
|
||||||
|
m_Index: 0
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 356371523793864382
|
||||||
|
m_Value1: 4751895819492649258
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: be46cc430316f2042ae9853a1220f241
|
||||||
|
m_Category: 0
|
||||||
|
m_Index: 1
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 8593691416048532199
|
||||||
|
m_Value1: 6890539440515769320
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: e77ae5c2cfec4277e8e3c20e1d1da05f
|
||||||
|
m_Category: 0
|
||||||
|
m_Index: 2
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 7709580528075638554
|
||||||
|
m_Value1: 12466507236153719696
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 1a8737a7a4eefd6a907bc7e847ee01ad
|
||||||
|
m_Category: 2
|
||||||
|
m_Index: 0
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 13887651235662800591
|
||||||
|
m_Value1: 935957084791214113
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: cf26320a38d9bac02190fd7b0230fd0c
|
||||||
|
m_Category: 1
|
||||||
|
m_Index: 0
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 4225538081375705477
|
||||||
|
m_Value1: 10816025756629798206
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 85d948457f20a43a3e0d65b11e3e1a96
|
||||||
|
m_Category: 0
|
||||||
|
m_Index: 3
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 1990642935411556156
|
||||||
|
m_Value1: 16710028644464764280
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 3cbfd8ef332fa01b78a5ecc384f2e5e7
|
||||||
|
m_Category: 0
|
||||||
|
m_Index: 4
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 5477022009621441144
|
||||||
|
m_Value1: 13992127810305260154
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 786a7bce7f4a024c7afa1b291c062ec2
|
||||||
|
m_Category: 2
|
||||||
|
m_Index: 1
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 10537482371379217669
|
||||||
|
m_Value1: 805153394380735108
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 05c5ff0463a83c928482c30dbf7a2c0b
|
||||||
|
m_Category: 0
|
||||||
|
m_Index: 5
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 10238952115911916765
|
||||||
|
m_Value1: 16796494752743159762
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: ddfc297db310188ed2f7f768fc2219e9
|
||||||
|
m_Category: 2
|
||||||
|
m_Index: 2
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 10375816761084646535
|
||||||
|
m_Value1: 15824079162718769611
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 8794feea5e4efe8fcb5183af286c9adb
|
||||||
|
m_Category: 2
|
||||||
|
m_Index: 3
|
||||||
|
- m_Guid:
|
||||||
|
m_Value0: 10491986159911335451
|
||||||
|
m_Value1: 18287880145942505208
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 1b76d4d1d2059b91f866d271199acbfd
|
||||||
|
m_Category: 2
|
||||||
|
m_Index: 4
|
||||||
|
m_EntryPoint:
|
||||||
|
rid: 1219994508087787747
|
||||||
|
m_Graph:
|
||||||
|
rid: 1219994508087787736
|
||||||
|
- rid: 1219994508087787735
|
||||||
|
type: {class: SectionModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 12939578175715148634
|
||||||
|
m_Value1: 2855330721591447007
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 5a03e642cb9d92b3dfcdb7c0292ca027
|
||||||
|
m_Version: 2
|
||||||
|
m_Items:
|
||||||
|
- rid: 1219994508087787760
|
||||||
|
m_Title:
|
||||||
|
- rid: 1219994508087787736
|
||||||
|
type: {class: DialogueGraph, ns: Editor.Dialogue, asm: AppleHillsEditor}
|
||||||
|
data:
|
||||||
|
- rid: 1219994508087787747
|
||||||
|
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 13346176596883742728
|
||||||
|
m_Value1: 18083586785705260694
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 0820e35ee72437b996f6e8e25ecef5fa
|
||||||
|
m_Version: 2
|
||||||
|
m_Position: {x: 316.4595, y: -65.01193}
|
||||||
|
m_Title:
|
||||||
|
m_Tooltip:
|
||||||
|
m_NodePreviewModel:
|
||||||
|
rid: -2
|
||||||
|
m_State: 0
|
||||||
|
m_InputConstantsById:
|
||||||
|
m_KeyList:
|
||||||
|
- SpeakerName
|
||||||
|
m_ValueList:
|
||||||
|
- rid: 1219994508087787766
|
||||||
|
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: 1219994508087787748
|
||||||
|
- rid: 1219994508087787748
|
||||||
|
type: {class: StartNode, ns: Editor.Dialogue, asm: AppleHillsEditor}
|
||||||
|
data:
|
||||||
|
- rid: 1219994508087787749
|
||||||
|
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 356371523793864382
|
||||||
|
m_Value1: 4751895819492649258
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: be46cc430316f2042ae9853a1220f241
|
||||||
|
m_Version: 2
|
||||||
|
m_Position: {x: 1707.9503, y: -59.602116}
|
||||||
|
m_Title:
|
||||||
|
m_Tooltip:
|
||||||
|
m_NodePreviewModel:
|
||||||
|
rid: -2
|
||||||
|
m_State: 0
|
||||||
|
m_InputConstantsById:
|
||||||
|
m_KeyList: []
|
||||||
|
m_ValueList: []
|
||||||
|
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: 1219994508087787750
|
||||||
|
- rid: 1219994508087787750
|
||||||
|
type: {class: EndNode, ns: Editor.Dialogue, asm: AppleHillsEditor}
|
||||||
|
data:
|
||||||
|
- rid: 1219994508087787751
|
||||||
|
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 8593691416048532199
|
||||||
|
m_Value1: 6890539440515769320
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: e77ae5c2cfec4277e8e3c20e1d1da05f
|
||||||
|
m_Version: 2
|
||||||
|
m_Position: {x: 530.97986, y: -60.683594}
|
||||||
|
m_Title:
|
||||||
|
m_Tooltip:
|
||||||
|
m_NodePreviewModel:
|
||||||
|
rid: -2
|
||||||
|
m_State: 0
|
||||||
|
m_InputConstantsById:
|
||||||
|
m_KeyList:
|
||||||
|
- __option_DialogueLineType
|
||||||
|
- __option_NoLines
|
||||||
|
- DefaultDialogueLine
|
||||||
|
- LoopThroughDefaultLines
|
||||||
|
m_ValueList:
|
||||||
|
- rid: 1219994508087787857
|
||||||
|
- rid: 1219994508087787858
|
||||||
|
- rid: 1219994508087787897
|
||||||
|
- rid: 1219994508087787904
|
||||||
|
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: 1219994508087787752
|
||||||
|
- rid: 1219994508087787752
|
||||||
|
type: {class: DialogueNode, ns: Editor.Dialogue, asm: AppleHillsEditor}
|
||||||
|
data:
|
||||||
|
- rid: 1219994508087787755
|
||||||
|
type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 7709580528075638554
|
||||||
|
m_Value1: 12466507236153719696
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 1a8737a7a4eefd6a907bc7e847ee01ad
|
||||||
|
m_Version: 2
|
||||||
|
m_FromPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 13346176596883742728
|
||||||
|
m_Value1: 18083586785705260694
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 0820e35ee72437b996f6e8e25ecef5fa
|
||||||
|
m_UniqueId: out
|
||||||
|
m_PortDirection: 2
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title: out
|
||||||
|
m_ToPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 8593691416048532199
|
||||||
|
m_Value1: 6890539440515769320
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: e77ae5c2cfec4277e8e3c20e1d1da05f
|
||||||
|
m_UniqueId: in
|
||||||
|
m_PortDirection: 1
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title: in
|
||||||
|
- rid: 1219994508087787760
|
||||||
|
type: {class: VariableDeclarationModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 13887651235662800591
|
||||||
|
m_Value1: 935957084791214113
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: cf26320a38d9bac02190fd7b0230fd0c
|
||||||
|
m_Version: 2
|
||||||
|
m_Name: Anna-Lyse
|
||||||
|
m_UniqueId:
|
||||||
|
m_DataType:
|
||||||
|
m_Identification: System.String, System.Private.CoreLib, Version=4.0.0.0,
|
||||||
|
Culture=neutral, PublicKeyToken=b77a5c561934e089
|
||||||
|
m_IsExposed: 0
|
||||||
|
m_Scope: 0
|
||||||
|
m_ShowOnInspectorOnly: 0
|
||||||
|
m_Tooltip:
|
||||||
|
m_InitializationValue:
|
||||||
|
rid: 1219994508087787761
|
||||||
|
m_Modifiers: 0
|
||||||
|
m_VariableFlags: 0
|
||||||
|
- rid: 1219994508087787761
|
||||||
|
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
|
||||||
|
data:
|
||||||
|
m_Value: Anna-Lyse
|
||||||
|
- rid: 1219994508087787764
|
||||||
|
type: {class: VariableNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 4225538081375705477
|
||||||
|
m_Value1: 10816025756629798206
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 85d948457f20a43a3e0d65b11e3e1a96
|
||||||
|
m_Version: 2
|
||||||
|
m_Position: {x: 123.485, y: -64.61}
|
||||||
|
m_Title: Anna-Lyse
|
||||||
|
m_Tooltip:
|
||||||
|
m_NodePreviewModel:
|
||||||
|
rid: -2
|
||||||
|
m_State: 0
|
||||||
|
m_InputConstantsById:
|
||||||
|
m_KeyList: []
|
||||||
|
m_ValueList: []
|
||||||
|
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_DeclarationModel:
|
||||||
|
rid: 1219994508087787760
|
||||||
|
m_DeclarationModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: cf26320a38d9bac02190fd7b0230fd0c
|
||||||
|
- rid: 1219994508087787766
|
||||||
|
type: {class: 'Constant`1[[System.String, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
|
||||||
|
data:
|
||||||
|
m_Value:
|
||||||
|
- rid: 1219994508087787770
|
||||||
|
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 1990642935411556156
|
||||||
|
m_Value1: 16710028644464764280
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 3cbfd8ef332fa01b78a5ecc384f2e5e7
|
||||||
|
m_Version: 2
|
||||||
|
m_Position: {x: 914.5827, y: -58.93837}
|
||||||
|
m_Title: DialogueNode
|
||||||
|
m_Tooltip:
|
||||||
|
m_NodePreviewModel:
|
||||||
|
rid: -2
|
||||||
|
m_State: 0
|
||||||
|
m_InputConstantsById:
|
||||||
|
m_KeyList:
|
||||||
|
- __option_DialogueLineType
|
||||||
|
- __option_NoLines
|
||||||
|
- DefaultDialogueLine1
|
||||||
|
- DefaultDialogueLine2
|
||||||
|
- DefaultDialogueLine3
|
||||||
|
- LoopThroughDefaultLines
|
||||||
|
m_ValueList:
|
||||||
|
- rid: 1219994508087787860
|
||||||
|
- rid: 1219994508087787861
|
||||||
|
- rid: 1219994508087787900
|
||||||
|
- rid: 1219994508087787901
|
||||||
|
- rid: 1219994508087787902
|
||||||
|
- rid: 1219994508087787905
|
||||||
|
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: 1219994508087787772
|
||||||
|
- rid: 1219994508087787772
|
||||||
|
type: {class: DialogueNode, ns: Editor.Dialogue, asm: AppleHillsEditor}
|
||||||
|
data:
|
||||||
|
- rid: 1219994508087787773
|
||||||
|
type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 5477022009621441144
|
||||||
|
m_Value1: 13992127810305260154
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 786a7bce7f4a024c7afa1b291c062ec2
|
||||||
|
m_Version: 2
|
||||||
|
m_FromPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 8593691416048532199
|
||||||
|
m_Value1: 6890539440515769320
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: e77ae5c2cfec4277e8e3c20e1d1da05f
|
||||||
|
m_UniqueId: out
|
||||||
|
m_PortDirection: 2
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title: out
|
||||||
|
m_ToPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 1990642935411556156
|
||||||
|
m_Value1: 16710028644464764280
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 3cbfd8ef332fa01b78a5ecc384f2e5e7
|
||||||
|
m_UniqueId: in
|
||||||
|
m_PortDirection: 1
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title: in
|
||||||
|
- rid: 1219994508087787776
|
||||||
|
type: {class: UserNodeModelImp, ns: Unity.GraphToolkit.Editor.Implementation, asm: Unity.GraphToolkit.Editor}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 10537482371379217669
|
||||||
|
m_Value1: 805153394380735108
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 05c5ff0463a83c928482c30dbf7a2c0b
|
||||||
|
m_Version: 2
|
||||||
|
m_Position: {x: 1294.008, y: -60.75061}
|
||||||
|
m_Title: DialogueNode
|
||||||
|
m_Tooltip:
|
||||||
|
m_NodePreviewModel:
|
||||||
|
rid: -2
|
||||||
|
m_State: 0
|
||||||
|
m_InputConstantsById:
|
||||||
|
m_KeyList:
|
||||||
|
- __option_DialogueLineType
|
||||||
|
- __option_NoLines
|
||||||
|
- DefaultDialogueLine
|
||||||
|
- LoopThroughDefaultLines
|
||||||
|
m_ValueList:
|
||||||
|
- rid: 1219994508087787863
|
||||||
|
- rid: 1219994508087787864
|
||||||
|
- rid: 1219994508087787898
|
||||||
|
- rid: 1219994508087787906
|
||||||
|
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: 1219994508087787778
|
||||||
|
- rid: 1219994508087787778
|
||||||
|
type: {class: DialogueNode, ns: Editor.Dialogue, asm: AppleHillsEditor}
|
||||||
|
data:
|
||||||
|
- rid: 1219994508087787779
|
||||||
|
type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 10238952115911916765
|
||||||
|
m_Value1: 16796494752743159762
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: ddfc297db310188ed2f7f768fc2219e9
|
||||||
|
m_Version: 2
|
||||||
|
m_FromPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 1990642935411556156
|
||||||
|
m_Value1: 16710028644464764280
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 3cbfd8ef332fa01b78a5ecc384f2e5e7
|
||||||
|
m_UniqueId: out
|
||||||
|
m_PortDirection: 2
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title: out
|
||||||
|
m_ToPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 10537482371379217669
|
||||||
|
m_Value1: 805153394380735108
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 05c5ff0463a83c928482c30dbf7a2c0b
|
||||||
|
m_UniqueId: in
|
||||||
|
m_PortDirection: 1
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title: in
|
||||||
|
- rid: 1219994508087787780
|
||||||
|
type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 10375816761084646535
|
||||||
|
m_Value1: 15824079162718769611
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 8794feea5e4efe8fcb5183af286c9adb
|
||||||
|
m_Version: 2
|
||||||
|
m_FromPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 10537482371379217669
|
||||||
|
m_Value1: 805153394380735108
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 05c5ff0463a83c928482c30dbf7a2c0b
|
||||||
|
m_UniqueId: out
|
||||||
|
m_PortDirection: 2
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title: out
|
||||||
|
m_ToPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 356371523793864382
|
||||||
|
m_Value1: 4751895819492649258
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: be46cc430316f2042ae9853a1220f241
|
||||||
|
m_UniqueId: in
|
||||||
|
m_PortDirection: 1
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title: in
|
||||||
|
- rid: 1219994508087787813
|
||||||
|
type: {class: WireModel, ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
|
||||||
|
data:
|
||||||
|
m_Guid:
|
||||||
|
m_Value0: 10491986159911335451
|
||||||
|
m_Value1: 18287880145942505208
|
||||||
|
m_HashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 1b76d4d1d2059b91f866d271199acbfd
|
||||||
|
m_Version: 2
|
||||||
|
m_FromPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 4225538081375705477
|
||||||
|
m_Value1: 10816025756629798206
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 85d948457f20a43a3e0d65b11e3e1a96
|
||||||
|
m_UniqueId: MainPortName
|
||||||
|
m_PortDirection: 2
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title: MainPortName
|
||||||
|
m_ToPortReference:
|
||||||
|
m_NodeModelGuid:
|
||||||
|
m_Value0: 13346176596883742728
|
||||||
|
m_Value1: 18083586785705260694
|
||||||
|
m_NodeModelHashGuid:
|
||||||
|
serializedVersion: 2
|
||||||
|
Hash: 0820e35ee72437b996f6e8e25ecef5fa
|
||||||
|
m_UniqueId: SpeakerName
|
||||||
|
m_PortDirection: 1
|
||||||
|
m_PortOrientation: 0
|
||||||
|
m_Title: SpeakerName
|
||||||
|
- rid: 1219994508087787857
|
||||||
|
type: {class: EnumConstant, 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: 0
|
||||||
|
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
|
||||||
|
- rid: 1219994508087787860
|
||||||
|
type: {class: EnumConstant, 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: 1219994508087787861
|
||||||
|
type: {class: 'Constant`1[[System.Int32, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
|
||||||
|
data:
|
||||||
|
m_Value: 3
|
||||||
|
- rid: 1219994508087787863
|
||||||
|
type: {class: EnumConstant, 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: 0
|
||||||
|
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 test line
|
||||||
|
- 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
|
||||||
|
- rid: 1219994508087787904
|
||||||
|
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
|
||||||
|
data:
|
||||||
|
m_Value: 0
|
||||||
|
- rid: 1219994508087787905
|
||||||
|
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
|
||||||
|
data:
|
||||||
|
m_Value: 0
|
||||||
|
- rid: 1219994508087787906
|
||||||
|
type: {class: 'Constant`1[[System.Boolean, mscorlib]]', ns: Unity.GraphToolkit.Editor, asm: Unity.GraphToolkit.Internal.Editor}
|
||||||
|
data:
|
||||||
|
m_Value: 0
|
||||||
7
Assets/Dialogue/TestDialogue.dialoguegraph.meta
Normal file
7
Assets/Dialogue/TestDialogue.dialoguegraph.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9050f99a225035b40b415df272d2b341
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -4,7 +4,9 @@
|
|||||||
"references": [
|
"references": [
|
||||||
"GUID:d91d3f46515a6954caa674697afbf416",
|
"GUID:d91d3f46515a6954caa674697afbf416",
|
||||||
"GUID:69448af7b92c7f342b298e06a37122aa",
|
"GUID:69448af7b92c7f342b298e06a37122aa",
|
||||||
"GUID:9e24947de15b9834991c9d8411ea37cf"
|
"GUID:9e24947de15b9834991c9d8411ea37cf",
|
||||||
|
"GUID:70ef9a24f4cfc4aec911c1414e3f90ad",
|
||||||
|
"GUID:d1e08c06f8f9473888c892637c83c913"
|
||||||
],
|
],
|
||||||
"includePlatforms": [
|
"includePlatforms": [
|
||||||
"Editor"
|
"Editor"
|
||||||
|
|||||||
3
Assets/Editor/Dialogue.meta
Normal file
3
Assets/Editor/Dialogue.meta
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5ced9daeaad4427f9feb953a53b6d3df
|
||||||
|
timeCreated: 1758869763
|
||||||
20
Assets/Editor/Dialogue/DialogueGraph.cs
Normal file
20
Assets/Editor/Dialogue/DialogueGraph.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
using Unity.GraphToolkit.Editor;
|
||||||
|
|
||||||
|
namespace Editor.Dialogue
|
||||||
|
{
|
||||||
|
[Serializable]
|
||||||
|
[Graph(AssetExtension)]
|
||||||
|
public class DialogueGraph : Graph
|
||||||
|
{
|
||||||
|
public const string AssetExtension = "dialoguegraph";
|
||||||
|
|
||||||
|
[MenuItem("Assets/Create/Dialogue Graph", false)]
|
||||||
|
private static void CreateAssetFile()
|
||||||
|
{
|
||||||
|
GraphDatabase.PromptInProjectBrowserToCreateNewAsset<DialogueGraph>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
3
Assets/Editor/Dialogue/DialogueGraph.cs.meta
Normal file
3
Assets/Editor/Dialogue/DialogueGraph.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: eff5cdbb7a22496e93560cffa5754029
|
||||||
|
timeCreated: 1758869773
|
||||||
246
Assets/Editor/Dialogue/DialogueGraphImporter.cs
Normal file
246
Assets/Editor/Dialogue/DialogueGraphImporter.cs
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor.AssetImporters;
|
||||||
|
using Unity.GraphToolkit.Editor;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using Dialogue;
|
||||||
|
using PuzzleS;
|
||||||
|
|
||||||
|
namespace Editor.Dialogue
|
||||||
|
{
|
||||||
|
[ScriptedImporter(1, DialogueGraph.AssetExtension)]
|
||||||
|
public class DialogueGraphImporter : ScriptedImporter
|
||||||
|
{
|
||||||
|
public override void OnImportAsset(AssetImportContext ctx)
|
||||||
|
{
|
||||||
|
DialogueGraph editorGraph = GraphDatabase.LoadGraphForImporter<DialogueGraph>(ctx.assetPath);
|
||||||
|
RuntimeDialogueGraph runtimeGraph = ScriptableObject.CreateInstance<RuntimeDialogueGraph>();
|
||||||
|
var nodeIDMap = new Dictionary<INode, string>();
|
||||||
|
|
||||||
|
// Generate stable GUIDs for each node
|
||||||
|
foreach (var node in editorGraph.GetNodes())
|
||||||
|
{
|
||||||
|
nodeIDMap[node] = Guid.NewGuid().ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process start node to get entry point and speaker name
|
||||||
|
var startNode = editorGraph.GetNodes().OfType<StartNode>().FirstOrDefault();
|
||||||
|
if (startNode != null)
|
||||||
|
{
|
||||||
|
var entryPoint = startNode.GetOutputPorts().FirstOrDefault()?.firstConnectedPort;
|
||||||
|
if (entryPoint != null)
|
||||||
|
{
|
||||||
|
runtimeGraph.entryNodeID = nodeIDMap[entryPoint.GetNode()];
|
||||||
|
}
|
||||||
|
|
||||||
|
runtimeGraph.speakerName = GetPortValue<string>(startNode.GetInputPortByName("SpeakerName"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process each node in the graph
|
||||||
|
foreach (var iNode in editorGraph.GetNodes())
|
||||||
|
{
|
||||||
|
if (iNode is StartNode || iNode is IVariableNode)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var runtimeNode = new RuntimeDialogueNode{ nodeID = nodeIDMap[iNode] };
|
||||||
|
|
||||||
|
// Process node based on its type
|
||||||
|
if (iNode is DialogueNode dialogueNode)
|
||||||
|
{
|
||||||
|
if (iNode is WaitOnPuzzleStep puzzleNode)
|
||||||
|
{
|
||||||
|
ProcessPuzzleNode(puzzleNode, runtimeNode);
|
||||||
|
}
|
||||||
|
else if (iNode is WaitOnPickup pickupNode)
|
||||||
|
{
|
||||||
|
ProcessPickupNode(pickupNode, runtimeNode);
|
||||||
|
}
|
||||||
|
else if (iNode is WaitOnSlot slotNode)
|
||||||
|
{
|
||||||
|
ProcessSlotNode(slotNode, runtimeNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process base dialogue node properties (for all node types)
|
||||||
|
ProcessDialogueNodeBase(dialogueNode, runtimeNode);
|
||||||
|
}
|
||||||
|
else if (iNode is EndNode)
|
||||||
|
{
|
||||||
|
runtimeNode.nodeType = RuntimeDialogueNodeType.End;
|
||||||
|
// End nodes don't have next nodes, so we don't need to look for "out" ports
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get next node connection (skip for EndNodes as they don't have out ports)
|
||||||
|
if (!(iNode is EndNode))
|
||||||
|
{
|
||||||
|
// Check if the node has output ports before trying to get one by name
|
||||||
|
var outputPorts = iNode.GetOutputPorts();
|
||||||
|
if (outputPorts != null && outputPorts.Any())
|
||||||
|
{
|
||||||
|
var outPort = outputPorts.FirstOrDefault(p => p.name == "out");
|
||||||
|
if (outPort != null && outPort.firstConnectedPort != null)
|
||||||
|
{
|
||||||
|
runtimeNode.nextNodeID = nodeIDMap[outPort.firstConnectedPort.GetNode()];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add node to runtime graph
|
||||||
|
runtimeGraph.allNodes.Add(runtimeNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.AddObjectToAsset("RuntimeData", runtimeGraph);
|
||||||
|
ctx.SetMainObject(runtimeGraph);
|
||||||
|
|
||||||
|
Debug.Log($"Imported DialogueGraph with {runtimeGraph.allNodes.Count} nodes.");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ProcessDialogueNodeBase(DialogueNode node, RuntimeDialogueNode runtimeNode)
|
||||||
|
{
|
||||||
|
// Set default node type
|
||||||
|
runtimeNode.nodeType = RuntimeDialogueNodeType.Dialogue;
|
||||||
|
|
||||||
|
// Get line type and count options
|
||||||
|
var lineTypeOption = node.GetNodeOptionByName("DialogueLineType");
|
||||||
|
lineTypeOption.TryGetValue<DialogueType>(out var lineType);
|
||||||
|
|
||||||
|
var lineCountOption = node.GetNodeOptionByName("NoLines");
|
||||||
|
lineCountOption.TryGetValue<int>(out var lineCount);
|
||||||
|
|
||||||
|
// Process dialogue lines based on line type
|
||||||
|
if (lineType == DialogueType.SayMultipleLines)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < lineCount; i++)
|
||||||
|
{
|
||||||
|
var lineValue = GetPortValue<string>(node.GetInputPortByName($"DefaultDialogueLine{i + 1}"));
|
||||||
|
if (!string.IsNullOrEmpty(lineValue))
|
||||||
|
{
|
||||||
|
runtimeNode.dialogueLines.Add(lineValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var lineValue = GetPortValue<string>(node.GetInputPortByName("DefaultDialogueLine"));
|
||||||
|
if (!string.IsNullOrEmpty(lineValue))
|
||||||
|
{
|
||||||
|
runtimeNode.dialogueLines.Add(lineValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get loop through lines option
|
||||||
|
var loopThroughLines = GetPortValue<bool>(node.GetInputPortByName("LoopThroughDefaultLines"));
|
||||||
|
runtimeNode.loopThroughLines = loopThroughLines;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ProcessPuzzleNode(WaitOnPuzzleStep node, RuntimeDialogueNode runtimeNode)
|
||||||
|
{
|
||||||
|
runtimeNode.nodeType = RuntimeDialogueNodeType.WaitOnPuzzleStep;
|
||||||
|
|
||||||
|
var puzzleStep = GetPortValue<PuzzleStepSO>(node.GetInputPortByName("RequiredPuzzleStep"));
|
||||||
|
if (puzzleStep != null)
|
||||||
|
{
|
||||||
|
runtimeNode.puzzleStepID = puzzleStep.stepId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ProcessPickupNode(WaitOnPickup node, RuntimeDialogueNode runtimeNode)
|
||||||
|
{
|
||||||
|
runtimeNode.nodeType = RuntimeDialogueNodeType.WaitOnPickup;
|
||||||
|
|
||||||
|
var pickup = GetPortValue<PickupItemData>(node.GetInputPortByName("RequiredPickup"));
|
||||||
|
if (pickup != null)
|
||||||
|
{
|
||||||
|
runtimeNode.pickupItemID = pickup.itemId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ProcessSlotNode(WaitOnSlot node, RuntimeDialogueNode runtimeNode)
|
||||||
|
{
|
||||||
|
runtimeNode.nodeType = RuntimeDialogueNodeType.WaitOnSlot;
|
||||||
|
|
||||||
|
var slot = GetPortValue<PickupItemData>(node.GetInputPortByName("RequiredSlot"));
|
||||||
|
if (slot != null)
|
||||||
|
{
|
||||||
|
runtimeNode.slotItemID = slot.itemId;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process incorrect item lines
|
||||||
|
var incorrectItemLineTypeOption = node.GetNodeOptionByName("IncorrectItemDialogueLineType");
|
||||||
|
incorrectItemLineTypeOption.TryGetValue<DialogueType>(out var incorrectItemLineType);
|
||||||
|
|
||||||
|
var incorrectItemLineCountOption = node.GetNodeOptionByName("IncorrectItemNoLines");
|
||||||
|
incorrectItemLineCountOption.TryGetValue<int>(out var incorrectItemLineCount);
|
||||||
|
|
||||||
|
if (incorrectItemLineType == DialogueType.SayMultipleLines)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < incorrectItemLineCount; i++)
|
||||||
|
{
|
||||||
|
var lineValue = GetPortValue<string>(node.GetInputPortByName($"IncorrectItemDialogueLine{i + 1}"));
|
||||||
|
if (!string.IsNullOrEmpty(lineValue))
|
||||||
|
{
|
||||||
|
runtimeNode.incorrectItemLines.Add(lineValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var lineValue = GetPortValue<string>(node.GetInputPortByName("IncorrectItemDialogueLine"));
|
||||||
|
if (!string.IsNullOrEmpty(lineValue))
|
||||||
|
{
|
||||||
|
runtimeNode.incorrectItemLines.Add(lineValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
runtimeNode.loopThroughIncorrectLines =
|
||||||
|
GetPortValue<bool>(node.GetInputPortByName("LoopThroughIncorrectItemLines"));
|
||||||
|
|
||||||
|
// Process forbidden item lines
|
||||||
|
var forbiddenItemLineTypeOption = node.GetNodeOptionByName("ForbiddenItemDialogueLineType");
|
||||||
|
forbiddenItemLineTypeOption.TryGetValue<DialogueType>(out var forbiddenItemLineType);
|
||||||
|
|
||||||
|
var forbiddenItemLineCountOption = node.GetNodeOptionByName("ForbiddenItemNoLines");
|
||||||
|
forbiddenItemLineCountOption.TryGetValue<int>(out var forbiddenItemLineCount);
|
||||||
|
|
||||||
|
if (forbiddenItemLineType == DialogueType.SayMultipleLines)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < forbiddenItemLineCount; i++)
|
||||||
|
{
|
||||||
|
var lineValue = GetPortValue<string>(node.GetInputPortByName($"ForbiddenItemDialogueLine{i + 1}"));
|
||||||
|
if (!string.IsNullOrEmpty(lineValue))
|
||||||
|
{
|
||||||
|
runtimeNode.forbiddenItemLines.Add(lineValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var lineValue = GetPortValue<string>(node.GetInputPortByName("ForbiddenItemDialogueLine"));
|
||||||
|
if (!string.IsNullOrEmpty(lineValue))
|
||||||
|
{
|
||||||
|
runtimeNode.forbiddenItemLines.Add(lineValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
runtimeNode.loopThroughForbiddenLines =
|
||||||
|
GetPortValue<bool>(node.GetInputPortByName("LoopThroughForbiddenItemLines"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private T GetPortValue<T>(IPort port)
|
||||||
|
{
|
||||||
|
if (port == null) return default(T);
|
||||||
|
|
||||||
|
if (port.isConnected)
|
||||||
|
{
|
||||||
|
if (port.firstConnectedPort.GetNode() is IVariableNode variableNode)
|
||||||
|
{
|
||||||
|
variableNode.variable.TryGetDefaultValue(out T value);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
port.TryGetValue(out T fallbackValue);
|
||||||
|
return fallbackValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
3
Assets/Editor/Dialogue/DialogueGraphImporter.cs.meta
Normal file
3
Assets/Editor/Dialogue/DialogueGraphImporter.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a2334d3ee5254a2bbcb316035c681b27
|
||||||
|
timeCreated: 1758871584
|
||||||
196
Assets/Editor/Dialogue/DialogueNodes.cs
Normal file
196
Assets/Editor/Dialogue/DialogueNodes.cs
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using Unity.GraphToolkit.Editor;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Editor.Dialogue
|
||||||
|
{
|
||||||
|
[Serializable]
|
||||||
|
public class StartNode : Node
|
||||||
|
{
|
||||||
|
protected override void OnDefinePorts(IPortDefinitionContext context)
|
||||||
|
{
|
||||||
|
context.AddOutputPort("out").Build();
|
||||||
|
|
||||||
|
context.AddInputPort<string>("SpeakerName").Build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class EndNode : Node
|
||||||
|
{
|
||||||
|
protected override void OnDefinePorts(IPortDefinitionContext context)
|
||||||
|
{
|
||||||
|
context.AddInputPort("in").Build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public enum DialogueType
|
||||||
|
{
|
||||||
|
SayOneLine,
|
||||||
|
SayMultipleLines
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class DialogueNode : Node
|
||||||
|
{
|
||||||
|
const string LineTypeOptionName = "DialogueLineType";
|
||||||
|
const string NoLinesOptionName = "NoLines";
|
||||||
|
const string LoopThroughDefaultLinesOptionName = "LoopThroughDefaultLines";
|
||||||
|
const string DefaultDialogueLineOptionName = "DefaultDialogueLine";
|
||||||
|
|
||||||
|
|
||||||
|
protected override void OnDefineOptions(IOptionDefinitionContext context)
|
||||||
|
{
|
||||||
|
context.AddOption<DialogueType>(LineTypeOptionName)
|
||||||
|
.WithDisplayName("Default Line Type")
|
||||||
|
.WithDefaultValue(DialogueType.SayOneLine)
|
||||||
|
.Delayed();
|
||||||
|
|
||||||
|
|
||||||
|
context.AddOption<int>(NoLinesOptionName)
|
||||||
|
.WithDisplayName("Number of Default Lines")
|
||||||
|
.WithDefaultValue(1)
|
||||||
|
.Delayed();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnDefinePorts(IPortDefinitionContext context)
|
||||||
|
{
|
||||||
|
context.AddInputPort("in").Build();
|
||||||
|
context.AddOutputPort("out").Build();
|
||||||
|
|
||||||
|
var lineTypeOption = GetNodeOptionByName(LineTypeOptionName);
|
||||||
|
lineTypeOption.TryGetValue<DialogueType>(out var lineType);
|
||||||
|
var lineCountOption = GetNodeOptionByName(NoLinesOptionName);
|
||||||
|
lineCountOption.TryGetValue<int>(out var lineCount);
|
||||||
|
|
||||||
|
if (lineType == DialogueType.SayMultipleLines)
|
||||||
|
{
|
||||||
|
for (var i = 0; i < lineCount; i++)
|
||||||
|
{
|
||||||
|
context.AddInputPort<string>($"{DefaultDialogueLineOptionName}{i + 1}").WithDisplayName($"Default Dialogue Line {i + 1}").Build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
context.AddInputPort<string>($"{DefaultDialogueLineOptionName}").WithDisplayName("Default Dialogue Line").Build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.AddInputPort<bool>($"{LoopThroughDefaultLinesOptionName}").WithDisplayName("Loop Through Default Lines?").Build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class WaitOnPuzzleStep : DialogueNode
|
||||||
|
{
|
||||||
|
const string RequiredPuzzleStep = "RequiredPuzzleStep";
|
||||||
|
|
||||||
|
protected override void OnDefinePorts(IPortDefinitionContext context)
|
||||||
|
{
|
||||||
|
context.AddInputPort<PuzzleStepSO>(RequiredPuzzleStep).WithDisplayName("Required Puzzle Step").Build();
|
||||||
|
|
||||||
|
base.OnDefinePorts(context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class WaitOnPickup : DialogueNode
|
||||||
|
{
|
||||||
|
const string RequiredPickupsOptionName = "RequiredPickup";
|
||||||
|
|
||||||
|
protected override void OnDefinePorts(IPortDefinitionContext context)
|
||||||
|
{
|
||||||
|
context.AddInputPort<PickupItemData>(RequiredPickupsOptionName).WithDisplayName("Required Pickup").Build();
|
||||||
|
|
||||||
|
base.OnDefinePorts(context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
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 ForbiddenItemLineTypeOptionName = "ForbiddenItemDialogueLineType";
|
||||||
|
const string ForbiddenItemNoLinesOptionName = "ForbiddenItemNoLines";
|
||||||
|
const string LoopThroughForbiddenItemLinesOptionName = "LoopThroughForbiddenItemLines";
|
||||||
|
const string ForbiddenIteDialogueLineOptionName = "ForbiddenItemDialogueLine";
|
||||||
|
|
||||||
|
protected override void OnDefineOptions(IOptionDefinitionContext context)
|
||||||
|
{
|
||||||
|
base.OnDefineOptions(context);
|
||||||
|
|
||||||
|
// Incorrect
|
||||||
|
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
|
||||||
|
context.AddOption<DialogueType>(ForbiddenItemLineTypeOptionName)
|
||||||
|
.WithDisplayName("Forbidden Item Line Type")
|
||||||
|
.WithDefaultValue(DialogueType.SayOneLine)
|
||||||
|
.Delayed();
|
||||||
|
context.AddOption<int>(ForbiddenItemNoLinesOptionName)
|
||||||
|
.WithDisplayName("Forbidden of Incorrect Item Lines")
|
||||||
|
.WithDefaultValue(1)
|
||||||
|
.Delayed();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnDefinePorts(IPortDefinitionContext context)
|
||||||
|
{
|
||||||
|
context.AddInputPort<PickupItemData>(RequiredSlotOptionName).WithDisplayName("Required Slot").Build();
|
||||||
|
|
||||||
|
base.OnDefinePorts(context);
|
||||||
|
|
||||||
|
// Incorrect
|
||||||
|
var incorrectItemLineTypeOption = GetNodeOptionByName(IncorrectItemLineTypeOptionName);
|
||||||
|
incorrectItemLineTypeOption.TryGetValue<DialogueType>(out var incorrectItemLineType);
|
||||||
|
var incorrectItemLineCountOption = GetNodeOptionByName(IncorrectItemNoLinesOptionName);
|
||||||
|
incorrectItemLineCountOption.TryGetValue<int>(out var incorrectItemLineCount);
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
context.AddInputPort<string>($"{IncorrectIteDialogueLineOptionName}").WithDisplayName("Incorrect Item Dialogue Line").Build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.AddInputPort<bool>($"{LoopThroughIncorrectItemLinesOptionName}").WithDisplayName("Loop Through Incorrect Item Lines?").Build();
|
||||||
|
|
||||||
|
// Forbidden
|
||||||
|
var forbiddenItemLineTypeOption = GetNodeOptionByName(ForbiddenItemLineTypeOptionName);
|
||||||
|
forbiddenItemLineTypeOption.TryGetValue<DialogueType>(out var forbiddenItemLineType);
|
||||||
|
var forbiddenItemLineCountOption = GetNodeOptionByName(ForbiddenItemNoLinesOptionName);
|
||||||
|
forbiddenItemLineCountOption.TryGetValue<int>(out var forbiddenItemLineCount);
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
context.AddInputPort<string>($"{ForbiddenIteDialogueLineOptionName}").WithDisplayName("Forbidden Item Dialogue Line").Build();
|
||||||
|
}
|
||||||
|
|
||||||
|
context.AddInputPort<bool>($"{LoopThroughForbiddenItemLinesOptionName}").WithDisplayName("Loop Through Forbidden Item Lines?").Build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
3
Assets/Editor/Dialogue/DialogueNodes.cs.meta
Normal file
3
Assets/Editor/Dialogue/DialogueNodes.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a8b3213c46b447a9adc5627a273f2b2d
|
||||||
|
timeCreated: 1758870466
|
||||||
@@ -52,6 +52,8 @@ SpriteRenderer:
|
|||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
m_SmallMeshCulling: 1
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
@@ -73,6 +75,7 @@ SpriteRenderer:
|
|||||||
m_AutoUVMaxDistance: 0.5
|
m_AutoUVMaxDistance: 0.5
|
||||||
m_AutoUVMaxAngle: 89
|
m_AutoUVMaxAngle: 89
|
||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 1
|
m_SortingOrder: 1
|
||||||
@@ -147,6 +150,8 @@ SpriteRenderer:
|
|||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
m_SmallMeshCulling: 1
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
@@ -168,6 +173,7 @@ SpriteRenderer:
|
|||||||
m_AutoUVMaxDistance: 0.5
|
m_AutoUVMaxDistance: 0.5
|
||||||
m_AutoUVMaxAngle: 89
|
m_AutoUVMaxAngle: 89
|
||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 0
|
m_SortingOrder: 0
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ SpriteRenderer:
|
|||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
m_SmallMeshCulling: 1
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
@@ -73,6 +75,7 @@ SpriteRenderer:
|
|||||||
m_AutoUVMaxDistance: 0.5
|
m_AutoUVMaxDistance: 0.5
|
||||||
m_AutoUVMaxAngle: 89
|
m_AutoUVMaxAngle: 89
|
||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 1
|
m_SortingOrder: 1
|
||||||
@@ -139,6 +142,8 @@ SpriteRenderer:
|
|||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
m_SmallMeshCulling: 1
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
@@ -160,6 +165,7 @@ SpriteRenderer:
|
|||||||
m_AutoUVMaxDistance: 0.5
|
m_AutoUVMaxDistance: 0.5
|
||||||
m_AutoUVMaxAngle: 89
|
m_AutoUVMaxAngle: 89
|
||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 1
|
m_SortingOrder: 1
|
||||||
@@ -234,6 +240,8 @@ SpriteRenderer:
|
|||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
m_SmallMeshCulling: 1
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
@@ -255,6 +263,7 @@ SpriteRenderer:
|
|||||||
m_AutoUVMaxDistance: 0.5
|
m_AutoUVMaxDistance: 0.5
|
||||||
m_AutoUVMaxAngle: 89
|
m_AutoUVMaxAngle: 89
|
||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 0
|
m_SortingOrder: 0
|
||||||
|
|||||||
@@ -135,6 +135,8 @@ SpriteRenderer:
|
|||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
m_SmallMeshCulling: 1
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
@@ -156,6 +158,7 @@ SpriteRenderer:
|
|||||||
m_AutoUVMaxDistance: 0.5
|
m_AutoUVMaxDistance: 0.5
|
||||||
m_AutoUVMaxAngle: 89
|
m_AutoUVMaxAngle: 89
|
||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 1
|
m_SortingOrder: 1
|
||||||
@@ -232,6 +235,8 @@ SpriteRenderer:
|
|||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
m_SmallMeshCulling: 1
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
@@ -253,6 +258,7 @@ SpriteRenderer:
|
|||||||
m_AutoUVMaxDistance: 0.5
|
m_AutoUVMaxDistance: 0.5
|
||||||
m_AutoUVMaxAngle: 89
|
m_AutoUVMaxAngle: 89
|
||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 0
|
m_SortingOrder: 0
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ SpriteRenderer:
|
|||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
m_SmallMeshCulling: 1
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
@@ -77,6 +79,7 @@ SpriteRenderer:
|
|||||||
m_AutoUVMaxDistance: 0.5
|
m_AutoUVMaxDistance: 0.5
|
||||||
m_AutoUVMaxAngle: 89
|
m_AutoUVMaxAngle: 89
|
||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 0
|
m_SortingOrder: 0
|
||||||
@@ -246,6 +249,8 @@ SpriteRenderer:
|
|||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
m_SmallMeshCulling: 1
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
@@ -267,6 +272,7 @@ SpriteRenderer:
|
|||||||
m_AutoUVMaxDistance: 0.5
|
m_AutoUVMaxDistance: 0.5
|
||||||
m_AutoUVMaxAngle: 89
|
m_AutoUVMaxAngle: 89
|
||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 0
|
m_SortingOrder: 0
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ SpriteRenderer:
|
|||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
m_SmallMeshCulling: 1
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
@@ -76,6 +78,7 @@ SpriteRenderer:
|
|||||||
m_AutoUVMaxDistance: 0.5
|
m_AutoUVMaxDistance: 0.5
|
||||||
m_AutoUVMaxAngle: 89
|
m_AutoUVMaxAngle: 89
|
||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 1
|
m_SortingOrder: 1
|
||||||
|
|||||||
46
Assets/Prefabs/Managers/ItemManager.prefab
Normal file
46
Assets/Prefabs/Managers/ItemManager.prefab
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!1 &6399527186463168339
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 7768516537241418043}
|
||||||
|
- component: {fileID: 4607144289768175859}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: ItemManager
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &7768516537241418043
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 6399527186463168339}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: -2.64965, y: 3.24335, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &4607144289768175859
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 6399527186463168339}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: a78fe78378e6426da43710f6d0ae84ba, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: AppleHillsScripts::Core.ItemManager
|
||||||
7
Assets/Prefabs/Managers/ItemManager.prefab.meta
Normal file
7
Assets/Prefabs/Managers/ItemManager.prefab.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ac41583865245bc4bb3de6c15929b9fc
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -309,7 +309,7 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: -8109988653212156562, guid: 77ab3d770c92d5344b36eee3293a0f94, type: 3}
|
objectReference: {fileID: -8109988653212156562, guid: 77ab3d770c92d5344b36eee3293a0f94, type: 3}
|
||||||
- target: {fileID: 6350287859698694726, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
|
- target: {fileID: 6350287859698694726, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
|
||||||
propertyPath: m_Name
|
propertyPath: m_Name
|
||||||
value: TestAss
|
value: TestAss3
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
m_RemovedComponents: []
|
m_RemovedComponents: []
|
||||||
m_RemovedGameObjects: []
|
m_RemovedGameObjects: []
|
||||||
@@ -368,6 +368,8 @@ SpriteRenderer:
|
|||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
m_SmallMeshCulling: 1
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
@@ -389,6 +391,7 @@ SpriteRenderer:
|
|||||||
m_AutoUVMaxDistance: 0.5
|
m_AutoUVMaxDistance: 0.5
|
||||||
m_AutoUVMaxAngle: 89
|
m_AutoUVMaxAngle: 89
|
||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 0
|
m_SortingOrder: 0
|
||||||
@@ -995,7 +998,7 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 6350287859698694726, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
|
- target: {fileID: 6350287859698694726, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3}
|
||||||
propertyPath: m_Name
|
propertyPath: m_Name
|
||||||
value: TestAss
|
value: TestAss2
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
m_RemovedComponents: []
|
m_RemovedComponents: []
|
||||||
m_RemovedGameObjects: []
|
m_RemovedGameObjects: []
|
||||||
@@ -1228,6 +1231,8 @@ SpriteRenderer:
|
|||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
m_SmallMeshCulling: 1
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
@@ -1249,6 +1254,7 @@ SpriteRenderer:
|
|||||||
m_AutoUVMaxDistance: 0.5
|
m_AutoUVMaxDistance: 0.5
|
||||||
m_AutoUVMaxAngle: 89
|
m_AutoUVMaxAngle: 89
|
||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: -1
|
m_SortingOrder: -1
|
||||||
@@ -1826,7 +1832,6 @@ MonoBehaviour:
|
|||||||
m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
|
m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
|
||||||
m_RequiresDepthTexture: 0
|
m_RequiresDepthTexture: 0
|
||||||
m_RequiresColorTexture: 0
|
m_RequiresColorTexture: 0
|
||||||
m_Version: 2
|
|
||||||
m_TaaSettings:
|
m_TaaSettings:
|
||||||
m_Quality: 3
|
m_Quality: 3
|
||||||
m_FrameInfluence: 0.1
|
m_FrameInfluence: 0.1
|
||||||
@@ -1834,6 +1839,7 @@ MonoBehaviour:
|
|||||||
m_MipBias: 0
|
m_MipBias: 0
|
||||||
m_VarianceClampScale: 0.9
|
m_VarianceClampScale: 0.9
|
||||||
m_ContrastAdaptiveSharpening: 0
|
m_ContrastAdaptiveSharpening: 0
|
||||||
|
m_Version: 2
|
||||||
--- !u!1 &1880929593
|
--- !u!1 &1880929593
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
|||||||
@@ -172,6 +172,8 @@ SpriteRenderer:
|
|||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
m_SmallMeshCulling: 1
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
@@ -193,6 +195,7 @@ SpriteRenderer:
|
|||||||
m_AutoUVMaxDistance: 0.5
|
m_AutoUVMaxDistance: 0.5
|
||||||
m_AutoUVMaxAngle: 89
|
m_AutoUVMaxAngle: 89
|
||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 0
|
m_SortingOrder: 0
|
||||||
@@ -253,6 +256,51 @@ BoxCollider2D:
|
|||||||
m_AutoTiling: 0
|
m_AutoTiling: 0
|
||||||
m_Size: {x: 1, y: 1}
|
m_Size: {x: 1, y: 1}
|
||||||
m_EdgeRadius: 0
|
m_EdgeRadius: 0
|
||||||
|
--- !u!1 &1334266842
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 1334266844}
|
||||||
|
- component: {fileID: 1334266843}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: DialogueTest
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!114 &1334266843
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1334266842}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 749c3dece1c14b82845c175203a2e7dc, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: AppleHillsScripts::Dialogue.DialogueComponent
|
||||||
|
runtimeGraph: {fileID: 3965311268370046156, guid: 9050f99a225035b40b415df272d2b341, type: 3}
|
||||||
|
--- !u!4 &1334266844
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1334266842}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: -3.64555, y: 2.05444, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!1 &1507068790
|
--- !u!1 &1507068790
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@@ -264,6 +312,7 @@ GameObject:
|
|||||||
- component: {fileID: 1507068793}
|
- component: {fileID: 1507068793}
|
||||||
- component: {fileID: 1507068792}
|
- component: {fileID: 1507068792}
|
||||||
- component: {fileID: 1507068791}
|
- component: {fileID: 1507068791}
|
||||||
|
- component: {fileID: 1507068794}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: Main Camera
|
m_Name: Main Camera
|
||||||
m_TagString: MainCamera
|
m_TagString: MainCamera
|
||||||
@@ -345,6 +394,50 @@ Transform:
|
|||||||
m_Children: []
|
m_Children: []
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &1507068794
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1507068790}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.UniversalAdditionalCameraData
|
||||||
|
m_RenderShadows: 1
|
||||||
|
m_RequiresDepthTextureOption: 2
|
||||||
|
m_RequiresOpaqueTextureOption: 2
|
||||||
|
m_CameraType: 0
|
||||||
|
m_Cameras: []
|
||||||
|
m_RendererIndex: -1
|
||||||
|
m_VolumeLayerMask:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 1
|
||||||
|
m_VolumeTrigger: {fileID: 0}
|
||||||
|
m_VolumeFrameworkUpdateModeOption: 2
|
||||||
|
m_RenderPostProcessing: 0
|
||||||
|
m_Antialiasing: 0
|
||||||
|
m_AntialiasingQuality: 2
|
||||||
|
m_StopNaN: 0
|
||||||
|
m_Dithering: 0
|
||||||
|
m_ClearDepth: 1
|
||||||
|
m_AllowXRRendering: 1
|
||||||
|
m_AllowHDROutput: 1
|
||||||
|
m_UseScreenCoordOverride: 0
|
||||||
|
m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_RequiresDepthTexture: 0
|
||||||
|
m_RequiresColorTexture: 0
|
||||||
|
m_TaaSettings:
|
||||||
|
m_Quality: 3
|
||||||
|
m_FrameInfluence: 0.1
|
||||||
|
m_JitterScale: 1
|
||||||
|
m_MipBias: 0
|
||||||
|
m_VarianceClampScale: 0.9
|
||||||
|
m_ContrastAdaptiveSharpening: 0
|
||||||
|
m_Version: 2
|
||||||
--- !u!1 &1851499346
|
--- !u!1 &1851499346
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@@ -429,6 +522,8 @@ SpriteRenderer:
|
|||||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||||
m_RayTracingAccelStructBuildFlags: 1
|
m_RayTracingAccelStructBuildFlags: 1
|
||||||
m_SmallMeshCulling: 1
|
m_SmallMeshCulling: 1
|
||||||
|
m_ForceMeshLod: -1
|
||||||
|
m_MeshLodSelectionBias: 0
|
||||||
m_RenderingLayerMask: 1
|
m_RenderingLayerMask: 1
|
||||||
m_RendererPriority: 0
|
m_RendererPriority: 0
|
||||||
m_Materials:
|
m_Materials:
|
||||||
@@ -450,6 +545,7 @@ SpriteRenderer:
|
|||||||
m_AutoUVMaxDistance: 0.5
|
m_AutoUVMaxDistance: 0.5
|
||||||
m_AutoUVMaxAngle: 89
|
m_AutoUVMaxAngle: 89
|
||||||
m_LightmapParameters: {fileID: 0}
|
m_LightmapParameters: {fileID: 0}
|
||||||
|
m_GlobalIlluminationMeshLod: 0
|
||||||
m_SortingLayerID: 0
|
m_SortingLayerID: 0
|
||||||
m_SortingLayer: 0
|
m_SortingLayer: 0
|
||||||
m_SortingOrder: 0
|
m_SortingOrder: 0
|
||||||
@@ -518,3 +614,4 @@ SceneRoots:
|
|||||||
- {fileID: 1851499349}
|
- {fileID: 1851499349}
|
||||||
- {fileID: 2029728268}
|
- {fileID: 2029728268}
|
||||||
- {fileID: 465048834}
|
- {fileID: 465048834}
|
||||||
|
- {fileID: 1334266844}
|
||||||
|
|||||||
181
Assets/Scripts/Core/ItemManager.cs
Normal file
181
Assets/Scripts/Core/ItemManager.cs
Normal file
@@ -0,0 +1,181 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
using Interactions;
|
||||||
|
|
||||||
|
namespace Core
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Central registry for pickups and item slots.
|
||||||
|
/// Mirrors the singleton pattern used by PuzzleManager.
|
||||||
|
/// </summary>
|
||||||
|
public class ItemManager : MonoBehaviour
|
||||||
|
{
|
||||||
|
private static ItemManager _instance;
|
||||||
|
private static bool _isQuitting;
|
||||||
|
|
||||||
|
public static ItemManager Instance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (_instance == null && Application.isPlaying && !_isQuitting)
|
||||||
|
{
|
||||||
|
_instance = FindAnyObjectByType<ItemManager>();
|
||||||
|
if (_instance == null)
|
||||||
|
{
|
||||||
|
var go = new GameObject("ItemManager");
|
||||||
|
_instance = go.AddComponent<ItemManager>();
|
||||||
|
// DontDestroyOnLoad(go);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly HashSet<Pickup> _pickups = new HashSet<Pickup>();
|
||||||
|
private readonly HashSet<ItemSlot> _itemSlots = new HashSet<ItemSlot>();
|
||||||
|
|
||||||
|
// Central events forwarded from registered pickups/slots
|
||||||
|
// Broadcasts when any registered pickup was picked up (passes the picked item data)
|
||||||
|
public event Action<PickupItemData> OnItemPickedUp;
|
||||||
|
|
||||||
|
// Broadcasts when any registered ItemSlot reports a correct item slotted
|
||||||
|
// Args: slot's itemData (the slot definition), then the slotted item data
|
||||||
|
public event Action<PickupItemData, PickupItemData> OnCorrectItemSlotted;
|
||||||
|
|
||||||
|
void Awake()
|
||||||
|
{
|
||||||
|
_instance = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
// Subscribe to scene load completed so we can clear registrations when scenes change
|
||||||
|
// Access Instance directly to ensure the service is initialized and we get the event hookup.
|
||||||
|
SceneManagerService.Instance.SceneLoadCompleted += OnSceneLoadCompleted;
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnDestroy()
|
||||||
|
{
|
||||||
|
// Unsubscribe from SceneManagerService
|
||||||
|
if (SceneManagerService.Instance != null)
|
||||||
|
SceneManagerService.Instance.SceneLoadCompleted -= OnSceneLoadCompleted;
|
||||||
|
|
||||||
|
// Ensure we clean up any subscriptions from registered items when the manager is destroyed
|
||||||
|
ClearAllRegistrations();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnApplicationQuit()
|
||||||
|
{
|
||||||
|
_isQuitting = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnSceneLoadCompleted(string sceneName)
|
||||||
|
{
|
||||||
|
// Clear all registrations when a new scene is loaded, so no stale references persist
|
||||||
|
ClearAllRegistrations();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Unsubscribe all pickup/slot event handlers and clear registries and manager events.
|
||||||
|
/// </summary>
|
||||||
|
private void ClearAllRegistrations()
|
||||||
|
{
|
||||||
|
// Unsubscribe pickup handlers
|
||||||
|
var pickupsCopy = new List<Pickup>(_pickups);
|
||||||
|
foreach (var p in pickupsCopy)
|
||||||
|
{
|
||||||
|
if (p != null)
|
||||||
|
p.OnItemPickedUp -= Pickup_OnItemPickedUp;
|
||||||
|
}
|
||||||
|
_pickups.Clear();
|
||||||
|
|
||||||
|
// Unsubscribe slot handlers
|
||||||
|
var slotsCopy = new List<ItemSlot>(_itemSlots);
|
||||||
|
foreach (var s in slotsCopy)
|
||||||
|
{
|
||||||
|
if (s != null)
|
||||||
|
s.OnCorrectItemSlotted -= ItemSlot_OnCorrectItemSlotted;
|
||||||
|
}
|
||||||
|
_itemSlots.Clear();
|
||||||
|
|
||||||
|
// Clear manager-level event subscribers
|
||||||
|
OnItemPickedUp = null;
|
||||||
|
OnCorrectItemSlotted = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RegisterPickup(Pickup pickup)
|
||||||
|
{
|
||||||
|
if (pickup == null) return;
|
||||||
|
// only subscribe if newly added to avoid duplicate subscriptions
|
||||||
|
if (_pickups.Add(pickup))
|
||||||
|
{
|
||||||
|
pickup.OnItemPickedUp += Pickup_OnItemPickedUp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UnregisterPickup(Pickup pickup)
|
||||||
|
{
|
||||||
|
if (pickup == null) return;
|
||||||
|
if (_pickups.Remove(pickup))
|
||||||
|
{
|
||||||
|
pickup.OnItemPickedUp -= Pickup_OnItemPickedUp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RegisterItemSlot(ItemSlot slot)
|
||||||
|
{
|
||||||
|
if (slot == null) return;
|
||||||
|
if (_itemSlots.Add(slot))
|
||||||
|
{
|
||||||
|
slot.OnCorrectItemSlotted += ItemSlot_OnCorrectItemSlotted;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UnregisterItemSlot(ItemSlot slot)
|
||||||
|
{
|
||||||
|
if (slot == null) return;
|
||||||
|
if (_itemSlots.Remove(slot))
|
||||||
|
{
|
||||||
|
slot.OnCorrectItemSlotted -= ItemSlot_OnCorrectItemSlotted;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handler that forwards pickup events
|
||||||
|
private void Pickup_OnItemPickedUp(PickupItemData data)
|
||||||
|
{
|
||||||
|
OnItemPickedUp?.Invoke(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handler that forwards correct-slot events
|
||||||
|
private void ItemSlot_OnCorrectItemSlotted(PickupItemData slotData, PickupItemData slottedItem)
|
||||||
|
{
|
||||||
|
OnCorrectItemSlotted?.Invoke(slotData, slottedItem);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the current slot state for the given item data by searching registered slots.
|
||||||
|
/// If the item is currently slotted in a slot, returns that slot's state; otherwise returns ItemSlotState.None.
|
||||||
|
/// </summary>
|
||||||
|
public ItemSlotState GetSlotStatusForItem(PickupItemData itemData)
|
||||||
|
{
|
||||||
|
if (itemData == null) return ItemSlotState.None;
|
||||||
|
|
||||||
|
foreach (var slot in _itemSlots)
|
||||||
|
{
|
||||||
|
var slottedObj = slot.GetSlottedObject();
|
||||||
|
if (slottedObj == null) continue;
|
||||||
|
var pickup = slottedObj.GetComponent<Pickup>();
|
||||||
|
if (pickup == null) continue;
|
||||||
|
if (pickup.itemData == itemData)
|
||||||
|
{
|
||||||
|
return slot.CurrentSlottedState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ItemSlotState.None;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<Pickup> Pickups => _pickups;
|
||||||
|
public IEnumerable<ItemSlot> ItemSlots => _itemSlots;
|
||||||
|
}
|
||||||
|
}
|
||||||
3
Assets/Scripts/Core/ItemManager.cs.meta
Normal file
3
Assets/Scripts/Core/ItemManager.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a78fe78378e6426da43710f6d0ae84ba
|
||||||
|
timeCreated: 1758888493
|
||||||
3
Assets/Scripts/Dialogue.meta
Normal file
3
Assets/Scripts/Dialogue.meta
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e592597a12a7498dbb5336395d7db00c
|
||||||
|
timeCreated: 1758871403
|
||||||
323
Assets/Scripts/Dialogue/DialogueComponent.cs
Normal file
323
Assets/Scripts/Dialogue/DialogueComponent.cs
Normal file
@@ -0,0 +1,323 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Core;
|
||||||
|
using Interactions;
|
||||||
|
using UnityEngine;
|
||||||
|
using PuzzleS;
|
||||||
|
|
||||||
|
namespace Dialogue
|
||||||
|
{
|
||||||
|
[AddComponentMenu("Apple Hills/Dialogue/Dialogue Component")]
|
||||||
|
public class DialogueComponent : MonoBehaviour
|
||||||
|
{
|
||||||
|
[SerializeField] private RuntimeDialogueGraph dialogueGraph;
|
||||||
|
|
||||||
|
private RuntimeDialogueNode currentNode;
|
||||||
|
private int currentLineIndex;
|
||||||
|
private bool initialized = false;
|
||||||
|
|
||||||
|
// Properties
|
||||||
|
public bool IsActive { get; private set; }
|
||||||
|
public bool IsCompleted { get; private set; }
|
||||||
|
public string CurrentSpeakerName => dialogueGraph?.speakerName;
|
||||||
|
|
||||||
|
// Event for UI updates if needed
|
||||||
|
public event Action<string> OnDialogueChanged;
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
// Register for global events
|
||||||
|
if (PuzzleManager.Instance != null)
|
||||||
|
PuzzleManager.Instance.OnStepCompleted += OnAnyPuzzleStepCompleted;
|
||||||
|
|
||||||
|
if (ItemManager.Instance != null)
|
||||||
|
{
|
||||||
|
ItemManager.Instance.OnItemPickedUp += OnAnyItemPickedUp;
|
||||||
|
ItemManager.Instance.OnCorrectItemSlotted += OnAnyItemSlotted;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Auto-start the dialogue
|
||||||
|
StartDialogue();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnDestroy()
|
||||||
|
{
|
||||||
|
// Unregister from events
|
||||||
|
if (PuzzleManager.Instance != null)
|
||||||
|
PuzzleManager.Instance.OnStepCompleted -= OnAnyPuzzleStepCompleted;
|
||||||
|
|
||||||
|
if (ItemManager.Instance != null)
|
||||||
|
{
|
||||||
|
ItemManager.Instance.OnItemPickedUp -= OnAnyItemPickedUp;
|
||||||
|
ItemManager.Instance.OnCorrectItemSlotted -= OnAnyItemSlotted;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Start the dialogue from the beginning
|
||||||
|
/// </summary>
|
||||||
|
public void StartDialogue()
|
||||||
|
{
|
||||||
|
if (dialogueGraph == null)
|
||||||
|
{
|
||||||
|
Debug.LogError("DialogueComponent: No dialogue graph assigned!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reset state
|
||||||
|
IsActive = true;
|
||||||
|
IsCompleted = false;
|
||||||
|
currentLineIndex = 0;
|
||||||
|
initialized = true;
|
||||||
|
|
||||||
|
// Set to entry node
|
||||||
|
currentNode = dialogueGraph.GetNodeByID(dialogueGraph.entryNodeID);
|
||||||
|
|
||||||
|
// Process the node
|
||||||
|
ProcessCurrentNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get the current dialogue line and advance to the next line or node if appropriate
|
||||||
|
/// Each call represents one interaction with the NPC
|
||||||
|
/// </summary>
|
||||||
|
public string GetCurrentDialogueLine()
|
||||||
|
{
|
||||||
|
// Initialize if needed
|
||||||
|
if (!initialized)
|
||||||
|
{
|
||||||
|
StartDialogue();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!IsActive || IsCompleted || currentNode == null || currentNode.dialogueLines.Count == 0)
|
||||||
|
return string.Empty;
|
||||||
|
|
||||||
|
// Get current line
|
||||||
|
string currentLine = string.Empty;
|
||||||
|
if (currentLineIndex >= 0 && currentLineIndex < currentNode.dialogueLines.Count)
|
||||||
|
{
|
||||||
|
currentLine = currentNode.dialogueLines[currentLineIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Advance dialogue state for next interaction
|
||||||
|
AdvanceDialogueState();
|
||||||
|
|
||||||
|
// Return the current line
|
||||||
|
return currentLine;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Advance dialogue state for the next interaction
|
||||||
|
/// </summary>
|
||||||
|
private void AdvanceDialogueState()
|
||||||
|
{
|
||||||
|
if (!IsActive || IsCompleted || currentNode == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// If we're on a conditional node, we can't advance past it until condition is met
|
||||||
|
if (IsWaitingForCondition())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, move to the next node
|
||||||
|
MoveToNextNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MoveToNextNode()
|
||||||
|
{
|
||||||
|
// If there's no next node, complete the dialogue
|
||||||
|
if (string.IsNullOrEmpty(currentNode.nextNodeID))
|
||||||
|
{
|
||||||
|
IsActive = false;
|
||||||
|
IsCompleted = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move to the next node
|
||||||
|
currentNode = dialogueGraph.GetNodeByID(currentNode.nextNodeID);
|
||||||
|
currentLineIndex = 0;
|
||||||
|
|
||||||
|
// Process the new node
|
||||||
|
ProcessCurrentNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ProcessCurrentNode()
|
||||||
|
{
|
||||||
|
if (currentNode == null)
|
||||||
|
{
|
||||||
|
Debug.LogError("DialogueComponent: Current node is null!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle different node types
|
||||||
|
switch (currentNode.nodeType)
|
||||||
|
{
|
||||||
|
case RuntimeDialogueNodeType.Dialogue:
|
||||||
|
// Regular dialogue node, nothing special to do
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RuntimeDialogueNodeType.WaitOnPuzzleStep:
|
||||||
|
// Check if the puzzle step is already completed
|
||||||
|
if (IsPuzzleStepComplete(currentNode.puzzleStepID))
|
||||||
|
{
|
||||||
|
// If it's already complete, move past this node automatically
|
||||||
|
MoveToNextNode();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RuntimeDialogueNodeType.WaitOnPickup:
|
||||||
|
// Check if the item is already picked up
|
||||||
|
if (IsItemPickedUp(currentNode.pickupItemID))
|
||||||
|
{
|
||||||
|
// If it's already picked up, move past this node automatically
|
||||||
|
MoveToNextNode();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RuntimeDialogueNodeType.WaitOnSlot:
|
||||||
|
// Check if the item is already slotted
|
||||||
|
if (IsItemSlotted(currentNode.slotItemID))
|
||||||
|
{
|
||||||
|
// If it's already slotted, move past this node automatically
|
||||||
|
MoveToNextNode();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RuntimeDialogueNodeType.End:
|
||||||
|
// End node, complete the dialogue
|
||||||
|
IsActive = false;
|
||||||
|
IsCompleted = true;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Debug.LogError($"DialogueComponent: Unknown node type {currentNode.nodeType}");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Global event handlers
|
||||||
|
private void OnAnyPuzzleStepCompleted(PuzzleStepSO step)
|
||||||
|
{
|
||||||
|
// Only react if we're active and waiting on a puzzle step
|
||||||
|
if (!IsActive || IsCompleted || currentNode == null ||
|
||||||
|
currentNode.nodeType != RuntimeDialogueNodeType.WaitOnPuzzleStep)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Check if this is the step we're waiting for
|
||||||
|
if (step.stepId == currentNode.puzzleStepID)
|
||||||
|
{
|
||||||
|
// Move to next node automatically when condition is met
|
||||||
|
MoveToNextNode();
|
||||||
|
OnDialogueChanged?.Invoke(GetCurrentDialogueLine());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnAnyItemPickedUp(PickupItemData item)
|
||||||
|
{
|
||||||
|
// Only react if we're active and waiting on an item pickup
|
||||||
|
if (!IsActive || IsCompleted || currentNode == null ||
|
||||||
|
currentNode.nodeType != RuntimeDialogueNodeType.WaitOnPickup)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Check if this is the item we're waiting for
|
||||||
|
if (item.itemId == currentNode.pickupItemID)
|
||||||
|
{
|
||||||
|
// Move to next node automatically when condition is met
|
||||||
|
MoveToNextNode();
|
||||||
|
OnDialogueChanged?.Invoke(GetCurrentDialogueLine());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnAnyItemSlotted(PickupItemData slotDefinition, PickupItemData slottedItem)
|
||||||
|
{
|
||||||
|
// Only react if we're active and waiting on a slot
|
||||||
|
if (!IsActive || IsCompleted || currentNode == null ||
|
||||||
|
currentNode.nodeType != RuntimeDialogueNodeType.WaitOnSlot)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Check if this is the slot we're waiting for
|
||||||
|
if (slotDefinition.itemId == currentNode.slotItemID)
|
||||||
|
{
|
||||||
|
// Move to next node automatically when condition is met
|
||||||
|
MoveToNextNode();
|
||||||
|
OnDialogueChanged?.Invoke(GetCurrentDialogueLine());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper methods
|
||||||
|
private bool IsWaitingForCondition()
|
||||||
|
{
|
||||||
|
if (currentNode == null) return false;
|
||||||
|
|
||||||
|
switch (currentNode.nodeType)
|
||||||
|
{
|
||||||
|
case RuntimeDialogueNodeType.WaitOnPuzzleStep:
|
||||||
|
return !IsPuzzleStepComplete(currentNode.puzzleStepID);
|
||||||
|
case RuntimeDialogueNodeType.WaitOnPickup:
|
||||||
|
return !IsItemPickedUp(currentNode.pickupItemID);
|
||||||
|
case RuntimeDialogueNodeType.WaitOnSlot:
|
||||||
|
return !IsItemSlotted(currentNode.slotItemID);
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsPuzzleStepComplete(string stepID)
|
||||||
|
{
|
||||||
|
return PuzzleManager.Instance != null &&
|
||||||
|
PuzzleManager.Instance.IsPuzzleStepCompleted(stepID);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsItemPickedUp(string itemID)
|
||||||
|
{
|
||||||
|
if (ItemManager.Instance == null) return false;
|
||||||
|
|
||||||
|
// Check all pickups for the given ID
|
||||||
|
foreach (var pickup in ItemManager.Instance.Pickups)
|
||||||
|
{
|
||||||
|
if (pickup.isPickedUp && pickup.itemData != null &&
|
||||||
|
pickup.itemData.itemId == itemID)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsItemSlotted(string slotID)
|
||||||
|
{
|
||||||
|
if (ItemManager.Instance == null) return false;
|
||||||
|
|
||||||
|
// Check if any slot with this ID has the correct item
|
||||||
|
foreach (var slot in ItemManager.Instance.ItemSlots)
|
||||||
|
{
|
||||||
|
if (slot.itemData != null && slot.itemData.itemId == slotID &&
|
||||||
|
slot.CurrentSlottedState == ItemSlotState.Correct)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Editor functionality
|
||||||
|
public void SetDialogueGraph(RuntimeDialogueGraph graph)
|
||||||
|
{
|
||||||
|
dialogueGraph = graph;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
3
Assets/Scripts/Dialogue/DialogueComponent.cs.meta
Normal file
3
Assets/Scripts/Dialogue/DialogueComponent.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 25bbad45f1fa4183b30ad76c62256fd6
|
||||||
|
timeCreated: 1758891211
|
||||||
53
Assets/Scripts/Dialogue/RuntimeDialogueGraph.cs
Normal file
53
Assets/Scripts/Dialogue/RuntimeDialogueGraph.cs
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace Dialogue
|
||||||
|
{
|
||||||
|
[Serializable]
|
||||||
|
public enum RuntimeDialogueNodeType
|
||||||
|
{
|
||||||
|
Dialogue,
|
||||||
|
WaitOnPuzzleStep,
|
||||||
|
WaitOnPickup,
|
||||||
|
WaitOnSlot,
|
||||||
|
End
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class RuntimeDialogueGraph : ScriptableObject
|
||||||
|
{
|
||||||
|
public string entryNodeID;
|
||||||
|
public string speakerName;
|
||||||
|
public List<RuntimeDialogueNode> allNodes = new List<RuntimeDialogueNode>();
|
||||||
|
|
||||||
|
// Helper method to find a node by ID
|
||||||
|
public RuntimeDialogueNode GetNodeByID(string id)
|
||||||
|
{
|
||||||
|
return allNodes.Find(n => n.nodeID == id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class RuntimeDialogueNode
|
||||||
|
{
|
||||||
|
public string nodeID;
|
||||||
|
public RuntimeDialogueNodeType nodeType;
|
||||||
|
public string nextNodeID;
|
||||||
|
|
||||||
|
// Basic dialogue
|
||||||
|
public List<string> dialogueLines = new List<string>();
|
||||||
|
public bool loopThroughLines;
|
||||||
|
|
||||||
|
// Conditional nodes
|
||||||
|
public string puzzleStepID; // For WaitOnPuzzleStep
|
||||||
|
public string pickupItemID; // For WaitOnPickup
|
||||||
|
public string slotItemID; // For WaitOnSlot
|
||||||
|
|
||||||
|
// For WaitOnSlot - different responses
|
||||||
|
public List<string> incorrectItemLines = new List<string>();
|
||||||
|
public bool loopThroughIncorrectLines;
|
||||||
|
public List<string> forbiddenItemLines = new List<string>();
|
||||||
|
public bool loopThroughForbiddenLines;
|
||||||
|
}
|
||||||
|
}
|
||||||
3
Assets/Scripts/Dialogue/RuntimeDialogueGraph.cs.meta
Normal file
3
Assets/Scripts/Dialogue/RuntimeDialogueGraph.cs.meta
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3c3be3596532450a923c31dfe0ed4aa9
|
||||||
|
timeCreated: 1758871423
|
||||||
@@ -1,18 +1,39 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Events;
|
using UnityEngine.Events;
|
||||||
|
using System; // for Action<T>
|
||||||
|
using Core; // register with ItemManager
|
||||||
|
|
||||||
namespace Interactions
|
namespace Interactions
|
||||||
{
|
{
|
||||||
|
// New enum describing possible states for the slotted item
|
||||||
|
public enum ItemSlotState
|
||||||
|
{
|
||||||
|
None,
|
||||||
|
Correct,
|
||||||
|
Incorrect,
|
||||||
|
Forbidden
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interaction requirement that allows slotting, swapping, or picking up items in a slot.
|
/// Interaction requirement that allows slotting, swapping, or picking up items in a slot.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[RequireComponent(typeof(Interactable))]
|
[RequireComponent(typeof(Interactable))]
|
||||||
public class ItemSlot : Pickup
|
public class ItemSlot : Pickup
|
||||||
{
|
{
|
||||||
|
// Tracks the current state of the slotted item
|
||||||
|
private ItemSlotState _currentState = ItemSlotState.None;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Read-only access to the current slotted item state.
|
||||||
|
/// </summary>
|
||||||
|
public ItemSlotState CurrentSlottedState => _currentState;
|
||||||
|
|
||||||
public UnityEvent onItemSlotted;
|
public UnityEvent onItemSlotted;
|
||||||
public UnityEvent onItemSlotRemoved;
|
public UnityEvent onItemSlotRemoved;
|
||||||
public UnityEvent onCorrectItemSlotted;
|
public UnityEvent onCorrectItemSlotted;
|
||||||
|
// Native C# event alternative to the UnityEvent for code-only subscribers
|
||||||
|
public event Action<PickupItemData, PickupItemData> OnCorrectItemSlotted;
|
||||||
public UnityEvent onIncorrectItemSlotted;
|
public UnityEvent onIncorrectItemSlotted;
|
||||||
public UnityEvent onForbiddenItemSlotted;
|
public UnityEvent onForbiddenItemSlotted;
|
||||||
private PickupItemData _currentlySlottedItemData;
|
private PickupItemData _currentlySlottedItemData;
|
||||||
@@ -48,6 +69,7 @@ namespace Interactions
|
|||||||
{
|
{
|
||||||
DebugUIMessage.Show("Can't place that here.", Color.red);
|
DebugUIMessage.Show("Can't place that here.", Color.red);
|
||||||
onForbiddenItemSlotted?.Invoke();
|
onForbiddenItemSlotted?.Invoke();
|
||||||
|
_currentState = ItemSlotState.Forbidden;
|
||||||
Interactable.BroadcastInteractionComplete(false);
|
Interactable.BroadcastInteractionComplete(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -62,6 +84,7 @@ namespace Interactions
|
|||||||
{
|
{
|
||||||
FollowerController.TryPickupItem(_currentlySlottedItemObject, _currentlySlottedItemData, false);
|
FollowerController.TryPickupItem(_currentlySlottedItemObject, _currentlySlottedItemData, false);
|
||||||
onItemSlotRemoved?.Invoke();
|
onItemSlotRemoved?.Invoke();
|
||||||
|
_currentState = ItemSlotState.None;
|
||||||
SlotItem(heldItemObj, heldItemData, _currentlySlottedItemObject == null);
|
SlotItem(heldItemObj, heldItemData, _currentlySlottedItemObject == null);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -109,6 +132,8 @@ namespace Interactions
|
|||||||
{
|
{
|
||||||
_currentlySlottedItemObject = null;
|
_currentlySlottedItemObject = null;
|
||||||
_currentlySlottedItemData = null;
|
_currentlySlottedItemData = null;
|
||||||
|
// Clear state when no item is slotted
|
||||||
|
_currentState = ItemSlotState.None;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -133,6 +158,8 @@ namespace Interactions
|
|||||||
{
|
{
|
||||||
DebugUIMessage.Show("You correctly slotted " + itemToSlotData.itemName + " into: " + itemData.itemName, Color.green);
|
DebugUIMessage.Show("You correctly slotted " + itemToSlotData.itemName + " into: " + itemData.itemName, Color.green);
|
||||||
onCorrectItemSlotted?.Invoke();
|
onCorrectItemSlotted?.Invoke();
|
||||||
|
OnCorrectItemSlotted?.Invoke(itemData, _currentlySlottedItemData);
|
||||||
|
_currentState = ItemSlotState.Correct;
|
||||||
}
|
}
|
||||||
|
|
||||||
Interactable.BroadcastInteractionComplete(true);
|
Interactable.BroadcastInteractionComplete(true);
|
||||||
@@ -143,9 +170,21 @@ namespace Interactions
|
|||||||
{
|
{
|
||||||
DebugUIMessage.Show("I'm not sure this works.", Color.yellow);
|
DebugUIMessage.Show("I'm not sure this works.", Color.yellow);
|
||||||
onIncorrectItemSlotted?.Invoke();
|
onIncorrectItemSlotted?.Invoke();
|
||||||
|
_currentState = ItemSlotState.Incorrect;
|
||||||
}
|
}
|
||||||
Interactable.BroadcastInteractionComplete(false);
|
Interactable.BroadcastInteractionComplete(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Register with ItemManager when enabled
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
ItemManager.Instance?.RegisterItemSlot(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnDestroy()
|
||||||
|
{
|
||||||
|
ItemManager.Instance?.UnregisterItemSlot(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
using Input;
|
using Input;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using System; // added for Action<T>
|
||||||
|
using Core; // register with ItemManager
|
||||||
|
|
||||||
namespace Interactions
|
namespace Interactions
|
||||||
{
|
{
|
||||||
@@ -12,6 +14,12 @@ namespace Interactions
|
|||||||
private PlayerTouchController _playerRef;
|
private PlayerTouchController _playerRef;
|
||||||
protected FollowerController FollowerController;
|
protected FollowerController FollowerController;
|
||||||
|
|
||||||
|
// Track if the item has been picked up
|
||||||
|
public bool isPickedUp { get; private set; }
|
||||||
|
|
||||||
|
// Event: invoked when the item was picked up successfully
|
||||||
|
public event Action<PickupItemData> OnItemPickedUp;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Unity Awake callback. Sets up icon, interactable, and event handlers.
|
/// Unity Awake callback. Sets up icon, interactable, and event handlers.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -30,6 +38,14 @@ namespace Interactions
|
|||||||
ApplyItemData();
|
ApplyItemData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Register with ItemManager on Start
|
||||||
|
/// </summary>
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
ItemManager.Instance?.RegisterPickup(this);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Unity OnDestroy callback. Cleans up event handlers.
|
/// Unity OnDestroy callback. Cleans up event handlers.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -40,6 +56,9 @@ namespace Interactions
|
|||||||
Interactable.interactionStarted.RemoveListener(OnInteractionStarted);
|
Interactable.interactionStarted.RemoveListener(OnInteractionStarted);
|
||||||
Interactable.characterArrived.RemoveListener(OnCharacterArrived);
|
Interactable.characterArrived.RemoveListener(OnCharacterArrived);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Unregister from ItemManager
|
||||||
|
ItemManager.Instance?.UnregisterPickup(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
@@ -89,7 +108,15 @@ namespace Interactions
|
|||||||
}
|
}
|
||||||
|
|
||||||
FollowerController?.TryPickupItem(gameObject, itemData);
|
FollowerController?.TryPickupItem(gameObject, itemData);
|
||||||
Interactable.BroadcastInteractionComplete(combinationResult == FollowerController.CombinationResult.NotApplicable);
|
bool wasPickedUp = (combinationResult == FollowerController.CombinationResult.NotApplicable);
|
||||||
|
Interactable.BroadcastInteractionComplete(wasPickedUp);
|
||||||
|
|
||||||
|
// Update pickup state and invoke event when the item was picked up successfully
|
||||||
|
if (wasPickedUp)
|
||||||
|
{
|
||||||
|
isPickedUp = true;
|
||||||
|
OnItemPickedUp?.Invoke(itemData);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,18 +1,58 @@
|
|||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System;
|
||||||
|
|
||||||
[CreateAssetMenu(fileName = "PickupItemData", menuName = "Game/Pickup Item Data")]
|
[CreateAssetMenu(fileName = "PickupItemData", menuName = "Game/Pickup Item Data")]
|
||||||
public class PickupItemData : ScriptableObject
|
public class PickupItemData : ScriptableObject
|
||||||
{
|
{
|
||||||
|
[SerializeField] private string _itemId;
|
||||||
|
|
||||||
public string itemName;
|
public string itemName;
|
||||||
[TextArea]
|
[TextArea]
|
||||||
public string description;
|
public string description;
|
||||||
public Sprite mapSprite;
|
public Sprite mapSprite;
|
||||||
|
|
||||||
|
// Read-only property for itemId
|
||||||
|
public string itemId => _itemId;
|
||||||
|
|
||||||
|
// Auto-generate ID on creation or validation
|
||||||
|
void OnValidate()
|
||||||
|
{
|
||||||
|
// Only generate if empty
|
||||||
|
if (string.IsNullOrEmpty(_itemId))
|
||||||
|
{
|
||||||
|
_itemId = GenerateItemId();
|
||||||
|
|
||||||
|
#if UNITY_EDITOR
|
||||||
|
// Mark the asset as dirty to ensure the ID is saved
|
||||||
|
UnityEditor.EditorUtility.SetDirty(this);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GenerateItemId()
|
||||||
|
{
|
||||||
|
// Use asset name as the basis for the ID to keep it somewhat readable
|
||||||
|
string baseName = name.Replace(" ", "").ToLowerInvariant();
|
||||||
|
|
||||||
|
// Add a unique suffix based on a GUID
|
||||||
|
string uniqueSuffix = Guid.NewGuid().ToString().Substring(0, 8);
|
||||||
|
|
||||||
|
return $"{baseName}_{uniqueSuffix}";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Method to manually regenerate ID if needed (for editor scripts)
|
||||||
|
public void RegenerateId()
|
||||||
|
{
|
||||||
|
_itemId = GenerateItemId();
|
||||||
|
}
|
||||||
|
|
||||||
public static bool AreEquivalent(PickupItemData a, PickupItemData b)
|
public static bool AreEquivalent(PickupItemData a, PickupItemData b)
|
||||||
{
|
{
|
||||||
if (ReferenceEquals(a, b)) return true;
|
// First compare by itemId if available
|
||||||
if (a is null || b is null) return false;
|
if (!string.IsNullOrEmpty(a.itemId) && !string.IsNullOrEmpty(b.itemId))
|
||||||
|
return a.itemId == b.itemId;
|
||||||
|
|
||||||
// Compare by itemName as a fallback
|
// Compare by itemName as a fallback
|
||||||
return a.itemName == b.itemName;
|
return a.itemName == b.itemName;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ namespace PuzzleS
|
|||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
Debug.Log($"[Puzzles] Step interacted: {stepData?.stepId} on {gameObject.name}");
|
Debug.Log($"[Puzzles] Step interacted: {stepData?.stepId} on {gameObject.name}");
|
||||||
PuzzleManager.Instance?.OnStepCompleted(stepData);
|
PuzzleManager.Instance?.MarkPuzzleStepCompleted(stepData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,18 @@
|
|||||||
using UnityEngine;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using PuzzleS;
|
using System.Linq;
|
||||||
|
using UnityEngine;
|
||||||
using UnityEngine.SceneManagement;
|
using UnityEngine.SceneManagement;
|
||||||
|
|
||||||
/// <summary>
|
namespace PuzzleS
|
||||||
/// Manages puzzle step registration, dependency management, and step completion for the puzzle system.
|
|
||||||
/// </summary>
|
|
||||||
public class PuzzleManager : MonoBehaviour
|
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Manages puzzle step registration, dependency management, and step completion for the puzzle system.
|
||||||
|
/// </summary>
|
||||||
|
public class PuzzleManager : MonoBehaviour
|
||||||
|
{
|
||||||
private static PuzzleManager _instance;
|
private static PuzzleManager _instance;
|
||||||
private static bool _isQuitting = false;
|
private static bool _isQuitting;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Singleton instance of the PuzzleManager.
|
/// Singleton instance of the PuzzleManager.
|
||||||
@@ -32,14 +35,16 @@ public class PuzzleManager : MonoBehaviour
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private HashSet<PuzzleStepSO> completedSteps = new HashSet<PuzzleStepSO>();
|
// Events to notify about step lifecycle
|
||||||
private HashSet<PuzzleStepSO> unlockedSteps = new HashSet<PuzzleStepSO>();
|
public event Action<PuzzleStepSO> OnStepCompleted;
|
||||||
|
public event Action<PuzzleStepSO> OnStepUnlocked;
|
||||||
|
|
||||||
|
private HashSet<PuzzleStepSO> _completedSteps = new HashSet<PuzzleStepSO>();
|
||||||
|
private HashSet<PuzzleStepSO> _unlockedSteps = new HashSet<PuzzleStepSO>();
|
||||||
// Registration for ObjectiveStepBehaviour
|
// Registration for ObjectiveStepBehaviour
|
||||||
private Dictionary<PuzzleStepSO, ObjectiveStepBehaviour> stepBehaviours = new Dictionary<PuzzleStepSO, ObjectiveStepBehaviour>();
|
private Dictionary<PuzzleStepSO, ObjectiveStepBehaviour> _stepBehaviours = new Dictionary<PuzzleStepSO, ObjectiveStepBehaviour>();
|
||||||
|
|
||||||
// Runtime dependency graph
|
// Runtime dependency graph
|
||||||
private Dictionary<PuzzleStepSO, List<PuzzleStepSO>> runtimeDependencies = new Dictionary<PuzzleStepSO, List<PuzzleStepSO>>();
|
private Dictionary<PuzzleStepSO, List<PuzzleStepSO>> _runtimeDependencies = new Dictionary<PuzzleStepSO, List<PuzzleStepSO>>();
|
||||||
|
|
||||||
void Awake()
|
void Awake()
|
||||||
{
|
{
|
||||||
@@ -66,9 +71,9 @@ public class PuzzleManager : MonoBehaviour
|
|||||||
public void RegisterStepBehaviour(ObjectiveStepBehaviour behaviour)
|
public void RegisterStepBehaviour(ObjectiveStepBehaviour behaviour)
|
||||||
{
|
{
|
||||||
if (behaviour?.stepData == null) return;
|
if (behaviour?.stepData == null) return;
|
||||||
if (!stepBehaviours.ContainsKey(behaviour.stepData))
|
if (!_stepBehaviours.ContainsKey(behaviour.stepData))
|
||||||
{
|
{
|
||||||
stepBehaviours.Add(behaviour.stepData, behaviour);
|
_stepBehaviours.Add(behaviour.stepData, behaviour);
|
||||||
Debug.Log($"[Puzzles] Registered step: {behaviour.stepData.stepId} on {behaviour.gameObject.name}");
|
Debug.Log($"[Puzzles] Registered step: {behaviour.stepData.stepId} on {behaviour.gameObject.name}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -80,7 +85,7 @@ public class PuzzleManager : MonoBehaviour
|
|||||||
public void UnregisterStepBehaviour(ObjectiveStepBehaviour behaviour)
|
public void UnregisterStepBehaviour(ObjectiveStepBehaviour behaviour)
|
||||||
{
|
{
|
||||||
if (behaviour?.stepData == null) return;
|
if (behaviour?.stepData == null) return;
|
||||||
stepBehaviours.Remove(behaviour.stepData);
|
_stepBehaviours.Remove(behaviour.stepData);
|
||||||
Debug.Log($"[Puzzles] Unregistered step: {behaviour.stepData.stepId} on {behaviour.gameObject.name}");
|
Debug.Log($"[Puzzles] Unregistered step: {behaviour.stepData.stepId} on {behaviour.gameObject.name}");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,15 +94,15 @@ public class PuzzleManager : MonoBehaviour
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void BuildRuntimeDependencies()
|
private void BuildRuntimeDependencies()
|
||||||
{
|
{
|
||||||
runtimeDependencies = PuzzleGraphUtility.BuildDependencyGraph(stepBehaviours.Keys);
|
_runtimeDependencies = PuzzleGraphUtility.BuildDependencyGraph(_stepBehaviours.Keys);
|
||||||
foreach (var step in runtimeDependencies.Keys)
|
foreach (var step in _runtimeDependencies.Keys)
|
||||||
{
|
{
|
||||||
foreach (var dep in runtimeDependencies[step])
|
foreach (var dep in _runtimeDependencies[step])
|
||||||
{
|
{
|
||||||
Debug.Log($"[Puzzles] Step {step.stepId} depends on {dep.stepId}");
|
Debug.Log($"[Puzzles] Step {step.stepId} depends on {dep.stepId}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Debug.Log($"[Puzzles] Runtime dependencies built. Total steps: {stepBehaviours.Count}");
|
Debug.Log($"[Puzzles] Runtime dependencies built. Total steps: {_stepBehaviours.Count}");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -105,7 +110,7 @@ public class PuzzleManager : MonoBehaviour
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void UnlockInitialSteps()
|
private void UnlockInitialSteps()
|
||||||
{
|
{
|
||||||
var initialSteps = PuzzleGraphUtility.FindInitialSteps(runtimeDependencies);
|
var initialSteps = PuzzleGraphUtility.FindInitialSteps(_runtimeDependencies);
|
||||||
foreach (var step in initialSteps)
|
foreach (var step in initialSteps)
|
||||||
{
|
{
|
||||||
Debug.Log($"[Puzzles] Initial step unlocked: {step.stepId}");
|
Debug.Log($"[Puzzles] Initial step unlocked: {step.stepId}");
|
||||||
@@ -117,11 +122,15 @@ public class PuzzleManager : MonoBehaviour
|
|||||||
/// Called when a step is completed. Unlocks dependent steps if their dependencies are met.
|
/// Called when a step is completed. Unlocks dependent steps if their dependencies are met.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="step">The completed step.</param>
|
/// <param name="step">The completed step.</param>
|
||||||
public void OnStepCompleted(PuzzleStepSO step)
|
public void MarkPuzzleStepCompleted(PuzzleStepSO step)
|
||||||
{
|
{
|
||||||
if (completedSteps.Contains(step)) return;
|
if (_completedSteps.Contains(step)) return;
|
||||||
completedSteps.Add(step);
|
_completedSteps.Add(step);
|
||||||
Debug.Log($"[Puzzles] Step completed: {step.stepId}");
|
Debug.Log($"[Puzzles] Step completed: {step.stepId}");
|
||||||
|
|
||||||
|
// Broadcast completion
|
||||||
|
OnStepCompleted?.Invoke(step);
|
||||||
|
|
||||||
foreach (var unlock in step.unlocks)
|
foreach (var unlock in step.unlocks)
|
||||||
{
|
{
|
||||||
if (AreRuntimeDependenciesMet(unlock))
|
if (AreRuntimeDependenciesMet(unlock))
|
||||||
@@ -144,10 +153,10 @@ public class PuzzleManager : MonoBehaviour
|
|||||||
/// <returns>True if all dependencies are met, false otherwise.</returns>
|
/// <returns>True if all dependencies are met, false otherwise.</returns>
|
||||||
private bool AreRuntimeDependenciesMet(PuzzleStepSO step)
|
private bool AreRuntimeDependenciesMet(PuzzleStepSO step)
|
||||||
{
|
{
|
||||||
if (!runtimeDependencies.ContainsKey(step) || runtimeDependencies[step].Count == 0) return true;
|
if (!_runtimeDependencies.ContainsKey(step) || _runtimeDependencies[step].Count == 0) return true;
|
||||||
foreach (var dep in runtimeDependencies[step])
|
foreach (var dep in _runtimeDependencies[step])
|
||||||
{
|
{
|
||||||
if (!completedSteps.Contains(dep)) return false;
|
if (!_completedSteps.Contains(dep)) return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -158,13 +167,16 @@ public class PuzzleManager : MonoBehaviour
|
|||||||
/// <param name="step">The step to unlock.</param>
|
/// <param name="step">The step to unlock.</param>
|
||||||
private void UnlockStep(PuzzleStepSO step)
|
private void UnlockStep(PuzzleStepSO step)
|
||||||
{
|
{
|
||||||
if (unlockedSteps.Contains(step)) return;
|
if (_unlockedSteps.Contains(step)) return;
|
||||||
unlockedSteps.Add(step);
|
_unlockedSteps.Add(step);
|
||||||
if (stepBehaviours.TryGetValue(step, out var behaviour))
|
if (_stepBehaviours.TryGetValue(step, out var behaviour))
|
||||||
{
|
{
|
||||||
behaviour.UnlockStep();
|
behaviour.UnlockStep();
|
||||||
}
|
}
|
||||||
Debug.Log($"[Puzzles] Step unlocked: {step.stepId}");
|
Debug.Log($"[Puzzles] Step unlocked: {step.stepId}");
|
||||||
|
|
||||||
|
// Broadcast unlock
|
||||||
|
OnStepUnlocked?.Invoke(step);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -172,7 +184,7 @@ public class PuzzleManager : MonoBehaviour
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void CheckPuzzleCompletion()
|
private void CheckPuzzleCompletion()
|
||||||
{
|
{
|
||||||
if (completedSteps.Count == stepBehaviours.Count)
|
if (_completedSteps.Count == _stepBehaviours.Count)
|
||||||
{
|
{
|
||||||
Debug.Log("[Puzzles] Puzzle complete! All steps finished.");
|
Debug.Log("[Puzzles] Puzzle complete! All steps finished.");
|
||||||
// TODO: Fire puzzle complete event or trigger outcome logic
|
// TODO: Fire puzzle complete event or trigger outcome logic
|
||||||
@@ -186,11 +198,22 @@ public class PuzzleManager : MonoBehaviour
|
|||||||
{
|
{
|
||||||
BuildRuntimeDependencies();
|
BuildRuntimeDependencies();
|
||||||
UnlockInitialSteps();
|
UnlockInitialSteps();
|
||||||
return unlockedSteps.Contains(step);
|
return _unlockedSteps.Contains(step);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks if a puzzle step with the specified ID has been completed
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="stepId">The ID of the puzzle step to check</param>
|
||||||
|
/// <returns>True if the step has been completed, false otherwise</returns>
|
||||||
|
public bool IsPuzzleStepCompleted(string stepId)
|
||||||
|
{
|
||||||
|
return _completedSteps.Any(step => step.stepId == stepId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnApplicationQuit()
|
void OnApplicationQuit()
|
||||||
{
|
{
|
||||||
_isQuitting = true;
|
_isQuitting = true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ MonoBehaviour:
|
|||||||
basePickupPrefab: {fileID: 7447346505753002421, guid: bf4b9d7045397f946b2125b1ad4a3fbd, type: 3}
|
basePickupPrefab: {fileID: 7447346505753002421, guid: bf4b9d7045397f946b2125b1ad4a3fbd, type: 3}
|
||||||
levelSwitchMenuPrefab: {fileID: 4062459998181038721, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
|
levelSwitchMenuPrefab: {fileID: 4062459998181038721, guid: de2ed28e4200a4340a5af4086c98a0dc, type: 3}
|
||||||
combinationRules:
|
combinationRules:
|
||||||
- itemA: {fileID: 11400000, guid: 33e7ca06b22108d4e802486e08bcdfd1, type: 2}
|
- itemA: {fileID: 11400000, guid: 8b2616beb14825a46b9b1ed85ad3cb25, type: 2}
|
||||||
itemB: {fileID: 11400000, guid: 8b2616beb14825a46b9b1ed85ad3cb25, type: 2}
|
itemB: {fileID: 11400000, guid: 33e7ca06b22108d4e802486e08bcdfd1, type: 2}
|
||||||
resultPrefab: {fileID: 1610562450228973293, guid: 58654125374567147839eb382fcde422, type: 3}
|
resultPrefab: {fileID: 1610562450228973293, guid: 58654125374567147839eb382fcde422, type: 3}
|
||||||
- itemA: {fileID: 11400000, guid: 983414276ae3f004c854e9c450f27f88, type: 2}
|
- itemA: {fileID: 11400000, guid: 983414276ae3f004c854e9c450f27f88, type: 2}
|
||||||
itemB: {fileID: 11400000, guid: 0c6986639ca176a419c92f5a327d95ce, type: 2}
|
itemB: {fileID: 11400000, guid: 0c6986639ca176a419c92f5a327d95ce, type: 2}
|
||||||
|
|||||||
Reference in New Issue
Block a user