209 lines
6.5 KiB
C#
209 lines
6.5 KiB
C#
using System.Collections;
|
|
using BehaviorDesigner.Runtime;
|
|
using BlueWater.Interfaces;
|
|
using BlueWater.Maps;
|
|
using Sirenix.OdinInspector;
|
|
using UnityEngine;
|
|
using UnityEngine.Serialization;
|
|
|
|
namespace BlueWater.Enemies.Bosses.SandMole
|
|
{
|
|
public class MiniSandMole : MonoBehaviour, ITarget, ICurrentDirection
|
|
{
|
|
// Variables
|
|
#region Variables
|
|
|
|
// Components
|
|
[field: SerializeField]
|
|
public Rigidbody Rigidbody { get; private set; }
|
|
|
|
[field: SerializeField]
|
|
public CapsuleCollider CharacterCollider { get; private set; }
|
|
|
|
[field: SerializeField]
|
|
public BehaviorTree BehaviorTree { get; private set; }
|
|
|
|
[field: SerializeField]
|
|
public Transform VisualLook { get; private set; }
|
|
|
|
[field: SerializeField]
|
|
public SpriteRenderer SpriteRenderer { get; private set; }
|
|
|
|
[field: SerializeField]
|
|
public Animator Animator { get; private set; }
|
|
|
|
[field: SerializeField]
|
|
public BoxCollider HitBoxCollider { get; private set; }
|
|
|
|
// Classes
|
|
[field: SerializeField, Required]
|
|
public BossData BossData { get; private set; }
|
|
|
|
[field: SerializeField, Required]
|
|
public AnimationController AnimationController { get; private set; }
|
|
|
|
[field: SerializeField, Required]
|
|
public BossHealthPoint BossHealthPoint { get; private set; }
|
|
|
|
[field: SerializeField, Required]
|
|
public BossSkillController BossSkillController { get; private set; }
|
|
|
|
[field: SerializeField, Required]
|
|
public SandMoleStatus SandMoleStatus { get; private set; }
|
|
|
|
[field: SerializeField]
|
|
public Collider Target { get; private set; }
|
|
|
|
[Title("효과")]
|
|
[SerializeField]
|
|
private float _spawnDissolveTime = 2f;
|
|
|
|
[SerializeField]
|
|
private float _dieDissolveTime = 1f;
|
|
|
|
public BossMapController BossMapController { get; private set; }
|
|
|
|
private bool _isMoving;
|
|
public bool IsMoving
|
|
{
|
|
get => _isMoving;
|
|
set
|
|
{
|
|
_isMoving = value;
|
|
AnimationController.SetAnimationParameter("isMoving", _isMoving);
|
|
}
|
|
}
|
|
|
|
private Vector3 _currentDirection = Vector3.right;
|
|
public Vector3 CurrentDirection
|
|
{
|
|
get => _currentDirection;
|
|
set
|
|
{
|
|
if (value == Vector3.zero) return;
|
|
|
|
_currentDirection = value;
|
|
AnimationController.SetAnimationParameter("xDirection", _currentDirection.x);
|
|
AnimationController.SetAnimationParameter("zDirection", _currentDirection.z);
|
|
}
|
|
}
|
|
|
|
// Hashes
|
|
private static readonly int _dissolveValueHash = Shader.PropertyToID("_DissolveValue");
|
|
|
|
#endregion
|
|
|
|
// Unity events
|
|
#region Unity events
|
|
|
|
private void Awake()
|
|
{
|
|
InitializeComponents();
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
FlipVisualLook();
|
|
}
|
|
|
|
#endregion
|
|
|
|
// Initialize methods
|
|
#region Initialize methods
|
|
|
|
[Button("컴포넌트 초기화")]
|
|
private void InitializeComponents()
|
|
{
|
|
Rigidbody = GetComponent<Rigidbody>();
|
|
CharacterCollider = GetComponent<CapsuleCollider>();
|
|
BehaviorTree = GetComponent<BehaviorTree>();
|
|
VisualLook = transform.Find("VisualLook");
|
|
SpriteRenderer = VisualLook.GetComponent<SpriteRenderer>();
|
|
Animator = VisualLook.GetComponent<Animator>();
|
|
HitBoxCollider = transform.Find("HitBox").GetComponent<BoxCollider>();
|
|
|
|
AnimationController = GetComponent<AnimationController>();
|
|
BossHealthPoint = GetComponent<BossHealthPoint>();
|
|
BossSkillController = GetComponent<BossSkillController>();
|
|
|
|
SandMoleStatus = GetComponent<SandMoleStatus>();
|
|
BossMapController = MapManager.Instance.SandMoleMapController;
|
|
}
|
|
|
|
public void Initialize()
|
|
{
|
|
StartCoroutine(InitializeEffectCoroutine());
|
|
}
|
|
|
|
private IEnumerator InitializeEffectCoroutine()
|
|
{
|
|
Target = GameManager.Instance.CurrentCombatPlayer.GetComponent<Collider>();
|
|
|
|
BossHealthPoint.Initialize(false, BossData.MaxHealthPoint,
|
|
BossData.DisplayName, BossMapController.ParticleInstantiateLocation);
|
|
BossHealthPoint.OnDead += HandleDie;
|
|
BossSkillController.Initialize(BossData.SkillDataList);
|
|
|
|
SpriteRenderer.material.SetFloat(_dissolveValueHash, 0f);
|
|
var elapsedTime = 0f;
|
|
while (elapsedTime <= _spawnDissolveTime)
|
|
{
|
|
var value = Mathf.Lerp(0f, 1f, elapsedTime / _spawnDissolveTime);
|
|
SpriteRenderer.material.SetFloat(_dissolveValueHash, value);
|
|
elapsedTime += Time.deltaTime;
|
|
|
|
yield return null;
|
|
}
|
|
SpriteRenderer.material.SetFloat(_dissolveValueHash, 1f);
|
|
|
|
BehaviorTree.EnableBehavior();
|
|
}
|
|
|
|
#endregion
|
|
|
|
// Methods
|
|
#region Methods
|
|
|
|
private void HandleDie()
|
|
{
|
|
StartCoroutine(DieCoroutine());
|
|
}
|
|
|
|
private IEnumerator DieCoroutine()
|
|
{
|
|
if (Rigidbody)
|
|
{
|
|
Rigidbody.isKinematic = true;
|
|
}
|
|
|
|
AnimationController.SetAnimationTrigger("isDead");
|
|
|
|
SpriteRenderer.material.SetFloat(_dissolveValueHash, 0f);
|
|
var elapsedTime = 0f;
|
|
while (elapsedTime <= _dieDissolveTime)
|
|
{
|
|
var value = Mathf.Lerp(1f, 0f, elapsedTime / _dieDissolveTime);
|
|
SpriteRenderer.material.SetFloat(_dissolveValueHash, value);
|
|
elapsedTime += Time.deltaTime;
|
|
|
|
yield return null;
|
|
}
|
|
SpriteRenderer.material.SetFloat(_dissolveValueHash, 0f);
|
|
Destroy(gameObject);
|
|
}
|
|
|
|
private void FlipVisualLook()
|
|
{
|
|
var localScale = VisualLook.localScale;
|
|
localScale.x = CurrentDirection.x switch
|
|
{
|
|
> 0.01f => Mathf.Abs(localScale.x),
|
|
< -0.01f => -Mathf.Abs(localScale.x),
|
|
_ => localScale.x
|
|
};
|
|
VisualLook.localScale = localScale;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |