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