CapersProject/Assets/02.Scripts/Character/Enemy/Boss/SandMole/MiniSandMole.cs
Nam Tae Gun 7fb0da5888 #25, #26 아이템 직접 획득 방식 추가 및 선형적인 맵 구조 변경
+ Item관련 Excel, Json, So 수정
+ DropItemTable 로직 수정
+ 아이템 프리팹에서 Enable Interaction 체크하면 직접 룻팅, 해제하면 자동 룻팅
+ 체력회복 아이템 추가
+ 개발자 메뉴 상호작용 "F1" 키를 통해 접근 가능
+ 보스 맵은 마법진을 상호작용하면 보스전 시작
+ 맵 안에서 교전 중일 때, 투명 벽 쉐이더 추가
+ 맵 마다의 통로를 통해서 이동 가능
+ 선형적인 맵 구조에 맞게 리소스 및 위치 수정
+ 타이틀 화면으로 이동할 때 나타나는 오류 수정(CombatUiManager OnDisable 싱글톤 문제)

Closes #25, #26
2024-06-22 07:11:53 +09:00

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.ParticleInstanceLocation);
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
}
}