#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
<Size>k__BackingField: 10
<MaxHp>k__BackingField: 100
<Speed>k__BackingField: 1
<Range>k__BackingField: 4
<RandomCooldown>k__BackingField: {x: 1.5, y: 2}
<AnimationLength>k__BackingField: 1
<ViewRange>k__BackingField: 4
<RandomCooldown>k__BackingField: {x: 1.5, y: 2.5}
<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}
<AnimationLength>k__BackingField: 0.9
<ViewRange>k__BackingField: 5
<RandomCooldown>k__BackingField: {x: 1.25, y: 2.25}
<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}
<AnimationLength>k__BackingField: 0.8
<ViewRange>k__BackingField: 6
<RandomCooldown>k__BackingField: {x: 1, y: 2}
<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}
<AnimationLength>k__BackingField: 0.7
<ViewRange>k__BackingField: 7
<RandomCooldown>k__BackingField: {x: 0.75, y: 1.75}
<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}
<AnimationLength>k__BackingField: 0.6
<ViewRange>k__BackingField: 8
<RandomCooldown>k__BackingField: {x: 0.5, y: 1.5}
<HasRabbit>k__BackingField: 0
--- !u!1 &1969962453
GameObject:

View File

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

View File

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