#255 거대 슬라임 작업2
This commit is contained in:
parent
bcefdb679c
commit
9699c0534a
@ -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:
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user