OneShotOneKill/Assets/Script/InGame/Actor/AimArrowController.cs

138 lines
3.9 KiB
C#
Raw Permalink Normal View History

2026-01-15 02:15:35 +00:00
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
public class AimArrowController : MonoBehaviour
{
public Animator m_Anim;
public Image arrow;
2026-01-11 23:53:38 +00:00
public Transform projectileParent;
float m_attackTime, m_attackLifeTime;
void Start()
{
arrow.enabled = false;
}
private void OnEnable()
{
var unit = IngameMgr.Ins.Get_CurUnitTData();
m_attackLifeTime = m_attackTime = unit.f_AttackSpeed;
}
2026-01-14 07:29:45 +00:00
public void Set_AttackLifeTime()
{
var unit = IngameMgr.Ins.Get_CurUnitTData();
m_attackLifeTime = unit.f_AttackSpeed - IngameMgr.Ins.Get_SkillValue(eSkillType.AttackSpeedUp);
}
private void Update()
{
m_attackLifeTime -= Time.deltaTime;
if (m_attackLifeTime <= 0)
{
m_attackLifeTime = m_attackTime;
2026-01-15 02:15:35 +00:00
StartCoroutine(Co_Shoot());
}
}
IEnumerator Co_Shoot()
{
int count = 1 + (int)IngameMgr.Ins.Get_SkillValue(eSkillType.DoubleShot);
for (int i = 0; i < count; i++)
{
m_Anim.SetTrigger("ShotBow");
2026-01-14 04:49:44 +00:00
Shoot();
2026-01-15 02:15:35 +00:00
yield return new WaitForSeconds(0.15f);
}
}
public void OnAimStart(Vector2 screenPos)
{
UpdateArrow(screenPos);
}
public void OnAimDrag(Vector2 screenPos)
{
UpdateArrow(screenPos);
}
public void OnAimEnd()
{
arrow.enabled = false;
}
2026-01-14 04:49:44 +00:00
void Shoot()
{
2026-01-13 00:46:52 +00:00
var unit = IngameMgr.Ins.Get_CurUnitTData();
ProjectileData basePd = new ProjectileData
{
2026-01-16 05:45:58 +00:00
ActorType = eActor.PC,
m_Data = table_projectile.Ins.Get_Data(unit.n_ProjectileID),
2026-01-13 07:33:06 +00:00
tf_Start = arrow.transform,
Dmg = unit.n_DefaultAttack + (int)IngameMgr.Ins.Get_SkillValue(eSkillType.AttackUp),
Ignore_WallHP = true,
PreviousArrow = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.PreviousArrow),
DiagonalArrow = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.DiagonalArrow),
2026-01-14 21:45:26 +00:00
ArrowLeftRight = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.ArrowLeftRight),
ArrowUpDown = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.ArrowUpDown),
2026-01-14 23:18:10 +00:00
Bounce = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.Bounce),
Pierce = (int)IngameMgr.Ins.Get_SkillValue(eSkillType.ProjectilePierce)
};
2026-01-14 21:45:26 +00:00
int lineCnt = 1 + basePd.PreviousArrow;
int diagCnt = 1 + basePd.DiagonalArrow;
for (int l = 0; l < lineCnt; l++)
2026-01-14 21:45:26 +00:00
{
for (int d = 0; d < diagCnt; d++)
2026-01-14 21:45:26 +00:00
{
ProjectileMgr.Ins.Shoot_Projectile(new ProjectileData
{
LineIndex = l,
DiagIndex = d,
PreviousArrow = basePd.PreviousArrow,
DiagonalArrow = basePd.DiagonalArrow,
Ignore_WallHP = basePd.Ignore_WallHP,
ArrowLeftRight = basePd.ArrowLeftRight,
ArrowUpDown = basePd.ArrowUpDown,
Bounce = basePd.Bounce,
2026-01-14 23:18:10 +00:00
Pierce = basePd.Pierce,
2026-01-16 05:45:58 +00:00
ActorType = basePd.ActorType,
m_Data = basePd.m_Data,
tf_Start = basePd.tf_Start,
Dmg = basePd.Dmg
});
}
2026-01-14 21:45:26 +00:00
}
}
2026-01-15 22:22:16 +00:00
void UpdateArrow(Vector2 screenPos)
{
arrow.enabled = true;
2026-01-15 22:40:46 +00:00
Vector2 touchWorldPos = Camera.main.ScreenToWorldPoint(screenPos);
Vector2 dir = touchWorldPos - (Vector2)arrow.transform.position;
if (dir.sqrMagnitude < 0.001f)
return;
// 1. 방향 → 각도 (위 기준)
float angle = Mathf.Atan2(dir.x, dir.y) * Mathf.Rad2Deg;
// ↑ x,y 순서 중요 (up 기준)
// 2. 각도 제한
2026-01-14 04:49:44 +00:00
angle = Mathf.Clamp(angle, -80f, 80f);
2026-01-15 22:40:46 +00:00
// 3. 각도 → 방향
Vector2 clampedDir = Quaternion.Euler(0, 0, -angle) * Vector2.up;
arrow.transform.up = clampedDir;
}
}