#255 거대 슬라임 작업2

This commit is contained in:
NTG_Lenovo 2024-05-08 11:59:17 +09:00
parent bcefdb679c
commit 9699c0534a
4 changed files with 79 additions and 45 deletions

View File

@ -9555,37 +9555,37 @@ MonoBehaviour:
- <Level>k__BackingField: 1 - <Level>k__BackingField: 1
<Size>k__BackingField: 10 <Size>k__BackingField: 10
<MaxHp>k__BackingField: 100 <MaxHp>k__BackingField: 100
<Speed>k__BackingField: 1 <AnimationLength>k__BackingField: 1
<Range>k__BackingField: 4 <ViewRange>k__BackingField: 4
<RandomCooldown>k__BackingField: {x: 1.5, y: 2} <RandomCooldown>k__BackingField: {x: 1.5, y: 2.5}
<HasRabbit>k__BackingField: 1 <HasRabbit>k__BackingField: 1
- <Level>k__BackingField: 2 - <Level>k__BackingField: 2
<Size>k__BackingField: 8 <Size>k__BackingField: 8
<MaxHp>k__BackingField: 70 <MaxHp>k__BackingField: 70
<Speed>k__BackingField: 1.25 <AnimationLength>k__BackingField: 0.9
<Range>k__BackingField: 5 <ViewRange>k__BackingField: 5
<RandomCooldown>k__BackingField: {x: 1.25, y: 1.75} <RandomCooldown>k__BackingField: {x: 1.25, y: 2.25}
<HasRabbit>k__BackingField: 0 <HasRabbit>k__BackingField: 0
- <Level>k__BackingField: 3 - <Level>k__BackingField: 3
<Size>k__BackingField: 6 <Size>k__BackingField: 6
<MaxHp>k__BackingField: 50 <MaxHp>k__BackingField: 50
<Speed>k__BackingField: 1.5 <AnimationLength>k__BackingField: 0.8
<Range>k__BackingField: 6 <ViewRange>k__BackingField: 6
<RandomCooldown>k__BackingField: {x: 1, y: 1.5} <RandomCooldown>k__BackingField: {x: 1, y: 2}
<HasRabbit>k__BackingField: 0 <HasRabbit>k__BackingField: 0
- <Level>k__BackingField: 4 - <Level>k__BackingField: 4
<Size>k__BackingField: 4 <Size>k__BackingField: 4
<MaxHp>k__BackingField: 30 <MaxHp>k__BackingField: 30
<Speed>k__BackingField: 1.75 <AnimationLength>k__BackingField: 0.7
<Range>k__BackingField: 7 <ViewRange>k__BackingField: 7
<RandomCooldown>k__BackingField: {x: 0.75, y: 1.25} <RandomCooldown>k__BackingField: {x: 0.75, y: 1.75}
<HasRabbit>k__BackingField: 0 <HasRabbit>k__BackingField: 0
- <Level>k__BackingField: 5 - <Level>k__BackingField: 5
<Size>k__BackingField: 2 <Size>k__BackingField: 2
<MaxHp>k__BackingField: 10 <MaxHp>k__BackingField: 10
<Speed>k__BackingField: 2 <AnimationLength>k__BackingField: 0.6
<Range>k__BackingField: 8 <ViewRange>k__BackingField: 8
<RandomCooldown>k__BackingField: {x: 0.5, y: 1} <RandomCooldown>k__BackingField: {x: 0.5, y: 1.5}
<HasRabbit>k__BackingField: 0 <HasRabbit>k__BackingField: 0
--- !u!1 &1969962453 --- !u!1 &1969962453
GameObject: GameObject:

View File

@ -9,7 +9,6 @@ namespace BlueWaterProject
// Components // Components
private SpriteRenderer spriteRenderer; private SpriteRenderer spriteRenderer;
private HeartHpUi heartHpUi; private HeartHpUi heartHpUi;
private MaterialPropertyBlock propBlock;
// Health // Health
[SerializeField] private int maxHp; [SerializeField] private int maxHp;
@ -35,8 +34,7 @@ namespace BlueWaterProject
iDashable = GetComponent<IDashable>(); iDashable = GetComponent<IDashable>();
OnChangedCurrentHp += heartHpUi.SetCurrentHp; OnChangedCurrentHp += heartHpUi.SetCurrentHp;
propBlock = new MaterialPropertyBlock();
flashWhiteWaitTime = new WaitForSeconds(0.05f); flashWhiteWaitTime = new WaitForSeconds(0.05f);
SetCurrentHp(maxHp); SetCurrentHp(maxHp);
} }
@ -67,7 +65,7 @@ namespace BlueWaterProject
return; return;
} }
if (changeHp <= 30f) if (changeHp <= 2)
{ {
CameraManager.Inst.CombatCamera.LowHpVignette(); CameraManager.Inst.CombatCamera.LowHpVignette();
} }
@ -99,12 +97,9 @@ namespace BlueWaterProject
{ {
for (var i = 0; i < 5; i++) for (var i = 0; i < 5; i++)
{ {
spriteRenderer.GetPropertyBlock(propBlock); spriteRenderer.material.SetInt(IsHitHash, 1);
propBlock.SetInt(IsHitHash, 1);
spriteRenderer.SetPropertyBlock(propBlock);
yield return flashWhiteWaitTime; yield return flashWhiteWaitTime;
propBlock.SetInt(IsHitHash, 0); spriteRenderer.material.SetInt(IsHitHash, 0);
spriteRenderer.SetPropertyBlock(propBlock);
yield return flashWhiteWaitTime; yield return flashWhiteWaitTime;
} }
} }

View File

@ -10,19 +10,31 @@ namespace BlueWaterProject
[field: SerializeField] public int Level { get; set; } [field: SerializeField] public int Level { get; set; }
[field: SerializeField] public float Size { get; set; } [field: SerializeField] public float Size { get; set; }
[field: SerializeField] public float MaxHp { get; set; } [field: SerializeField] public float MaxHp { get; set; }
[field: SerializeField] public float Speed { get; set; } [field: SerializeField] public float AnimationLength { get; set; }
[field: SerializeField] public float Range { get; set; } [field: SerializeField] public float ViewRange { get; set; }
[field: SerializeField] public Vector2 RandomCooldown { get; set; } [field: SerializeField] public Vector2 RandomCooldown { get; set; }
[field: SerializeField] public bool HasRabbit { get; set; } [field: SerializeField] public bool HasRabbit { get; set; }
public SlimeState(int level, float size, float maxHp, float speed, Vector2 randomCooldown, bool hasRabbit) public SlimeState(int level, float size, float maxHp, float animationLength, float viewRange, Vector2 randomCooldown, bool hasRabbit)
{ {
Level = level; Level = level;
Size = size; Size = size;
MaxHp = maxHp; MaxHp = maxHp;
Speed = speed; AnimationLength = animationLength;
RandomCooldown = randomCooldown; RandomCooldown = randomCooldown;
ViewRange = viewRange;
HasRabbit = hasRabbit; HasRabbit = hasRabbit;
} }
public SlimeState(SlimeState slimeState, bool hasRabbit = default)
{
Level = slimeState.Level;
Size = slimeState.Size;
MaxHp = slimeState.MaxHp;
AnimationLength = slimeState.AnimationLength;
ViewRange = slimeState.ViewRange;
RandomCooldown = slimeState.RandomCooldown;
HasRabbit = hasRabbit == default ? slimeState.HasRabbit : hasRabbit;
}
} }
} }

View File

@ -46,6 +46,7 @@ namespace BlueWaterProject
[field: Title("스탯")] [field: Title("스탯")]
[field: SerializeField] public string BossName { get; private set; } = "거대 슬라임"; [field: SerializeField] public string BossName { get; private set; } = "거대 슬라임";
[SerializeField] private SlimeState slimeState; [SerializeField] private SlimeState slimeState;
[SerializeField] private int attackDamage = 1;
[SerializeField] private float currentHp; [SerializeField] private float currentHp;
[SerializeField] private LayerMask targetLayer; [SerializeField] private LayerMask targetLayer;
[SerializeField] private LayerMask groundLayer; [SerializeField] private LayerMask groundLayer;
@ -60,11 +61,12 @@ namespace BlueWaterProject
private Dictionary<TitanSlimeAnimationParameter, int> animationParameterHashDictionary = new(); private Dictionary<TitanSlimeAnimationParameter, int> animationParameterHashDictionary = new();
private Dictionary<TitanSlimeAnimationName, int> animationNameHashDictionary = new(); private Dictionary<TitanSlimeAnimationName, int> animationNameHashDictionary = new();
private MaterialPropertyBlock propBlock;
private WaitForSeconds flashWhiteWaitTime; private WaitForSeconds flashWhiteWaitTime;
private Coroutine flashWhiteCoroutine; private Coroutine flashWhiteCoroutine;
private Coroutine jumpSlamCoroutine; private Coroutine jumpSlamCoroutine;
private Collider[] hitColliders; [SerializeField] private Collider[] targetedColliders;
[SerializeField] private Collider[] hitColliders;
private float ColliderRadius => ((CapsuleCollider)col).radius * slimeState.Size;
// Shader Hashes // Shader Hashes
private static readonly int IsHitHash = Shader.PropertyToID("_IsHit"); private static readonly int IsHitHash = Shader.PropertyToID("_IsHit");
@ -77,8 +79,11 @@ namespace BlueWaterProject
private static readonly int JumpSlamHash = Animator.StringToHash("JumpSlam"); private static readonly int JumpSlamHash = Animator.StringToHash("JumpSlam");
// events // events
public delegate void ChangedCurrentHp(float currentHp); public delegate void ChangedCurrentHpEvent(float currentHp);
public event ChangedCurrentHp OnChangedCurrentHp; public event ChangedCurrentHpEvent OnChangedCurrentHp;
public delegate void DieRabbitEvent();
public event DieRabbitEvent OnDieRabbitEvent;
#endregion #endregion
@ -96,8 +101,8 @@ namespace BlueWaterProject
private void Start() private void Start()
{ {
mapController = FindAnyObjectByType<SlimeBossMapController>(); mapController = FindAnyObjectByType<SlimeBossMapController>();
propBlock = new MaterialPropertyBlock();
flashWhiteWaitTime = new WaitForSeconds(0.1f); flashWhiteWaitTime = new WaitForSeconds(0.1f);
targetedColliders = new Collider[1];
hitColliders = new Collider[1]; hitColliders = new Collider[1];
StartMove(); StartMove();
@ -106,6 +111,7 @@ namespace BlueWaterProject
private void OnDestroy() private void OnDestroy()
{ {
OnChangedCurrentHp -= UiManager.Inst.CombatUi.FieldBossHpSlider.UpdateHpSlider; OnChangedCurrentHp -= UiManager.Inst.CombatUi.FieldBossHpSlider.UpdateHpSlider;
OnDieRabbitEvent -= mapController.AllDestroyInstantiateObject;
} }
#endregion #endregion
@ -143,14 +149,18 @@ namespace BlueWaterProject
public void Init(SlimeState state, bool hasRabbit) public void Init(SlimeState state, bool hasRabbit)
{ {
slimeState = state; slimeState = new SlimeState(state, hasRabbit);
slimeState.HasRabbit = hasRabbit;
SetCurrentHp(slimeState.MaxHp); SetCurrentHp(slimeState.MaxHp);
transform.localScale = Vector3.one * slimeState.Size; transform.localScale = Vector3.one * slimeState.Size;
if (slimeState.HasRabbit) if (slimeState.HasRabbit)
{ {
Anim.runtimeAnimatorController = slimeRabbitController; Anim.runtimeAnimatorController = slimeRabbitController;
OnChangedCurrentHp += UiManager.Inst.CombatUi.FieldBossHpSlider.UpdateHpSlider; OnChangedCurrentHp += UiManager.Inst.CombatUi.FieldBossHpSlider.UpdateHpSlider;
if (slimeState.Level != 5) return;
mapController ??= FindAnyObjectByType<SlimeBossMapController>();
OnDieRabbitEvent += mapController.AllDestroyInstantiateObject;
} }
else else
{ {
@ -189,6 +199,10 @@ namespace BlueWaterProject
public void Die() public void Die()
{ {
if (slimeState.Level == 5)
{
OnDieRabbitEvent?.Invoke();
}
if (slimeState.Level <= 4) if (slimeState.Level <= 4)
{ {
mapController.SpawnSplitSlimes(transform.position, slimeState.Level + 1, slimeState.HasRabbit); mapController.SpawnSplitSlimes(transform.position, slimeState.Level + 1, slimeState.HasRabbit);
@ -308,13 +322,9 @@ namespace BlueWaterProject
private IEnumerator FlashWhiteCoroutine() private IEnumerator FlashWhiteCoroutine()
{ {
spriteRenderer.GetPropertyBlock(propBlock); spriteRenderer.material.SetInt(IsHitHash, 1);
propBlock.SetInt(IsHitHash, 1);
spriteRenderer.SetPropertyBlock(propBlock);
yield return flashWhiteWaitTime;
propBlock.SetInt(IsHitHash, 0);
spriteRenderer.SetPropertyBlock(propBlock);
yield return flashWhiteWaitTime; yield return flashWhiteWaitTime;
spriteRenderer.material.SetInt(IsHitHash, 0);
} }
private void StartMove() private void StartMove()
@ -328,7 +338,7 @@ namespace BlueWaterProject
var endPosition = CalculateRandomPosition(startPosition, 2f); var endPosition = CalculateRandomPosition(startPosition, 2f);
var elapsedTime = 0f; var elapsedTime = 0f;
while (elapsedTime <= slimeState.Speed) while (elapsedTime <= slimeState.AnimationLength)
{ {
elapsedTime += Time.deltaTime; elapsedTime += Time.deltaTime;
transform.position = Vector3.Lerp(startPosition, endPosition, transform.position = Vector3.Lerp(startPosition, endPosition,
@ -360,13 +370,13 @@ namespace BlueWaterProject
yield break; yield break;
} }
iAnimationStateController.SetCurrentAnimationSpeed(slimeState.Speed); iAnimationStateController.SetCurrentAnimationSpeed(slimeState.AnimationLength);
var startPosition = transform.position; var startPosition = transform.position;
Vector3 endPosition; Vector3 endPosition;
var hitCount = Physics.OverlapSphereNonAlloc(startPosition, slimeState.Range, hitColliders, targetLayer); var hitCount = Physics.OverlapSphereNonAlloc(startPosition, slimeState.ViewRange, targetedColliders, targetLayer);
if (hitCount >= 1) if (hitCount >= 1)
{ {
endPosition = CalculateRandomPosition(hitColliders[0].transform.position, 1f); endPosition = CalculateRandomPosition(targetedColliders[0].transform.position, 1f);
} }
else else
{ {
@ -381,6 +391,8 @@ namespace BlueWaterProject
yield return null; yield return null;
} }
DoAttack();
var randomCooldown = Random.Range(slimeState.RandomCooldown.x, slimeState.RandomCooldown.y); var randomCooldown = Random.Range(slimeState.RandomCooldown.x, slimeState.RandomCooldown.y);
EndJumpSlam(randomCooldown); EndJumpSlam(randomCooldown);
} }
@ -418,6 +430,21 @@ namespace BlueWaterProject
return false; return false;
} }
private void DoAttack()
{
var attackPosition = transform.position;
var hitCount = Physics.OverlapSphereNonAlloc(attackPosition, ColliderRadius, hitColliders, targetLayer);
if (hitCount < 1) return;
var targetToVector = hitColliders[0].transform.position - attackPosition;
targetToVector.y = 0f;
var targetDirection = targetToVector.normalized;
var iDamageable = hitColliders[0].transform.GetComponent<IDamageable>();
iDamageable?.TakeDamage(attackDamage);
hitColliders[0].GetComponent<Rigidbody>().AddForce(targetDirection * 3f, ForceMode.Impulse);
}
#endregion #endregion
} }
} }