139 lines
4.1 KiB
C#
139 lines
4.1 KiB
C#
using System.Collections;
|
|
using BlueWater.Interfaces;
|
|
using Sirenix.OdinInspector;
|
|
using UnityEngine;
|
|
|
|
namespace BlueWater.Enemies.Bosses
|
|
{
|
|
public abstract class AnimatorBoss : Boss, ICurrentDirection
|
|
{
|
|
// Variables
|
|
#region Variables
|
|
|
|
// Components
|
|
[field: Title("애니메이터 보스 컴포넌트")]
|
|
[field: SerializeField]
|
|
public SpriteRenderer SpriteRenderer { get; private set; }
|
|
|
|
[field: SerializeField]
|
|
public Animator Animator { get; private set; }
|
|
|
|
// Classes
|
|
[field: SerializeField]
|
|
public AnimationController AnimationController { 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);
|
|
}
|
|
}
|
|
|
|
// Unity events
|
|
#region Unity events
|
|
|
|
protected override void Update()
|
|
{
|
|
base.Update();
|
|
|
|
HandleMovement();
|
|
FlipVisualLook();
|
|
}
|
|
|
|
#endregion
|
|
|
|
#endregion
|
|
|
|
// Initialize methods
|
|
#region Initialize methods
|
|
|
|
[Button("컴포넌트 초기화")]
|
|
protected override void InitializeComponents()
|
|
{
|
|
base.InitializeComponents();
|
|
|
|
SpriteRenderer = VisualLook.GetComponent<SpriteRenderer>();
|
|
SpriteRenderer.enabled = false;
|
|
Animator = VisualLook.GetComponent<Animator>();
|
|
AnimationController = GetComponent<AnimationController>();
|
|
|
|
MaterialInstance = Instantiate(SpriteRenderer.material);
|
|
SpriteRenderer.material = MaterialInstance;
|
|
|
|
BossHealthPoint.SetMaterialInstance(MaterialInstance);
|
|
IsInitialized = true;
|
|
}
|
|
|
|
#endregion
|
|
|
|
// Methods
|
|
#region Methods
|
|
|
|
protected override IEnumerator DissolveCoroutine(float start, float end, float dissolveTime)
|
|
{
|
|
if (!IsDissolveActive)
|
|
{
|
|
MaterialInstance.SetFloat(_dissolveValueHash, end);
|
|
yield break;
|
|
}
|
|
|
|
MaterialInstance.SetFloat(_dissolveValueHash, start);
|
|
SpriteRenderer.enabled = true;
|
|
|
|
var elapsedTime = 0f;
|
|
while (elapsedTime <= dissolveTime)
|
|
{
|
|
var value = Mathf.Lerp(start, end, elapsedTime / dissolveTime);
|
|
MaterialInstance.SetFloat(_dissolveValueHash, value);
|
|
elapsedTime += Time.deltaTime;
|
|
yield return null;
|
|
}
|
|
|
|
MaterialInstance.SetFloat(_dissolveValueHash, end);
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
private void HandleMovement()
|
|
{
|
|
if (!AstarAi.canMove || AstarAi.isStopped)
|
|
{
|
|
IsMoving = false;
|
|
return;
|
|
}
|
|
|
|
CurrentDirection = AstarAi.velocity.normalized;
|
|
IsMoving = AstarAi.velocity != Vector3.zero || AstarAi.velocity != Vector3.positiveInfinity;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |