144 lines
5.2 KiB
C#
Raw Permalink Normal View History

2025-09-19 19:43:49 +05:00
using BulletHellTemplate.VFX;
using DentedPixel;
2025-09-19 14:56:58 +05:00
using UnityEngine;
namespace BulletHellTemplate
{
2025-09-19 19:43:49 +05:00
[DisallowMultipleComponent]
public sealed class DropEntity : MonoBehaviour
2025-09-19 14:56:58 +05:00
{
2025-09-19 19:43:49 +05:00
/*──────── CONFIG────────*/
2025-09-19 14:56:58 +05:00
public enum DropType
{
2025-09-19 19:43:49 +05:00
Gold, Experience, Health, Shield,
CollectAll, CollectGold, CollectExperience, CollectHealth
2025-09-19 14:56:58 +05:00
}
[Header("Drop Settings")]
2025-09-19 19:43:49 +05:00
public DropType type;
[SerializeField] private int value;
public bool canAutoCollect = true;
/*──────── Runtime ───────*/
private Transform _target;
private float _collectRange;
private bool _magnetActive;
private LTDescr _spinTween;
2025-09-19 14:56:58 +05:00
2025-09-19 19:43:49 +05:00
private void OnEnable()
2025-09-19 14:56:58 +05:00
{
2025-09-19 19:43:49 +05:00
_spinTween = LeanTween.rotateAround(
gameObject, Vector3.up, 360f, 3f)
.setRepeat(-1)
.setEaseLinear();
#if UNITY_6000_0_OR_NEWER
var player = FindAnyObjectByType<CharacterEntity>();
#else
var player = FindObjectOfType<CharacterEntity>();
#endif
if (player)
2025-09-19 14:56:58 +05:00
{
2025-09-19 19:43:49 +05:00
_target = player.transform;
_collectRange = player.GetCurrentCollectRange();
2025-09-19 14:56:58 +05:00
}
}
2025-09-19 19:43:49 +05:00
private void OnDisable()
{
if (_spinTween != null) LeanTween.cancel(_spinTween.uniqueId);
_magnetActive = false;
canAutoCollect = true;
}
public void SetValue(int amount)
{
value = amount;
}
/*──────────────────────── UPDATE ──────────────────────────────*/
2025-09-19 14:56:58 +05:00
private void Update()
{
2025-09-19 19:43:49 +05:00
if (GameplayManager.Singleton.IsPaused()) return;
if (!_target) return;
if (!_magnetActive && canAutoCollect)
2025-09-19 14:56:58 +05:00
{
2025-09-19 19:43:49 +05:00
float dist = Vector3.Distance(transform.position, _target.position);
if (dist <= _collectRange)
StartMagnet();
2025-09-19 14:56:58 +05:00
}
2025-09-19 19:43:49 +05:00
if (_magnetActive)
{
transform.position = Vector3.MoveTowards(
transform.position,
_target.position,
Time.deltaTime * 12f);
2025-09-19 14:56:58 +05:00
}
}
2025-09-19 19:43:49 +05:00
/*──────────────────────── MAGNET FX ───────────────────────────*/
private void StartMagnet()
2025-09-19 14:56:58 +05:00
{
2025-09-19 19:43:49 +05:00
_magnetActive = true;
canAutoCollect = false;
2025-09-19 14:56:58 +05:00
2025-09-19 19:43:49 +05:00
Vector3 back = transform.position - transform.forward * 0.6f;
LeanTween.move(gameObject, back, 0.08f)
.setEaseOutQuad();
}
/*──────────────────────── PICKUP ──────────────────────────────*/
2025-09-19 14:56:58 +05:00
private void OnTriggerEnter(Collider other)
{
2025-09-19 19:43:49 +05:00
if (!other.CompareTag("Character")) return;
var player = other.GetComponent<CharacterEntity>();
if (!player || GameplayManager.Singleton.IsPaused()) return;
if (type is DropType.CollectAll or DropType.CollectGold
or DropType.CollectExperience or DropType.CollectHealth)
2025-09-19 14:56:58 +05:00
{
2025-09-19 19:43:49 +05:00
AttractDrops(player, type);
2025-09-19 14:56:58 +05:00
}
2025-09-19 19:43:49 +05:00
else
{
ApplyDrop(player);
}
DropPool.Release(this);
2025-09-19 14:56:58 +05:00
}
2025-09-19 19:43:49 +05:00
private void ApplyDrop(CharacterEntity player)
2025-09-19 14:56:58 +05:00
{
switch (type)
{
2025-09-19 19:43:49 +05:00
case DropType.Gold: GameplayManager.Singleton.IncrementGainGold(value); break;
case DropType.Experience: GameplayManager.Singleton.IncrementGainXP(value); ; break;
case DropType.Health: player.ApplyHealHP(value); break;
case DropType.Shield: player.ApplyShield(value); break;
2025-09-19 14:56:58 +05:00
}
}
2025-09-19 19:43:49 +05:00
/*──────────────────────── COLLECT-ALL ─────────────────────────*/
private static void AttractDrops(CharacterEntity player, DropType collector)
2025-09-19 14:56:58 +05:00
{
2025-09-19 19:43:49 +05:00
#if UNITY_6000_0_OR_NEWER
var drops = FindObjectsByType<DropEntity>(FindObjectsSortMode.None);
#else
var drops = FindObjectsOfType<DropEntity>();
#endif
foreach (var d in drops)
if (ShouldAttract(collector, d.type))
2025-09-19 14:56:58 +05:00
{
2025-09-19 19:43:49 +05:00
d._target = player.transform;
d._collectRange = float.MaxValue;
d.StartMagnet();
2025-09-19 14:56:58 +05:00
}
}
2025-09-19 19:43:49 +05:00
private static bool ShouldAttract(DropType collector, DropType drop) =>
collector == DropType.CollectAll && drop < DropType.CollectAll
|| collector == DropType.CollectGold && drop == DropType.Gold
|| collector == DropType.CollectExperience && drop == DropType.Experience
|| collector == DropType.CollectHealth && drop == DropType.Health;
2025-09-19 14:56:58 +05:00
}
2025-09-19 19:43:49 +05:00
}