using UnityEngine;
using UnityEngine.InputSystem;
using RR.Game2D.Entities.Projectiles;
namespace RR.Game2D.Behaviour
{
public class PlayerFireScript : MonoBehaviour
{
[Header("Управление")]
[SerializeField] private InputActionReference fireButton;
[Header("Снаряд")]
[SerializeField] private PickableProjectile projectilePrefab;
public bool spawnIfMissing = false;
[Header("Бросок / Подбор")]
[SerializeField] private float throwSpeed = 20f;
[SerializeField] public Transform attachPoint;
private PickableProjectile pickableProjectile;
void Awake()
{
if (!attachPoint)
Debug.LogWarning("PlayerFireScript: attachPoint не задан. Будет использован корень игрока.");
}
void Update()
{
//if (!Input.GetButtonDown("Fire1")) return;
if (!fireButton.action.WasPressedThisFrame()) return;
if (pickableProjectile == null)
pickableProjectile = PickableProjectile.Instance;
if (pickableProjectile == null)
{
if (!spawnIfMissing || projectilePrefab == null)
{
Debug.LogError("PlayerFireScript: projectile missing; enable spawnIfMissing and assign projectilePrefab.");
return;
}
Vector3 spawnPos = attachPoint ? attachPoint.position : transform.position;
pickableProjectile = Instantiate(projectilePrefab, spawnPos, Quaternion.identity);
pickableProjectile.TryPickup(gameObject, attachPoint);
return;
}
// Бросок
if (pickableProjectile.CurrentState == PickableProjectile.State.Held && pickableProjectile.owner == gameObject) Throw();
}
///
/// Метод для броска снаряда (выстрела).
/// У снаряда обязательно должен быть метод Launch(Vector2 direction)
///
private void Throw()
{
float facing = Mathf.Abs(transform.localEulerAngles.y) >= 180 ? -1 : 1;
Vector2 direction = facing > 0 ? Vector2.right : Vector2.left;
Vector2 launchPos = (Vector2)transform.position + new Vector2(1.4f * facing, 0);
Vector3 projectileScale = pickableProjectile.transform.localScale;
pickableProjectile.transform.localScale = new Vector3(Mathf.Abs(projectileScale.x) * -facing, projectileScale.y, projectileScale.z);
pickableProjectile.transform.position = launchPos;
pickableProjectile.Launch(direction, throwSpeed, gameObject);
}
///
/// Метод для привязки снаряда к игроку.
///
/// Снаряд
public void BindProjectile(PickableProjectile proj) => pickableProjectile = proj;
}
}