#168 코뿔소(Rhinoceros) 패턴 작업
This commit is contained in:
parent
9325a07d1b
commit
f4004d2bc2
@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: bbf51270609cd8b4fbb496b691c43c61
|
guid: 11a23da00c57aa641bfb1e0008d6fdd5
|
||||||
folderAsset: yes
|
folderAsset: yes
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
@ -3835,6 +3835,11 @@ PrefabInstance:
|
|||||||
propertyPath: m_Name
|
propertyPath: m_Name
|
||||||
value: RedOrc2
|
value: RedOrc2
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7305287201485691239, guid: fe3183ccc4347734ea166dd7e385a8f7,
|
||||||
|
type: 3}
|
||||||
|
propertyPath: m_IsActive
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
m_RemovedComponents: []
|
m_RemovedComponents: []
|
||||||
m_RemovedGameObjects: []
|
m_RemovedGameObjects: []
|
||||||
m_AddedGameObjects: []
|
m_AddedGameObjects: []
|
||||||
@ -55876,6 +55881,11 @@ PrefabInstance:
|
|||||||
propertyPath: m_Name
|
propertyPath: m_Name
|
||||||
value: RedOrc1
|
value: RedOrc1
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6294429197787252722, guid: b82511a1823faf14f97c60a0e6984872,
|
||||||
|
type: 3}
|
||||||
|
propertyPath: m_IsActive
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
m_RemovedComponents: []
|
m_RemovedComponents: []
|
||||||
m_RemovedGameObjects: []
|
m_RemovedGameObjects: []
|
||||||
m_AddedGameObjects: []
|
m_AddedGameObjects: []
|
||||||
@ -161333,6 +161343,7 @@ GameObject:
|
|||||||
serializedVersion: 6
|
serializedVersion: 6
|
||||||
m_Component:
|
m_Component:
|
||||||
- component: {fileID: 751419040}
|
- component: {fileID: 751419040}
|
||||||
|
- component: {fileID: 751419041}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: CollidableProps
|
m_Name: CollidableProps
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@ -161357,6 +161368,25 @@ Transform:
|
|||||||
- {fileID: 800400055}
|
- {fileID: 800400055}
|
||||||
m_Father: {fileID: 777427179}
|
m_Father: {fileID: 777427179}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &751419041
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 751419039}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 1e3fdca004f2d45fe8abbed571a8abd5, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_OverrideArea: 1
|
||||||
|
m_Area: 1
|
||||||
|
m_OverrideGenerateLinks: 0
|
||||||
|
m_GenerateLinks: 0
|
||||||
|
m_IgnoreFromBuild: 0
|
||||||
|
m_ApplyToChildren: 1
|
||||||
|
m_AffectedAgents: ffffffff
|
||||||
--- !u!1 &752091393
|
--- !u!1 &752091393
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -177304,7 +177334,7 @@ MonoBehaviour:
|
|||||||
IsHidden: 0
|
IsHidden: 0
|
||||||
- Type: 0
|
- Type: 0
|
||||||
Name:
|
Name:
|
||||||
GameObject: {fileID: 549059391}
|
GameObject: {fileID: 0}
|
||||||
Ordinal: 8
|
Ordinal: 8
|
||||||
Priority: 0
|
Priority: 0
|
||||||
IconType: 138500
|
IconType: 138500
|
||||||
@ -177316,7 +177346,7 @@ MonoBehaviour:
|
|||||||
IsHidden: 0
|
IsHidden: 0
|
||||||
- Type: 0
|
- Type: 0
|
||||||
Name:
|
Name:
|
||||||
GameObject: {fileID: 1383322270}
|
GameObject: {fileID: 549059391}
|
||||||
Ordinal: 9
|
Ordinal: 9
|
||||||
Priority: 0
|
Priority: 0
|
||||||
IconType: 138500
|
IconType: 138500
|
||||||
@ -177328,9 +177358,21 @@ MonoBehaviour:
|
|||||||
IsHidden: 0
|
IsHidden: 0
|
||||||
- Type: 0
|
- Type: 0
|
||||||
Name:
|
Name:
|
||||||
GameObject: {fileID: 85768100}
|
GameObject: {fileID: 1383322270}
|
||||||
Ordinal: 10
|
Ordinal: 10
|
||||||
Priority: 0
|
Priority: 0
|
||||||
|
IconType: 138500
|
||||||
|
IconTexture: {fileID: 0}
|
||||||
|
IsIconRecursive: 0
|
||||||
|
BackgroundType: 13000
|
||||||
|
BackgroundTexture: {fileID: 0}
|
||||||
|
IsBackgroundRecursive: 0
|
||||||
|
IsHidden: 0
|
||||||
|
- Type: 0
|
||||||
|
Name:
|
||||||
|
GameObject: {fileID: 85768100}
|
||||||
|
Ordinal: 11
|
||||||
|
Priority: 0
|
||||||
IconType: 169520
|
IconType: 169520
|
||||||
IconTexture: {fileID: 0}
|
IconTexture: {fileID: 0}
|
||||||
IsIconRecursive: 0
|
IsIconRecursive: 0
|
||||||
@ -177341,18 +177383,6 @@ MonoBehaviour:
|
|||||||
- Type: 0
|
- Type: 0
|
||||||
Name:
|
Name:
|
||||||
GameObject: {fileID: 191889754}
|
GameObject: {fileID: 191889754}
|
||||||
Ordinal: 11
|
|
||||||
Priority: 0
|
|
||||||
IconType: 290000
|
|
||||||
IconTexture: {fileID: 0}
|
|
||||||
IsIconRecursive: 0
|
|
||||||
BackgroundType: 0
|
|
||||||
BackgroundTexture: {fileID: 0}
|
|
||||||
IsBackgroundRecursive: 0
|
|
||||||
IsHidden: 0
|
|
||||||
- Type: 0
|
|
||||||
Name:
|
|
||||||
GameObject: {fileID: 1322024545}
|
|
||||||
Ordinal: 12
|
Ordinal: 12
|
||||||
Priority: 0
|
Priority: 0
|
||||||
IconType: 290000
|
IconType: 290000
|
||||||
@ -177364,7 +177394,7 @@ MonoBehaviour:
|
|||||||
IsHidden: 0
|
IsHidden: 0
|
||||||
- Type: 0
|
- Type: 0
|
||||||
Name:
|
Name:
|
||||||
GameObject: {fileID: 2043119554}
|
GameObject: {fileID: 1322024545}
|
||||||
Ordinal: 13
|
Ordinal: 13
|
||||||
Priority: 0
|
Priority: 0
|
||||||
IconType: 290000
|
IconType: 290000
|
||||||
@ -177376,7 +177406,7 @@ MonoBehaviour:
|
|||||||
IsHidden: 0
|
IsHidden: 0
|
||||||
- Type: 0
|
- Type: 0
|
||||||
Name:
|
Name:
|
||||||
GameObject: {fileID: 285952512}
|
GameObject: {fileID: 2043119554}
|
||||||
Ordinal: 14
|
Ordinal: 14
|
||||||
Priority: 0
|
Priority: 0
|
||||||
IconType: 290000
|
IconType: 290000
|
||||||
@ -177388,10 +177418,10 @@ MonoBehaviour:
|
|||||||
IsHidden: 0
|
IsHidden: 0
|
||||||
- Type: 0
|
- Type: 0
|
||||||
Name:
|
Name:
|
||||||
GameObject: {fileID: 223154179}
|
GameObject: {fileID: 285952512}
|
||||||
Ordinal: 15
|
Ordinal: 15
|
||||||
Priority: 0
|
Priority: 0
|
||||||
IconType: 1000
|
IconType: 290000
|
||||||
IconTexture: {fileID: 0}
|
IconTexture: {fileID: 0}
|
||||||
IsIconRecursive: 0
|
IsIconRecursive: 0
|
||||||
BackgroundType: 0
|
BackgroundType: 0
|
||||||
@ -177400,7 +177430,7 @@ MonoBehaviour:
|
|||||||
IsHidden: 0
|
IsHidden: 0
|
||||||
- Type: 0
|
- Type: 0
|
||||||
Name:
|
Name:
|
||||||
GameObject: {fileID: 1221037476}
|
GameObject: {fileID: 223154179}
|
||||||
Ordinal: 16
|
Ordinal: 16
|
||||||
Priority: 0
|
Priority: 0
|
||||||
IconType: 1000
|
IconType: 1000
|
||||||
@ -177412,9 +177442,21 @@ MonoBehaviour:
|
|||||||
IsHidden: 0
|
IsHidden: 0
|
||||||
- Type: 0
|
- Type: 0
|
||||||
Name:
|
Name:
|
||||||
GameObject: {fileID: 1033584364}
|
GameObject: {fileID: 1221037476}
|
||||||
Ordinal: 17
|
Ordinal: 17
|
||||||
Priority: 0
|
Priority: 0
|
||||||
|
IconType: 1000
|
||||||
|
IconTexture: {fileID: 0}
|
||||||
|
IsIconRecursive: 0
|
||||||
|
BackgroundType: 0
|
||||||
|
BackgroundTexture: {fileID: 0}
|
||||||
|
IsBackgroundRecursive: 0
|
||||||
|
IsHidden: 0
|
||||||
|
- Type: 0
|
||||||
|
Name:
|
||||||
|
GameObject: {fileID: 1033584364}
|
||||||
|
Ordinal: 18
|
||||||
|
Priority: 0
|
||||||
IconType: 161000
|
IconType: 161000
|
||||||
IconTexture: {fileID: 0}
|
IconTexture: {fileID: 0}
|
||||||
IsIconRecursive: 0
|
IsIconRecursive: 0
|
||||||
@ -177425,7 +177467,7 @@ MonoBehaviour:
|
|||||||
- Type: 0
|
- Type: 0
|
||||||
Name:
|
Name:
|
||||||
GameObject: {fileID: 2046550838}
|
GameObject: {fileID: 2046550838}
|
||||||
Ordinal: 18
|
Ordinal: 19
|
||||||
Priority: 0
|
Priority: 0
|
||||||
IconType: 161000
|
IconType: 161000
|
||||||
IconTexture: {fileID: 0}
|
IconTexture: {fileID: 0}
|
||||||
@ -182360,6 +182402,69 @@ MeshFilter:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 845611084}
|
m_GameObject: {fileID: 845611084}
|
||||||
m_Mesh: {fileID: -2072209373316696021, guid: a4438a8ede1e65045b8f2af44f8e5587, type: 3}
|
m_Mesh: {fileID: -2072209373316696021, guid: a4438a8ede1e65045b8f2af44f8e5587, type: 3}
|
||||||
|
--- !u!1 &847549924
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 847549926}
|
||||||
|
- component: {fileID: 847549925}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: NavMeshSurface
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!114 &847549925
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 847549924}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 7a5ac11cc976e418e8d13136b07e1f52, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_AgentTypeID: -334000983
|
||||||
|
m_CollectObjects: 3
|
||||||
|
m_Size: {x: 10, y: 10, z: 10}
|
||||||
|
m_Center: {x: 0, y: 2, z: 0}
|
||||||
|
m_LayerMask:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 4294967295
|
||||||
|
m_UseGeometry: 0
|
||||||
|
m_DefaultArea: 0
|
||||||
|
m_GenerateLinks: 0
|
||||||
|
m_IgnoreNavMeshAgent: 1
|
||||||
|
m_IgnoreNavMeshObstacle: 1
|
||||||
|
m_OverrideTileSize: 0
|
||||||
|
m_TileSize: 256
|
||||||
|
m_OverrideVoxelSize: 0
|
||||||
|
m_VoxelSize: 0.5
|
||||||
|
m_MinRegionArea: 2
|
||||||
|
m_NavMeshData: {fileID: 23800000, guid: 67a241bba6326594fad03e9f4778fd67, type: 2}
|
||||||
|
m_BuildHeightMesh: 0
|
||||||
|
--- !u!4 &847549926
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 847549924}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!1001 &847675453
|
--- !u!1001 &847675453
|
||||||
PrefabInstance:
|
PrefabInstance:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -188362,6 +188467,76 @@ MeshFilter:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 871972808}
|
m_GameObject: {fileID: 871972808}
|
||||||
m_Mesh: {fileID: 877145102505475392, guid: e6acc74d2dca97b4a9d57fb44c4c52e2, type: 3}
|
m_Mesh: {fileID: 877145102505475392, guid: e6acc74d2dca97b4a9d57fb44c4c52e2, type: 3}
|
||||||
|
--- !u!1 &872439966
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 872439967}
|
||||||
|
- component: {fileID: 872439969}
|
||||||
|
- component: {fileID: 872439968}
|
||||||
|
m_Layer: 21
|
||||||
|
m_Name: BossPortal
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &872439967
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 872439966}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 150.38, y: 0, z: -163.03}
|
||||||
|
m_LocalScale: {x: 5.0656, y: 4.2452, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 1221037477}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &872439968
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 872439966}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 505719451d226d54ab182554fdd8e664, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
playerSpawnPosObj: {fileID: 0}
|
||||||
|
bossController: {fileID: 1221037478}
|
||||||
|
bossEntranceObstacles:
|
||||||
|
- {fileID: 1780331645}
|
||||||
|
--- !u!65 &872439969
|
||||||
|
BoxCollider:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 872439966}
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_IncludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_ExcludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_LayerOverridePriority: 0
|
||||||
|
m_IsTrigger: 1
|
||||||
|
m_ProvidesContacts: 0
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 3
|
||||||
|
m_Size: {x: 1, y: 1, z: 1}
|
||||||
|
m_Center: {x: 0, y: 0, z: 0}
|
||||||
--- !u!1 &872441705
|
--- !u!1 &872441705
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -191354,7 +191529,7 @@ MonoBehaviour:
|
|||||||
m_OverrideTileSize: 0
|
m_OverrideTileSize: 0
|
||||||
m_TileSize: 256
|
m_TileSize: 256
|
||||||
m_OverrideVoxelSize: 0
|
m_OverrideVoxelSize: 0
|
||||||
m_VoxelSize: 0.13333334
|
m_VoxelSize: 0.5
|
||||||
m_MinRegionArea: 2
|
m_MinRegionArea: 2
|
||||||
m_NavMeshData: {fileID: 23800000, guid: 248a5d84e6704f242aaf236a312d9c69, type: 2}
|
m_NavMeshData: {fileID: 23800000, guid: 248a5d84e6704f242aaf236a312d9c69, type: 2}
|
||||||
m_BuildHeightMesh: 0
|
m_BuildHeightMesh: 0
|
||||||
@ -237547,6 +237722,7 @@ GameObject:
|
|||||||
serializedVersion: 6
|
serializedVersion: 6
|
||||||
m_Component:
|
m_Component:
|
||||||
- component: {fileID: 1095906254}
|
- component: {fileID: 1095906254}
|
||||||
|
- component: {fileID: 1095906255}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: Grounds
|
m_Name: Grounds
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@ -237571,6 +237747,25 @@ Transform:
|
|||||||
- {fileID: 678473477}
|
- {fileID: 678473477}
|
||||||
m_Father: {fileID: 1221037477}
|
m_Father: {fileID: 1221037477}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &1095906255
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1095906253}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 1e3fdca004f2d45fe8abbed571a8abd5, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_OverrideArea: 1
|
||||||
|
m_Area: 0
|
||||||
|
m_OverrideGenerateLinks: 0
|
||||||
|
m_GenerateLinks: 0
|
||||||
|
m_IgnoreFromBuild: 0
|
||||||
|
m_ApplyToChildren: 1
|
||||||
|
m_AffectedAgents: ffffffff
|
||||||
--- !u!1 &1095964192
|
--- !u!1 &1095964192
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -241359,6 +241554,11 @@ PrefabInstance:
|
|||||||
propertyPath: m_Name
|
propertyPath: m_Name
|
||||||
value: RedOrc1 (1)
|
value: RedOrc1 (1)
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6294429197787252722, guid: b82511a1823faf14f97c60a0e6984872,
|
||||||
|
type: 3}
|
||||||
|
propertyPath: m_IsActive
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
m_RemovedComponents: []
|
m_RemovedComponents: []
|
||||||
m_RemovedGameObjects: []
|
m_RemovedGameObjects: []
|
||||||
m_AddedGameObjects: []
|
m_AddedGameObjects: []
|
||||||
@ -264339,6 +264539,11 @@ PrefabInstance:
|
|||||||
propertyPath: m_Name
|
propertyPath: m_Name
|
||||||
value: RedOrc1 (2)
|
value: RedOrc1 (2)
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 6294429197787252722, guid: b82511a1823faf14f97c60a0e6984872,
|
||||||
|
type: 3}
|
||||||
|
propertyPath: m_IsActive
|
||||||
|
value: 1
|
||||||
|
objectReference: {fileID: 0}
|
||||||
m_RemovedComponents: []
|
m_RemovedComponents: []
|
||||||
m_RemovedGameObjects: []
|
m_RemovedGameObjects: []
|
||||||
m_AddedGameObjects: []
|
m_AddedGameObjects: []
|
||||||
@ -266703,6 +266908,7 @@ GameObject:
|
|||||||
serializedVersion: 6
|
serializedVersion: 6
|
||||||
m_Component:
|
m_Component:
|
||||||
- component: {fileID: 1221037477}
|
- component: {fileID: 1221037477}
|
||||||
|
- component: {fileID: 1221037478}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: DesertBossArea
|
m_Name: DesertBossArea
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
@ -266726,9 +266932,29 @@ Transform:
|
|||||||
- {fileID: 1095906254}
|
- {fileID: 1095906254}
|
||||||
- {fileID: 777427179}
|
- {fileID: 777427179}
|
||||||
- {fileID: 1695233646}
|
- {fileID: 1695233646}
|
||||||
|
- {fileID: 1879350455}
|
||||||
- {fileID: 1598597191}
|
- {fileID: 1598597191}
|
||||||
|
- {fileID: 872439967}
|
||||||
|
- {fileID: 1780331644}
|
||||||
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 &1221037478
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1221037476}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 3ee283b48c3d38c4690a7711c3276571, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
<BossPrefab>k__BackingField: {fileID: 1907803032604947452, guid: 9ea7800dae26e5f4bbbfba64b7e9485a,
|
||||||
|
type: 3}
|
||||||
|
<BossSpawnTransform>k__BackingField: {fileID: 1695233646}
|
||||||
|
<PlayerSpawnTransform>k__BackingField: {fileID: 1879350455}
|
||||||
|
bossInstantiateLocation: {fileID: 1598597191}
|
||||||
--- !u!1 &1221375644
|
--- !u!1 &1221375644
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -368506,7 +368732,7 @@ Transform:
|
|||||||
m_GameObject: {fileID: 1695233645}
|
m_GameObject: {fileID: 1695233645}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||||
m_LocalPosition: {x: 150.5, y: 0, z: -173}
|
m_LocalPosition: {x: 150, y: 0, z: -150}
|
||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children: []
|
m_Children: []
|
||||||
@ -375293,7 +375519,7 @@ GameObject:
|
|||||||
m_Component:
|
m_Component:
|
||||||
- component: {fileID: 1729365191}
|
- component: {fileID: 1729365191}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: ForestSpawnPosition
|
m_Name: PlayerSpawnPosition
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
m_Icon: {fileID: 5132851093641282708, guid: 0000000000000000d000000000000000, type: 0}
|
m_Icon: {fileID: 5132851093641282708, guid: 0000000000000000d000000000000000, type: 0}
|
||||||
m_NavMeshLayer: 0
|
m_NavMeshLayer: 0
|
||||||
@ -385987,6 +386213,59 @@ PrefabInstance:
|
|||||||
m_AddedGameObjects: []
|
m_AddedGameObjects: []
|
||||||
m_AddedComponents: []
|
m_AddedComponents: []
|
||||||
m_SourcePrefab: {fileID: 100100000, guid: 2e8bbf453e01df4419a1c58dc64996be, type: 3}
|
m_SourcePrefab: {fileID: 100100000, guid: 2e8bbf453e01df4419a1c58dc64996be, type: 3}
|
||||||
|
--- !u!1 &1780331643
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 1780331644}
|
||||||
|
- component: {fileID: 1780331645}
|
||||||
|
m_Layer: 21
|
||||||
|
m_Name: BossEntranceObstacle
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &1780331644
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1780331643}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 150.38, y: 0, z: -165.39}
|
||||||
|
m_LocalScale: {x: 5.0656, y: 4.2452, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 1221037477}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!65 &1780331645
|
||||||
|
BoxCollider:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1780331643}
|
||||||
|
m_Material: {fileID: 0}
|
||||||
|
m_IncludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_ExcludeLayers:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_LayerOverridePriority: 0
|
||||||
|
m_IsTrigger: 0
|
||||||
|
m_ProvidesContacts: 0
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 3
|
||||||
|
m_Size: {x: 1, y: 1, z: 1}
|
||||||
|
m_Center: {x: 0, y: 0, z: 0}
|
||||||
--- !u!1 &1780541748
|
--- !u!1 &1780541748
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -407069,6 +407348,37 @@ MeshFilter:
|
|||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
m_GameObject: {fileID: 1879268411}
|
m_GameObject: {fileID: 1879268411}
|
||||||
m_Mesh: {fileID: -6657265976162632719, guid: 6d6fa4529dae6034c922617ae8409407, type: 3}
|
m_Mesh: {fileID: -6657265976162632719, guid: 6d6fa4529dae6034c922617ae8409407, type: 3}
|
||||||
|
--- !u!1 &1879350454
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 1879350455}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: PlayerSpawnPosition
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 5132851093641282708, guid: 0000000000000000d000000000000000, type: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &1879350455
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1879350454}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||||
|
m_LocalPosition: {x: 150.5, y: 0, z: -173}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 1221037477}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!1 &1879875187
|
--- !u!1 &1879875187
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -479345,7 +479655,8 @@ MonoBehaviour:
|
|||||||
m_Name:
|
m_Name:
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
playerSpawnPosObj: {fileID: 432863286}
|
playerSpawnPosObj: {fileID: 432863286}
|
||||||
fieldBoss: {fileID: 6569975607144876776}
|
bossController: {fileID: 0}
|
||||||
|
bossEntranceObstacles: []
|
||||||
--- !u!65 &2604109505574073398
|
--- !u!65 &2604109505574073398
|
||||||
BoxCollider:
|
BoxCollider:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -488786,12 +489097,22 @@ PrefabInstance:
|
|||||||
type: 3}
|
type: 3}
|
||||||
propertyPath: '<MyComponents>k__BackingField.spawnPosition.Array.data[1]'
|
propertyPath: '<MyComponents>k__BackingField.spawnPosition.Array.data[1]'
|
||||||
value:
|
value:
|
||||||
objectReference: {fileID: 1695233646}
|
objectReference: {fileID: 1879350455}
|
||||||
- target: {fileID: 2391945466483065398, guid: d9472bd7185627847ae4d5b1d3d3bb8a,
|
- target: {fileID: 2391945466483065398, guid: d9472bd7185627847ae4d5b1d3d3bb8a,
|
||||||
type: 3}
|
type: 3}
|
||||||
propertyPath: m_Name
|
propertyPath: m_Name
|
||||||
value: CombatPlayer
|
value: CombatPlayer
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 2391945466483065398, guid: d9472bd7185627847ae4d5b1d3d3bb8a,
|
||||||
|
type: 3}
|
||||||
|
propertyPath: m_TagString
|
||||||
|
value: CombatPlayer
|
||||||
|
objectReference: {fileID: 0}
|
||||||
|
- target: {fileID: 7729150195808218711, guid: d9472bd7185627847ae4d5b1d3d3bb8a,
|
||||||
|
type: 3}
|
||||||
|
propertyPath: m_Mass
|
||||||
|
value: 10
|
||||||
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 8934240191915016273, guid: d9472bd7185627847ae4d5b1d3d3bb8a,
|
- target: {fileID: 8934240191915016273, guid: d9472bd7185627847ae4d5b1d3d3bb8a,
|
||||||
type: 3}
|
type: 3}
|
||||||
propertyPath: m_LocalPosition.x
|
propertyPath: m_LocalPosition.x
|
||||||
@ -492711,18 +493032,6 @@ Transform:
|
|||||||
type: 3}
|
type: 3}
|
||||||
m_PrefabInstance: {fileID: 6569975607144876774}
|
m_PrefabInstance: {fileID: 6569975607144876774}
|
||||||
m_PrefabAsset: {fileID: 0}
|
m_PrefabAsset: {fileID: 0}
|
||||||
--- !u!114 &6569975607144876776 stripped
|
|
||||||
MonoBehaviour:
|
|
||||||
m_CorrespondingSourceObject: {fileID: 7556135373767129943, guid: 211c62e69325b584bb719f236f0e2d5c,
|
|
||||||
type: 3}
|
|
||||||
m_PrefabInstance: {fileID: 6569975607144876774}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 1160947005}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_EditorHideFlags: 0
|
|
||||||
m_Script: {fileID: 11500000, guid: 53a5952d905610548b93367641aa8244, type: 3}
|
|
||||||
m_Name:
|
|
||||||
m_EditorClassIdentifier:
|
|
||||||
--- !u!64 &6569975607144876780
|
--- !u!64 &6569975607144876780
|
||||||
MeshCollider:
|
MeshCollider:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -504340,6 +504649,7 @@ SceneRoots:
|
|||||||
- {fileID: 1816611989}
|
- {fileID: 1816611989}
|
||||||
- {fileID: 85768103}
|
- {fileID: 85768103}
|
||||||
- {fileID: 269653247}
|
- {fileID: 269653247}
|
||||||
|
- {fileID: 847549926}
|
||||||
- {fileID: 2046550842}
|
- {fileID: 2046550842}
|
||||||
- {fileID: 1033584370}
|
- {fileID: 1033584370}
|
||||||
- {fileID: 1719893244}
|
- {fileID: 1719893244}
|
||||||
|
Binary file not shown.
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 67a241bba6326594fad03e9f4778fd67
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 23800000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 31dac17fce1ca4b4ba03670c1a4102d9
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 23800000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
BIN
BlueWater/Assets/01.Scenes/02.Ocean/NavMesh-NavMeshSurface.asset
Normal file
BIN
BlueWater/Assets/01.Scenes/02.Ocean/NavMesh-NavMeshSurface.asset
Normal file
Binary file not shown.
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c770fc6f65a9f504489a477abd678a56
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 23800000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
Binary file not shown.
@ -7,23 +7,35 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
public class AiWeight : MonoBehaviour
|
public class AiWeight : MonoBehaviour
|
||||||
{
|
{
|
||||||
|
/***********************************************************************
|
||||||
|
* Definitions
|
||||||
|
***********************************************************************/
|
||||||
|
#region Definitions
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
private struct DirectionInfo
|
private struct DirectionInfo
|
||||||
{
|
{
|
||||||
public bool hit; // 장애물 충돌 여부
|
public RaycastHit RaycastHit { get; set; }
|
||||||
public Vector3 direction; // 방향 노말값
|
[field: SerializeField] public Vector3 Direction { get; set; }
|
||||||
public float interest; // 호기심 수치
|
[field: SerializeField] public float Interest { get; set; }
|
||||||
public float danger; // 위험 수치
|
[field: SerializeField] public float Danger { get; set; }
|
||||||
|
|
||||||
public DirectionInfo(bool hit, Vector3 direction, float interest, float danger)
|
public DirectionInfo(RaycastHit raycastHit, Vector3 direction, float interest, float danger)
|
||||||
{
|
{
|
||||||
this.hit = hit;
|
RaycastHit = raycastHit;
|
||||||
this.direction = direction;
|
Direction = direction;
|
||||||
this.interest = interest;
|
Interest = interest;
|
||||||
this.danger = danger;
|
Danger = danger;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Variables
|
||||||
|
***********************************************************************/
|
||||||
|
#region Variables
|
||||||
|
|
||||||
[field: Tooltip("Scene뷰에서의 가중치 시스템 가시화 여부")]
|
[field: Tooltip("Scene뷰에서의 가중치 시스템 가시화 여부")]
|
||||||
[field: SerializeField] private bool drawGizmo = true;
|
[field: SerializeField] private bool drawGizmo = true;
|
||||||
|
|
||||||
@ -45,8 +57,27 @@ namespace BlueWaterProject
|
|||||||
[field: Tooltip("장애물 최대 인지 거리")]
|
[field: Tooltip("장애물 최대 인지 거리")]
|
||||||
[field: SerializeField] private float obstacleDist = 5f;
|
[field: SerializeField] private float obstacleDist = 5f;
|
||||||
|
|
||||||
|
[Range(1, 36), Tooltip("방향의 갯수")]
|
||||||
|
[SerializeField] private int directionIndex = 24;
|
||||||
|
public int DirectionIndex
|
||||||
|
{
|
||||||
|
get => directionIndex;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
directionIndex = value;
|
||||||
|
directionInfo = new DirectionInfo[DirectionIndex];
|
||||||
|
|
||||||
|
var angle = 360f / directionInfo.Length;
|
||||||
|
for (var i = 0; i < directionInfo.Length; i++)
|
||||||
|
{
|
||||||
|
var direction = Utils.AngleToDir(angle * i);
|
||||||
|
directionInfo[i] = new DirectionInfo(default, direction, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[field: Tooltip("방향이 가지는 구조체의 배열")]
|
[field: Tooltip("방향이 가지는 구조체의 배열")]
|
||||||
[field: SerializeField] private DirectionInfo[] directionInfo = new DirectionInfo[24];
|
[field: SerializeField] private DirectionInfo[] directionInfo;
|
||||||
|
|
||||||
[field: Tooltip("현재 공전 중일 때, 해당 방향의 위험 수치가 설정한 값 이상일 경우, 반대편 회전")]
|
[field: Tooltip("현재 공전 중일 때, 해당 방향의 위험 수치가 설정한 값 이상일 경우, 반대편 회전")]
|
||||||
[field: SerializeField] private float dangerValue = 0.8f;
|
[field: SerializeField] private float dangerValue = 0.8f;
|
||||||
@ -68,18 +99,13 @@ namespace BlueWaterProject
|
|||||||
[field: SerializeField] public bool isAvoiding;
|
[field: SerializeField] public bool isAvoiding;
|
||||||
|
|
||||||
private bool usedWeighted;
|
private bool usedWeighted;
|
||||||
|
|
||||||
private void Reset()
|
#endregion
|
||||||
{
|
|
||||||
drawGizmo = true;
|
/***********************************************************************
|
||||||
maxDistance = 10f;
|
* Unity Methods
|
||||||
minDistance = 3f;
|
***********************************************************************/
|
||||||
orbitDistance = 2f;
|
#region Unity Methods
|
||||||
orbitAllowableValue = 2f;
|
|
||||||
obstacleDist = 5f;
|
|
||||||
directionInfo = new DirectionInfo[24];
|
|
||||||
dangerValue = 0.8f;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
private void OnDrawGizmos()
|
private void OnDrawGizmos()
|
||||||
@ -90,26 +116,41 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
var myPos = transform.position;
|
var myPos = transform.position;
|
||||||
|
|
||||||
Gizmos.color = GetFinalDirectionValue().direction == directionInfo[i].direction
|
Gizmos.color = GetFinalDirectionValue().Direction == directionInfo[i].Direction
|
||||||
? Color.green
|
? Color.green
|
||||||
: Color.white;
|
: Color.white;
|
||||||
|
|
||||||
var resultWeighted = Mathf.Clamp(directionInfo[i].interest - directionInfo[i].danger, 0f, 1f);
|
var resultWeighted = Mathf.Clamp(directionInfo[i].Interest - directionInfo[i].Danger, 0f, 1f);
|
||||||
Gizmos.DrawLine(myPos, myPos + directionInfo[i].direction * resultWeighted);
|
Gizmos.DrawLine(myPos, myPos + directionInfo[i].Direction * resultWeighted);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private void Awake()
|
private void Update()
|
||||||
{
|
{
|
||||||
var angle = 360f / directionInfo.Length;
|
GetDirectionRaycastHit(transform.position);
|
||||||
for (var i = 0; i < directionInfo.Length; i++)
|
|
||||||
{
|
|
||||||
var direction = Utils.AngleToDir(angle * i + 5);
|
|
||||||
directionInfo[i] = new DirectionInfo(false, direction, 0, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void GetDirectionRaycastHit(Vector3 startPosition)
|
||||||
|
{
|
||||||
|
// 각 방향에 대한 raycastHit 정보 받아두기
|
||||||
|
for (var i = 0; i < directionInfo.Length; i++)
|
||||||
|
{
|
||||||
|
Physics.Raycast(startPosition, directionInfo[i].Direction, out var hit, obstacleDist,obstacleWeightLayer, QueryTriggerInteraction.Ignore);
|
||||||
|
|
||||||
|
directionInfo[i].RaycastHit = hit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Methods
|
||||||
|
***********************************************************************/
|
||||||
|
#region Methods
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Update()에서 사용하는 Enemy의 가중치 시스템
|
/// Update()에서 사용하는 Enemy의 가중치 시스템
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -131,7 +172,7 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
usedWeighted = true;
|
usedWeighted = true;
|
||||||
SetWeights(distanceToTarget, directionToTarget, resultDirection);
|
SetWeights(distanceToTarget, directionToTarget, resultDirection);
|
||||||
MoveTowardDirection(agent, transform.position + CalcDirectionInfo().direction, targetTransform,
|
MoveTowardDirection(agent, transform.position + CalcDirectionInfo().Direction, targetTransform,
|
||||||
rotationTransform, canLookAtTarget);
|
rotationTransform, canLookAtTarget);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,21 +181,21 @@ namespace BlueWaterProject
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void CheckObstacle()
|
private void CheckObstacle()
|
||||||
{
|
{
|
||||||
for (var i = 0; i < directionInfo.Length; i++)
|
// for (var i = 0; i < directionInfo.Length; i++)
|
||||||
{
|
// {
|
||||||
if (Physics.Raycast(transform.position, directionInfo[i].direction, out var hit, obstacleDist,
|
// if (Physics.Raycast(transform.position, directionInfo[i].Direction, out var hit, obstacleDist,
|
||||||
obstacleWeightLayer))
|
// obstacleWeightLayer))
|
||||||
{
|
// {
|
||||||
var obstacleFactor = (obstacleDist - hit.distance) / obstacleDist;
|
// var obstacleFactor = (obstacleDist - hit.distance) / obstacleDist;
|
||||||
directionInfo[i].danger = obstacleFactor;
|
// directionInfo[i].Danger = obstacleFactor;
|
||||||
directionInfo[i].hit = true;
|
// directionInfo[i].hit = true;
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
directionInfo[i].danger = 0f;
|
// directionInfo[i].Danger = 0f;
|
||||||
directionInfo[i].hit = false;
|
// directionInfo[i].hit = false;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -169,9 +210,9 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
usedWeighted = false;
|
usedWeighted = false;
|
||||||
SetBeInOrBitAndIsAvoiding(false, false);
|
SetBeInOrBitAndIsAvoiding(false, false);
|
||||||
if (Vector3.Dot(directionInfo[i].direction, directionToTarget) > 0.7f)
|
if (Vector3.Dot(directionInfo[i].Direction, directionToTarget) > 0.7f)
|
||||||
{
|
{
|
||||||
directionInfo[i].interest = 1f;
|
directionInfo[i].Interest = 1f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((!beInOrbit && distanceToTarget > minDistance) ||
|
else if ((!beInOrbit && distanceToTarget > minDistance) ||
|
||||||
@ -179,23 +220,23 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
usedWeighted = true;
|
usedWeighted = true;
|
||||||
SetBeInOrBitAndIsAvoiding(false, false);
|
SetBeInOrBitAndIsAvoiding(false, false);
|
||||||
directionInfo[i].interest =
|
directionInfo[i].Interest =
|
||||||
Mathf.Clamp(Vector3.Dot(directionInfo[i].direction, directionToTarget), 0, 1)
|
Mathf.Clamp(Vector3.Dot(directionInfo[i].Direction, directionToTarget), 0, 1)
|
||||||
- directionInfo[i].danger;
|
- directionInfo[i].Danger;
|
||||||
}
|
}
|
||||||
else if (distanceToTarget > orbitDistance)
|
else if (distanceToTarget > orbitDistance)
|
||||||
{
|
{
|
||||||
usedWeighted = true;
|
usedWeighted = true;
|
||||||
SetBeInOrBitAndIsAvoiding(true, false);
|
SetBeInOrBitAndIsAvoiding(true, false);
|
||||||
directionInfo[i].interest = Mathf.Clamp(Vector3.Dot(directionInfo[i].direction, resultDir), 0, 1)
|
directionInfo[i].Interest = Mathf.Clamp(Vector3.Dot(directionInfo[i].Direction, resultDir), 0, 1)
|
||||||
- directionInfo[i].danger;
|
- directionInfo[i].Danger;
|
||||||
}
|
}
|
||||||
else if (distanceToTarget <= orbitDistance)
|
else if (distanceToTarget <= orbitDistance)
|
||||||
{
|
{
|
||||||
usedWeighted = true;
|
usedWeighted = true;
|
||||||
SetBeInOrBitAndIsAvoiding(false, true);
|
SetBeInOrBitAndIsAvoiding(false, true);
|
||||||
directionInfo[i].interest =
|
directionInfo[i].Interest =
|
||||||
Mathf.Clamp(Vector3.Dot(directionInfo[i].direction, -directionToTarget), 0, 1);
|
Mathf.Clamp(Vector3.Dot(directionInfo[i].Direction, -directionToTarget), 0, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -205,7 +246,7 @@ namespace BlueWaterProject
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private Vector3 CheckTurnAround(Vector3 resultDir, Vector3 directionToTarget)
|
private Vector3 CheckTurnAround(Vector3 resultDir, Vector3 directionToTarget)
|
||||||
{
|
{
|
||||||
if (beInOrbit || directionInfo[GetDirectionIndex(resultDir)].danger < dangerValue) return resultDir;
|
if (beInOrbit || directionInfo[GetDirectionIndex(resultDir)].Danger < dangerValue) return resultDir;
|
||||||
|
|
||||||
isClockwise = !isClockwise;
|
isClockwise = !isClockwise;
|
||||||
return SetResultDirection(directionToTarget);
|
return SetResultDirection(directionToTarget);
|
||||||
@ -253,9 +294,9 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
for (var i = 0; i < directionInfo.Length; i++)
|
for (var i = 0; i < directionInfo.Length; i++)
|
||||||
{
|
{
|
||||||
if (directionInfo[i].interest <= bestWeight) continue;
|
if (directionInfo[i].Interest <= bestWeight) continue;
|
||||||
|
|
||||||
bestWeight = directionInfo[i].interest;
|
bestWeight = directionInfo[i].Interest;
|
||||||
bestDirectionIndex = i;
|
bestDirectionIndex = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -272,7 +313,7 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
for (var i = 0; i < directionInfo.Length; i++)
|
for (var i = 0; i < directionInfo.Length; i++)
|
||||||
{
|
{
|
||||||
var finalInterestValue = Mathf.Clamp(directionInfo[i].interest - directionInfo[i].danger, 0f, 1f);
|
var finalInterestValue = Mathf.Clamp(directionInfo[i].Interest - directionInfo[i].Danger, 0f, 1f);
|
||||||
if (finalInterestValue <= bestWeight) continue;
|
if (finalInterestValue <= bestWeight) continue;
|
||||||
|
|
||||||
bestWeight = finalInterestValue;
|
bestWeight = finalInterestValue;
|
||||||
@ -292,7 +333,7 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
for (var i = 0; i < directionInfo.Length; i++)
|
for (var i = 0; i < directionInfo.Length; i++)
|
||||||
{
|
{
|
||||||
var dotValue = Vector3.Dot(directionInfo[i].direction, direction);
|
var dotValue = Vector3.Dot(directionInfo[i].Direction, direction);
|
||||||
|
|
||||||
if (maxDotValue >= dotValue) continue;
|
if (maxDotValue >= dotValue) continue;
|
||||||
|
|
||||||
@ -320,5 +361,16 @@ namespace BlueWaterProject
|
|||||||
beInOrbit = beInOrbitValue;
|
beInOrbit = beInOrbitValue;
|
||||||
isAvoiding = isAvoidingValue;
|
isAvoiding = isAvoidingValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 각도를 통해 방향값을 반환하는 함수
|
||||||
|
/// </summary>
|
||||||
|
private Vector3 AngleToDir(float angle)
|
||||||
|
{
|
||||||
|
var radian = angle * Mathf.Deg2Rad;
|
||||||
|
return new Vector3(Mathf.Sin(radian), 0f, Mathf.Cos(radian)).normalized;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e4569d9c2e381c5449ca2d04ff1bd70c
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 786e4a88bcdbf714a81520b648e68c91
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using BehaviorDesigner.Runtime;
|
|
||||||
using BehaviorDesigner.Runtime.Tasks;
|
using BehaviorDesigner.Runtime.Tasks;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using Action = BehaviorDesigner.Runtime.Tasks.Action;
|
using Action = BehaviorDesigner.Runtime.Tasks.Action;
|
||||||
@ -9,25 +8,25 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
[TaskCategory("Custom/FieldBossAction")]
|
[TaskCategory("Custom/FieldBossAction")]
|
||||||
[Serializable]
|
[Serializable]
|
||||||
public class ExecuteSkill : Action
|
public class ActivateSkill : Action
|
||||||
{
|
{
|
||||||
[SerializeField] private SharedInt skillIndex;
|
[SerializeField] private string skillName;
|
||||||
|
|
||||||
private FieldBoss fieldBoss;
|
private FieldBoss fieldBoss;
|
||||||
|
|
||||||
public override void OnAwake()
|
public override void OnAwake()
|
||||||
{
|
{
|
||||||
fieldBoss = GetComponent<FieldBoss>();
|
fieldBoss = transform.GetComponent<FieldBoss>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnStart()
|
public override void OnStart()
|
||||||
{
|
{
|
||||||
fieldBoss.ExecuteActiveSkill(fieldBoss.GetActiveSkillList()[skillIndex.Value]);
|
fieldBoss.ActivateSkill(skillName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override TaskStatus OnUpdate()
|
public override TaskStatus OnUpdate()
|
||||||
{
|
{
|
||||||
return fieldBoss.GetUsedSkillCoroutine() ? TaskStatus.Running : TaskStatus.Success;
|
return fieldBoss.IsUsingSkill ? TaskStatus.Running : TaskStatus.Success;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,36 @@
|
|||||||
|
// using System;
|
||||||
|
// using BehaviorDesigner.Runtime.Tasks;
|
||||||
|
// using UnityEngine;
|
||||||
|
//
|
||||||
|
// // ReSharper disable once CheckNamespace
|
||||||
|
// namespace BlueWaterProject
|
||||||
|
// {
|
||||||
|
// [TaskCategory("Custom/FieldBossConditional")]
|
||||||
|
// [Serializable]
|
||||||
|
// public class CompareDistance : Conditional
|
||||||
|
// {
|
||||||
|
// [SerializeField] private float maxDistance = 3f;
|
||||||
|
//
|
||||||
|
// private FieldBoss fieldBoss;
|
||||||
|
//
|
||||||
|
// public override void OnAwake()
|
||||||
|
// {
|
||||||
|
// fieldBoss = GetComponent<FieldBoss>();
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public override TaskStatus OnUpdate()
|
||||||
|
// {
|
||||||
|
// var targetBounds = fieldBoss.Target.bounds;
|
||||||
|
// var targetPos = targetBounds.min;
|
||||||
|
// targetPos.x = targetBounds.center.x;
|
||||||
|
// targetPos.z = targetBounds.center.z;
|
||||||
|
//
|
||||||
|
// var myBounds = fieldBoss.MyCollider.bounds;
|
||||||
|
// var myPos = myBounds.min;
|
||||||
|
// myPos.x = myBounds.center.x;
|
||||||
|
// myPos.z = myBounds.center.z;
|
||||||
|
//
|
||||||
|
// return Vector3.Distance(targetPos, myPos) <= maxDistance ? TaskStatus.Success : TaskStatus.Failure;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
@ -0,0 +1,33 @@
|
|||||||
|
using System;
|
||||||
|
using BehaviorDesigner.Runtime.Tasks;
|
||||||
|
using UnityEngine;
|
||||||
|
using Action = BehaviorDesigner.Runtime.Tasks.Action;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace BlueWaterProject
|
||||||
|
{
|
||||||
|
[TaskCategory("Custom/FieldBossAction")]
|
||||||
|
[Serializable]
|
||||||
|
public class MoveTarget : Action
|
||||||
|
{
|
||||||
|
[SerializeField] private float stoppingDistance;
|
||||||
|
[SerializeField] private float limitMovingTime;
|
||||||
|
|
||||||
|
private FieldBoss fieldBoss;
|
||||||
|
|
||||||
|
public override void OnAwake()
|
||||||
|
{
|
||||||
|
fieldBoss = transform.GetComponent<FieldBoss>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnStart()
|
||||||
|
{
|
||||||
|
fieldBoss.MoveTarget(stoppingDistance);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TaskStatus OnUpdate()
|
||||||
|
{
|
||||||
|
return fieldBoss.HasReachedDestination(limitMovingTime) ? TaskStatus.Success : TaskStatus.Running;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1f085fad5a5a7c04da8e1d7f014675a0
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a241d2a8708ad744983da8e1b81f7961
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -0,0 +1,26 @@
|
|||||||
|
using System;
|
||||||
|
using BehaviorDesigner.Runtime.Tasks;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace BlueWaterProject
|
||||||
|
{
|
||||||
|
[TaskCategory("Custom/FieldBossConditional")]
|
||||||
|
[Serializable]
|
||||||
|
public class EnableSkill : Conditional
|
||||||
|
{
|
||||||
|
[SerializeField] private string skillName;
|
||||||
|
|
||||||
|
private FieldBoss fieldBoss;
|
||||||
|
|
||||||
|
public override void OnAwake()
|
||||||
|
{
|
||||||
|
fieldBoss = transform.GetComponent<FieldBoss>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TaskStatus OnUpdate()
|
||||||
|
{
|
||||||
|
return fieldBoss.EnableSkill(skillName) ? TaskStatus.Success : TaskStatus.Failure;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 29a10688914e93e41b013ecfdd3db9fb
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -0,0 +1,48 @@
|
|||||||
|
using System;
|
||||||
|
using BehaviorDesigner.Runtime.Tasks;
|
||||||
|
using Sirenix.OdinInspector;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace BlueWaterProject
|
||||||
|
{
|
||||||
|
[TaskCategory("Custom/FieldBossConditional")]
|
||||||
|
[Serializable]
|
||||||
|
public class TargetDistance : Conditional
|
||||||
|
{
|
||||||
|
[Title("비교값 float 설정")]
|
||||||
|
public float compareTo;
|
||||||
|
|
||||||
|
[Title("부등호 설정 - Tooltip 참고")]
|
||||||
|
[BehaviorDesigner.Runtime.Tasks.Tooltip("LessThen : variable < compareTo\n" +
|
||||||
|
"LessThenOrEqualTo : variable <= compareTo\n" +
|
||||||
|
"GreaterThen : variable > compareTo\n" +
|
||||||
|
"GreaterThenOrEqualTo : variable < compareTo\n")]
|
||||||
|
public Inequality inequality;
|
||||||
|
|
||||||
|
private FieldBoss fieldBoss;
|
||||||
|
|
||||||
|
public override void OnAwake()
|
||||||
|
{
|
||||||
|
fieldBoss = transform.GetComponent<FieldBoss>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TaskStatus OnUpdate()
|
||||||
|
{
|
||||||
|
return CompareInequality(fieldBoss.GetTargetDistance()) ? TaskStatus.Success : TaskStatus.Failure;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool CompareInequality(float variable)
|
||||||
|
{
|
||||||
|
return inequality switch
|
||||||
|
{
|
||||||
|
Inequality.NONE => throw new Exception("부등호 미설정 오류"),
|
||||||
|
Inequality.LESS_THEN => variable < compareTo,
|
||||||
|
Inequality.LESS_THEN_OR_EQUAL_TO => variable <= compareTo,
|
||||||
|
Inequality.GREATER_THEN => variable > compareTo,
|
||||||
|
Inequality.GREATER_THEN_OR_EQUAL_TO => variable >= compareTo,
|
||||||
|
_ => throw new ArgumentOutOfRangeException()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 67a3df493f272d34b92f4642d0e7b045
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4bfe6b45d561ba3498fd8ae44568991f
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -0,0 +1,31 @@
|
|||||||
|
using BehaviorDesigner.Runtime.Tasks;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace BlueWaterProject
|
||||||
|
{
|
||||||
|
public class PatrolMove : Action
|
||||||
|
{
|
||||||
|
private IPatrol iPatrol;
|
||||||
|
|
||||||
|
public override void OnAwake()
|
||||||
|
{
|
||||||
|
iPatrol = transform.GetComponent<IPatrol>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnStart()
|
||||||
|
{
|
||||||
|
iPatrol.SetMovePoint();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TaskStatus OnUpdate()
|
||||||
|
{
|
||||||
|
if (!iPatrol.HasReachedDestination())
|
||||||
|
{
|
||||||
|
iPatrol.UpdatePositionAndRotation();
|
||||||
|
return TaskStatus.Running;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TaskStatus.Success;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6f4fd33f9b745e740b3d5408b7e8cd63
|
@ -0,0 +1,37 @@
|
|||||||
|
using BehaviorDesigner.Runtime.Tasks;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace BlueWaterProject
|
||||||
|
{
|
||||||
|
public class PatrolWait : Action
|
||||||
|
{
|
||||||
|
private IPatrol iPatrol;
|
||||||
|
private float currentWaitTime;
|
||||||
|
private float time;
|
||||||
|
|
||||||
|
public override void OnAwake()
|
||||||
|
{
|
||||||
|
iPatrol = transform.GetComponent<IPatrol>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnStart()
|
||||||
|
{
|
||||||
|
currentWaitTime = iPatrol.GetCurrentWayPoint().WaitTime;
|
||||||
|
|
||||||
|
time = 0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override TaskStatus OnUpdate()
|
||||||
|
{
|
||||||
|
time += Time.deltaTime;
|
||||||
|
|
||||||
|
if (time < currentWaitTime)
|
||||||
|
{
|
||||||
|
return TaskStatus.Running;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TaskStatus.Success;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1e4d5b048d872fb498c1f979de884213
|
@ -1,36 +0,0 @@
|
|||||||
using System;
|
|
||||||
using BehaviorDesigner.Runtime.Tasks;
|
|
||||||
using UnityEngine;
|
|
||||||
|
|
||||||
// ReSharper disable once CheckNamespace
|
|
||||||
namespace BlueWaterProject
|
|
||||||
{
|
|
||||||
[TaskCategory("Custom/FieldBossConditional")]
|
|
||||||
[Serializable]
|
|
||||||
public class CompareDistance : Conditional
|
|
||||||
{
|
|
||||||
[SerializeField] private float maxDistance = 3f;
|
|
||||||
|
|
||||||
private FieldBoss fieldBoss;
|
|
||||||
|
|
||||||
public override void OnAwake()
|
|
||||||
{
|
|
||||||
fieldBoss = GetComponent<FieldBoss>();
|
|
||||||
}
|
|
||||||
|
|
||||||
public override TaskStatus OnUpdate()
|
|
||||||
{
|
|
||||||
var targetBounds = fieldBoss.Target.bounds;
|
|
||||||
var targetPos = targetBounds.min;
|
|
||||||
targetPos.x = targetBounds.center.x;
|
|
||||||
targetPos.z = targetBounds.center.z;
|
|
||||||
|
|
||||||
var myBounds = fieldBoss.MyCollider.bounds;
|
|
||||||
var myPos = myBounds.min;
|
|
||||||
myPos.x = myBounds.center.x;
|
|
||||||
myPos.z = myBounds.center.z;
|
|
||||||
|
|
||||||
return Vector3.Distance(targetPos, myPos) <= maxDistance ? TaskStatus.Success : TaskStatus.Failure;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
39
BlueWater/Assets/02.Scripts/Ai/PirateShipAi.cs
Normal file
39
BlueWater/Assets/02.Scripts/Ai/PirateShipAi.cs
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace BlueWaterProject
|
||||||
|
{
|
||||||
|
public class PirateShipAi : MonoBehaviour
|
||||||
|
{
|
||||||
|
/***********************************************************************
|
||||||
|
* Variables
|
||||||
|
***********************************************************************/
|
||||||
|
#region Variables
|
||||||
|
|
||||||
|
// Components
|
||||||
|
[SerializeField] private ShipPatrol shipPatrol;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Unity Events
|
||||||
|
***********************************************************************/
|
||||||
|
#region Unity Events
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Methods
|
||||||
|
***********************************************************************/
|
||||||
|
#region Methods
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
2
BlueWater/Assets/02.Scripts/Ai/PirateShipAi.cs.meta
Normal file
2
BlueWater/Assets/02.Scripts/Ai/PirateShipAi.cs.meta
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 64a8cec913e50e74ebca756bee584331
|
170
BlueWater/Assets/02.Scripts/Ai/ShipPatrol.cs
Normal file
170
BlueWater/Assets/02.Scripts/Ai/ShipPatrol.cs
Normal file
@ -0,0 +1,170 @@
|
|||||||
|
using Sirenix.OdinInspector;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.AI;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace BlueWaterProject
|
||||||
|
{
|
||||||
|
public class ShipPatrol : MonoBehaviour, IPatrol
|
||||||
|
{
|
||||||
|
/***********************************************************************
|
||||||
|
* Variables
|
||||||
|
***********************************************************************/
|
||||||
|
#region Variables
|
||||||
|
|
||||||
|
// 컴포넌트
|
||||||
|
[Title("컴포넌트")]
|
||||||
|
[SerializeField] private Rigidbody rb;
|
||||||
|
|
||||||
|
// 패트롤 옵션
|
||||||
|
[Title("패트롤 옵션")]
|
||||||
|
[SerializeField] private bool showWayPointGizmo = true;
|
||||||
|
[field: SerializeField] public WayPoint[] WayPoints { get; set; }
|
||||||
|
[field: SerializeField] public Vector3 OriginalPoint { get; set; }
|
||||||
|
[field: SerializeField] public int CurrentIndex { get; set; }
|
||||||
|
[field: SerializeField] public int PreviousIndex { get; set; }
|
||||||
|
|
||||||
|
// 기즈모 잠금 기능
|
||||||
|
[Title("기즈모 잠금 기능")]
|
||||||
|
[field: SerializeField] public bool LockHandlesOnXAxis { get; set; }
|
||||||
|
[field: SerializeField] public bool LockHandlesOnYAxis { get; set; }
|
||||||
|
[field: SerializeField] public bool LockHandlesOnZAxis { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Unity Events
|
||||||
|
***************************************************************m********/
|
||||||
|
#region Unity Events
|
||||||
|
|
||||||
|
private void OnDrawGizmosSelected()
|
||||||
|
{
|
||||||
|
if (WayPoints == null || WayPoints.Length <= 0 || !showWayPointGizmo) return;
|
||||||
|
|
||||||
|
if (!Application.isPlaying)
|
||||||
|
{
|
||||||
|
OriginalPoint = rb.position;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < WayPoints.Length; i++)
|
||||||
|
{
|
||||||
|
var currentColor = i == CurrentIndex ? Color.blue : Color.yellow;
|
||||||
|
|
||||||
|
if ((i + 1) < WayPoints.Length)
|
||||||
|
{
|
||||||
|
Gizmos.color = currentColor;
|
||||||
|
Gizmos.DrawLine(OriginalPoint + WayPoints[i].Point, OriginalPoint + WayPoints[i + 1].Point);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i == WayPoints.Length - 1)
|
||||||
|
{
|
||||||
|
Gizmos.color = currentColor;
|
||||||
|
Gizmos.DrawLine(OriginalPoint + WayPoints[i].Point, OriginalPoint + WayPoints[0].Point);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Application.isPlaying) return;
|
||||||
|
|
||||||
|
DrawGizmoPoint(OriginalPoint + WayPoints[CurrentIndex].Point,2f, Color.blue);
|
||||||
|
DrawGizmoPoint(OriginalPoint + WayPoints[PreviousIndex].Point, 2f, Color.red);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void DrawGizmoPoint(Vector3 pos, float size, Color color)
|
||||||
|
{
|
||||||
|
Gizmos.color = color;
|
||||||
|
Gizmos.DrawWireSphere(pos, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
OriginalPoint = transform.position;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Methods
|
||||||
|
***********************************************************************/
|
||||||
|
#region Methods
|
||||||
|
|
||||||
|
public WayPoint GetCurrentWayPoint() => WayPoints[CurrentIndex];
|
||||||
|
|
||||||
|
public int GetNextIndex()
|
||||||
|
{
|
||||||
|
if (WayPoints == null) return -1;
|
||||||
|
|
||||||
|
var maxSize = WayPoints.Length;
|
||||||
|
var nextIndex = CurrentIndex + 1;
|
||||||
|
|
||||||
|
if (nextIndex >= maxSize)
|
||||||
|
{
|
||||||
|
nextIndex = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nextIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool HasReachedDestination()
|
||||||
|
{
|
||||||
|
var myPosition = rb.position;
|
||||||
|
var movePoint = OriginalPoint + WayPoints[CurrentIndex].Point;
|
||||||
|
var distance = Vector3.Distance(myPosition, movePoint);
|
||||||
|
|
||||||
|
print(distance);
|
||||||
|
|
||||||
|
if (distance > 3f) return false;
|
||||||
|
|
||||||
|
print("도착");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetMovePoint()
|
||||||
|
{
|
||||||
|
if (!rb || WayPoints == null || WayPoints.Length <= CurrentIndex) return;
|
||||||
|
|
||||||
|
print("다음 목적지");
|
||||||
|
PreviousIndex = CurrentIndex;
|
||||||
|
CurrentIndex = GetNextIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdatePositionAndRotation()
|
||||||
|
{
|
||||||
|
// // 현재 위치에서 목표지점까지의 방향과 거리 계산
|
||||||
|
// var myPosition = rb.position;
|
||||||
|
// var movePoint = OriginalPoint + WayPoints[CurrentIndex].Point;
|
||||||
|
// var direction = (movePoint - myPosition).normalized;
|
||||||
|
// var distance = Vector3.Distance(movePoint, myPosition);
|
||||||
|
//
|
||||||
|
// // Combine forces with weights
|
||||||
|
// var currentVelocity = seekForce + avoidForce;
|
||||||
|
// currentVelocity = Vector3.ClampMagnitude(currentVelocity, maxVelocity);
|
||||||
|
//
|
||||||
|
// if (distance < 10f)
|
||||||
|
// {
|
||||||
|
// // 목적지에 가까워짐에 따라 속도를 동적으로 조절
|
||||||
|
// var desiredSpeed = (distance / 10f) * maxSpeed;
|
||||||
|
// currentVelocity = currentVelocity.normalized * desiredSpeed;
|
||||||
|
// }
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// // 목적지에서 멀리 떨어져 있을 때는 최대 속도로 이동
|
||||||
|
// currentVelocity = Vector3.ClampMagnitude(currentVelocity, maxSpeed);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// rb.AddForce(currentVelocity - rb.velocity, ForceMode.Acceleration);
|
||||||
|
//
|
||||||
|
// //rb.AddForce(currentVelocity, ForceMode.Acceleration);
|
||||||
|
//
|
||||||
|
// if (rb.velocity.magnitude > 10f)
|
||||||
|
// {
|
||||||
|
// rb.velocity = rb.velocity.normalized * 10f;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// var targetRotation = Quaternion.LookRotation(direction);
|
||||||
|
// rb.MoveRotation(Quaternion.RotateTowards(rb.rotation, targetRotation, rotationSpeed * Time.deltaTime));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
2
BlueWater/Assets/02.Scripts/Ai/ShipPatrol.cs.meta
Normal file
2
BlueWater/Assets/02.Scripts/Ai/ShipPatrol.cs.meta
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 54f7637ae66462d4ebd40401643172f6
|
60
BlueWater/Assets/02.Scripts/BossController.cs
Normal file
60
BlueWater/Assets/02.Scripts/BossController.cs
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace BlueWaterProject
|
||||||
|
{
|
||||||
|
public class BossController : MonoBehaviour
|
||||||
|
{
|
||||||
|
[field: SerializeField] public GameObject BossPrefab { get; set; }
|
||||||
|
[field: SerializeField] public Transform BossSpawnTransform { get; set; }
|
||||||
|
[field: SerializeField] public Transform PlayerSpawnTransform { get; set; }
|
||||||
|
[SerializeField] private Transform bossInstantiateLocation;
|
||||||
|
|
||||||
|
private GameObject instantiatedBoss;
|
||||||
|
|
||||||
|
private void Start()
|
||||||
|
{
|
||||||
|
InitStart();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitStart()
|
||||||
|
{
|
||||||
|
if (!instantiatedBoss)
|
||||||
|
{
|
||||||
|
instantiatedBoss = Instantiate(BossPrefab, BossSpawnTransform.position, Quaternion.identity, bossInstantiateLocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
instantiatedBoss.SetActive(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ResetBoss()
|
||||||
|
{
|
||||||
|
if (instantiatedBoss)
|
||||||
|
{
|
||||||
|
if (instantiatedBoss.activeSelf)
|
||||||
|
{
|
||||||
|
Destroy(instantiatedBoss);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Respawn()
|
||||||
|
{
|
||||||
|
if (instantiatedBoss)
|
||||||
|
{
|
||||||
|
if (instantiatedBoss.activeSelf)
|
||||||
|
{
|
||||||
|
Destroy(instantiatedBoss);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
instantiatedBoss.transform.position = BossSpawnTransform.position;
|
||||||
|
instantiatedBoss.SetActive(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
instantiatedBoss = Instantiate(BossPrefab, BossSpawnTransform.position, Quaternion.identity, bossInstantiateLocation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
2
BlueWater/Assets/02.Scripts/BossController.cs.meta
Normal file
2
BlueWater/Assets/02.Scripts/BossController.cs.meta
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3ee283b48c3d38c4690a7711c3276571
|
@ -1,5 +1,3 @@
|
|||||||
using System;
|
|
||||||
using Doozy.Editor.EditorUI.Components;
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
// ReSharper disable once CheckNamespace
|
// ReSharper disable once CheckNamespace
|
||||||
@ -8,70 +6,42 @@ namespace BlueWaterProject
|
|||||||
public class BossPortal : MonoBehaviour
|
public class BossPortal : MonoBehaviour
|
||||||
{
|
{
|
||||||
[SerializeField] private GameObject playerSpawnPosObj;
|
[SerializeField] private GameObject playerSpawnPosObj;
|
||||||
[SerializeField] private FieldBoss fieldBoss;
|
[SerializeField] private BossController bossController;
|
||||||
|
[SerializeField] private Collider[] bossEntranceObstacles;
|
||||||
private Collider myCollider;
|
|
||||||
private float[] bossMapVertices;
|
|
||||||
private Collider[] bossEntrances;
|
|
||||||
|
|
||||||
private bool isIn;
|
private bool isIn;
|
||||||
|
|
||||||
private void Awake()
|
private void Start()
|
||||||
{
|
{
|
||||||
myCollider = GetComponent<Collider>();
|
|
||||||
var bossEntrance = transform.Find("BossEntrance");
|
|
||||||
if (!bossEntrance)
|
|
||||||
{
|
|
||||||
print("BossEntrance 오브젝트가 null입니다.");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
bossEntrances = bossEntrance.GetComponentsInChildren<Collider>();
|
|
||||||
}
|
|
||||||
|
|
||||||
GetColliderVertices(myCollider);
|
|
||||||
BossEntranceSetActive(false);
|
BossEntranceSetActive(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnTriggerEnter(Collider other)
|
private void OnTriggerEnter(Collider other)
|
||||||
{
|
{
|
||||||
if (isIn || !other.CompareTag("InIslandPlayer")) return;
|
if (isIn || !other.CompareTag("CombatPlayer")) return;
|
||||||
|
|
||||||
// TODO : 보스 맵 입장
|
|
||||||
isIn = true;
|
isIn = true;
|
||||||
other.transform.position = playerSpawnPosObj.transform.position;
|
if (playerSpawnPosObj)
|
||||||
|
{
|
||||||
|
other.transform.position = playerSpawnPosObj.transform.position;
|
||||||
|
}
|
||||||
BossEntranceSetActive(true);
|
BossEntranceSetActive(true);
|
||||||
|
bossController.Respawn();
|
||||||
fieldBoss.BossSpawn(other, bossMapVertices);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BossEntranceSetActive(bool value)
|
private void BossEntranceSetActive(bool value)
|
||||||
{
|
{
|
||||||
foreach (var entrance in bossEntrances)
|
foreach (var entrance in bossEntranceObstacles)
|
||||||
{
|
{
|
||||||
entrance.gameObject.SetActive(value);
|
entrance.gameObject.SetActive(value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BossReset()
|
public void ResetPortal()
|
||||||
{
|
{
|
||||||
fieldBoss.gameObject.SetActive(false);
|
|
||||||
BossEntranceSetActive(false);
|
|
||||||
|
|
||||||
isIn = false;
|
isIn = false;
|
||||||
}
|
BossEntranceSetActive(false);
|
||||||
|
bossController.ResetBoss();
|
||||||
private void GetColliderVertices(Collider col)
|
|
||||||
{
|
|
||||||
var bounds = col.bounds;
|
|
||||||
var center = bounds.center;
|
|
||||||
var size = bounds.size;
|
|
||||||
|
|
||||||
bossMapVertices = new float[4];
|
|
||||||
bossMapVertices[0] = center.x + -size.x * 0.5f;
|
|
||||||
bossMapVertices[1] = center.x + size.x * 0.5f;
|
|
||||||
bossMapVertices[2] = center.z + size.z * 0.5f;
|
|
||||||
bossMapVertices[3] = center.z + -size.z * 0.5f;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -2,7 +2,6 @@ using System;
|
|||||||
using System.Collections;
|
using System.Collections;
|
||||||
using Sirenix.OdinInspector;
|
using Sirenix.OdinInspector;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.EventSystems;
|
|
||||||
using UnityEngine.InputSystem;
|
using UnityEngine.InputSystem;
|
||||||
|
|
||||||
// ReSharper disable once CheckNamespace
|
// ReSharper disable once CheckNamespace
|
||||||
@ -59,6 +58,7 @@ namespace BlueWaterProject
|
|||||||
public bool isAttacking;
|
public bool isAttacking;
|
||||||
public bool isComboPossible;
|
public bool isComboPossible;
|
||||||
public bool isComboAttacking;
|
public bool isComboAttacking;
|
||||||
|
public bool isUsingSkill;
|
||||||
}
|
}
|
||||||
|
|
||||||
[DisableIf("@true")]
|
[DisableIf("@true")]
|
||||||
@ -150,10 +150,12 @@ namespace BlueWaterProject
|
|||||||
var myCollider = MyComponents.movement.MyComponents.capsuleCollider;
|
var myCollider = MyComponents.movement.MyComponents.capsuleCollider;
|
||||||
var myRb = MyComponents.movement.MyComponents.rb;
|
var myRb = MyComponents.movement.MyComponents.rb;
|
||||||
var myVisualLook = MyComponents.visualLook;
|
var myVisualLook = MyComponents.visualLook;
|
||||||
|
var myAnimator = MyComponents.animator;
|
||||||
|
var targetLayer = MyCharacterOption.targetLayer;
|
||||||
var ui = UiManager.Inst.CombatUi.MainSkillUi;
|
var ui = UiManager.Inst.CombatUi.MainSkillUi;
|
||||||
ui.gameObject.SetActive(true);
|
ui.gameObject.SetActive(true);
|
||||||
|
|
||||||
mainSkill.SkillInputData.InitInputData(myCollider, myRb, myVisualLook, MyCharacterOption.targetLayer, ui);
|
mainSkill.SkillInputData.InitInputData(myCollider, myRb, null, myVisualLook, myAnimator, null, targetLayer, ui);
|
||||||
mainSkill.InitData();
|
mainSkill.InitData();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -198,7 +200,7 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
if (MyCurrentState.isAttacking || GetIsDashing()) return;
|
if (MyCurrentState.isAttacking || GetIsDashing()) return;
|
||||||
|
|
||||||
mainSkill.SkillInputData.UpdateInputData(GetCurrentPosition());
|
mainSkill.SkillInputData.StartPosition = GetCurrentPosition();
|
||||||
if (mainSkill.EnableSkill())
|
if (mainSkill.EnableSkill())
|
||||||
{
|
{
|
||||||
SetEnableMoving(false);
|
SetEnableMoving(false);
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections;
|
||||||
using Sirenix.OdinInspector;
|
using Sirenix.OdinInspector;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.InputSystem;
|
using UnityEngine.InputSystem;
|
||||||
@ -72,6 +73,7 @@ namespace BlueWaterProject
|
|||||||
public bool isOutOfControl;
|
public bool isOutOfControl;
|
||||||
public bool isDashing;
|
public bool isDashing;
|
||||||
public bool enableDash = true;
|
public bool enableDash = true;
|
||||||
|
public bool IsStunned { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
@ -139,7 +141,7 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
private void FixedUpdate()
|
private void FixedUpdate()
|
||||||
{
|
{
|
||||||
if (!MyCurrentState.enableMoving) return;
|
if (!MyCurrentState.enableMoving || MyCurrentState.IsStunned) return;
|
||||||
|
|
||||||
InputMove();
|
InputMove();
|
||||||
CheckGround();
|
CheckGround();
|
||||||
@ -354,9 +356,9 @@ namespace BlueWaterProject
|
|||||||
Vector3 finalVelocity;
|
Vector3 finalVelocity;
|
||||||
if (MyCurrentState.isOutOfControl || MyCurrentState.isOnSteepSlope || !MyCurrentState.isGrounded)
|
if (MyCurrentState.isOutOfControl || MyCurrentState.isOnSteepSlope || !MyCurrentState.isGrounded)
|
||||||
{
|
{
|
||||||
var velocity = MyComponents.rb.velocity;
|
// var velocity = MyComponents.rb.velocity;
|
||||||
finalVelocity = MyComponents.rb.position + new Vector3(velocity.x, MyCurrentValue.gravity.y, velocity.z) * Time.fixedDeltaTime;
|
// finalVelocity = MyComponents.rb.position + new Vector3(velocity.x, MyCurrentValue.gravity.y, velocity.z) * Time.fixedDeltaTime;
|
||||||
MyComponents.rb.MovePosition(finalVelocity);
|
// MyComponents.rb.MovePosition(finalVelocity);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (MyCurrentValue.horizontalVelocity == Vector3.zero)
|
if (MyCurrentValue.horizontalVelocity == Vector3.zero)
|
||||||
@ -367,17 +369,31 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
finalVelocity = MyComponents.rb.position + MyCurrentValue.horizontalVelocity * Time.fixedDeltaTime;
|
finalVelocity = MyComponents.rb.position + MyCurrentValue.horizontalVelocity * Time.fixedDeltaTime;
|
||||||
MyComponents.rb.MovePosition(finalVelocity);
|
MyComponents.rb.MovePosition(finalVelocity);
|
||||||
}
|
|
||||||
|
|
||||||
public void Move(Vector3 velocity)
|
// finalVelocity = MyCurrentValue.horizontalVelocity;
|
||||||
|
// MyComponents.rb.velocity = finalVelocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Move(Vector3 position) => MyComponents.rb.position = position;
|
||||||
|
|
||||||
|
public void SpawnPlayer(Vector3 position)
|
||||||
{
|
{
|
||||||
MyComponents.rb.position = velocity;
|
Move(position);
|
||||||
|
|
||||||
|
var bossPortal = GameObject.Find("DesertBossArea").transform.Find("BossPortal").GetComponent<BossPortal>();
|
||||||
|
if (bossPortal)
|
||||||
|
{
|
||||||
|
bossPortal.ResetPortal();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void MoveToCurrentDirection(float speed)
|
public void MoveToCurrentDirection(float speed)
|
||||||
{
|
{
|
||||||
var finalVelocity = MyComponents.rb.position + MyCurrentValue.previousMoveDirection * speed * Time.fixedDeltaTime;
|
var finalVelocity = MyComponents.rb.position + MyCurrentValue.previousMoveDirection * speed * Time.fixedDeltaTime;
|
||||||
MyComponents.rb.MovePosition(finalVelocity);
|
MyComponents.rb.MovePosition(finalVelocity);
|
||||||
|
|
||||||
|
// var finalVelocity = MyCurrentValue.previousMoveDirection * speed;
|
||||||
|
// MyComponents.rb.velocity = finalVelocity;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetEnableMoving(bool value) => MyCurrentState.enableMoving = value;
|
public void SetEnableMoving(bool value) => MyCurrentState.enableMoving = value;
|
||||||
@ -517,7 +533,7 @@ namespace BlueWaterProject
|
|||||||
{
|
{
|
||||||
if (GUI.Button(new Rect(sWidth - 350f, yPos, buttonWidth, buttonHeight), spawnPosition[i].name, buttonStyle))
|
if (GUI.Button(new Rect(sWidth - 350f, yPos, buttonWidth, buttonHeight), spawnPosition[i].name, buttonStyle))
|
||||||
{
|
{
|
||||||
Move(spawnPosition[i].position);
|
SpawnPlayer(spawnPosition[i].position);
|
||||||
}
|
}
|
||||||
yPos += buttonSpacing;
|
yPos += buttonSpacing;
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ namespace BlueWaterProject
|
|||||||
}
|
}
|
||||||
|
|
||||||
var animationLength = stateInfo.length;
|
var animationLength = stateInfo.length;
|
||||||
animator.speed = animationLength / theWaltzOfTheSword.castingTime;
|
animator.speed = animationLength / theWaltzOfTheSword.CastingTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
|
||||||
|
@ -39,7 +39,7 @@ namespace BlueWaterProject
|
|||||||
}
|
}
|
||||||
|
|
||||||
var animationLength = stateInfo.length;
|
var animationLength = stateInfo.length;
|
||||||
animator.speed = animationLength / theWaltzOfTheSword.skillDuration;
|
animator.speed = animationLength / theWaltzOfTheSword.SkillDuration;
|
||||||
intervalTime = animationLength / animator.speed / 6f;
|
intervalTime = animationLength / animator.speed / 6f;
|
||||||
|
|
||||||
if (!theWaltzOfTheSword.isMovingCamera)
|
if (!theWaltzOfTheSword.isMovingCamera)
|
||||||
@ -87,11 +87,11 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
if (theWaltzOfTheSword.returnToStartPosition)
|
if (theWaltzOfTheSword.returnToStartPosition)
|
||||||
{
|
{
|
||||||
combatPlayerController.Move(theWaltzOfTheSword.SkillInputData.startPosition);
|
combatPlayerController.Move(theWaltzOfTheSword.SkillInputData.StartPosition);
|
||||||
}
|
}
|
||||||
if (!theWaltzOfTheSword.isMovingCamera)
|
if (!theWaltzOfTheSword.isMovingCamera)
|
||||||
{
|
{
|
||||||
var userTransform = theWaltzOfTheSword.SkillInputData.playerCollider.transform;
|
var userTransform = theWaltzOfTheSword.SkillInputData.PlayerCollider.transform;
|
||||||
CameraManager.Inst.CombatCamera.SetFollowAndLookAt(userTransform);
|
CameraManager.Inst.CombatCamera.SetFollowAndLookAt(userTransform);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,100 +1,129 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using BehaviorDesigner.Runtime;
|
using BehaviorDesigner.Runtime;
|
||||||
using Sirenix.OdinInspector;
|
using Sirenix.OdinInspector;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.UI;
|
using UnityEngine.AI;
|
||||||
|
|
||||||
// ReSharper disable once CheckNamespace
|
// ReSharper disable once CheckNamespace
|
||||||
namespace BlueWaterProject
|
namespace BlueWaterProject
|
||||||
{
|
{
|
||||||
public abstract class FieldBoss : MonoBehaviour, IDamageable
|
public abstract class FieldBoss : MonoBehaviour, IDamageable
|
||||||
{
|
{
|
||||||
#region Properties and variables
|
/***********************************************************************
|
||||||
|
* Variables
|
||||||
// Stat
|
***********************************************************************/
|
||||||
[field: Title("Stat")]
|
#region Variables
|
||||||
[field: Tooltip("최대 체력 설정")]
|
|
||||||
[field: SerializeField] public float MaxHp { get; private set; } = 100f;
|
|
||||||
|
|
||||||
[field: Tooltip("현재 체력")]
|
|
||||||
[field: SerializeField] public float CurrentHp { get; private set; }
|
|
||||||
|
|
||||||
[field: Tooltip("이동 속도 설정")]
|
|
||||||
[field: SerializeField] public float MoveSpd { get; set; } = 5f;
|
|
||||||
|
|
||||||
[field: SerializeField] public Collider Target { get; set; }
|
|
||||||
|
|
||||||
[field: SerializeField] public LayerMask TargetLayer { get; set; }
|
|
||||||
|
|
||||||
[SerializeField] protected List<ActiveSkill> activeSkillList;
|
|
||||||
|
|
||||||
[SerializeField] private Slider hpSlider;
|
|
||||||
[SerializeField] private Slider damageEffectSlider;
|
|
||||||
[SerializeField] private float damageEffectSpeed = 0.1f;
|
|
||||||
|
|
||||||
// 컴포넌트
|
// 컴포넌트
|
||||||
protected Rigidbody rb;
|
[Title("컴포넌트")]
|
||||||
public Collider MyCollider { get; set; }
|
[SerializeField] protected Rigidbody rb;
|
||||||
protected BehaviorTree bt;
|
[SerializeField] protected Collider capsuleCollider;
|
||||||
protected Transform unitRoot;
|
[SerializeField] protected NavMeshAgent agent;
|
||||||
protected SkillController skillController;
|
[SerializeField] protected BehaviorTree behaviorTree;
|
||||||
|
[SerializeField] protected Transform visualLook;
|
||||||
|
[SerializeField] protected Animator animator;
|
||||||
|
|
||||||
// 일반 변수
|
// 보스 스탯
|
||||||
protected bool usedSkillCoroutine;
|
[Title("보스 스탯")]
|
||||||
protected bool isCollisionAttack;
|
[SerializeField] protected float maxHp = 100f;
|
||||||
protected float collisionDamage;
|
[SerializeField] protected float moveSpeed = 3f;
|
||||||
protected float[] bossMapVertices;
|
[SerializeField] protected LayerMask targetLayer;
|
||||||
|
|
||||||
|
// 스킬
|
||||||
|
[Title("스킬")]
|
||||||
|
[SerializeField] protected List<SkillBase> skillList = new(6);
|
||||||
|
protected Dictionary<string, ISkill> skillDictionary = new(6);
|
||||||
|
private List<SkillBase> instanceSkillList = new(6);
|
||||||
|
|
||||||
|
// 실시간 데이터
|
||||||
|
[field: Title("실시간 데이터")]
|
||||||
|
[field: SerializeField] public float CurrentHp { get; private set; }
|
||||||
|
[field: SerializeField] public Collider Target { get; set; }
|
||||||
|
[field: SerializeField] public bool IsUsingSkill { get; protected set; }
|
||||||
|
|
||||||
|
protected Vector3 PreviousDirection { get; set; } = Vector3.right;
|
||||||
|
|
||||||
|
private float departureTime = -1f;
|
||||||
|
protected bool isDead;
|
||||||
|
|
||||||
|
// [SerializeField] private Slider hpSlider;
|
||||||
|
// [SerializeField] private Slider damageEffectSlider;
|
||||||
|
// [SerializeField] private float damageEffectSpeed = 0.1f;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
#region Unity built-in methods
|
* Unity Events
|
||||||
|
***********************************************************************/
|
||||||
|
#region Unity Events
|
||||||
|
|
||||||
protected virtual void Awake()
|
|
||||||
{
|
|
||||||
rb = GetComponent<Rigidbody>();
|
|
||||||
MyCollider = GetComponent<Collider>();
|
|
||||||
bt = GetComponent<BehaviorTree>();
|
|
||||||
|
|
||||||
unitRoot = transform.Find("UnitRoot");
|
|
||||||
if (unitRoot == null)
|
|
||||||
{
|
|
||||||
print("UnitRoot를 찾을 수 없습니다.");
|
|
||||||
}
|
|
||||||
|
|
||||||
skillController = FindAnyObjectByType<SkillController>();
|
|
||||||
var overlayCanvas = GameObject.Find("OverlayCanvas").transform;
|
|
||||||
hpSlider = overlayCanvas.Find("FieldBossHpSlider").GetComponent<Slider>();
|
|
||||||
damageEffectSlider = hpSlider.transform.Find("Fill Area/Background/DamageEffectSlider").GetComponent<Slider>();
|
|
||||||
gameObject.SetActive(false);
|
|
||||||
hpSlider.gameObject.SetActive(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void Start()
|
protected virtual void Start()
|
||||||
{
|
{
|
||||||
TargetLayer = LayerMask.GetMask("Player");
|
InitStart();
|
||||||
|
|
||||||
SetMaxHp();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void OnCollisionStay(Collision other)
|
private void OnDestroy()
|
||||||
{
|
{
|
||||||
if (!isCollisionAttack || !other.gameObject.CompareTag("InIslandPlayer")) return;
|
foreach (var element in instanceSkillList)
|
||||||
|
{
|
||||||
var iDamageable = other.gameObject.GetComponent<IDamageable>();
|
if (element.gameObject != null)
|
||||||
iDamageable.TakeDamage(collisionDamage);
|
{
|
||||||
isCollisionAttack = false;
|
Destroy(element.gameObject);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Interface
|
/***********************************************************************
|
||||||
|
* Init Methods
|
||||||
|
***********************************************************************/
|
||||||
|
#region Init Methods
|
||||||
|
|
||||||
|
[Button("셋팅 초기화")]
|
||||||
|
private void Init()
|
||||||
|
{
|
||||||
|
rb = GetComponent<Rigidbody>();
|
||||||
|
capsuleCollider = GetComponent<Collider>();
|
||||||
|
agent = GetComponent<NavMeshAgent>();
|
||||||
|
behaviorTree = GetComponent<BehaviorTree>();
|
||||||
|
visualLook = transform.Find("VisualLook");
|
||||||
|
animator = visualLook.GetComponent<Animator>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitStart()
|
||||||
|
{
|
||||||
|
agent.updateRotation = false;
|
||||||
|
agent.speed = moveSpeed;
|
||||||
|
SetCurrentHp(maxHp);
|
||||||
|
Target = GameObject.FindGameObjectWithTag("CombatPlayer").GetComponent<Collider>();
|
||||||
|
|
||||||
|
foreach (var element in skillList)
|
||||||
|
{
|
||||||
|
var skill = Instantiate(element, Vector3.zero, Quaternion.identity);
|
||||||
|
skillDictionary.Add(skill.SkillName, skill);
|
||||||
|
|
||||||
|
skill.SkillInputData.InitInputData(capsuleCollider, rb, agent, visualLook, animator, Target, targetLayer, null);
|
||||||
|
skill.InitData();
|
||||||
|
instanceSkillList.Add(skill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Interfaces
|
||||||
|
***********************************************************************/
|
||||||
|
#region Interfaces
|
||||||
|
|
||||||
// IDamageable
|
// IDamageable
|
||||||
public void TakeDamage(float attackerPower, Vector3? attackPos = null)
|
public void TakeDamage(float attackerPower, Vector3? attackPos = null)
|
||||||
{
|
{
|
||||||
|
if (isDead) return;
|
||||||
|
|
||||||
var changeHp = Mathf.Max(CurrentHp - attackerPower, 0);
|
var changeHp = Mathf.Max(CurrentHp - attackerPower, 0);
|
||||||
SetCurrentHp(changeHp);
|
SetCurrentHp(changeHp);
|
||||||
|
|
||||||
@ -108,7 +137,7 @@ namespace BlueWaterProject
|
|||||||
// 공격 당함
|
// 공격 당함
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Die()
|
public virtual void Die()
|
||||||
{
|
{
|
||||||
Destroy(gameObject, 2f);
|
Destroy(gameObject, 2f);
|
||||||
}
|
}
|
||||||
@ -117,73 +146,124 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Custom methods
|
/***********************************************************************
|
||||||
|
* Methods
|
||||||
public void BossSpawn(Collider target, float[] mapVertices)
|
***********************************************************************/
|
||||||
|
#region Methods
|
||||||
|
|
||||||
|
public void MovePoint(Vector3 point, float stoppingDistance)
|
||||||
{
|
{
|
||||||
SetMaxHp();
|
if (agent)
|
||||||
|
{
|
||||||
|
agent.stoppingDistance = stoppingDistance;
|
||||||
|
agent.SetDestination(point);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void MoveTarget(float stoppingDistance)
|
||||||
|
{
|
||||||
|
if (agent)
|
||||||
|
{
|
||||||
|
agent.isStopped = false;
|
||||||
|
agent.stoppingDistance = stoppingDistance;
|
||||||
|
agent.SetDestination(Target.transform.position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool HasReachedDestination(float limitMovingTime)
|
||||||
|
{
|
||||||
|
// 경로 계산 중이면 false
|
||||||
|
if (!agent || agent.pathPending)
|
||||||
|
{
|
||||||
|
departureTime = -1f;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
gameObject.SetActive(true);
|
if (departureTime < 0f)
|
||||||
hpSlider.gameObject.SetActive(true);
|
|
||||||
|
|
||||||
Target = target;
|
|
||||||
bossMapVertices = new float[mapVertices.Length];
|
|
||||||
bossMapVertices = mapVertices;
|
|
||||||
Invoke(nameof(EnableBehaviorTree), 2f);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void EnableBehaviorTree() => bt.EnableBehavior();
|
|
||||||
|
|
||||||
public virtual void ExecuteActiveSkill(ActiveSkill activeSkill)
|
|
||||||
{
|
|
||||||
// activeSkill.Execute(TargetLayer, Target.bounds.center);
|
|
||||||
// StartCoroutine(CoolDown(myActiveSkill.ActiveSkillData.Cooldown, () => usedActiveSkill = false));
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SetMaxHp()
|
|
||||||
{
|
|
||||||
CurrentHp = MaxHp;
|
|
||||||
|
|
||||||
if (hpSlider != null)
|
|
||||||
{
|
{
|
||||||
hpSlider.maxValue = MaxHp;
|
departureTime = Time.time;
|
||||||
hpSlider.value = MaxHp;
|
}
|
||||||
|
|
||||||
|
if (departureTime > 0f && Time.time - departureTime >= limitMovingTime)
|
||||||
|
{
|
||||||
|
agent.isStopped = true;
|
||||||
|
departureTime = -1f;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 남은 거리가 정지 거리 이상이면 false
|
||||||
|
if (agent.remainingDistance > agent.stoppingDistance) return false;
|
||||||
|
|
||||||
|
// 경로가 있고, 속도가 0이 아니면 false
|
||||||
|
if (agent.hasPath && agent.velocity.sqrMagnitude != 0f) return false;
|
||||||
|
|
||||||
|
agent.velocity = Vector3.zero;
|
||||||
|
agent.isStopped = true;
|
||||||
|
departureTime = -1f;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool EnableSkill(string skillName)
|
||||||
|
{
|
||||||
|
if (IsUsingSkill) return false;
|
||||||
|
|
||||||
|
if (skillDictionary.ContainsKey(skillName))
|
||||||
|
{
|
||||||
|
return skillDictionary[skillName].EnableSkill();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (damageEffectSlider != null)
|
return false;
|
||||||
{
|
|
||||||
damageEffectSlider.maxValue = MaxHp;
|
|
||||||
damageEffectSlider.value = MaxHp;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Button("스킬 사용")]
|
||||||
|
public virtual void ActivateSkill(string skillName){}
|
||||||
|
|
||||||
private void SetCurrentHp(float value)
|
private void SetCurrentHp(float value)
|
||||||
{
|
{
|
||||||
CurrentHp = value;
|
CurrentHp = value;
|
||||||
if (hpSlider != null)
|
|
||||||
{
|
|
||||||
hpSlider.value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
StartCoroutine(DamageEffect(CurrentHp));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void CoolDownCoroutine(float waitTime, Action onCooldownComplete)
|
public float GetTargetDistance()
|
||||||
{
|
{
|
||||||
StartCoroutine(Utils.CoolDown(waitTime, onCooldownComplete));
|
var distance = Target.transform.position - transform.position;
|
||||||
|
distance.y = 0f;
|
||||||
|
return distance.magnitude;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerator DamageEffect(float currentHp)
|
public Vector3 GetTargetDirection()
|
||||||
{
|
{
|
||||||
while (damageEffectSlider.value > currentHp)
|
var distance = Target.transform.position - transform.position;
|
||||||
{
|
distance.y = 0f;
|
||||||
damageEffectSlider.value -= damageEffectSpeed;
|
return distance.normalized;
|
||||||
yield return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool GetUsedSkillCoroutine() => usedSkillCoroutine;
|
// private void SetCurrentHp(float value)
|
||||||
public List<ActiveSkill> GetActiveSkillList() => activeSkillList;
|
// {
|
||||||
|
// CurrentHp = value;
|
||||||
|
// if (hpSlider != null)
|
||||||
|
// {
|
||||||
|
// hpSlider.value = value;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// StartCoroutine(DamageEffect(CurrentHp));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// protected void CoolDownCoroutine(float waitTime, Action onCooldownComplete)
|
||||||
|
// {
|
||||||
|
// StartCoroutine(Utils.CoolDown(waitTime, onCooldownComplete));
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// private IEnumerator DamageEffect(float currentHp)
|
||||||
|
// {
|
||||||
|
// while (damageEffectSlider.value > currentHp)
|
||||||
|
// {
|
||||||
|
// damageEffectSlider.value -= damageEffectSpeed;
|
||||||
|
// yield return null;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public bool GetUsedSkillCoroutine() => usedSkillCoroutine;
|
||||||
|
// public List<ActiveSkill> GetActiveSkillList() => activeSkillList;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
@ -1,181 +1,181 @@
|
|||||||
using System;
|
// using System;
|
||||||
using System.Collections;
|
// using System.Collections;
|
||||||
using Sirenix.OdinInspector;
|
// using Sirenix.OdinInspector;
|
||||||
using UnityEngine;
|
// using UnityEngine;
|
||||||
|
//
|
||||||
// ReSharper disable once CheckNamespace
|
// // ReSharper disable once CheckNamespace
|
||||||
namespace BlueWaterProject
|
// namespace BlueWaterProject
|
||||||
{
|
// {
|
||||||
[Serializable]
|
// [Serializable]
|
||||||
public class FieldBoss01 : FieldBoss
|
// public class FieldBoss01 : FieldBoss
|
||||||
{
|
// {
|
||||||
#region Properties and variables
|
// #region Properties and variables
|
||||||
|
//
|
||||||
[Title("Extensions Data")]
|
// [Title("Extensions Data")]
|
||||||
[SerializeField] private int lavaNumber = 8;
|
// [SerializeField] private int lavaNumber = 8;
|
||||||
[SerializeField] private int volcanicNumber = 20;
|
// [SerializeField] private int volcanicNumber = 20;
|
||||||
[SerializeField] private int lineRushNumber = 1;
|
// [SerializeField] private int lineRushNumber = 1;
|
||||||
[SerializeField] private int enhancedLineRushNumber = 2;
|
// [SerializeField] private int enhancedLineRushNumber = 2;
|
||||||
[SerializeField] private Vector3 lavaBubbleBulletOffset = new(0, 3, 0);
|
// [SerializeField] private Vector3 lavaBubbleBulletOffset = new(0, 3, 0);
|
||||||
[SerializeField] private float lavaBubbleBulletDelay = 0.3f;
|
// [SerializeField] private float lavaBubbleBulletDelay = 0.3f;
|
||||||
[SerializeField] private int lavaBubbleBulletNumber = 2;
|
// [SerializeField] private int lavaBubbleBulletNumber = 2;
|
||||||
[SerializeField] private int lavaBubbleBulletFastNumber = 3;
|
// [SerializeField] private int lavaBubbleBulletFastNumber = 3;
|
||||||
|
//
|
||||||
private ParticleSystem ghost;
|
// private ParticleSystem ghost;
|
||||||
|
//
|
||||||
#endregion
|
// #endregion
|
||||||
|
//
|
||||||
#region Unity built-in methods
|
// #region Unity built-in methods
|
||||||
|
//
|
||||||
protected override void Awake()
|
// protected override void Awake()
|
||||||
{
|
// {
|
||||||
base.Awake();
|
// base.Awake();
|
||||||
|
//
|
||||||
ghost = transform.Find("Ghost").GetComponent<ParticleSystem>();
|
// ghost = transform.Find("Ghost").GetComponent<ParticleSystem>();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
protected override void Start()
|
// protected override void Start()
|
||||||
{
|
// {
|
||||||
base.Start();
|
// base.Start();
|
||||||
|
//
|
||||||
activeSkillList.Add(skillController.GetSkillByName("LavaEruption"));
|
// activeSkillList.Add(skillController.GetSkillByName("LavaEruption"));
|
||||||
activeSkillList.Add(skillController.GetSkillByName("LineRush"));
|
// activeSkillList.Add(skillController.GetSkillByName("LineRush"));
|
||||||
activeSkillList.Add(skillController.GetSkillByName("BigLavaEruption"));
|
// activeSkillList.Add(skillController.GetSkillByName("BigLavaEruption"));
|
||||||
activeSkillList.Add(skillController.GetSkillByName("VolcanicEruption"));
|
// activeSkillList.Add(skillController.GetSkillByName("VolcanicEruption"));
|
||||||
activeSkillList.Add(skillController.GetSkillByName("LavaBubbleBullet"));
|
// activeSkillList.Add(skillController.GetSkillByName("LavaBubbleBullet"));
|
||||||
activeSkillList.Add(skillController.GetSkillByName("LavaBubbleBulletFast"));
|
// activeSkillList.Add(skillController.GetSkillByName("LavaBubbleBulletFast"));
|
||||||
|
//
|
||||||
collisionDamage = activeSkillList[1].ActiveSkillData.Damage;
|
// collisionDamage = activeSkillList[1].ActiveSkillData.Damage;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
#endregion
|
// #endregion
|
||||||
|
//
|
||||||
#region Interface
|
// #region Interface
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
#endregion
|
// #endregion
|
||||||
|
//
|
||||||
#region Custom methods
|
// #region Custom methods
|
||||||
|
//
|
||||||
[Button("스킬 사용")]
|
// [Button("스킬 사용")]
|
||||||
public void Test(int index)
|
// public void Test(int index)
|
||||||
{
|
// {
|
||||||
ExecuteActiveSkill(activeSkillList[index]);
|
// ExecuteActiveSkill(activeSkillList[index]);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
public override void ExecuteActiveSkill(ActiveSkill activeSkill)
|
// public override void ExecuteActiveSkill(ActiveSkill activeSkill)
|
||||||
{
|
// {
|
||||||
usedSkillCoroutine = true;
|
// usedSkillCoroutine = true;
|
||||||
|
//
|
||||||
var endSkillTime = 0f;
|
// var endSkillTime = 0f;
|
||||||
if (activeSkill.ActiveSkillData.Name.Equals("LavaEruption"))
|
// if (activeSkill.ActiveSkillData.Name.Equals("LavaEruption"))
|
||||||
{
|
// {
|
||||||
for (var i = 0; i < lavaNumber; i++)
|
// for (var i = 0; i < lavaNumber; i++)
|
||||||
{
|
// {
|
||||||
var lava = Instantiate(activeSkill);
|
// var lava = Instantiate(activeSkill);
|
||||||
lava.Execute(TargetLayer, Target.transform.position, bossMapVertices);
|
// lava.Execute(TargetLayer, Target.transform.position, bossMapVertices);
|
||||||
endSkillTime = lava.GetEndSkillTime();
|
// endSkillTime = lava.GetEndSkillTime();
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
else if (activeSkill.ActiveSkillData.Name.Equals("LineRush"))
|
// else if (activeSkill.ActiveSkillData.Name.Equals("LineRush"))
|
||||||
{
|
// {
|
||||||
StartCoroutine(LineRushCoroutine(activeSkill));
|
// StartCoroutine(LineRushCoroutine(activeSkill));
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
else if (activeSkill.ActiveSkillData.Name.Equals("BigLavaEruption"))
|
// else if (activeSkill.ActiveSkillData.Name.Equals("BigLavaEruption"))
|
||||||
{
|
// {
|
||||||
var bigLava = Instantiate(activeSkill);
|
// var bigLava = Instantiate(activeSkill);
|
||||||
bigLava.Execute(TargetLayer, Target.transform.position);
|
// bigLava.Execute(TargetLayer, Target.transform.position);
|
||||||
endSkillTime = bigLava.GetEndSkillTime();
|
// endSkillTime = bigLava.GetEndSkillTime();
|
||||||
}
|
// }
|
||||||
else if (activeSkill.ActiveSkillData.Name.Equals("VolcanicEruption"))
|
// else if (activeSkill.ActiveSkillData.Name.Equals("VolcanicEruption"))
|
||||||
{
|
// {
|
||||||
for (var i = 0; i < volcanicNumber; i++)
|
// for (var i = 0; i < volcanicNumber; i++)
|
||||||
{
|
// {
|
||||||
var lava = Instantiate(activeSkill);
|
// var lava = Instantiate(activeSkill);
|
||||||
lava.SetUser(MyCollider);
|
// lava.SetUser(MyCollider);
|
||||||
lava.Execute(TargetLayer, Target.transform.position, bossMapVertices);
|
// lava.Execute(TargetLayer, Target.transform.position, bossMapVertices);
|
||||||
endSkillTime = lava.GetEndSkillTime();
|
// endSkillTime = lava.GetEndSkillTime();
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
else if (activeSkill.ActiveSkillData.Name.Equals("LavaBubbleBullet"))
|
// else if (activeSkill.ActiveSkillData.Name.Equals("LavaBubbleBullet"))
|
||||||
{
|
// {
|
||||||
StartCoroutine(LavaBubbleBulletCoroutine(activeSkill));
|
// StartCoroutine(LavaBubbleBulletCoroutine(activeSkill));
|
||||||
endSkillTime = 0f;
|
// endSkillTime = 0f;
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
print("사용할 수 없는 스킬입니다.");
|
// print("사용할 수 없는 스킬입니다.");
|
||||||
}
|
// }
|
||||||
CoolDownCoroutine(endSkillTime, () => usedSkillCoroutine = false);
|
// CoolDownCoroutine(endSkillTime, () => usedSkillCoroutine = false);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private IEnumerator LineRushCoroutine(ActiveSkill activeSkill)
|
// private IEnumerator LineRushCoroutine(ActiveSkill activeSkill)
|
||||||
{
|
// {
|
||||||
var endSkillTime = 0f;
|
// var endSkillTime = 0f;
|
||||||
var skillNumber = CurrentHp > MaxHp * 0.5f ? lineRushNumber : enhancedLineRushNumber;
|
// var skillNumber = CurrentHp > MaxHp * 0.5f ? lineRushNumber : enhancedLineRushNumber;
|
||||||
for (var i = 0; i < skillNumber; i++)
|
// for (var i = 0; i < skillNumber; i++)
|
||||||
{
|
// {
|
||||||
var skill = Instantiate(activeSkill);
|
// var skill = Instantiate(activeSkill);
|
||||||
skill.SetUser(MyCollider);
|
// skill.SetUser(MyCollider);
|
||||||
skill.Execute(TargetLayer, Target.transform.position, GhostPlay, GhostStop);
|
// skill.Execute(TargetLayer, Target.transform.position, GhostPlay, GhostStop);
|
||||||
endSkillTime = skill.GetEndSkillTime();
|
// endSkillTime = skill.GetEndSkillTime();
|
||||||
|
//
|
||||||
var time = 0f;
|
// var time = 0f;
|
||||||
while (time < endSkillTime)
|
// while (time < endSkillTime)
|
||||||
{
|
// {
|
||||||
time += Time.deltaTime;
|
// time += Time.deltaTime;
|
||||||
yield return null;
|
// yield return null;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
CoolDownCoroutine(endSkillTime, () => usedSkillCoroutine = false);
|
// CoolDownCoroutine(endSkillTime, () => usedSkillCoroutine = false);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private IEnumerator LavaBubbleBulletCoroutine(ActiveSkill activeSkill)
|
// private IEnumerator LavaBubbleBulletCoroutine(ActiveSkill activeSkill)
|
||||||
{
|
// {
|
||||||
for (var i = 0; i < lavaBubbleBulletNumber; i++)
|
// for (var i = 0; i < lavaBubbleBulletNumber; i++)
|
||||||
{
|
// {
|
||||||
var bullet = Instantiate(activeSkill, MyCollider.bounds.center + lavaBubbleBulletOffset, Quaternion.identity);
|
// var bullet = Instantiate(activeSkill, MyCollider.bounds.center + lavaBubbleBulletOffset, Quaternion.identity);
|
||||||
bullet.Execute(Target);
|
// bullet.Execute(Target);
|
||||||
|
//
|
||||||
var time = 0f;
|
// var time = 0f;
|
||||||
while (time < lavaBubbleBulletDelay)
|
// while (time < lavaBubbleBulletDelay)
|
||||||
{
|
// {
|
||||||
time += Time.deltaTime;
|
// time += Time.deltaTime;
|
||||||
yield return null;
|
// yield return null;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
var activeSkill2 = skillController.GetSkillByName("LavaBubbleBulletFast");
|
// var activeSkill2 = skillController.GetSkillByName("LavaBubbleBulletFast");
|
||||||
for (var i = 0; i < lavaBubbleBulletFastNumber; i++)
|
// for (var i = 0; i < lavaBubbleBulletFastNumber; i++)
|
||||||
{
|
// {
|
||||||
var bullet = Instantiate(activeSkill2, MyCollider.bounds.center + lavaBubbleBulletOffset, Quaternion.identity);
|
// var bullet = Instantiate(activeSkill2, MyCollider.bounds.center + lavaBubbleBulletOffset, Quaternion.identity);
|
||||||
bullet.Execute(Target);
|
// bullet.Execute(Target);
|
||||||
|
//
|
||||||
var time = 0f;
|
// var time = 0f;
|
||||||
while (time < lavaBubbleBulletDelay)
|
// while (time < lavaBubbleBulletDelay)
|
||||||
{
|
// {
|
||||||
time += Time.deltaTime;
|
// time += Time.deltaTime;
|
||||||
yield return null;
|
// yield return null;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private void GhostPlay()
|
// private void GhostPlay()
|
||||||
{
|
// {
|
||||||
isCollisionAttack = true;
|
// isCollisionAttack = true;
|
||||||
ghost.Clear();
|
// ghost.Clear();
|
||||||
ghost.Play();
|
// ghost.Play();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
private void GhostStop()
|
// private void GhostStop()
|
||||||
{
|
// {
|
||||||
isCollisionAttack = false;
|
// isCollisionAttack = false;
|
||||||
ghost.Stop();
|
// ghost.Stop();
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
#endregion
|
// #endregion
|
||||||
}
|
// }
|
||||||
}
|
// }
|
@ -0,0 +1,125 @@
|
|||||||
|
using System;
|
||||||
|
using Sirenix.OdinInspector;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace BlueWaterProject
|
||||||
|
{
|
||||||
|
public class Rhinoceros : FieldBoss
|
||||||
|
{
|
||||||
|
/***********************************************************************
|
||||||
|
* Variables
|
||||||
|
***********************************************************************/
|
||||||
|
#region Variables
|
||||||
|
|
||||||
|
// 실시간 상태
|
||||||
|
[Title("실시간 상태")]
|
||||||
|
[SerializeField] private bool isMoving;
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Unity Events
|
||||||
|
***********************************************************************/
|
||||||
|
#region Unity Events
|
||||||
|
|
||||||
|
private void Update()
|
||||||
|
{
|
||||||
|
MoveHandler();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Init Methods
|
||||||
|
***********************************************************************/
|
||||||
|
#region Init Methods
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Interfaces
|
||||||
|
***********************************************************************/
|
||||||
|
#region Interfaces
|
||||||
|
|
||||||
|
public override void Die()
|
||||||
|
{
|
||||||
|
isDead = true;
|
||||||
|
|
||||||
|
if (agent && agent.enabled)
|
||||||
|
{
|
||||||
|
agent.velocity = Vector3.zero;
|
||||||
|
agent.isStopped = true;
|
||||||
|
agent.enabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rb)
|
||||||
|
{
|
||||||
|
rb.velocity = Vector3.zero;
|
||||||
|
rb.isKinematic = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (capsuleCollider && capsuleCollider.enabled)
|
||||||
|
{
|
||||||
|
capsuleCollider.isTrigger = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
animator.SetTrigger("isDead");
|
||||||
|
Destroy(gameObject, 2f);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* Methods
|
||||||
|
***********************************************************************/
|
||||||
|
#region Methods
|
||||||
|
|
||||||
|
public override void ActivateSkill(string skillName)
|
||||||
|
{
|
||||||
|
IsUsingSkill = true;
|
||||||
|
|
||||||
|
skillDictionary[skillName].SkillInputData.PreviousDirection = PreviousDirection;
|
||||||
|
skillDictionary[skillName].ActivateSkill(
|
||||||
|
() => IsUsingSkill = false,
|
||||||
|
() => PreviousDirection = GetTargetDirection());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void MoveHandler()
|
||||||
|
{
|
||||||
|
if (agent)
|
||||||
|
{
|
||||||
|
//var localVelocity = transform.InverseTransformDirection(agent.velocity);
|
||||||
|
//var moveDirection = localVelocity.normalized;
|
||||||
|
|
||||||
|
var moveDirection = agent.enabled ? agent.velocity.normalized : rb.velocity.normalized;
|
||||||
|
|
||||||
|
isMoving = moveDirection != Vector3.zero;
|
||||||
|
animator.SetBool("isMoving", isMoving);
|
||||||
|
if (isMoving)
|
||||||
|
{
|
||||||
|
PreviousDirection = moveDirection;
|
||||||
|
}
|
||||||
|
animator.SetFloat("xDirection", PreviousDirection.x);
|
||||||
|
animator.SetFloat("zDirection", PreviousDirection.z);
|
||||||
|
|
||||||
|
FlipVisualLook(PreviousDirection.x);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void FlipVisualLook(float previousDirectionX)
|
||||||
|
{
|
||||||
|
var localScale = visualLook.localScale;
|
||||||
|
localScale.x = previousDirectionX switch
|
||||||
|
{
|
||||||
|
> 0.01f => Mathf.Abs(localScale.x),
|
||||||
|
< -0.01f => -Mathf.Abs(localScale.x),
|
||||||
|
_ => localScale.x
|
||||||
|
};
|
||||||
|
visualLook.localScale = localScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 12e4cddc82acd7e4aa0c534bd6db84a9
|
@ -135,7 +135,13 @@ namespace BlueWaterProject
|
|||||||
var boost = isBoosting ? boostPower : 1f;
|
var boost = isBoosting ? boostPower : 1f;
|
||||||
var speedChange = movementInput != Vector2.zero ? acceleration * boost * Time.fixedDeltaTime : deceleration * Time.fixedDeltaTime;
|
var speedChange = movementInput != Vector2.zero ? acceleration * boost * Time.fixedDeltaTime : deceleration * Time.fixedDeltaTime;
|
||||||
var targetVelocity = moveDirection * (maxSpeed * boost);
|
var targetVelocity = moveDirection * (maxSpeed * boost);
|
||||||
rb.velocity = Vector3.MoveTowards(rb.velocity, targetVelocity, speedChange);
|
//rb.velocity = Vector3.MoveTowards(rb.velocity, targetVelocity, speedChange);
|
||||||
|
rb.AddForce(targetVelocity * speedChange, ForceMode.Acceleration);
|
||||||
|
|
||||||
|
if (rb.velocity.magnitude > maxSpeed * boost)
|
||||||
|
{
|
||||||
|
rb.velocity = rb.velocity.normalized * (maxSpeed * boost);
|
||||||
|
}
|
||||||
|
|
||||||
if (moveDirection != Vector3.zero)
|
if (moveDirection != Vector3.zero)
|
||||||
{
|
{
|
||||||
@ -149,6 +155,29 @@ namespace BlueWaterProject
|
|||||||
// rb.rotation = Quaternion.Slerp(rb.rotation, targetRotation, turnSpeed * Time.fixedDeltaTime);
|
// rb.rotation = Quaternion.Slerp(rb.rotation, targetRotation, turnSpeed * Time.fixedDeltaTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ApplyForceToReachVelocity(Rigidbody rigidbody, Vector3 velocity, float force = 1, ForceMode mode = ForceMode.Force)
|
||||||
|
{
|
||||||
|
if (force == 0 || velocity.magnitude == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
velocity = velocity + velocity.normalized * (0.2f * rigidbody.drag);
|
||||||
|
print(velocity);
|
||||||
|
|
||||||
|
//force = 1 => need 1 s to reach velocity (if mass is 1) => force can be max 1 / Time.fixedDeltaTime
|
||||||
|
force = Mathf.Clamp(force, -rigidbody.mass / Time.fixedDeltaTime, rigidbody.mass / Time.fixedDeltaTime);
|
||||||
|
|
||||||
|
//dot product is a projection from rhs to lhs with a length of result / lhs.magnitude https://www.youtube.com/watch?v=h0NJK4mEIJU
|
||||||
|
if (rigidbody.velocity.magnitude == 0)
|
||||||
|
{
|
||||||
|
rigidbody.AddForce(velocity * force, mode);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var velocityProjectedToTarget = (velocity.normalized * Vector3.Dot(velocity, rigidbody.velocity) / velocity.magnitude);
|
||||||
|
rigidbody.AddForce((velocity - velocityProjectedToTarget) * force, mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void StopShipMovement()
|
private void StopShipMovement()
|
||||||
{
|
{
|
||||||
|
@ -16,6 +16,8 @@ namespace BlueWaterProject
|
|||||||
|
|
||||||
private GameObject cinemachineCameras;
|
private GameObject cinemachineCameras;
|
||||||
private List<CinemachineVirtualCamera> cineCamList;
|
private List<CinemachineVirtualCamera> cineCamList;
|
||||||
|
|
||||||
|
private float originalRotation;
|
||||||
|
|
||||||
private const int CINE_CAM_NUM = 1;
|
private const int CINE_CAM_NUM = 1;
|
||||||
|
|
||||||
@ -65,7 +67,7 @@ namespace BlueWaterProject
|
|||||||
public void SetFollowAndLookAt(Transform target)
|
public void SetFollowAndLookAt(Transform target)
|
||||||
{
|
{
|
||||||
BaseCombatCamera.Follow = target;
|
BaseCombatCamera.Follow = target;
|
||||||
BaseCombatCamera.LookAt = target;
|
//BaseCombatCamera.LookAt = target;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
8
BlueWater/Assets/02.Scripts/Editor.meta
Normal file
8
BlueWater/Assets/02.Scripts/Editor.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a4449f766bff72748a5afae8e7fb907c
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
57
BlueWater/Assets/02.Scripts/Editor/PatrolEditor.cs
Normal file
57
BlueWater/Assets/02.Scripts/Editor/PatrolEditor.cs
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace BlueWaterProject
|
||||||
|
{
|
||||||
|
[CustomEditor(typeof(ShipPatrol),true)]
|
||||||
|
public class ShipPatrolEditor : Editor
|
||||||
|
{
|
||||||
|
private void OnSceneGUI()
|
||||||
|
{
|
||||||
|
Handles.color = Color.green;
|
||||||
|
var patrol = (ShipPatrol)target;
|
||||||
|
|
||||||
|
for (var i = 0; i < patrol.WayPoints.Length; i++)
|
||||||
|
{
|
||||||
|
EditorGUI.BeginChangeCheck();
|
||||||
|
|
||||||
|
var oldPoint = patrol.OriginalPoint + patrol.WayPoints[i].Point;
|
||||||
|
var style = new GUIStyle();
|
||||||
|
|
||||||
|
style.normal.textColor = Color.yellow;
|
||||||
|
Handles.Label(patrol.OriginalPoint + patrol.WayPoints[i].Point +
|
||||||
|
(Vector3.down * 0.4f) + (Vector3.right * 0.4f), "" + i, style);
|
||||||
|
|
||||||
|
var newPoint = Handles.FreeMoveHandle(oldPoint, 0.5f,
|
||||||
|
new Vector3(0.25f, 0.25f, 0.25f), Handles.CircleHandleCap);
|
||||||
|
newPoint = ApplyAxisLock(oldPoint, newPoint);
|
||||||
|
|
||||||
|
if (EditorGUI.EndChangeCheck())
|
||||||
|
{
|
||||||
|
Undo.RecordObject(target, "Free Move Handle");
|
||||||
|
patrol.WayPoints[i].Point = newPoint - patrol.OriginalPoint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Vector3 ApplyAxisLock(Vector3 oldPoint, Vector3 newPoint)
|
||||||
|
{
|
||||||
|
var patrolSetting = (ShipPatrol)target;
|
||||||
|
if (patrolSetting.LockHandlesOnXAxis)
|
||||||
|
{
|
||||||
|
newPoint.x = oldPoint.x;
|
||||||
|
}
|
||||||
|
if (patrolSetting.LockHandlesOnYAxis)
|
||||||
|
{
|
||||||
|
newPoint.y = oldPoint.y;
|
||||||
|
}
|
||||||
|
if (patrolSetting.LockHandlesOnZAxis)
|
||||||
|
{
|
||||||
|
newPoint.z = oldPoint.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
return newPoint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
2
BlueWater/Assets/02.Scripts/Editor/PatrolEditor.cs.meta
Normal file
2
BlueWater/Assets/02.Scripts/Editor/PatrolEditor.cs.meta
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c18603aad4bd6ed4884f225756c0d27e
|
9
BlueWater/Assets/02.Scripts/GameLifetimeScope.cs
Normal file
9
BlueWater/Assets/02.Scripts/GameLifetimeScope.cs
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
using VContainer;
|
||||||
|
using VContainer.Unity;
|
||||||
|
|
||||||
|
public class GameLifetimeScope : LifetimeScope
|
||||||
|
{
|
||||||
|
protected override void Configure(IContainerBuilder builder)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
2
BlueWater/Assets/02.Scripts/GameLifetimeScope.cs.meta
Normal file
2
BlueWater/Assets/02.Scripts/GameLifetimeScope.cs.meta
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f6d3174aef91e74449c5585531f446ac
|
8
BlueWater/Assets/02.Scripts/Interface/ILaunch.cs
Normal file
8
BlueWater/Assets/02.Scripts/Interface/ILaunch.cs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace BlueWaterProject
|
||||||
|
{
|
||||||
|
public interface ILaunch
|
||||||
|
{
|
||||||
|
void ExecuteLaunch();
|
||||||
|
}
|
||||||
|
}
|
11
BlueWater/Assets/02.Scripts/Interface/ILaunch.cs.meta
Normal file
11
BlueWater/Assets/02.Scripts/Interface/ILaunch.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 656485857a827954b84f967e8903a637
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
19
BlueWater/Assets/02.Scripts/Interface/IPatrol.cs
Normal file
19
BlueWater/Assets/02.Scripts/Interface/IPatrol.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace BlueWaterProject
|
||||||
|
{
|
||||||
|
public interface IPatrol
|
||||||
|
{
|
||||||
|
WayPoint[] WayPoints { get; set; }
|
||||||
|
Vector3 OriginalPoint { get; set; }
|
||||||
|
int CurrentIndex { get; set; }
|
||||||
|
int PreviousIndex { get; set; }
|
||||||
|
|
||||||
|
WayPoint GetCurrentWayPoint();
|
||||||
|
int GetNextIndex();
|
||||||
|
bool HasReachedDestination();
|
||||||
|
void SetMovePoint();
|
||||||
|
void UpdatePositionAndRotation();
|
||||||
|
}
|
||||||
|
}
|
11
BlueWater/Assets/02.Scripts/Interface/IPatrol.cs.meta
Normal file
11
BlueWater/Assets/02.Scripts/Interface/IPatrol.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 04272c03bcfe62e4486a1826b5065025
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -1,10 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
// ReSharper disable once CheckNamespace
|
// ReSharper disable once CheckNamespace
|
||||||
namespace BlueWaterProject
|
namespace BlueWaterProject
|
||||||
{
|
{
|
||||||
public interface ISkill
|
public interface ISkill
|
||||||
{
|
{
|
||||||
SkillInputData SkillInputData { get; set; }
|
SkillInputData SkillInputData { get; set; }
|
||||||
void ActivateSkill();
|
void ActivateSkill(params Action[] actions);
|
||||||
bool EnableSkill();
|
bool EnableSkill();
|
||||||
void InitData();
|
void InitData();
|
||||||
}
|
}
|
||||||
|
8
BlueWater/Assets/02.Scripts/NewSkill/Rhinoceros.meta
Normal file
8
BlueWater/Assets/02.Scripts/NewSkill/Rhinoceros.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 17876ba3755c2d44488cc47410de1153
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -0,0 +1,97 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using BlueWaterProject;
|
||||||
|
using Sirenix.OdinInspector;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace RhinocerosSkill
|
||||||
|
{
|
||||||
|
public class EarthquakeWave : SkillBase
|
||||||
|
{
|
||||||
|
[Title("추가 옵션")]
|
||||||
|
[SerializeField] private bool isDrawingGizmo = true;
|
||||||
|
[SerializeField] private float width = 3f;
|
||||||
|
|
||||||
|
private Vector3 startPosition;
|
||||||
|
private Vector3 halfScale;
|
||||||
|
private RaycastHit[] hits;
|
||||||
|
private bool isUsingSkill;
|
||||||
|
|
||||||
|
private void OnDrawGizmos()
|
||||||
|
{
|
||||||
|
if (!isDrawingGizmo || !isUsingSkill) return;
|
||||||
|
|
||||||
|
Gizmos.color = Color.red;
|
||||||
|
|
||||||
|
var rotation = Quaternion.LookRotation(new Vector3(SkillInputData.PreviousDirection.x, 0, SkillInputData.PreviousDirection.z));
|
||||||
|
Gizmos.matrix = Matrix4x4.TRS(startPosition + SkillInputData.PreviousDirection * Range * 0.5f, rotation, Vector3.one);
|
||||||
|
Gizmos.DrawWireCube(Vector3.zero, new Vector3(halfScale.x * 2, halfScale.y * 2, Range));
|
||||||
|
Gizmos.matrix = Matrix4x4.identity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ActivateSkill(params Action[] actions)
|
||||||
|
{
|
||||||
|
ReadySkill = false;
|
||||||
|
CoolDown(Cooldown, () => ReadySkill = true);
|
||||||
|
StartCoroutine(SkillCoroutine(actions));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool EnableSkill()
|
||||||
|
{
|
||||||
|
if (!ReadySkill) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void BasicSetting()
|
||||||
|
{
|
||||||
|
base.BasicSetting();
|
||||||
|
|
||||||
|
hits = new RaycastHit[5];
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerator SkillCoroutine(params Action[] actions)
|
||||||
|
{
|
||||||
|
isUsingSkill = true;
|
||||||
|
startPosition = SkillInputData.PlayerRb.position;
|
||||||
|
halfScale = transform.localScale * 0.5f;
|
||||||
|
|
||||||
|
transform.position = startPosition;
|
||||||
|
var angle = Mathf.Atan2(SkillInputData.PreviousDirection.x, SkillInputData.PreviousDirection.z) * Mathf.Rad2Deg;
|
||||||
|
transform.rotation = Quaternion.Euler(0, angle, 0);
|
||||||
|
transform.localScale = new Vector3(width, 6f, Range * 2);
|
||||||
|
|
||||||
|
ShowIndicator();
|
||||||
|
|
||||||
|
var elapsedTime = 0f;
|
||||||
|
var fill = 1 / CastingTime;
|
||||||
|
while (elapsedTime < CastingTime)
|
||||||
|
{
|
||||||
|
elapsedTime += Time.deltaTime;
|
||||||
|
|
||||||
|
if (isUsingIndicator && indicator)
|
||||||
|
{
|
||||||
|
var fillValue = indicator.material.GetFloat(FillHash) + Time.deltaTime * fill;
|
||||||
|
indicator.material.SetFloat(FillHash, fillValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var maxSize = Physics.BoxCastNonAlloc(startPosition, halfScale, SkillInputData.PreviousDirection,
|
||||||
|
hits, Quaternion.identity, 0f, SkillInputData.TargetLayer, QueryTriggerInteraction.Ignore);
|
||||||
|
for (var i = 0; i < maxSize; i++)
|
||||||
|
{
|
||||||
|
var iDamageable = hits[i].transform.GetComponent<IDamageable>();
|
||||||
|
iDamageable?.TakeDamage(Damage);
|
||||||
|
}
|
||||||
|
|
||||||
|
HideIndicator();
|
||||||
|
|
||||||
|
actions[0].Invoke();
|
||||||
|
|
||||||
|
isUsingSkill = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0bc3a312bfa527e45864c7d94466f674
|
@ -0,0 +1,87 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using BlueWaterProject;
|
||||||
|
using Sirenix.OdinInspector;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace RhinocerosSkill
|
||||||
|
{
|
||||||
|
public class HammerAttack : SkillBase
|
||||||
|
{
|
||||||
|
[Title("추가 옵션")]
|
||||||
|
[SerializeField] private float hammerOffset = 3f;
|
||||||
|
|
||||||
|
private Collider[] hitColliders;
|
||||||
|
|
||||||
|
public override void ActivateSkill(params Action[] actions)
|
||||||
|
{
|
||||||
|
ReadySkill = false;
|
||||||
|
SkillInputData.PlayerAnimator.SetTrigger("isHammerAttack");
|
||||||
|
CoolDown(Cooldown, () => ReadySkill = true);
|
||||||
|
StartCoroutine(SkillCoroutine(actions));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool EnableSkill()
|
||||||
|
{
|
||||||
|
if (!ReadySkill) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void BasicSetting()
|
||||||
|
{
|
||||||
|
base.BasicSetting();
|
||||||
|
|
||||||
|
hitColliders = new Collider[5];
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerator SkillCoroutine(params Action[] actions)
|
||||||
|
{
|
||||||
|
while (!SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).IsName("HammerAttack"))
|
||||||
|
{
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var skillPlayerPosition = SkillInputData.PlayerCollider.transform.position;
|
||||||
|
var targetPosition = SkillInputData.TargetCollider.transform.position;
|
||||||
|
var targetToDirection = (targetPosition - skillPlayerPosition).normalized;
|
||||||
|
transform.position = skillPlayerPosition + targetToDirection * hammerOffset;
|
||||||
|
transform.localScale = Vector3.one * Range;
|
||||||
|
|
||||||
|
actions[1].Invoke();
|
||||||
|
ShowIndicator();
|
||||||
|
|
||||||
|
var elapsedTime = 0f;
|
||||||
|
var fill = 1 / CastingTime;
|
||||||
|
while (elapsedTime < CastingTime)
|
||||||
|
{
|
||||||
|
elapsedTime += Time.deltaTime;
|
||||||
|
|
||||||
|
if (isUsingIndicator && indicator)
|
||||||
|
{
|
||||||
|
var fillValue = indicator.material.GetFloat(FillHash) + Time.deltaTime * fill;
|
||||||
|
indicator.material.SetFloat(FillHash, fillValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var maxSize = Physics.OverlapSphereNonAlloc(transform.position, Range, hitColliders, SkillInputData.TargetLayer);
|
||||||
|
for (var i = 0; i < maxSize; i++)
|
||||||
|
{
|
||||||
|
var iDamageable = hitColliders[i].GetComponent<IDamageable>();
|
||||||
|
iDamageable?.TakeDamage(Damage);
|
||||||
|
}
|
||||||
|
|
||||||
|
HideIndicator();
|
||||||
|
|
||||||
|
while (SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).IsName("HammerAttack") &&
|
||||||
|
SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f)
|
||||||
|
{
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
actions[0].Invoke();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7f2a50b72621aac4f9178db7ab02867e
|
142
BlueWater/Assets/02.Scripts/NewSkill/Rhinoceros/HammerSwing.cs
Normal file
142
BlueWater/Assets/02.Scripts/NewSkill/Rhinoceros/HammerSwing.cs
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using BlueWaterProject;
|
||||||
|
using Sirenix.OdinInspector;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.Rendering.Universal;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace RhinocerosSkill
|
||||||
|
{
|
||||||
|
public class HammerSwing : SkillBase
|
||||||
|
{
|
||||||
|
[Title("추가 옵션")]
|
||||||
|
[SerializeField] private bool isDrawingGizmo = true;
|
||||||
|
[SerializeField] private float angle = 180f;
|
||||||
|
|
||||||
|
[Title("발사체 옵션")]
|
||||||
|
[SerializeField] private GameObject projectilePrefab;
|
||||||
|
[SerializeField] private int projectileNumber = 5;
|
||||||
|
[SerializeField] private float projectileDamage = 10f;
|
||||||
|
[SerializeField] private float projectileAngle = 90f;
|
||||||
|
[SerializeField] private float projectileSpeed = 500f;
|
||||||
|
|
||||||
|
private Collider[] hitColliders;
|
||||||
|
private bool isUsingSkill;
|
||||||
|
|
||||||
|
private void OnDrawGizmos()
|
||||||
|
{
|
||||||
|
if (!isDrawingGizmo || !isUsingSkill) return;
|
||||||
|
|
||||||
|
Gizmos.color = Color.red;
|
||||||
|
var skillPosition = transform.position;
|
||||||
|
Gizmos.DrawWireSphere(skillPosition, Range);
|
||||||
|
|
||||||
|
if (SkillInputData != null && SkillInputData.TargetCollider != null)
|
||||||
|
{
|
||||||
|
var skillPlayerPosition = SkillInputData.PlayerRb.position;
|
||||||
|
var forward = transform.forward;
|
||||||
|
var leftBoundary = Quaternion.Euler(0, -angle / 2, 0) * forward;
|
||||||
|
var rightBoundary = Quaternion.Euler(0, angle / 2, 0) * forward;
|
||||||
|
|
||||||
|
Gizmos.color = Color.yellow;
|
||||||
|
Gizmos.DrawLine(skillPlayerPosition, skillPlayerPosition + leftBoundary * Range);
|
||||||
|
Gizmos.DrawLine(skillPlayerPosition, skillPlayerPosition + rightBoundary * Range);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ActivateSkill(params Action[] actions)
|
||||||
|
{
|
||||||
|
ReadySkill = false;
|
||||||
|
SkillInputData.PlayerAnimator.SetTrigger("isHammerSwing");
|
||||||
|
CoolDown(Cooldown, () => ReadySkill = true);
|
||||||
|
StartCoroutine(SkillCoroutine(actions));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool EnableSkill()
|
||||||
|
{
|
||||||
|
if (!ReadySkill) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void BasicSetting()
|
||||||
|
{
|
||||||
|
if (isUsingIndicator && indicator)
|
||||||
|
{
|
||||||
|
indicator.scaleMode = DecalScaleMode.InheritFromHierarchy;
|
||||||
|
indicator.material = new Material(indicator.material);
|
||||||
|
indicator.material.SetFloat(FillHash, 0f);
|
||||||
|
indicator.material.SetFloat("Angle", angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
hitColliders = new Collider[5];
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerator SkillCoroutine(params Action[] actions)
|
||||||
|
{
|
||||||
|
while (!SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).IsName("HammerSwing"))
|
||||||
|
{
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
isUsingSkill = true;
|
||||||
|
var skillPlayerPosition = SkillInputData.PlayerRb.position;
|
||||||
|
var targetPosition = SkillInputData.TargetCollider.transform.position;
|
||||||
|
var targetToDirection = (targetPosition - skillPlayerPosition).normalized;
|
||||||
|
transform.position = skillPlayerPosition;
|
||||||
|
var yAngle = Mathf.Atan2(targetToDirection.x, targetToDirection.z) * Mathf.Rad2Deg;
|
||||||
|
transform.rotation = Quaternion.Euler(0, yAngle, 0);
|
||||||
|
transform.localScale = Vector3.one * (Range * 2);
|
||||||
|
|
||||||
|
actions[1].Invoke();
|
||||||
|
ShowIndicator();
|
||||||
|
|
||||||
|
var elapsedTime = 0f;
|
||||||
|
var fill = 1 / CastingTime;
|
||||||
|
while (elapsedTime < CastingTime)
|
||||||
|
{
|
||||||
|
elapsedTime += Time.deltaTime;
|
||||||
|
|
||||||
|
if (isUsingIndicator && indicator)
|
||||||
|
{
|
||||||
|
var fillValue = indicator.material.GetFloat(FillHash) + Time.deltaTime * fill;
|
||||||
|
indicator.material.SetFloat(FillHash, fillValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var maxSize = Physics.OverlapSphereNonAlloc(transform.position, Range, hitColliders, SkillInputData.TargetLayer);
|
||||||
|
for (var i = 0; i < maxSize; i++)
|
||||||
|
{
|
||||||
|
var angleToTarget = Vector3.Angle(skillPlayerPosition, transform.forward);
|
||||||
|
|
||||||
|
if (angleToTarget <= angle * 0.5f)
|
||||||
|
{
|
||||||
|
var iDamageable = hitColliders[i].GetComponent<IDamageable>();
|
||||||
|
iDamageable?.TakeDamage(Damage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HideIndicator();
|
||||||
|
|
||||||
|
var startAngle = yAngle - projectileAngle * 0.5f;
|
||||||
|
var angleStep = projectileAngle / (projectileNumber - 1);
|
||||||
|
|
||||||
|
for (var i = 0; i < projectileNumber; i++)
|
||||||
|
{
|
||||||
|
var currentAngle = startAngle + angleStep * i;
|
||||||
|
var rotation = Quaternion.Euler(0, currentAngle, 0);
|
||||||
|
var projectile = Instantiate(projectilePrefab, transform.position + Vector3.up, rotation);
|
||||||
|
var particleWeapon = projectile.GetComponent<ParticleWeapon>();
|
||||||
|
particleWeapon.SetPower(projectileDamage);
|
||||||
|
particleWeapon.Rb.AddForce(particleWeapon.transform.forward * projectileSpeed);
|
||||||
|
}
|
||||||
|
|
||||||
|
actions[0].Invoke();
|
||||||
|
|
||||||
|
isUsingSkill = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0fde1b55379e6834585dfbadb4b7c0f2
|
247
BlueWater/Assets/02.Scripts/NewSkill/Rhinoceros/JumpSmash.cs
Normal file
247
BlueWater/Assets/02.Scripts/NewSkill/Rhinoceros/JumpSmash.cs
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using BlueWaterProject;
|
||||||
|
using Sirenix.OdinInspector;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.Rendering.Universal;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace RhinocerosSkill
|
||||||
|
{
|
||||||
|
public class JumpSmash : SkillBase
|
||||||
|
{
|
||||||
|
[Title("추가 옵션")]
|
||||||
|
[SerializeField] private float upTime = 0.1f;
|
||||||
|
[SerializeField] private float waitTime = 1f;
|
||||||
|
[SerializeField] private float downTime = 0.1f;
|
||||||
|
[SerializeField] private float stunTime = 2f;
|
||||||
|
[SerializeField] protected DecalProjector stunIndicator;
|
||||||
|
|
||||||
|
private Collider[] hitColliders;
|
||||||
|
|
||||||
|
private void OnDestroy()
|
||||||
|
{
|
||||||
|
if (SkillInputData.TargetCollider)
|
||||||
|
{
|
||||||
|
SkillInputData.TargetCollider.GetComponent<PhysicsMovement>().MyCurrentState.IsStunned = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ActivateSkill(params Action[] actions)
|
||||||
|
{
|
||||||
|
ReadySkill = false;
|
||||||
|
SkillInputData.PlayerAnimator.SetBool("isJump", true);
|
||||||
|
CoolDown(Cooldown, () => ReadySkill = true);
|
||||||
|
StartCoroutine(SkillCoroutine(actions));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool EnableSkill()
|
||||||
|
{
|
||||||
|
if (!ReadySkill) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void BasicSetting()
|
||||||
|
{
|
||||||
|
if (isUsingIndicator)
|
||||||
|
{
|
||||||
|
if (indicator)
|
||||||
|
{
|
||||||
|
indicator.scaleMode = DecalScaleMode.InheritFromHierarchy;
|
||||||
|
indicator.material = new Material(indicator.material);
|
||||||
|
indicator.material.SetFloat(FillHash, 0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stunIndicator)
|
||||||
|
{
|
||||||
|
stunIndicator.scaleMode = DecalScaleMode.InheritFromHierarchy;
|
||||||
|
stunIndicator.material = new Material(stunIndicator.material);
|
||||||
|
stunIndicator.material.SetFloat(FillHash, 0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hitColliders = new Collider[5];
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void HideIndicator()
|
||||||
|
{
|
||||||
|
if (isUsingIndicator)
|
||||||
|
{
|
||||||
|
if (indicator)
|
||||||
|
{
|
||||||
|
indicator.enabled = false;
|
||||||
|
indicator.material.SetFloat(FillHash, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stunIndicator)
|
||||||
|
{
|
||||||
|
stunIndicator.enabled = false;
|
||||||
|
stunIndicator.material.SetFloat(FillHash, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void ShowIndicator()
|
||||||
|
{
|
||||||
|
if (isUsingIndicator)
|
||||||
|
{
|
||||||
|
if (indicator)
|
||||||
|
{
|
||||||
|
indicator.material.SetFloat(FillHash, 0);
|
||||||
|
indicator.enabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stunIndicator)
|
||||||
|
{
|
||||||
|
stunIndicator.material.SetFloat(FillHash, 0);
|
||||||
|
stunIndicator.enabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerator SkillCoroutine(params Action[] actions)
|
||||||
|
{
|
||||||
|
while (!SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).IsName("Jump"))
|
||||||
|
{
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).IsName("Jump") &&
|
||||||
|
SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).normalizedTime < 1.0f)
|
||||||
|
{
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
SkillInputData.PlayerAgent.enabled = false;
|
||||||
|
SkillInputData.PlayerRb.useGravity = false;
|
||||||
|
|
||||||
|
var elapsedTime = 0f;
|
||||||
|
var startPosition = SkillInputData.PlayerRb.transform.position;
|
||||||
|
var endPosition = startPosition + Vector3.up * 15f;
|
||||||
|
|
||||||
|
while (elapsedTime < upTime)
|
||||||
|
{
|
||||||
|
elapsedTime += Time.deltaTime;
|
||||||
|
SkillInputData.PlayerRb.position = Vector3.Lerp(startPosition, endPosition, elapsedTime / upTime);
|
||||||
|
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
SkillInputData.PlayerRb.position = endPosition;
|
||||||
|
|
||||||
|
yield return new WaitForSeconds(waitTime);
|
||||||
|
|
||||||
|
var targetPosition = SkillInputData.TargetCollider.transform.position;
|
||||||
|
transform.position = targetPosition;
|
||||||
|
transform.localScale = Vector3.one * (Range * 2f);
|
||||||
|
stunIndicator.transform.localScale = Vector3.one * 4f;
|
||||||
|
|
||||||
|
startPosition = targetPosition + Vector3.up * 15f;
|
||||||
|
endPosition = targetPosition;
|
||||||
|
|
||||||
|
ShowIndicator();
|
||||||
|
|
||||||
|
elapsedTime = 0f;
|
||||||
|
var fill = 1 / CastingTime;
|
||||||
|
while (elapsedTime < CastingTime)
|
||||||
|
{
|
||||||
|
elapsedTime += Time.deltaTime;
|
||||||
|
|
||||||
|
if (isUsingIndicator)
|
||||||
|
{
|
||||||
|
var fillValue = indicator.material.GetFloat(FillHash) + Time.deltaTime * fill;
|
||||||
|
if (indicator)
|
||||||
|
{
|
||||||
|
indicator.material.SetFloat(FillHash, fillValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stunIndicator)
|
||||||
|
{
|
||||||
|
stunIndicator.material.SetFloat(FillHash, fillValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
IgnoreCollision(true);
|
||||||
|
|
||||||
|
elapsedTime = 0f;
|
||||||
|
while (elapsedTime < downTime)
|
||||||
|
{
|
||||||
|
elapsedTime += Time.deltaTime;
|
||||||
|
|
||||||
|
SkillInputData.PlayerRb.position = Vector3.Lerp(startPosition, endPosition, elapsedTime / downTime);
|
||||||
|
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
VisualFeedbackManager.Inst.CameraShake(CameraManager.Inst.CombatCamera.BaseCombatCamera, 3f, 1f);
|
||||||
|
SkillInputData.PlayerRb.useGravity = true;
|
||||||
|
SkillInputData.PlayerAgent.enabled = true;
|
||||||
|
|
||||||
|
SkillInputData.PlayerRb.position = endPosition;
|
||||||
|
|
||||||
|
var targetToVector = SkillInputData.TargetCollider.transform.position - SkillInputData.PlayerCollider.transform.position;
|
||||||
|
targetToVector.y = 0f;
|
||||||
|
var playerRadius = ((CapsuleCollider)SkillInputData.PlayerCollider).radius;
|
||||||
|
|
||||||
|
if (targetToVector.magnitude < playerRadius)
|
||||||
|
{
|
||||||
|
var direction = targetToVector.normalized;
|
||||||
|
direction = direction == Vector3.zero ? Vector3.right : direction;
|
||||||
|
SkillInputData.TargetCollider.transform.GetComponent<Rigidbody>().AddForce(direction * 70f, ForceMode.Impulse);
|
||||||
|
CoolDown(1f, () => IgnoreCollision(false));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
IgnoreCollision(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
HideIndicator();
|
||||||
|
|
||||||
|
var maxSize = Physics.OverlapSphereNonAlloc(transform.position, Range, hitColliders, SkillInputData.TargetLayer);
|
||||||
|
for (var i = 0; i < maxSize; i++)
|
||||||
|
{
|
||||||
|
var iDamageable = hitColliders[i].GetComponent<IDamageable>();
|
||||||
|
iDamageable?.TakeDamage(Damage);
|
||||||
|
}
|
||||||
|
|
||||||
|
maxSize = Physics.OverlapSphereNonAlloc(transform.position, Range * 2f, hitColliders, SkillInputData.TargetLayer);
|
||||||
|
for (var i = 0; i < maxSize; i++)
|
||||||
|
{
|
||||||
|
var physicsMovement = hitColliders[i].GetComponent<PhysicsMovement>();
|
||||||
|
if (physicsMovement != null && !physicsMovement.MyCurrentState.isDashing)
|
||||||
|
{
|
||||||
|
StartCoroutine(StunCoroutine(physicsMovement));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SkillInputData.PlayerAnimator.SetBool("isJump", false);
|
||||||
|
SkillInputData.PlayerAnimator.SetTrigger("isSmash");
|
||||||
|
|
||||||
|
actions[0].Invoke();
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerator StunCoroutine(PhysicsMovement physicsMovement)
|
||||||
|
{
|
||||||
|
physicsMovement.MyCurrentState.isMoving = false;
|
||||||
|
physicsMovement.MyCurrentState.IsStunned = true;
|
||||||
|
|
||||||
|
var elapsedTime = 0f;
|
||||||
|
while (elapsedTime < stunTime)
|
||||||
|
{
|
||||||
|
elapsedTime += Time.deltaTime;
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
physicsMovement.MyCurrentState.IsStunned = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void IgnoreCollision(bool value)
|
||||||
|
{
|
||||||
|
Physics.IgnoreCollision(SkillInputData.PlayerCollider, SkillInputData.TargetCollider, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ef339f855b0080641b375baefaddb1d0
|
145
BlueWater/Assets/02.Scripts/NewSkill/Rhinoceros/LineRush.cs
Normal file
145
BlueWater/Assets/02.Scripts/NewSkill/Rhinoceros/LineRush.cs
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections;
|
||||||
|
using BlueWaterProject;
|
||||||
|
using Sirenix.OdinInspector;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace RhinocerosSkill
|
||||||
|
{
|
||||||
|
public class LineRush : SkillBase
|
||||||
|
{
|
||||||
|
[Title("추가 옵션")]
|
||||||
|
[SerializeField] private bool isDrawingGizmo = true;
|
||||||
|
[SerializeField] private float width = 3f;
|
||||||
|
[SerializeField] private float rushSpeed = 15f;
|
||||||
|
[SerializeField] private float rushOffset = 3f;
|
||||||
|
|
||||||
|
private bool isUsingSkill;
|
||||||
|
private Vector3 startPosition;
|
||||||
|
private float distanceToTarget;
|
||||||
|
private Vector3 direction;
|
||||||
|
private RaycastHit[] hits;
|
||||||
|
private bool isAttacked;
|
||||||
|
|
||||||
|
private void OnDrawGizmos()
|
||||||
|
{
|
||||||
|
if (!isDrawingGizmo || !isUsingSkill) return;
|
||||||
|
|
||||||
|
if (SkillInputData.PlayerCollider is CapsuleCollider capsuleCollider)
|
||||||
|
{
|
||||||
|
var capsuleRadius = capsuleCollider.radius;
|
||||||
|
var point1 = SkillInputData.PlayerRb.position + Vector3.up * capsuleRadius;
|
||||||
|
|
||||||
|
Gizmos.color = Color.red;
|
||||||
|
Gizmos.DrawWireSphere(point1, capsuleRadius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ActivateSkill(params Action[] actions)
|
||||||
|
{
|
||||||
|
ReadySkill = false;
|
||||||
|
SkillInputData.PlayerAnimator.SetBool("isLineRush", true);
|
||||||
|
CoolDown(Cooldown, () => ReadySkill = true);
|
||||||
|
StartCoroutine(SkillCoroutine(actions));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool EnableSkill()
|
||||||
|
{
|
||||||
|
if (!ReadySkill) return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void BasicSetting()
|
||||||
|
{
|
||||||
|
base.BasicSetting();
|
||||||
|
|
||||||
|
hits = new RaycastHit[5];
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerator SkillCoroutine(params Action[] actions)
|
||||||
|
{
|
||||||
|
while (!SkillInputData.PlayerAnimator.GetCurrentAnimatorStateInfo(0).IsName("LineRush"))
|
||||||
|
{
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
isUsingSkill = true;
|
||||||
|
isAttacked = false;
|
||||||
|
startPosition = SkillInputData.PlayerRb.position;
|
||||||
|
var vectorToTarget = SkillInputData.TargetCollider.transform.position - startPosition;
|
||||||
|
vectorToTarget.y = 0f;
|
||||||
|
direction = vectorToTarget.normalized;
|
||||||
|
distanceToTarget = vectorToTarget.magnitude + rushOffset;
|
||||||
|
|
||||||
|
transform.position = startPosition;
|
||||||
|
transform.localScale = new Vector3(width, 6f, distanceToTarget * 2);
|
||||||
|
var angle = Mathf.Atan2(direction.x, direction.z) * Mathf.Rad2Deg;
|
||||||
|
transform.rotation = Quaternion.Euler(0, angle, 0);
|
||||||
|
|
||||||
|
actions[1].Invoke();
|
||||||
|
ShowIndicator();
|
||||||
|
|
||||||
|
var elapsedTime = 0f;
|
||||||
|
var fill = 1 / CastingTime;
|
||||||
|
while (elapsedTime < CastingTime)
|
||||||
|
{
|
||||||
|
elapsedTime += Time.deltaTime;
|
||||||
|
|
||||||
|
if (isUsingIndicator && indicator)
|
||||||
|
{
|
||||||
|
var fillValue = indicator.material.GetFloat(FillHash) + Time.deltaTime * fill;
|
||||||
|
indicator.material.SetFloat(FillHash, fillValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
HideIndicator();
|
||||||
|
|
||||||
|
SkillInputData.PlayerAgent.enabled = false;
|
||||||
|
SkillInputData.PlayerRb.isKinematic = false;
|
||||||
|
|
||||||
|
var timeToReachTarget = distanceToTarget / rushSpeed;
|
||||||
|
elapsedTime = 0f;
|
||||||
|
|
||||||
|
var capsuleCollider = (CapsuleCollider)SkillInputData.PlayerCollider;
|
||||||
|
var capsuleRadius = capsuleCollider.radius;
|
||||||
|
|
||||||
|
while (elapsedTime < timeToReachTarget)
|
||||||
|
{
|
||||||
|
SkillInputData.PlayerRb.velocity = direction * rushSpeed;
|
||||||
|
elapsedTime += Time.deltaTime;
|
||||||
|
|
||||||
|
var playerPosition = SkillInputData.PlayerRb.position;
|
||||||
|
var point1 = playerPosition + Vector3.up * capsuleRadius;
|
||||||
|
var point2 = playerPosition + Vector3.up * (capsuleCollider.height - capsuleRadius);
|
||||||
|
|
||||||
|
var maxSize = Physics.CapsuleCastNonAlloc(point1, point2, capsuleRadius, direction, hits,
|
||||||
|
0f, SkillInputData.TargetLayer, QueryTriggerInteraction.Ignore);
|
||||||
|
|
||||||
|
for (var i = 0; i < maxSize; i++)
|
||||||
|
{
|
||||||
|
if (!isAttacked)
|
||||||
|
{
|
||||||
|
var iDamageable = hits[i].transform.GetComponent<IDamageable>();
|
||||||
|
iDamageable?.TakeDamage(Damage);
|
||||||
|
isAttacked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
SkillInputData.PlayerRb.velocity = Vector3.zero;
|
||||||
|
SkillInputData.PlayerAgent.enabled = true;
|
||||||
|
SkillInputData.PlayerRb.isKinematic = true;
|
||||||
|
|
||||||
|
actions[0].Invoke();
|
||||||
|
|
||||||
|
isUsingSkill = false;
|
||||||
|
SkillInputData.PlayerAnimator.SetBool("isLineRush", false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1f6a1d28ac8854842965166f68f3ab4b
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user