Working on quests, moved to CineMachine for camera and started to build out areas, started combat system

This commit is contained in:
2026-02-12 17:30:04 +00:00
parent c08d7d8830
commit d564c5f44e
50 changed files with 21700 additions and 10726 deletions

View File

@@ -23,3 +23,8 @@ MonoBehaviour:
portrayalSprites: []
overrideDefaultGibberishAudio: 0
gibberishAudioClips: []
- characterName: GoblinCampGuard
iconsSprites: []
portrayalSprites: []
overrideDefaultGibberishAudio: 0
gibberishAudioClips: []

View File

@@ -0,0 +1,845 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &-5480557833331767576
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: e5800231a05eaae43b00503881229245, type: 3}
m_Name:
m_EditorClassIdentifier: games.okitoki.EasyTalk::EasyTalk.Localization.TranslationLibrary
originalLanguage: en
translationSets:
- counter: 16
languageCode: en
translations:
- id: 0
language: en
text: GoblinCampGuard
- id: 1
language: en
text: '''ello human and welcome to our impenatrable fort!'
- id: 2
language: en
text: Dun even try 'n' find a way inta 'ere, is super secure!
- id: 3
language: en
text: '''ello ''uman and welcome to our impenatrable fort!'
- id: 4
language: en
text: No, dun look at that 'uman!
- id: 5
language: en
text: Ah com on...
- id: 6
language: en
text: Go away 'uman! Now sad.
- id: 7
language: en
text: '"Sneak" into the goblin camp.'
- id: 8
language: en
text: Walk away, it is not even worth your time.
- id: 9
language: en
text: Player
- id: 10
language: en
text: Time to pay for your crimes!
- id: 11
language: en
text: I have come on behalf of the farmer to drive you from here.
- id: 12
language: en
text: Uuuuh, wot 'uman sayin'?
- id: 13
language: en
text: Farmer is nice 'uman outside trees, gobs like 'im and leave farmer alone.
- id: 14
language: en
text: I am going to enjoy this...
- id: 15
language: en
text: OOOOOOI! Go away 'uman!
--- !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: 65aaff45f3a1d794180acfe1b86e7406, type: 3}
m_Name: GoblinCampGuard
m_EditorClassIdentifier: games.okitoki.EasyTalk::EasyTalk.Nodes.Dialogue
version: 1.7.5
nodes:
- rid: 2559183962979173149
- rid: 2559183962979173150
- rid: 2559183962979173151
- rid: 2559183962979173152
- rid: 2559183962979173153
- rid: 2559183962979173154
- rid: 2559183962979173155
- rid: 2559183962979173156
- rid: 2559183962979173157
- rid: 2559183962979173158
- rid: 2559183962979173159
- rid: 2559183962979173160
- rid: 2559183962979173161
- rid: 2559183962979173162
- rid: 2559183962979173163
- rid: 2559183962979173164
- rid: 2559183962979173165
- rid: 2559183962979173166
- rid: 2559183962979173167
- rid: 2559183962979173168
translationLibrary: {fileID: -5480557833331767576}
maxID: 3709
references:
version: 2
RefIds:
- rid: 2559183962979173149
type: {class: ConversationNode, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
nodeId: 6
name: CONVERSATION
nodeType: 3
inputs:
- id: 7
attachedIds: ee0b0000
ownerId: 6
connectionType: 1
outputs:
- id: 8
attachedIds: 16070000
ownerId: 6
connectionType: 1
width: 268
height: 170
xPosition: 439.60144
yPosition: 350.9394
items:
- rid: 2559183962979173169
- rid: 2559183962979173170
characterName: Player
icon:
- rid: 2559183962979173150
type: {class: ConversationNode, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
nodeId: 9
name: CONVERSATION
nodeType: 3
inputs:
- id: 10
attachedIds: ef0b0000
ownerId: 9
connectionType: 1
outputs:
- id: 11
attachedIds: 2f000000
ownerId: 9
connectionType: 1
width: 268
height: 170
xPosition: 466.80145
yPosition: -37.26063
items:
- rid: 2559183962979173171
- rid: 2559183962979173172
characterName: GoblinCampGuard
icon:
- rid: 2559183962979173151
type: {class: TriggerScriptNode, ns: EasyTalk.Nodes.Logic, asm: games.okitoki.EasyTalk}
data:
nodeId: 46
name: TRIGGER
nodeType: 8
inputs:
- id: 47
attachedIds: 0b000000
ownerId: 46
connectionType: 1
- id: 48
attachedIds:
ownerId: 46
connectionType: 5
- id: 49
attachedIds:
ownerId: 46
connectionType: 9
- id: 50
attachedIds:
ownerId: 46
connectionType: 9
- id: 51
attachedIds:
ownerId: 46
connectionType: 9
outputs:
- id: 52
attachedIds:
ownerId: 46
connectionType: 9
- id: 53
attachedIds: b0010000
ownerId: 46
connectionType: 1
width: 220
height: 320
xPosition: 832.4014
yPosition: -72.86067
triggeredClassName: CameraManager
triggeredMethodName: SwitchTo
methodSignature: SwitchTo(string)
parameterTypes:
- string
parameterValues:
- GoblinCamp
triggerType: 0
objectTagOrName:
- rid: 2559183962979173152
type: {class: TriggerScriptNode, ns: EasyTalk.Nodes.Logic, asm: games.okitoki.EasyTalk}
data:
nodeId: 115
name: TRIGGER
nodeType: 8
inputs:
- id: 116
attachedIds: 17070000
ownerId: 115
connectionType: 1
- id: 117
attachedIds:
ownerId: 115
connectionType: 5
- id: 118
attachedIds:
ownerId: 115
connectionType: 9
- id: 119
attachedIds:
ownerId: 115
connectionType: 9
- id: 120
attachedIds:
ownerId: 115
connectionType: 9
outputs:
- id: 121
attachedIds:
ownerId: 115
connectionType: 2
- id: 122
attachedIds: 0e090000
ownerId: 115
connectionType: 1
width: 220
height: 320
xPosition: 1145.8014
yPosition: 360.3894
triggeredClassName: QuestManager
triggeredMethodName: CompleteQuest
methodSignature: CompleteQuest(string):bool
parameterTypes:
- string
parameterValues:
- 1
triggerType: 0
objectTagOrName:
- rid: 2559183962979173153
type: {class: WaitNode, ns: EasyTalk.Nodes.Flow, asm: games.okitoki.EasyTalk}
data:
nodeId: 431
name: WAIT
nodeType: 34
inputs:
- id: 432
attachedIds: 35000000
ownerId: 431
connectionType: 1
outputs:
- id: 433
attachedIds: d4050000
ownerId: 431
connectionType: 1
width: 110
height: 75
xPosition: 1113.1306
yPosition: 108.54551
waitTime: 4
- rid: 2559183962979173154
type: {class: ConversationNode, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
nodeId: 561
name: CONVERSATION
nodeType: 3
inputs:
- id: 562
attachedIds: da050000
ownerId: 561
connectionType: 1
outputs:
- id: 563
attachedIds: 59020000
ownerId: 561
connectionType: 1
width: 268
height: 200
xPosition: 1552.8007
yPosition: 30.112488
items:
- rid: 2559183962979173173
- rid: 2559183962979173174
- rid: 2559183962979173175
characterName: GoblinCampGuard
icon:
- rid: 2559183962979173155
type: {class: OptionNode, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
nodeId: 600
name: OPTION
nodeType: 4
inputs:
- id: 601
attachedIds: 33020000
ownerId: 600
connectionType: 1
- id: 602
attachedIds:
ownerId: 600
connectionType: 7
- id: 604
attachedIds:
ownerId: 600
connectionType: 7
outputs:
- id: 603
attachedIds: 9f030000
ownerId: 600
connectionType: 1
- id: 605
attachedIds: 6a020000
ownerId: 600
connectionType: 1
width: 228
height: 194
xPosition: 1866.8007
yPosition: 45.112488
items:
- rid: 2559183962979173176
- rid: 2559183962979173177
- rid: 2559183962979173156
type: {class: TriggerScriptNode, ns: EasyTalk.Nodes.Logic, asm: games.okitoki.EasyTalk}
data:
nodeId: 617
name: TRIGGER
nodeType: 8
inputs:
- id: 618
attachedIds: 5d020000
ownerId: 617
connectionType: 1
- id: 619
attachedIds:
ownerId: 617
connectionType: 5
- id: 620
attachedIds:
ownerId: 617
connectionType: 9
- id: 621
attachedIds:
ownerId: 617
connectionType: 9
- id: 622
attachedIds:
ownerId: 617
connectionType: 9
outputs:
- id: 623
attachedIds:
ownerId: 617
connectionType: 2
- id: 624
attachedIds: bd040000
ownerId: 617
connectionType: 1
width: 220
height: 320
xPosition: 2171.8008
yPosition: 219.11249
triggeredClassName: QuestManager
triggeredMethodName: FailQuest
methodSignature: FailQuest(string):bool
parameterTypes:
- string
parameterValues:
- 1
triggerType: 0
objectTagOrName:
- rid: 2559183962979173157
type: {class: TriggerScriptNode, ns: EasyTalk.Nodes.Logic, asm: games.okitoki.EasyTalk}
data:
nodeId: 926
name: TRIGGER
nodeType: 8
inputs:
- id: 927
attachedIds: 5b020000
ownerId: 926
connectionType: 1
- id: 928
attachedIds:
ownerId: 926
connectionType: 5
- id: 929
attachedIds:
ownerId: 926
connectionType: 9
- id: 930
attachedIds:
ownerId: 926
connectionType: 9
- id: 931
attachedIds:
ownerId: 926
connectionType: 9
outputs:
- id: 932
attachedIds:
ownerId: 926
connectionType: 2
- id: 933
attachedIds: bd040000
ownerId: 926
connectionType: 1
width: 220
height: 320
xPosition: 2175.8008
yPosition: -143.88751
triggeredClassName: QuestManager
triggeredMethodName: StartQuest
methodSignature: StartQuest(string):bool
parameterTypes:
- string
parameterValues:
- 1
triggerType: 0
objectTagOrName:
- rid: 2559183962979173158
type: {class: ExitNode, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
nodeId: 1212
name: EXIT
nodeType: 2
inputs:
- id: 1213
attachedIds: 70020000a5030000
ownerId: 1212
connectionType: 1
outputs: []
width: 110
height: 75
xPosition: 2585.8008
yPosition: 171.61249
exitPointName:
- rid: 2559183962979173159
type: {class: TriggerScriptNode, ns: EasyTalk.Nodes.Logic, asm: games.okitoki.EasyTalk}
data:
nodeId: 1491
name: TRIGGER
nodeType: 8
inputs:
- id: 1492
attachedIds: b1010000
ownerId: 1491
connectionType: 1
- id: 1493
attachedIds:
ownerId: 1491
connectionType: 5
- id: 1494
attachedIds:
ownerId: 1491
connectionType: 9
- id: 1495
attachedIds:
ownerId: 1491
connectionType: 9
- id: 1496
attachedIds:
ownerId: 1491
connectionType: 9
outputs:
- id: 1497
attachedIds:
ownerId: 1491
connectionType: 9
- id: 1498
attachedIds: 32020000
ownerId: 1491
connectionType: 1
width: 220
height: 320
xPosition: 1301.3369
yPosition: 12.786354
triggeredClassName: CameraManager
triggeredMethodName: SwitchTo
methodSignature: SwitchTo(string)
parameterTypes:
- string
parameterValues:
- MainCamera
triggerType: 0
objectTagOrName:
- rid: 2559183962979173160
type: {class: ConversationNode, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
nodeId: 1813
name: CONVERSATION
nodeType: 3
inputs:
- id: 1814
attachedIds: 08000000
ownerId: 1813
connectionType: 1
outputs:
- id: 1815
attachedIds: 74000000
ownerId: 1813
connectionType: 1
width: 268
height: 170
xPosition: 794.60986
yPosition: 391.98926
items:
- rid: 2559183962979173178
- rid: 2559183962979173179
characterName: GoblinCampGuard
icon:
- rid: 2559183962979173161
type: {class: TriggerScriptNode, ns: EasyTalk.Nodes.Logic, asm: games.okitoki.EasyTalk}
data:
nodeId: 2125
name: TRIGGER
nodeType: 8
inputs:
- id: 2126
attachedIds: 0f090000
ownerId: 2125
connectionType: 1
- id: 2127
attachedIds:
ownerId: 2125
connectionType: 5
- id: 2128
attachedIds:
ownerId: 2125
connectionType: 9
- id: 2129
attachedIds:
ownerId: 2125
connectionType: 9
- id: 2130
attachedIds:
ownerId: 2125
connectionType: 9
outputs:
- id: 2131
attachedIds:
ownerId: 2125
connectionType: 2
- id: 2132
attachedIds: af090000
ownerId: 2125
connectionType: 1
width: 220
height: 320
xPosition: 1743.3597
yPosition: 351.98926
triggeredClassName: QuestManager
triggeredMethodName: StartQuest
methodSignature: StartQuest(string):bool
parameterTypes:
- string
parameterValues:
- 2
triggerType: 0
objectTagOrName:
- rid: 2559183962979173162
type: {class: ConversationNode, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
nodeId: 2317
name: CONVERSATION
nodeType: 3
inputs:
- id: 2318
attachedIds: 7a000000
ownerId: 2317
connectionType: 1
outputs:
- id: 2319
attachedIds: 4e080000
ownerId: 2317
connectionType: 1
width: 268
height: 144
xPosition: 1397.1097
yPosition: 424.48926
items:
- rid: 2559183962979173180
characterName: Player
icon:
- rid: 2559183962979173163
type: {class: ExitNode, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
nodeId: 2478
name: EXIT
nodeType: 2
inputs:
- id: 2479
attachedIds: 54080000
ownerId: 2478
connectionType: 1
outputs: []
width: 110
height: 75
xPosition: 2043.3596
yPosition: 536.9892
exitPointName:
- rid: 2559183962979173164
type: {class: EntryNode, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
nodeId: 2725
name: ENTRY
nodeType: 1
inputs: []
outputs:
- id: 2726
attachedIds: db0a0000
ownerId: 2725
connectionType: 1
width: 110
height: 75
xPosition: -345.38983
yPosition: 175.73926
entryPointName: Door
- rid: 2559183962979173165
type: {class: TriggerScriptNode, ns: EasyTalk.Nodes.Logic, asm: games.okitoki.EasyTalk}
data:
nodeId: 2778
name: TRIGGER
nodeType: 8
inputs:
- id: 2779
attachedIds: a60a0000
ownerId: 2778
connectionType: 1
- id: 2780
attachedIds:
ownerId: 2778
connectionType: 5
- id: 2781
attachedIds:
ownerId: 2778
connectionType: 9
- id: 2782
attachedIds:
ownerId: 2778
connectionType: 9
- id: 2783
attachedIds:
ownerId: 2778
connectionType: 9
outputs:
- id: 2784
attachedIds: ec0b0000eb0b0000
ownerId: 2778
connectionType: 2
- id: 2785
attachedIds: ea0b0000
ownerId: 2778
connectionType: 1
width: 220
height: 320
xPosition: -154.13977
yPosition: 123.23929
triggeredClassName: QuestManager
triggeredMethodName: IsQuestActive
methodSignature: IsQuestActive(string):bool
parameterTypes:
- string
parameterValues:
- 1
triggerType: 0
objectTagOrName:
- rid: 2559183962979173166
type: {class: LogicNode, ns: EasyTalk.Nodes.Logic, asm: games.okitoki.EasyTalk}
data:
nodeId: 3049
name: BOOL LOGIC
nodeType: 20
inputs:
- id: 3050
attachedIds: e10a0000
ownerId: 3049
connectionType: 1
- id: 3051
attachedIds: e00a0000
ownerId: 3049
connectionType: 2
- id: 3052
attachedIds: e00a0000
ownerId: 3049
connectionType: 2
outputs:
- id: 3053
attachedIds:
ownerId: 3049
connectionType: 2
- id: 3054
attachedIds: 07000000
ownerId: 3049
connectionType: 10
- id: 3055
attachedIds: 0a000000
ownerId: 3049
connectionType: 11
width: 160
height: 120
xPosition: 118.36012
yPosition: 331.98926
logicOperation: 4
- rid: 2559183962979173167
type: {class: EntryNode, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
nodeId: 1169
name: ENTRY
nodeType: 1
inputs: []
outputs:
- id: 1170
attachedIds: 99040000
ownerId: 1169
connectionType: 1
width: 110
height: 75
xPosition: -415.1557
yPosition: -434.8136
entryPointName: Wall
- rid: 2559183962979173168
type: {class: ConversationNode, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
nodeId: 1176
name: CONVERSATION
nodeType: 3
inputs:
- id: 1177
attachedIds: 92040000
ownerId: 1176
connectionType: 1
outputs:
- id: 1178
attachedIds:
ownerId: 1176
connectionType: 1
width: 268
height: 140
xPosition: -214.15575
yPosition: -433.5636
items:
- rid: 2559183962979173181
characterName: GoblinCampGuard
icon:
- rid: 2559183962979173169
type: {class: ConversationItem, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
text: Time to pay for your crimes!
audioClip: {fileID: 0}
audioClipFile:
audioAssetID: 0
- rid: 2559183962979173170
type: {class: ConversationItem, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
text: I have come on behalf of the farmer to drive you from here.
audioClip: {fileID: 0}
audioClipFile:
audioAssetID: 0
- rid: 2559183962979173171
type: {class: ConversationItem, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
text: '''ello ''uman and welcome to our impenatrable fort!'
audioClip: {fileID: 0}
audioClipFile:
audioAssetID: 0
- rid: 2559183962979173172
type: {class: ConversationItem, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
text: Dun even try 'n' find a way inta 'ere, is super secure!
audioClip: {fileID: 0}
audioClipFile:
audioAssetID: 0
- rid: 2559183962979173173
type: {class: ConversationItem, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
text: No, dun look at that 'uman!
audioClip: {fileID: 0}
audioClipFile:
audioAssetID: 0
- rid: 2559183962979173174
type: {class: ConversationItem, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
text: Ah com on...
audioClip: {fileID: 0}
audioClipFile:
audioAssetID: 0
- rid: 2559183962979173175
type: {class: ConversationItem, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
text: Go away 'uman! Now sad.
audioClip: {fileID: 0}
audioClipFile:
audioAssetID: 0
- rid: 2559183962979173176
type: {class: OptionItem, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
text: '"Sneak" into the goblin camp.'
- rid: 2559183962979173177
type: {class: OptionItem, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
text: Walk away, it is not even worth your time.
- rid: 2559183962979173178
type: {class: ConversationItem, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
text: Uuuuh, wot 'uman sayin'?
audioClip: {fileID: 0}
audioClipFile:
audioAssetID: 0
- rid: 2559183962979173179
type: {class: ConversationItem, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
text: Farmer is nice 'uman outside trees, gobs like 'im and leave farmer
alone.
audioClip: {fileID: 0}
audioClipFile:
audioAssetID: 0
- rid: 2559183962979173180
type: {class: ConversationItem, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
text: I am going to enjoy this...
audioClip: {fileID: 0}
audioClipFile:
audioAssetID: 0
- rid: 2559183962979173181
type: {class: ConversationItem, ns: EasyTalk.Nodes.Common, asm: games.okitoki.EasyTalk}
data:
text: OOOOOOI! Go away 'uman!
audioClip: {fileID: 0}
audioClipFile:
audioAssetID: 0

View File

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

View File

@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: 82fc15035885a7f44b4f1d3b74e51bf6
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: c868f6d508a1bc241bc0cddce1355984
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: df5e4280c3c2f7340a18d133ae4eae84
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: 17ee63f882d6be2449ebecf4610c42be
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: 4db65af7a2c77044db19761e180cdcbd
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: 147755e7df36cbb42af0aaa29e1d77db
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: c7cb5eee6412d294ba27acae4e256b57
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: ca47119cfdd3a3e469e22f529bd1b47b
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: aadf96e6ff3ec4c45817e3c80fd07b3a
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: c5fc3d5b230344a4cb0909e00f095977
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: 1f97c4058121bb747a4da3ff2f4aa3b6
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: 20a9bf0e11ca65149a1dbda4e717a94e
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,110 @@
fileFormatVersion: 2
guid: c211f61a8b5d48b44bad6bdbd52a171a
ModelImporter:
serializedVersion: 24200
internalIDToNameTable: []
externalObjects: {}
materials:
materialImportMode: 2
materialName: 0
materialSearch: 1
materialLocation: 1
animations:
legacyGenerateAnimations: 4
bakeSimulation: 0
resampleCurves: 1
optimizeGameObjects: 0
removeConstantScaleCurves: 0
motionNodeName:
animationImportErrors:
animationImportWarnings:
animationRetargetingWarnings:
animationDoRetargetingWarnings: 0
importAnimatedCustomProperties: 0
importConstraints: 0
animationCompression: 1
animationRotationError: 0.5
animationPositionError: 0.5
animationScaleError: 0.5
animationWrapMode: 0
extraExposedTransformPaths: []
extraUserProperties: []
clipAnimations: []
isReadable: 0
meshes:
lODScreenPercentages: []
globalScale: 1
meshCompression: 0
addColliders: 0
useSRGBMaterialColor: 1
sortHierarchyByName: 1
importPhysicalCameras: 1
importVisibility: 1
importBlendShapes: 1
importCameras: 1
importLights: 1
nodeNameCollisionStrategy: 1
fileIdsGeneration: 2
swapUVChannels: 0
generateSecondaryUV: 0
useFileUnits: 1
keepQuads: 0
weldVertices: 1
bakeAxisConversion: 0
preserveHierarchy: 0
skinWeightsMode: 0
maxBonesPerVertex: 4
minBoneWeight: 0.001
optimizeBones: 1
generateMeshLods: 0
meshLodGenerationFlags: 0
maximumMeshLod: -1
meshOptimizationFlags: -1
indexFormat: 0
secondaryUVAngleDistortion: 8
secondaryUVAreaDistortion: 15.000001
secondaryUVHardAngle: 88
secondaryUVMarginMethod: 1
secondaryUVMinLightmapResolution: 40
secondaryUVMinObjectScale: 1
secondaryUVPackMargin: 4
useFileScale: 1
strictVertexDataChecks: 0
tangentSpace:
normalSmoothAngle: 60
normalImportMode: 0
tangentImportMode: 3
normalCalculationMode: 4
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
blendShapeNormalImportMode: 1
normalSmoothingSource: 0
referencedClips: []
importAnimation: 1
humanDescription:
serializedVersion: 3
human: []
skeleton: []
armTwist: 0.5
foreArmTwist: 0.5
upperLegTwist: 0.5
legTwist: 0.5
armStretch: 0.05
legStretch: 0.05
feetSpacing: 0
globalScale: 1
rootMotionBoneName:
hasTranslationDoF: 0
hasExtraRoot: 0
skeletonHasParents: 1
lastHumanDescriptionAvatarSource: {instanceID: 0}
autoGenerateAvatarMappingIfUnspecified: 1
animationType: 2
humanoidOversampling: 1
avatarSetup: 0
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
importBlendShapeDeformPercent: 1
remapMaterialsIfMaterialImportModeIsNone: 0
additionalBone: 0
userData:
assetBundleName:
assetBundleVariant:

5404
Assets/Prefabs/Enemy.prefab Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 3c7624b3fef3a424890d75535897fd16
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

5350
Assets/Prefabs/NPC.prefab Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 7e60f5f8f00164b43864848c893e5357
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,8 @@
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.AI;
using EasyTalk.Controller;
using EasyTalk.Nodes;
public abstract class Character : MonoBehaviour
{
@@ -34,6 +36,22 @@ public abstract class Character : MonoBehaviour
[SerializeField]
protected int MaxHp = 10;
[Header("Dialogue")]
public bool hasDialogue = false;
[Tooltip("The Dialogue asset for this character. Will be loaded into the central DialogueController.")]
public Dialogue dialogue;
[Tooltip("Optional: Entry point name for starting dialogue. Leave empty to use default entry point.")]
public string dialogueEntryPoint = "";
[Tooltip("Name of the GameObject with the central DialogueController. Leave empty to auto-find.")]
public string dialogueManagerName = "Manager";
[Header("Debug")]
[SerializeField]
protected bool enableDebugLogs = false;
// Cache the central DialogueController
protected static DialogueController centralDialogueController;
[Header("Components")]
// Optional movement controller reference, assign in inspector if used
public NavMeshMovementController MovementController;
@@ -219,6 +237,174 @@ public abstract class Character : MonoBehaviour
SetFloatIfExists(paramHeadVertical, vertical);
}
/// <summary>
/// Make character look at a target with head rotation, body rotation when clamped
/// </summary>
public void LookAtTarget(Transform target)
{
if (target == null) return;
Vector3 directionToTarget = target.position - transform.position;
directionToTarget.y = 0; // Keep on horizontal plane
if (directionToTarget.sqrMagnitude < 0.01f) return;
// Calculate angle to target
float angleToTarget = Vector3.SignedAngle(transform.forward, directionToTarget, Vector3.up);
// Head rotation limits (before body needs to rotate)
const float headHorizontalLimit = 60f;
if (Mathf.Abs(angleToTarget) > headHorizontalLimit)
{
// Rotate body to face target
Quaternion targetRotation = Quaternion.LookRotation(directionToTarget);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 5f);
// Reset head to neutral when body rotates
SetHeadLook(0f, 0f);
}
else
{
// Just rotate head
float normalizedAngle = angleToTarget / headHorizontalLimit; // -1 to 1
SetHeadLook(normalizedAngle, 0f);
}
}
/// <summary>
/// Called when player interacts with this character. Override to add custom behavior.
/// </summary>
public virtual void OnInteract(GameObject player)
{
Log($"Interacting with {gameObject.name}");
// Look at player
if (player != null)
{
LookAtTarget(player.transform);
// Make player look at this character
Character playerChar = player.GetComponent<Character>();
if (playerChar != null)
{
playerChar.LookAtTarget(transform);
}
}
if (hasDialogue)
{
ShowDialogue();
}
}
/// <summary>
/// Display dialogue for this character using EasyTalk with centralized DialogueController
/// </summary>
/// <param name="entryPoint">Optional entry point override. If null/empty, uses dialogueEntryPoint field.</param>
protected virtual void ShowDialogue(string entryPoint = null)
{
// Find the central DialogueController if not cached
if (centralDialogueController == null)
{
centralDialogueController = FindCentralDialogueController();
}
// Check if we have both a controller and dialogue asset
if (centralDialogueController != null && dialogue != null)
{
// Load this character's dialogue into the central controller
centralDialogueController.ChangeDialogue(dialogue);
// Use provided entry point, fallback to field, then default
string targetEntryPoint = !string.IsNullOrEmpty(entryPoint) ? entryPoint : dialogueEntryPoint;
// Play dialogue with optional entry point
if (!string.IsNullOrEmpty(targetEntryPoint))
{
centralDialogueController.PlayDialogue(targetEntryPoint);
Log($"{gameObject.name}: Starting EasyTalk dialogue at entry point '{targetEntryPoint}'");
}
else
{
centralDialogueController.PlayDialogue();
Log($"{gameObject.name}: Starting EasyTalk dialogue");
}
}
else
{
// Warnings for missing components
if (centralDialogueController == null)
{
Debug.LogWarning($"No central DialogueController found. Make sure there's a DialogueController on a GameObject named '{dialogueManagerName}'.", gameObject);
}
if (dialogue == null)
{
Debug.LogWarning($"No Dialogue asset assigned to {gameObject.name}. Assign a Dialogue asset in the inspector.", gameObject);
}
}
}
/// <summary>
/// Public wrapper for UnityEvents or other triggers
/// </summary>
/// <param name="entryPoint">Optional entry point name. If empty, uses default dialogueEntryPoint.</param>
public virtual void StartDialogue(string entryPoint = "")
{
// Look at player if available
if (Player.current != null)
{
LookAtTarget(Player.current.transform);
// Make player look at this character
Player.current.LookAtTarget(transform);
}
ShowDialogue(entryPoint);
}
/// <summary>
/// Finds the central DialogueController in the scene
/// </summary>
protected DialogueController FindCentralDialogueController()
{
// First, try to find by the specified manager name
if (!string.IsNullOrEmpty(dialogueManagerName))
{
GameObject manager = GameObject.Find(dialogueManagerName);
if (manager != null)
{
DialogueController controller = manager.GetComponent<DialogueController>();
if (controller != null)
{
Log($"Found central DialogueController on '{dialogueManagerName}'");
return controller;
}
}
}
// Fallback: search for any DialogueController in the scene
DialogueController foundController = FindAnyObjectByType<DialogueController>();
if (foundController != null)
{
Log($"Found DialogueController via FindAnyObjectByType on '{foundController.gameObject.name}'");
return foundController;
}
return null;
}
/// <summary>
/// Debug logging utility
/// </summary>
protected void Log(string message)
{
if (enableDebugLogs)
{
Debug.Log($"[{GetType().Name}] {message}", gameObject);
}
}
private void ApplyStaticAnimatorParams()
{
if (animator == null) return;
@@ -322,6 +508,9 @@ public abstract class Character : MonoBehaviour
yield return new WaitForSeconds(attackHoldSeconds);
}
SetBoolIfExists(paramShoot, false);
// Wait one frame for animator to process the Shoot_b = false transition
yield return null;
if (restoreWeaponAfterAttack)
{

View File

@@ -19,6 +19,7 @@ public class ClickToMoveInputSystem : MonoBehaviour
Vector2 pointerScreenPos;
PlayerInteractionController cachedInteraction;
NavMeshMovementController cachedMovement;
PlayerCombatController cachedCombat;
void Awake()
{
@@ -46,11 +47,13 @@ public class ClickToMoveInputSystem : MonoBehaviour
{
cachedInteraction = null;
cachedMovement = null;
cachedCombat = null;
return;
}
cachedInteraction = Player.current.GetComponent<PlayerInteractionController>();
cachedMovement = Player.current.MovementController;
cachedCombat = Player.current.GetComponent<PlayerCombatController>();
if (cachedMovement == null)
{
cachedMovement = Player.current.GetComponent<NavMeshMovementController>();
@@ -77,6 +80,16 @@ public class ClickToMoveInputSystem : MonoBehaviour
return cachedMovement;
}
PlayerCombatController GetCombat()
{
if (Player.current == null) return null;
if (cachedCombat == null || cachedCombat.gameObject != Player.current.gameObject)
{
CachePlayerReferences();
}
return cachedCombat;
}
void Log(string message)
{
if (enableDebugLogs)
@@ -189,10 +202,35 @@ public class ClickToMoveInputSystem : MonoBehaviour
// First check if right-clicking on a building to interact with it
if (Physics.Raycast(ray, out RaycastHit hit, 500f, selectionLayers))
{
// Check for enemy combat target first
var enemy = hit.collider.GetComponentInParent<Enemy>();
if (enemy != null)
{
var combat = GetCombat();
if (combat != null)
{
combat.SetTargetEnemy(enemy);
Log($"Set combat target: {enemy.enemyName}");
}
else
{
// Fallback: move to enemy and look at them
var movement = GetMovement();
if (movement != null)
{
movement.MoveToAndLookAt(enemy.transform.position, enemy.transform.position);
}
}
return;
}
// Check for NPC interaction first
var npc = hit.collider.GetComponentInParent<NPC>();
if (npc != null)
{
var combat = GetCombat();
if (combat != null) combat.ClearCombatTarget();
var interaction = GetInteraction();
if (interaction != null)
{
@@ -215,6 +253,9 @@ public class ClickToMoveInputSystem : MonoBehaviour
var building = hit.collider.GetComponentInParent<Building>();
if (building != null)
{
var combat = GetCombat();
if (combat != null) combat.ClearCombatTarget();
// If building can be entered and has an entry point, move to the door
if (building.canEnter && building.entryPoint != null)
{
@@ -252,6 +293,9 @@ public class ClickToMoveInputSystem : MonoBehaviour
var interactiveObject = hit.collider.GetComponentInParent<IInteractiveObject>();
if (interactiveObject != null)
{
var combat = GetCombat();
if (combat != null) combat.ClearCombatTarget();
var interaction = GetInteraction();
if (interaction != null)
{
@@ -277,6 +321,9 @@ public class ClickToMoveInputSystem : MonoBehaviour
// If not an interactive object, check for movement destination
if (Physics.Raycast(ray, out RaycastHit groundHit, 500f, movementLayers))
{
var combat = GetCombat();
if (combat != null) combat.ClearCombatTarget();
var movement = GetMovement();
if (movement != null)
{

102
Assets/Scripts/Enemy.cs Normal file
View File

@@ -0,0 +1,102 @@
using UnityEngine;
public class Enemy : Character
{
[Header("Enemy Settings")]
public string enemyName = "Enemy";
public int contactDamage = 1;
public float aggroRange = 6f;
public float attackRange = 1.5f;
public float attackCooldown = 1f;
public bool autoAcquirePlayer = true;
private float nextAttackTime = 0f;
protected override void Update()
{
base.Update();
UpdateTargetAndCombat();
}
/// <summary>
/// Called when player interacts with this enemy
/// </summary>
public override void OnInteract(GameObject player)
{
// Call base implementation (handles look-at and dialogue)
base.OnInteract(player);
}
private void UpdateTargetAndCombat()
{
if (autoAcquirePlayer && target == null)
{
TryAcquirePlayer();
}
if (target == null)
{
return;
}
float distance = Vector3.Distance(transform.position, target.transform.position);
if (distance > aggroRange)
{
target = null;
if (MovementController != null)
{
MovementController.Stop();
}
return;
}
if (MovementController != null)
{
if (distance > attackRange)
{
MovementController.MoveTo(target.transform.position);
}
else
{
MovementController.Stop();
MovementController.SetLookTarget(target.transform.position);
}
}
if (distance <= attackRange && Time.time >= nextAttackTime)
{
nextAttackTime = Time.time + attackCooldown;
TriggerAttack();
target.TakeDamage(contactDamage);
}
}
private void TryAcquirePlayer()
{
if (Player.current == null)
{
return;
}
float distance = Vector3.Distance(transform.position, Player.current.transform.position);
if (distance <= aggroRange)
{
SetTarget(Player.current);
}
}
private void OnDrawGizmosSelected()
{
// Draw aggro range
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, aggroRange);
// Draw attack range
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, attackRange);
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 7dbaebd502c3bf048a421cc649730492

View File

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

View File

@@ -0,0 +1,180 @@
using System.Collections.Generic;
using UnityEngine;
using Unity.Cinemachine;
public class CameraManager : MonoBehaviour
{
public static CameraManager Instance { get; private set; }
[System.Serializable]
public class CameraEntry
{
public string id;
public CinemachineVirtualCameraBase camera;
public int activePriority = 20;
public int inactivePriority = 10;
}
[Header("Setup")]
public bool dontDestroyOnLoad = true;
public bool disableInactiveCameras = false;
public CinemachineBrain brain;
[Header("Cameras")]
public List<CameraEntry> cameras = new List<CameraEntry>();
private readonly Dictionary<string, CameraEntry> cameraLookup = new Dictionary<string, CameraEntry>();
private CameraEntry current;
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
if (dontDestroyOnLoad)
{
DontDestroyOnLoad(gameObject);
}
RebuildLookup();
if (brain == null)
{
brain = FindAnyObjectByType<CinemachineBrain>();
}
}
private void OnValidate()
{
for (int i = 0; i < cameras.Count; i++)
{
CameraEntry entry = cameras[i];
if (entry != null && string.IsNullOrEmpty(entry.id) && entry.camera != null)
{
entry.id = entry.camera.name;
}
}
}
public void RebuildLookup()
{
cameraLookup.Clear();
foreach (CameraEntry entry in cameras)
{
if (entry == null || entry.camera == null || string.IsNullOrEmpty(entry.id))
{
continue;
}
if (!cameraLookup.ContainsKey(entry.id))
{
cameraLookup.Add(entry.id, entry);
}
}
}
public void SwitchTo(string id)
{
if (string.IsNullOrEmpty(id)) return;
if (!cameraLookup.TryGetValue(id, out CameraEntry entry) || entry.camera == null)
{
Debug.LogWarning($"CameraManager: No camera registered with id '{id}'.", gameObject);
return;
}
SwitchTo(entry.camera);
}
public void SwitchTo(CinemachineVirtualCameraBase targetCamera)
{
if (targetCamera == null) return;
foreach (CameraEntry entry in cameras)
{
if (entry == null || entry.camera == null) continue;
bool isActive = entry.camera == targetCamera;
entry.camera.Priority = isActive ? entry.activePriority : entry.inactivePriority;
if (disableInactiveCameras)
{
entry.camera.gameObject.SetActive(isActive);
}
if (isActive)
{
current = entry;
}
}
}
public CinemachineVirtualCameraBase GetActiveCamera()
{
return current != null ? current.camera : null;
}
public void SetFollow(Transform followTarget)
{
CinemachineVirtualCameraBase cam = GetActiveCamera();
if (cam != null)
{
cam.Follow = followTarget;
}
}
public void SetLookAt(Transform lookTarget)
{
CinemachineVirtualCameraBase cam = GetActiveCamera();
if (cam != null)
{
cam.LookAt = lookTarget;
}
}
public void SetDefaultBlend(string style, float time)
{
if (brain == null)
{
brain = FindAnyObjectByType<CinemachineBrain>();
}
if (brain != null && System.Enum.TryParse<CinemachineBlendDefinition.Styles>(style, out var blendStyle))
{
brain.DefaultBlend = new CinemachineBlendDefinition(blendStyle, time);
}
}
public void RegisterCamera(string id, CinemachineVirtualCameraBase cam, int activePriority = 20, int inactivePriority = 10)
{
if (cam == null || string.IsNullOrEmpty(id)) return;
CameraEntry entry = new CameraEntry
{
id = id,
camera = cam,
activePriority = activePriority,
inactivePriority = inactivePriority
};
cameras.Add(entry);
RebuildLookup();
}
public void UnregisterCamera(string id)
{
if (string.IsNullOrEmpty(id)) return;
for (int i = cameras.Count - 1; i >= 0; i--)
{
if (cameras[i] != null && cameras[i].id == id)
{
cameras.RemoveAt(i);
}
}
RebuildLookup();
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 301957f69b431174f9fb965be9b869db

View File

@@ -1,6 +1,4 @@
using UnityEngine;
using EasyTalk.Controller;
using EasyTalk.Nodes;
public enum NPCType
{
@@ -18,27 +16,11 @@ public class NPC : Character
public string npcName = "NPC";
public NPCType npcType = NPCType.Villager;
[Header("Debug")]
[SerializeField]
private bool enableDebugLogs = false;
[Header("Interaction Capabilities")]
public bool hasDialogue = true;
public bool isQuestGiver = false;
public bool isMerchant = false;
public bool isTrainer = false;
[Header("EasyTalk Integration")]
[Tooltip("The Dialogue asset for this NPC. Will be loaded into the central DialogueController.")]
public Dialogue dialogue;
[Tooltip("Optional: Entry point name for starting dialogue. Leave empty to use default entry point.")]
public string dialogueEntryPoint = "";
[Tooltip("Name of the GameObject with the central DialogueController. Leave empty to auto-find.")]
public string dialogueManagerName = "Manager";
// Cache the central DialogueController
private static DialogueController centralDialogueController;
[Header("Fallback Dialogue (if no EasyTalk)")]
[TextArea(3, 10)]
public string greetingText = "Hello, traveler!";
@@ -58,15 +40,12 @@ public class NPC : Character
/// <summary>
/// Called when player interacts with this NPC
/// </summary>
public virtual void OnInteract(GameObject player)
public override void OnInteract(GameObject player)
{
Log($"Interacting with {npcName} ({npcType})");
if (hasDialogue)
{
ShowDialogue();
}
// Call base implementation (handles look-at and dialogue)
base.OnInteract(player);
// NPC-specific interactions
if (isQuestGiver && !string.IsNullOrEmpty(questId))
{
//OfferQuest(player);
@@ -84,80 +63,18 @@ public class NPC : Character
}
/// <summary>
/// Display dialogue for this NPC using EasyTalk with centralized DialogueController
/// Override to add NPC-specific dialogue fallback
/// </summary>
protected virtual void ShowDialogue()
protected override void ShowDialogue(string entryPoint = null)
{
// Find the central DialogueController if not cached
if (centralDialogueController == null)
base.ShowDialogue(entryPoint);
// Fallback to simple greeting if no dialogue was shown
if (centralDialogueController == null || dialogue == null)
{
centralDialogueController = FindCentralDialogueController();
}
// Check if we have both a controller and dialogue asset
if (centralDialogueController != null && dialogue != null)
{
// Load this NPC's dialogue into the central controller
centralDialogueController.ChangeDialogue(dialogue);
// Play dialogue with optional entry point
if (!string.IsNullOrEmpty(dialogueEntryPoint))
{
centralDialogueController.PlayDialogue(dialogueEntryPoint);
Log($"{npcName}: Starting EasyTalk dialogue at entry point '{dialogueEntryPoint}'");
}
else
{
centralDialogueController.PlayDialogue();
Log($"{npcName}: Starting EasyTalk dialogue");
}
}
else
{
// Fallback to simple greeting if no EasyTalk setup
if (centralDialogueController == null)
{
Debug.LogWarning($"No central DialogueController found. Make sure there's a DialogueController on a GameObject named '{dialogueManagerName}'.", gameObject);
}
if (dialogue == null)
{
Debug.LogWarning($"No Dialogue asset assigned to {npcName}. Assign a Dialogue asset in the inspector.", gameObject);
}
Log($"{npcName}: {greetingText}");
}
}
/// <summary>
/// Finds the central DialogueController in the scene
/// </summary>
private DialogueController FindCentralDialogueController()
{
// First, try to find by the specified manager name
if (!string.IsNullOrEmpty(dialogueManagerName))
{
GameObject manager = GameObject.Find(dialogueManagerName);
if (manager != null)
{
DialogueController controller = manager.GetComponent<DialogueController>();
if (controller != null)
{
Log($"Found central DialogueController on '{dialogueManagerName}'");
return controller;
}
}
}
// Fallback: search for any DialogueController in the scene
DialogueController foundController = FindAnyObjectByType<DialogueController>();
if (foundController != null)
{
Log($"Found DialogueController via FindAnyObjectByType on '{foundController.gameObject.name}'");
return foundController;
}
return null;
}
/// <summary>
/// Offer quest to the player
@@ -277,12 +194,4 @@ public class NPC : Character
// NPCs might drop loot, give quest credit, etc.
base.Die();
}
private void Log(string message)
{
if (enableDebugLogs)
{
Debug.Log(message);
}
}
}

View File

@@ -5,7 +5,7 @@ using UnityEngine.AI;
public class NavMeshMovementController : MonoBehaviour
{
[Header("Movement")]
public float stopDistanceTolerance = 0.1f;
public float stopDistanceTolerance = 0.5f;
[Header("Rotation")]
public bool enableSmartRotation = true;
@@ -53,9 +53,13 @@ public class NavMeshMovementController : MonoBehaviour
}
// Auto-stop when reaching destination
if (!agent.pathPending && agent.remainingDistance <= agent.stoppingDistance + stopDistanceTolerance)
if (!agent.pathPending && agent.hasPath)
{
agent.isStopped = true;
if (agent.remainingDistance <= agent.stoppingDistance + stopDistanceTolerance)
{
agent.isStopped = true;
agent.velocity = Vector3.zero;
}
}
}

View File

@@ -4,8 +4,10 @@ public class Player : Character
{
public static Player current { get; private set; }
void Awake()
protected override void Awake()
{
base.Awake(); // IMPORTANT: Initialize animator and parameters
if (current != null && current != this)
{
Debug.LogWarning("Multiple Player instances detected. Destroying duplicate.", gameObject);

View File

@@ -0,0 +1,131 @@
using UnityEngine;
/// <summary>
/// Basic player combat controller: right-click an enemy to chase and attack in range.
/// </summary>
public class PlayerCombatController : MonoBehaviour
{
[Header("Combat")]
public int attackDamage = 1;
public float attackRange = 1.5f;
public float attackCooldown = 0.6f;
[Tooltip("Maximum chase distance. Clear target if enemy gets farther than this.")]
public float maxChaseDistance = 20f;
[Header("Movement")]
public bool useMovementController = true;
[Header("Debug")]
public bool enableDebugLogs = false;
private Enemy targetEnemy;
private float nextAttackTime = 0f;
private NavMeshMovementController movementController;
private void Awake()
{
movementController = GetComponent<NavMeshMovementController>();
}
private void Update()
{
if (targetEnemy == null) return;
if (targetEnemy.GetCurrentHP() <= 0)
{
Log("Target enemy is dead, clearing combat target");
ClearCombatTarget();
return;
}
float distance = Vector3.Distance(transform.position, targetEnemy.transform.position);
// Auto-clear if enemy goes out of chase range
if (distance > maxChaseDistance)
{
Log($"Enemy out of chase range (distance: {distance:F2}, max: {maxChaseDistance:F2}), clearing target");
ClearCombatTarget();
return;
}
if (useMovementController && movementController != null)
{
if (distance > attackRange)
{
Log($"Moving to enemy (distance: {distance:F2} > attackRange: {attackRange})");
movementController.MoveTo(targetEnemy.transform.position);
}
else
{
Log($"In attack range, stopping (distance: {distance:F2})");
movementController.Stop();
movementController.SetLookTarget(targetEnemy.transform.position);
}
}
if (distance <= attackRange && Time.time >= nextAttackTime)
{
Log($"ATTACKING! Distance: {distance:F2}, Cooldown ready: {Time.time >= nextAttackTime}");
nextAttackTime = Time.time + attackCooldown;
Character character = GetComponent<Character>();
if (character != null)
{
character.TriggerAttack();
}
targetEnemy.TakeDamage(attackDamage);
}
}
public void SetTargetEnemy(Enemy enemy)
{
if (enemy == null) return;
Log($"Setting target: {enemy.enemyName}");
targetEnemy = enemy;
nextAttackTime = Time.time;
// Set weapon type to Melee for combat
Character character = GetComponent<Character>();
if (character != null)
{
character.SetWeaponType(Character.WeaponType.Melee);
}
}
public void ClearCombatTarget()
{
if (targetEnemy != null)
Log($"Clearing target: {targetEnemy.enemyName}");
targetEnemy = null;
// Return to idle weapon state
Character character = GetComponent<Character>();
if (character != null)
{
character.SetWeaponType(Character.WeaponType.None);
}
}
public Enemy GetTargetEnemy() => targetEnemy;
private void Log(string message)
{
if (enableDebugLogs)
{
Debug.Log($"[PlayerCombat] {message}", gameObject);
}
}
private void OnDrawGizmosSelected()
{
// Draw attack range
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, attackRange);
// Draw max chase distance
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, maxChaseDistance);
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 82ad2efd495c74c448c1a7ccf06710dd

View File

@@ -31,6 +31,8 @@ public class QuestTrigger : MonoBehaviour
{
OnTriggerEnter,
OnCollisionEnter,
OnItemPickup,
OnDeath,
Manual
}
@@ -50,12 +52,34 @@ public class QuestTrigger : MonoBehaviour
}
}
/// <summary>
/// Call when an item is picked up (from item pickup scripts)
/// </summary>
public void OnItemPickup(GameObject picker)
{
if (triggerType == TriggerType.OnItemPickup)
{
TryTrigger(picker);
}
}
/// <summary>
/// Call when a target dies (from enemy death scripts)
/// </summary>
public void OnDeath(GameObject deadObject)
{
if (triggerType == TriggerType.OnDeath)
{
TryTrigger(deadObject);
}
}
/// <summary>
/// Manually trigger quest progress (call from other scripts)
/// </summary>
public void ManualTrigger(GameObject triggerer = null)
{
if (triggerType == TriggerType.Manual || triggerType == TriggerType.OnTriggerEnter)
if (triggerType == TriggerType.Manual)
{
TryTrigger(triggerer);
}

View File

@@ -0,0 +1,107 @@
using UnityEngine;
using UnityEngine.Events;
[DisallowMultipleComponent]
[RequireComponent(typeof(Collider))]
public class TriggerEvents : MonoBehaviour
{
[Header("Trigger Conditions")]
[Tooltip("Only trigger once for all events")]
public bool triggerOnce = true;
[Tooltip("Destroy this GameObject after triggering")]
public bool destroyAfterTrigger = false;
[Tooltip("Stop player movement when triggered")]
public bool stopPlayerMovement = true;
[Tooltip("Tag required to trigger (leave empty to ignore)")]
public string requiredTag = "Player";
[Tooltip("Layer mask required to trigger")]
public LayerMask requiredLayers = ~0;
[Header("Events")]
public UnityEvent onEnter;
public UnityEvent onExit;
public UnityEvent onStay;
private bool hasTriggered = false;
private void Reset()
{
Collider collider = GetComponent<Collider>();
if (collider != null)
{
collider.isTrigger = true;
}
}
private void OnTriggerEnter(Collider other)
{
if (!CanTrigger(other)) return;
hasTriggered = true;
// Stop player movement if enabled
if (stopPlayerMovement)
{
StopMovement(other.gameObject);
}
onEnter?.Invoke();
if (destroyAfterTrigger)
{
Destroy(gameObject);
}
}
private void OnTriggerExit(Collider other)
{
if (!CanTrigger(other)) return;
onExit?.Invoke();
}
private void OnTriggerStay(Collider other)
{
if (!CanTrigger(other)) return;
onStay?.Invoke();
}
private bool CanTrigger(Collider other)
{
if (other == null) return false;
if (triggerOnce && hasTriggered) return false;
if (!string.IsNullOrEmpty(requiredTag) && !other.CompareTag(requiredTag))
{
return false;
}
int otherLayerMask = 1 << other.gameObject.layer;
if ((requiredLayers.value & otherLayerMask) == 0)
{
return false;
}
return true;
}
private void StopMovement(GameObject target)
{
if (target == null) return;
// Try NavMeshMovementController first
NavMeshMovementController movementController = target.GetComponent<NavMeshMovementController>();
if (movementController != null)
{
movementController.Stop();
return;
}
// Fallback to NavMeshAgent
UnityEngine.AI.NavMeshAgent agent = target.GetComponent<UnityEngine.AI.NavMeshAgent>();
if (agent != null)
{
agent.isStopped = true;
agent.ResetPath();
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: de1e15f9e006b534fb3a5261c25bab34

View File

@@ -24,6 +24,7 @@ Material:
disabledShaderPasses:
- MOTIONVECTORS
- DepthOnly
- SHADOWCASTER
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -57,7 +58,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 2800000, guid: cf19d52271177d0428e56c9b5bca279a, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
@@ -129,7 +130,7 @@ Material:
- _ZWrite: 0
m_Colors:
- _BaseColor: {r: 1, g: 0, b: 0, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 0, b: 0, a: 1}
- _DiffuseColor: {r: 1, g: 0.47586206, b: 0, a: 1}
- _EmissionColor: {r: 60, g: 1.2413799, b: 0, a: 60}
- _EmissionColorUI: {r: 1, g: 0.020689664, b: 0, a: 1}

View File

@@ -64,7 +64,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 2800000, guid: cf19d52271177d0428e56c9b5bca279a, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:

View File

@@ -64,7 +64,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 2800000, guid: d3de0e72cc53be44384f5a74581eea2b, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:

View File

@@ -64,7 +64,7 @@ Material:
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Texture: {fileID: 2800000, guid: 98cf3250d96197d4d8188a96526fffc1, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:

View File

@@ -3348,6 +3348,9 @@ AnimatorStateTransition:
- m_ConditionMode: 6
m_ConditionEvent: MeleeType_int
m_EventTreshold: 2
- m_ConditionMode: 1
m_ConditionEvent: Shoot_b
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 110240064}
m_Solo: 0
@@ -5320,6 +5323,9 @@ AnimatorStateTransition:
- m_ConditionMode: 6
m_ConditionEvent: MeleeType_int
m_EventTreshold: 1
- m_ConditionMode: 1
m_ConditionEvent: Shoot_b
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 110277130}
m_Solo: 0
@@ -6903,6 +6909,9 @@ AnimatorStateTransition:
- m_ConditionMode: 6
m_ConditionEvent: MeleeType_int
m_EventTreshold: 0
- m_ConditionMode: 1
m_ConditionEvent: Shoot_b
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 110207262}
m_Solo: 0