#255 거대 슬라임 작업 중

This commit is contained in:
NTG 2024-05-08 09:28:04 +09:00
parent 7d11851f52
commit bcefdb679c
9 changed files with 919 additions and 176 deletions

View File

@ -386,6 +386,37 @@ Transform:
- {fileID: 1732156238}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &104997133
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 104997134}
m_Layer: 0
m_Name: PlayerSpawn
m_TagString: Untagged
m_Icon: {fileID: -964228994112308473, guid: 0000000000000000d000000000000000, type: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &104997134
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 104997133}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: -5}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1915017510}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &121245774
GameObject:
m_ObjectHideFlags: 0
@ -497,7 +528,39 @@ MonoBehaviour:
_ConnectionHighLerp: {r: 1, g: 0, b: 0, a: 0.5}
_MeshEdgeColor: {r: 0, g: 0, b: 0, a: 0.5}
_AreaColors: []
tagNames: []
tagNames:
- Basic Ground
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
heuristic: 2
heuristicScale: 1
threadCount: 1
@ -2798,6 +2861,37 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 704479487}
m_CullTransparentMesh: 1
--- !u!1 &729800709
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 729800710}
m_Layer: 0
m_Name: BossSpawn
m_TagString: Untagged
m_Icon: {fileID: 5132851093641282708, guid: 0000000000000000d000000000000000, type: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &729800710
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 729800709}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 5}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1915017510}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &784283201
GameObject:
m_ObjectHideFlags: 0
@ -3576,80 +3670,6 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 793017943}
m_CullTransparentMesh: 0
--- !u!1001 &818265830
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 1245399511}
m_Modifications:
- target: {fileID: 1907803032604947452, guid: 4f6f7700d35b9c3499d8ba66f5113e48,
type: 3}
propertyPath: m_Name
value: Slime
objectReference: {fileID: 0}
- target: {fileID: 8090463508496005930, guid: 4f6f7700d35b9c3499d8ba66f5113e48,
type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8090463508496005930, guid: 4f6f7700d35b9c3499d8ba66f5113e48,
type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8090463508496005930, guid: 4f6f7700d35b9c3499d8ba66f5113e48,
type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8090463508496005930, guid: 4f6f7700d35b9c3499d8ba66f5113e48,
type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 8090463508496005930, guid: 4f6f7700d35b9c3499d8ba66f5113e48,
type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8090463508496005930, guid: 4f6f7700d35b9c3499d8ba66f5113e48,
type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8090463508496005930, guid: 4f6f7700d35b9c3499d8ba66f5113e48,
type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8090463508496005930, guid: 4f6f7700d35b9c3499d8ba66f5113e48,
type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8090463508496005930, guid: 4f6f7700d35b9c3499d8ba66f5113e48,
type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 8090463508496005930, guid: 4f6f7700d35b9c3499d8ba66f5113e48,
type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 4f6f7700d35b9c3499d8ba66f5113e48, type: 3}
--- !u!4 &818265831 stripped
Transform:
m_CorrespondingSourceObject: {fileID: 8090463508496005930, guid: 4f6f7700d35b9c3499d8ba66f5113e48,
type: 3}
m_PrefabInstance: {fileID: 818265830}
m_PrefabAsset: {fileID: 0}
--- !u!1 &823586984
GameObject:
m_ObjectHideFlags: 0
@ -4677,6 +4697,7 @@ RectTransform:
- {fileID: 6661296397982603978}
- {fileID: 1906451880}
- {fileID: 1644675859}
- {fileID: 1703985565}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@ -5168,8 +5189,7 @@ Transform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 818265831}
m_Children: []
m_Father: {fileID: 1915017510}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1256709750
@ -7600,6 +7620,143 @@ Transform:
type: 3}
m_PrefabInstance: {fileID: 1362034954}
m_PrefabAsset: {fileID: 0}
--- !u!1 &1536485950
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1536485951}
- component: {fileID: 1536485953}
- component: {fileID: 1536485952}
m_Layer: 5
m_Name: Text (TMP)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1536485951
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1536485950}
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: 1703985565}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1536485952
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1536485950}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: "\uC2AC\uB77C\uC784"
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: dabfdeb80b25d44b4ace56414d0eb4ad, type: 2}
m_sharedMaterial: {fileID: 5657039867100983486, guid: dabfdeb80b25d44b4ace56414d0eb4ad,
type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4281479730
m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 27.6
m_fontSizeBase: 24
m_fontWeight: 400
m_enableAutoSizing: 1
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!222 &1536485953
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1536485950}
m_CullTransparentMesh: 1
--- !u!1 &1560091181
GameObject:
m_ObjectHideFlags: 0
@ -8013,6 +8170,139 @@ MeshFilter:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1658435463}
m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0}
--- !u!1 &1703985564
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1703985565}
- component: {fileID: 1703985568}
- component: {fileID: 1703985567}
- component: {fileID: 1703985566}
m_Layer: 5
m_Name: SlimeStageButton
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1703985565
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1703985564}
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:
- {fileID: 1536485951}
m_Father: {fileID: 1033584370}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -10, y: -10}
m_SizeDelta: {x: 120, y: 40}
m_Pivot: {x: 1, y: 1}
--- !u!114 &1703985566
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1703985564}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Navigation:
m_Mode: 0
m_WrapAround: 0
m_SelectOnUp: {fileID: 0}
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
m_SelectedSprite: {fileID: 0}
m_DisabledSprite: {fileID: 0}
m_AnimationTriggers:
m_NormalTrigger: Normal
m_HighlightedTrigger: Highlighted
m_PressedTrigger: Pressed
m_SelectedTrigger: Selected
m_DisabledTrigger: Disabled
m_Interactable: 1
m_TargetGraphic: {fileID: 1703985567}
m_OnClick:
m_PersistentCalls:
m_Calls:
- m_Target: {fileID: 1915017511}
m_TargetAssemblyTypeName: SlimeBossMapController, Assembly-CSharp
m_MethodName: InitBossMap
m_Mode: 1
m_Arguments:
m_ObjectArgument: {fileID: 0}
m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine
m_IntArgument: 0
m_FloatArgument: 0
m_StringArgument:
m_BoolArgument: 0
m_CallState: 2
--- !u!114 &1703985567
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1703985564}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &1703985568
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1703985564}
m_CullTransparentMesh: 1
--- !u!1 &1715186577
GameObject:
m_ObjectHideFlags: 0
@ -9216,6 +9506,7 @@ GameObject:
serializedVersion: 6
m_Component:
- component: {fileID: 1915017510}
- component: {fileID: 1915017511}
m_Layer: 0
m_Name: SlimeBossMap
m_TagString: Untagged
@ -9239,8 +9530,63 @@ Transform:
- {fileID: 1994003675}
- {fileID: 555715576}
- {fileID: 1245399511}
- {fileID: 104997134}
- {fileID: 729800710}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &1915017511
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1915017509}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 9d736acd182e9d84484a4ff16ea608c6, type: 3}
m_Name:
m_EditorClassIdentifier:
playerSpawnTransform: {fileID: 104997134}
bossSpawnTransform: {fileID: 729800710}
bossInstantiateTransform: {fileID: 1245399511}
bossPrefab: {fileID: 5876525979198911062, guid: 4f6f7700d35b9c3499d8ba66f5113e48,
type: 3}
slimeStateList:
- <Level>k__BackingField: 1
<Size>k__BackingField: 10
<MaxHp>k__BackingField: 100
<Speed>k__BackingField: 1
<Range>k__BackingField: 4
<RandomCooldown>k__BackingField: {x: 1.5, y: 2}
<HasRabbit>k__BackingField: 1
- <Level>k__BackingField: 2
<Size>k__BackingField: 8
<MaxHp>k__BackingField: 70
<Speed>k__BackingField: 1.25
<Range>k__BackingField: 5
<RandomCooldown>k__BackingField: {x: 1.25, y: 1.75}
<HasRabbit>k__BackingField: 0
- <Level>k__BackingField: 3
<Size>k__BackingField: 6
<MaxHp>k__BackingField: 50
<Speed>k__BackingField: 1.5
<Range>k__BackingField: 6
<RandomCooldown>k__BackingField: {x: 1, y: 1.5}
<HasRabbit>k__BackingField: 0
- <Level>k__BackingField: 4
<Size>k__BackingField: 4
<MaxHp>k__BackingField: 30
<Speed>k__BackingField: 1.75
<Range>k__BackingField: 7
<RandomCooldown>k__BackingField: {x: 0.75, y: 1.25}
<HasRabbit>k__BackingField: 0
- <Level>k__BackingField: 5
<Size>k__BackingField: 2
<MaxHp>k__BackingField: 10
<Speed>k__BackingField: 2
<Range>k__BackingField: 8
<RandomCooldown>k__BackingField: {x: 0.5, y: 1}
<HasRabbit>k__BackingField: 0
--- !u!1 &1969962453
GameObject:
m_ObjectHideFlags: 0

View File

@ -18,6 +18,9 @@ namespace BlueWaterProject
// Interfaces
private IDashable iDashable;
// Variables
private WaitForSeconds flashWhiteWaitTime;
// Hashes
private static readonly int IsHitHash = Shader.PropertyToID("_IsHit");
@ -34,6 +37,7 @@ namespace BlueWaterProject
OnChangedCurrentHp += heartHpUi.SetCurrentHp;
propBlock = new MaterialPropertyBlock();
flashWhiteWaitTime = new WaitForSeconds(0.05f);
SetCurrentHp(maxHp);
}
@ -98,10 +102,10 @@ namespace BlueWaterProject
spriteRenderer.GetPropertyBlock(propBlock);
propBlock.SetInt(IsHitHash, 1);
spriteRenderer.SetPropertyBlock(propBlock);
yield return new WaitForSeconds(0.05f);
yield return flashWhiteWaitTime;
propBlock.SetInt(IsHitHash, 0);
spriteRenderer.SetPropertyBlock(propBlock);
yield return new WaitForSeconds(0.05f);
yield return flashWhiteWaitTime;
}
}
}

View File

@ -0,0 +1,28 @@
using System;
using UnityEngine;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
[Serializable]
public class SlimeState
{
[field: SerializeField] public int Level { get; set; }
[field: SerializeField] public float Size { get; set; }
[field: SerializeField] public float MaxHp { get; set; }
[field: SerializeField] public float Speed { get; set; }
[field: SerializeField] public float Range { get; set; }
[field: SerializeField] public Vector2 RandomCooldown { get; set; }
[field: SerializeField] public bool HasRabbit { get; set; }
public SlimeState(int level, float size, float maxHp, float speed, Vector2 randomCooldown, bool hasRabbit)
{
Level = level;
Size = size;
MaxHp = maxHp;
Speed = speed;
RandomCooldown = randomCooldown;
HasRabbit = hasRabbit;
}
}
}

View File

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

View File

@ -1,19 +1,84 @@
using System;
using System.Collections;
using System.Collections.Generic;
using BehaviorDesigner.Runtime;
using Sirenix.OdinInspector;
using UnityEditor.Animations;
using UnityEngine;
using Random = UnityEngine.Random;
// ReSharper disable once CheckNamespace
namespace BlueWaterProject
{
public class TitanSlime : FieldBoss
public enum TitanSlimeAnimationParameter
{
IS_JUMP_SLAM
}
public enum TitanSlimeAnimationName
{
IDLE,
JUMP_SLAM
}
public class TitanSlime : MonoBehaviour, IDamageable, IAnimationStateController
{
/***********************************************************************
* Variables
***********************************************************************/
#region Variables
// 실시간 상태
[Title("실시간 상태")]
[SerializeField] private bool isMoving;
// 컴포넌트
[Title("컴포넌트")]
[SerializeField] private Rigidbody rb;
[SerializeField] private Collider col;
[SerializeField] private BehaviorTree behaviorTree;
[SerializeField] private Transform visualLook;
[field: SerializeField] public Animator Anim { get; set; }
[SerializeField] private SpriteRenderer spriteRenderer;
[SerializeField] private AnimatorController slimeController;
[SerializeField] private AnimatorController slimeRabbitController;
private IAnimationStateController iAnimationStateController;
private SlimeBossMapController mapController;
// 스탯
[field: Title("스탯")]
[field: SerializeField] public string BossName { get; private set; } = "거대 슬라임";
[SerializeField] private SlimeState slimeState;
[SerializeField] private float currentHp;
[SerializeField] private LayerMask targetLayer;
[SerializeField] private LayerMask groundLayer;
public float MaxHp => slimeState.MaxHp;
// 스킬
[Title("스킬")]
[SerializeField] private List<BaseSkill> skillList;
private List<BaseSkill> instanceSkillList;
// Variables
private Dictionary<TitanSlimeAnimationParameter, int> animationParameterHashDictionary = new();
private Dictionary<TitanSlimeAnimationName, int> animationNameHashDictionary = new();
private MaterialPropertyBlock propBlock;
private WaitForSeconds flashWhiteWaitTime;
private Coroutine flashWhiteCoroutine;
private Coroutine jumpSlamCoroutine;
private Collider[] hitColliders;
// Shader Hashes
private static readonly int IsHitHash = Shader.PropertyToID("_IsHit");
// Parameter hashes
private static readonly int IsJumpSlamHash = Animator.StringToHash("isJumpSlam");
// Animation name hashes
private static readonly int IdleHash = Animator.StringToHash("Idle");
private static readonly int JumpSlamHash = Animator.StringToHash("JumpSlam");
// events
public delegate void ChangedCurrentHp(float currentHp);
public event ChangedCurrentHp OnChangedCurrentHp;
#endregion
@ -22,9 +87,25 @@ namespace BlueWaterProject
***********************************************************************/
#region Unity Events
private void Update()
private void Awake()
{
MoveHandler();
InitComponent();
InitDictionary();
}
private void Start()
{
mapController = FindAnyObjectByType<SlimeBossMapController>();
propBlock = new MaterialPropertyBlock();
flashWhiteWaitTime = new WaitForSeconds(0.1f);
hitColliders = new Collider[1];
StartMove();
}
private void OnDestroy()
{
OnChangedCurrentHp -= UiManager.Inst.CombatUi.FieldBossHpSlider.UpdateHpSlider;
}
#endregion
@ -33,7 +114,49 @@ namespace BlueWaterProject
* Init Methods
***********************************************************************/
#region Init Methods
private void InitComponent()
{
rb = GetComponent<Rigidbody>();
col = GetComponent<Collider>();
behaviorTree = GetComponent<BehaviorTree>();
visualLook = transform.Find("VisualLook");
Anim = visualLook.GetComponent<Animator>();
spriteRenderer = visualLook.GetComponent<SpriteRenderer>();
iAnimationStateController = GetComponent<IAnimationStateController>();
}
private void InitDictionary()
{
animationParameterHashDictionary = new Dictionary<TitanSlimeAnimationParameter, int>(Enum.GetValues(typeof(TitanSlimeAnimationParameter)).Length)
{
{ TitanSlimeAnimationParameter.IS_JUMP_SLAM, IsJumpSlamHash },
};
animationNameHashDictionary = new Dictionary<TitanSlimeAnimationName, int>(Enum.GetValues(typeof(TitanSlimeAnimationName)).Length)
{
{ TitanSlimeAnimationName.IDLE, IdleHash },
{ TitanSlimeAnimationName.JUMP_SLAM, JumpSlamHash },
};
}
public void Init(SlimeState state, bool hasRabbit)
{
slimeState = state;
slimeState.HasRabbit = hasRabbit;
SetCurrentHp(slimeState.MaxHp);
transform.localScale = Vector3.one * slimeState.Size;
if (slimeState.HasRabbit)
{
Anim.runtimeAnimatorController = slimeRabbitController;
OnChangedCurrentHp += UiManager.Inst.CombatUi.FieldBossHpSlider.UpdateHpSlider;
}
else
{
Anim.runtimeAnimatorController = slimeController;
}
}
#endregion
@ -41,31 +164,139 @@ namespace BlueWaterProject
* Interfaces
***********************************************************************/
#region Interfaces
public override void Die()
// IDamageable
public void TakeDamage(float attackerPower, Vector3? attackPos = null)
{
isDead = true;
if (currentHp <= 0) return;
if (agent && agent.enabled)
var changeHp = Mathf.Max(currentHp - attackerPower, 0);
SetCurrentHp(changeHp);
// 죽었는지 체크
if (changeHp == 0f)
{
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;
Die();
return;
}
animator.SetTrigger("isDead");
Destroy(gameObject, 2f);
// 공격 당함
if (spriteRenderer)
{
flashWhiteCoroutine = StartCoroutine(nameof(FlashWhiteCoroutine));
}
}
public void Die()
{
if (slimeState.Level <= 4)
{
mapController.SpawnSplitSlimes(transform.position, slimeState.Level + 1, slimeState.HasRabbit);
}
Destroy(gameObject);
}
public float GetCurrentHp()
{
return currentHp;
}
public void SetCurrentHp(float value)
{
currentHp = value;
OnChangedCurrentHp?.Invoke(value);
}
// IAnimationStateController
public void SetAnimationParameter<T>(T parameter, bool value) where T : Enum
{
if (parameter is TitanSlimeAnimationParameter enumParameter)
{
if (animationParameterHashDictionary.TryGetValue(enumParameter, out var hash))
{
Anim.SetBool(hash, value);
}
else
{
throw new KeyNotFoundException($"The parameter {parameter} was not found in the dictionary.");
}
}
else
{
throw new ArgumentException("Invalid parameter type for SetAnimationParameter");
}
}
public void SetAnimationParameter<T>(T parameter, int value) where T : Enum
{
if (parameter is TitanSlimeAnimationParameter enumParameter)
{
if (animationParameterHashDictionary.TryGetValue(enumParameter, out var hash))
{
Anim.SetInteger(hash, value);
}
else
{
throw new KeyNotFoundException($"The parameter {parameter} was not found in the dictionary.");
}
}
else
{
throw new ArgumentException("Invalid parameter type for SetAnimationParameter");
}
}
public void SetAnimationParameter<T>(T parameter, float value) where T : Enum
{
if (parameter is TitanSlimeAnimationParameter enumParameter)
{
if (animationParameterHashDictionary.TryGetValue(enumParameter, out var hash))
{
Anim.SetFloat(hash, value);
}
else
{
throw new KeyNotFoundException($"The parameter {parameter} was not found in the dictionary.");
}
}
else
{
throw new ArgumentException("Invalid parameter type for SetAnimationParameter");
}
}
public void SetAnimationTrigger<T>(T parameter) where T : Enum
{
if (parameter is TitanSlimeAnimationParameter enumParameter)
{
if (animationParameterHashDictionary.TryGetValue(enumParameter, out var hash))
{
Anim.SetTrigger(hash);
}
else
{
throw new KeyNotFoundException($"The parameter {parameter} was not found in the dictionary.");
}
}
else
{
throw new ArgumentException("Invalid parameter type for SetAnimationParameter");
}
}
public bool IsComparingCurrentAnimation<T>(T animationName, int animatorLayer = 0) where T : Enum
{
if (animationName is not TitanSlimeAnimationName enumAnimationName)
{
throw new ArgumentException("Invalid parameter type for SetAnimationParameter");
}
if (animationNameHashDictionary.TryGetValue(enumAnimationName, out var hash))
{
return Anim.GetCurrentAnimatorStateInfo(animatorLayer).shortNameHash == hash;
}
throw new KeyNotFoundException($"The parameter {animationName} was not found in the dictionary.");
}
#endregion
@ -74,49 +305,117 @@ namespace BlueWaterProject
* 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)
private IEnumerator FlashWhiteCoroutine()
{
var localScale = visualLook.localScale;
localScale.x = previousDirectionX switch
spriteRenderer.GetPropertyBlock(propBlock);
propBlock.SetInt(IsHitHash, 1);
spriteRenderer.SetPropertyBlock(propBlock);
yield return flashWhiteWaitTime;
propBlock.SetInt(IsHitHash, 0);
spriteRenderer.SetPropertyBlock(propBlock);
yield return flashWhiteWaitTime;
}
private void StartMove()
{
StartCoroutine(nameof(StartMoveCoroutine));
}
private IEnumerator StartMoveCoroutine()
{
var startPosition = transform.position;
var endPosition = CalculateRandomPosition(startPosition, 2f);
var elapsedTime = 0f;
while (elapsedTime <= slimeState.Speed)
{
> 0.01f => Mathf.Abs(localScale.x),
< -0.01f => -Mathf.Abs(localScale.x),
_ => localScale.x
};
visualLook.localScale = localScale;
elapsedTime += Time.deltaTime;
transform.position = Vector3.Lerp(startPosition, endPosition,
iAnimationStateController.GetCurrentAnimationNormalizedTime());
yield return null;
}
JumpSlam();
}
private void JumpSlam()
{
if (currentHp <= 0) return;
jumpSlamCoroutine = StartCoroutine(nameof(JumpSlamCoroutine));
}
private IEnumerator JumpSlamCoroutine()
{
iAnimationStateController.SetAnimationParameter(TitanSlimeAnimationParameter.IS_JUMP_SLAM, true);
var animationStarted = false;
yield return StartCoroutine(iAnimationStateController.WaitForAnimationToRun(TitanSlimeAnimationName.JUMP_SLAM,
success => animationStarted = success));
if (!animationStarted)
{
EndJumpSlam(0);
yield break;
}
iAnimationStateController.SetCurrentAnimationSpeed(slimeState.Speed);
var startPosition = transform.position;
Vector3 endPosition;
var hitCount = Physics.OverlapSphereNonAlloc(startPosition, slimeState.Range, hitColliders, targetLayer);
if (hitCount >= 1)
{
endPosition = CalculateRandomPosition(hitColliders[0].transform.position, 1f);
}
else
{
endPosition = CalculateRandomPosition(startPosition, 3f);
}
while (iAnimationStateController.IsComparingCurrentAnimation(TitanSlimeAnimationName.JUMP_SLAM) &&
iAnimationStateController.GetCurrentAnimationNormalizedTime() < 1f)
{
transform.position = Vector3.Lerp(startPosition, endPosition,
iAnimationStateController.GetCurrentAnimationNormalizedTime());
yield return null;
}
var randomCooldown = Random.Range(slimeState.RandomCooldown.x, slimeState.RandomCooldown.y);
EndJumpSlam(randomCooldown);
}
private void EndJumpSlam(float cooldown)
{
iAnimationStateController.ResetAnimationSpeed();
iAnimationStateController.SetAnimationParameter(TitanSlimeAnimationParameter.IS_JUMP_SLAM, false);
StartCoroutine(Utils.CoolDown(cooldown, JumpSlam));
}
private Vector3 CalculateRandomPosition(Vector3 startPosition, float range, int iterationCount = 50)
{
for (var i = 0; i < iterationCount; i++)
{
var randomPosition = startPosition + Random.insideUnitSphere * range;
randomPosition.y = startPosition.y;
if (!CheckMovablePosition(randomPosition)) continue;
return randomPosition;
}
return startPosition;
}
private bool CheckMovablePosition(Vector3 checkPosition)
{
if (Physics.Raycast(checkPosition, Vector3.down, 1f, groundLayer))
{
return true;
}
return false;
}
#endregion

View File

@ -0,0 +1,57 @@
using System.Collections.Generic;
using BlueWaterProject;
using Sirenix.OdinInspector;
using UnityEngine;
// ReSharper disable once CheckNamespace
public class SlimeBossMapController : MonoBehaviour
{
// 컴포넌트
[Title("컴포넌트")]
[SerializeField] private Transform playerSpawnTransform;
[SerializeField] private Transform bossSpawnTransform;
[SerializeField] private Transform bossInstantiateTransform;
[SerializeField] private TitanSlime bossPrefab;
[SerializeField] private List<SlimeState> slimeStateList = new(5);
private List<GameObject> bossInstanceList = new(10);
public void InitBossMap()
{
AllDestroyInstantiateObject();
bossInstanceList = new List<GameObject>(10);
var player = GameObject.FindWithTag("CombatPlayer");
if (player && playerSpawnTransform)
{
player.transform.position = playerSpawnTransform.position;
}
InstantiateSlime(bossSpawnTransform.position, 1, true);
}
private void InstantiateSlime(Vector3 instantiatePosition, int level, bool hasRabbit)
{
var instantiateBoss = Instantiate(bossPrefab, instantiatePosition, Quaternion.identity, bossInstantiateTransform);
var slimeState = slimeStateList.Find((list) => list.Level == level);
instantiateBoss.Init(slimeState, hasRabbit);
UiManager.Inst.CombatUi.FieldBossHpSlider.SetHpSlider(instantiateBoss.MaxHp, instantiateBoss.BossName);
bossInstanceList.Add(instantiateBoss.gameObject);
}
public void SpawnSplitSlimes(Vector3 deathPosition, int nextLevel, bool hasRabbit)
{
InstantiateSlime(deathPosition, nextLevel, hasRabbit);
InstantiateSlime(deathPosition, nextLevel, false);
}
public void AllDestroyInstantiateObject()
{
foreach (var element in bossInstanceList)
{
Destroy(element);
}
}
}

View File

@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 9d736acd182e9d84484a4ff16ea608c6

View File

@ -14,7 +14,7 @@ GameObject:
- component: {fileID: 5660425300834808149}
- component: {fileID: 5876525979198911062}
m_Layer: 13
m_Name: SlimeRabbit
m_Name: Slime
m_TagString: FieldBoss
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@ -30,8 +30,8 @@ Transform:
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_LocalScale: {x: 10, y: 10, z: 10}
m_ConstrainProportionsScale: 1
m_Children:
- {fileID: 695049024773443745}
m_Father: {fileID: 0}
@ -58,10 +58,10 @@ Rigidbody:
m_Bits: 0
m_ImplicitCom: 1
m_ImplicitTensor: 1
m_UseGravity: 1
m_IsKinematic: 1
m_UseGravity: 0
m_IsKinematic: 0
m_Interpolate: 0
m_Constraints: 112
m_Constraints: 116
m_CollisionDetection: 0
--- !u!136 &1668494360487994466
CapsuleCollider:
@ -82,10 +82,10 @@ CapsuleCollider:
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 2
m_Radius: 1.5
m_Height: 3
m_Radius: 0.25
m_Height: 0.25
m_Direction: 1
m_Center: {x: 0, y: 1.5, z: 0}
m_Center: {x: 0, y: 0.25, z: 0}
--- !u!114 &5660425300834808149
MonoBehaviour:
m_ObjectHideFlags: 0
@ -105,24 +105,22 @@ MonoBehaviour:
logTaskChanges: 0
group: 0
resetValuesOnRestart: 0
externalBehavior: {fileID: 11400000, guid: d13d572258c1a34448812a8c0c0b54a1, type: 2}
externalBehavior: {fileID: 0}
mBehaviorSource:
behaviorName: Rhinoceros
behaviorName: TitanSlime
behaviorDescription:
mTaskData:
types: []
parentIndex:
startIndex:
variableStartIndex:
JSONSerialization: '{"Variables":[{"Type":"BehaviorDesigner.Runtime.SharedGameObject","Name":"MyObj","IsShared":true,"GameObjectmValue":0},{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":"CurrentHp","IsShared":true,"PropertyMapping":"BlueWaterProject.Rhinoceros/CurrentHp","PropertyMappingOwner":1,"SinglemValue":0},{"Type":"BehaviorDesigner.Runtime.SharedVector3","Name":"MovePoint","IsShared":true,"Vector3mValue":"(0,0,0)"},{"Type":"BehaviorDesigner.Runtime.SharedFloat","Name":"StoppingDistance","IsShared":true,"SinglemValue":0},{"Type":"BehaviorDesigner.Runtime.SharedBool","Name":"isStartBehavior","IsShared":true,"BooleanmValue":false}]}'
JSONSerialization: '{}'
fieldSerializationData:
typeName: []
fieldNameHash:
startIndex:
dataPosition:
unityObjects:
- {fileID: 1907803032604947452}
- {fileID: 1907803032604947452}
unityObjects: []
byteData:
byteDataArray:
Version: 1.7.7
@ -140,25 +138,32 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 25f52002aaedd9f47a21029646c1feba, type: 3}
m_Name:
m_EditorClassIdentifier:
rb: {fileID: 0}
capsuleCollider: {fileID: 0}
agent: {fileID: 0}
behaviorTree: {fileID: 0}
visualLook: {fileID: 0}
animator: {fileID: 0}
spriteRenderer: {fileID: 0}
<Name>k__BackingField: TitanSlime
<MaxHp>k__BackingField: 500
moveSpeed: 1
rb: {fileID: 8142684666082997760}
col: {fileID: 1668494360487994466}
behaviorTree: {fileID: 5660425300834808149}
visualLook: {fileID: 695049024773443745}
<Anim>k__BackingField: {fileID: 0}
spriteRenderer: {fileID: 8089310337301863899}
slimeController: {fileID: 9100000, guid: 86a4cd4976c230e43ab5f86f49711ee8, type: 2}
slimeRabbitController: {fileID: 9100000, guid: 37338d4da60b9074897d606fa445d255,
type: 2}
<BossName>k__BackingField: "\uAC70\uB300 \uC2AC\uB77C\uC784"
slimeState:
<Level>k__BackingField: 0
<Size>k__BackingField: 0
<MaxHp>k__BackingField: 0
<Speed>k__BackingField: 0
<RandomCooldown>k__BackingField: {x: 0, y: 0}
<HasRabbit>k__BackingField: 0
currentHp: 0
targetRange: 3
targetLayer:
serializedVersion: 2
m_Bits: 512
flashWhiteTime: 0.1
groundLayer:
serializedVersion: 2
m_Bits: 8
skillList: []
<CurrentHp>k__BackingField: 0
<Target>k__BackingField: {fileID: 0}
<IsUsingSkill>k__BackingField: 0
isMoving: 0
--- !u!1 &5250888242721872286
GameObject:
m_ObjectHideFlags: 0
@ -187,7 +192,7 @@ Transform:
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 5, y: 5, z: 5}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 8090463508496005930}