์—ฌ๊ธฐ ๊ณ„์‹  ๋ถ„๋“ค์˜ย ๋„์›€์„ ๋งŽ์ด ๋ฐ›์•„์„œ (์ œ ๋‚˜๋ฆ„๋Œ€๋กœ) ๊น”๋”ํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.ย 

๊ทธ๋Ÿฐ๋ฐ ์•„์ง 2๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ ๊ตฌ๊ธ€๋ง ํ•ด๋ด๋„ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์ด ๋„์ €ํžˆ ๋– ์˜ค๋ฅด์ง€ ์•Š์•„์„œ ์งˆ๋ฌธ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์†Œ์Šค์ฝ”๋“œ๋Š” ๋งจ ๋ฐ‘์— ์ œ์‹œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๊ตฌํ˜„ ํ•˜๋ ค๋Š” ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.ย 


์žฅ๋ฅด : 2D ํƒ‘ ๋ทฐ ์•„์ผ€์ด๋“œ

์‚ฌ์šฉ์ค‘์ธ ์—์…‹ : DOTween, New Input System


๋งˆ์šฐ์Šค ์ปค์„œ์— ๋”ฐ๋ผ์„œ ์ผ์ • ๋ฐ˜๊ฒฝ์œผ๋กœย ํ”Œ๋ ˆ์ด์–ด ์ฃผ๋ณ€์„ ํšŒ์ „ํ•˜๋Š” ๋ง‰๋Œ€๊ฐ€ ์žˆ์Œ -> ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ง‰๋Œ€๊ฐ€ ํ”Œ๋ ˆ์ด์–ด ์ชฝ์œผ๋กœ ๋‹น๊ฒจ์ง ->ย 

๋ฒ„ํŠผ์„ ๋—„ ์‹œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅธ ์‹œ๊ฐ„ ๋งŒํผ์˜ ๊ฐ’์„ ๋ฐ›๊ณ  ๊ทธ ๊ฐ’์— ๋”ฐ๋ผ ๋ง‰๋Œ€๊ฐ€ ์–ด๋–ป๊ฒŒ ์›€์ง์—ฌ์งˆ์ง€ ๊ฒฐ์ •๋จ -> ๊ฐ’์ด ๋„ˆ๋ฌด ์งง๊ฑฐ๋‚˜ ๊ธธ๋ฉด ๋‹ค์‹œ ์›๋ž˜ ๋ฐ˜๊ฒฝ์œผ๋กœ ๋Œ์•„๊ฐย 

-> ๊ฐ’์ด ์ ๋‹นํ•˜๊ฑฐ๋‚˜ perfect ํ•  ๊ฒฝ์šฐ, ๋ง‰๋Œ€๊ฐ€ ๋น ๋ฅด๊ฒŒ ๋ฐ€๋ ค๋‚ฌ๋‹ค๊ฐ€ ๋‹ค์‹œ ์›๋ž˜ ๋ฐ˜๊ฒฝ์œผ๋กœ ๋Œ์•„์˜ด



ํ”Œ๋ ˆ์ด์–ด ์ชฝ์œผ๋กœ ๋‹น๊ฒจ์ง€๋Š” ๊ธฐ๋Šฅ์€ Update()์—์„œ ๊ด€๋ฆฌํ•˜๊ณ , ๋ฐ€๊ฑฐ๋‚˜ ์›๋ž˜ ๋ฐ˜๊ฒฝ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ธฐ๋Šฅ์€ย OnEnable() ์—์„œ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.


๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ


1. ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ๋„์ค‘์—๋„ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ์‹œ์—๋„ ๊ฐ’์ด ์ธก์ •๋˜์–ด ํ›„์— ๊ฐ’์ด ์ •ํ™•ํ•˜๊ฒŒ ์ธก์ •๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•จ

-> ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹คํ–‰์ด ๋๋‚˜๊ธฐ ์ „๊นŒ์ง€๋Š” ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋„ ๊ฐ’์ด ์ธก์ •๋˜์ง€ ์•Š๊ฒŒ ํ•ด์•ผํ•จ

2. ๋ฒ„ํŠผ์„ 1์ดˆ ์ด์ƒ์œผ๋กœ ๋ˆŒ๋ €์„ ๋•Œ ์ž๋™์œผ๋กœ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋Š”๊ฒŒ ์ทจ์†Œ ๋˜๊ณ , ๋ง‰๋Œ€๊ฐ€ ์›๋ž˜ ๋ฐ˜๊ฒฝ์œผ๋กœย ๋Œ์•„๊ฐธ์•„ ํ•˜๋Š”๋ฐ ๋Œ์•„๊ฐ€์ง€ ์•Š๊ณ  ๊ณ„์† ์œ ์ง€๋˜๋Š” ํ˜„์ƒ

-> 1์ดˆ ์ด์ƒ ๋ˆ„๋ฅผ ์‹œ ๋ฒ„ํŠผ์ดย ๋น„ํ™œ์„ฑํ™” ๋˜๊ณ  ๋‹ค์‹œ ์›๋ž˜ ๋ฐ˜๊ฒฝ์œผ๋กœ ๋Œ์•„๊ฐธ์•„ํ•จ


์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•ด์•ผ ํ•ด๊ฒฐ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์„๊นŒ์š”?



์ œ๊ฐ€ ๋งŒ๋“  ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.


void Start()
ย  ย  {
ย  ย  ย  ย  DOTween.Init();
ย  ย  }

ย  ย  void Awake()
ย  ย  {
ย  ย  ย  ย  mainCamera = Camera.main;
ย  ย  ย  ย  orbitRadius = defaultOrbitRadius;
ย  ย  ย  ย  playerControls = new PlayerControl(); // ์—ฌ๊ธฐ์„œ playerControls๋ฅผ ์ดˆ๊ธฐํ™”
ย  ย  }

ย  ย  void OnEnable()
ย  ย  {
ย  ย  ย  ย  playerControls.Enable();
ย  ย  ย  ย  playerControls.Player.Fire.performed += ctx =>
ย  ย  {
ย  ย  isFireButtonPressed = true;
ย  ย  fireButtonPressStartTime = Time.realtimeSinceStartup;
ย  ย  };

ย  ย  ย  ย  playerControls.Player.Fire.canceled += ctx =>
{
ย  ย  isFireButtonPressed = false;
ย  ย  fireButtonPressDuration = Time.realtimeSinceStartup - fireButtonPressStartTime;
ย  ย  Debug.Log($"๋ฒ„ํŠผ ๋ˆ„๋ฅธ ์‹œ๊ฐ„:{fireButtonPressDuration}");

ย  ย  if (fireButtonPressDuration > maxHoldTime)
ย  ย  {
ย  ย  ย  ย  Debug.Log("Too Long");
ย  ย  ย  ย  DOTween.To(() => orbitRadius, x => orbitRadius = x, defaultOrbitRadius, 0.3f).SetEase(Ease.Linear);
ย  ย  }
ย  ย  else if (fireButtonPressDuration < minHoldTime)
ย  ย  {
ย  ย  ย  ย  Debug.Log("Too short!");
ย  ย  ย  ย  DOTween.To(() => orbitRadius, x => orbitRadius = x, defaultOrbitRadius, 0.5f).SetEase(Ease.Linear);
ย  ย  }
ย  ย  else if (fireButtonPressDuration >= 0.45f && fireButtonPressDuration <= 0.55f)
ย  ย  {
ย  ย  ย  ย  Debug.Log("Perfect Parrying!");
ย  ย  ย  ย  Sequence s = DOTween.Sequence();
ย  ย  ย  ย  DOTween.To(() => orbitRadius, x => orbitRadius = x, defaultOrbitRadius, 0.8f).SetEase(Ease.OutElastic, overshoot: 3);
ย  ย  }
ย  ย  else
ย  ย  {
ย  ย  ย  ย  Debug.Log("Normal Parrying");
ย  ย  ย  ย  Sequence s = DOTween.Sequence();
ย  ย  ย  ย  DOTween.To(() => orbitRadius, x => orbitRadius = x, defaultOrbitRadius, 1f).SetEase(Ease.OutElastic);
ย  ย  }
};
ย  ย  }

ย  ย 

ย  ย  void OnDisable()
ย  ย  {
ย  ย  ย  ย  playerControls.Disable();
ย  ย  }

ย  ย  void Update()
ย  ย  {
ย  ย  ย  ย  fireButtonPressDuration = Time.realtimeSinceStartup - fireButtonPressStartTime;
ย  ย  ย  ย  if (isFireButtonPressed && orbitRadius > minOrbitRadius)
ย  ย  ย  ย  {
ย  ย  ย  ย  ย  ย  orbitRadius -= Time.deltaTime; // radius ๊ฐ์†Œ
ย  ย  ย  ย  }

ย  ย  ย  ย  if (isFireButtonPressed && fireButtonPressDuration >= 1.0f)
ย  ย  ย  ย  {
ย  ย  ย  ย  ย  ย  isFireButtonPressed = false;

ย  ย  ย  ย  ย  ย  Debug.Log("๋„ˆ๋ฌด ๊ธธ์–ด์„œ ์ž๋™์œผ๋กœ ์ทจ์†Œ๋จ");
ย  ย  ย  ย  }

ย  ย  ย  ย  UpdateOrbitPosition();
ย  ย  }


ย  ย  private void UpdateOrbitPosition()
ย  ย  {
ย  ย  ย  ย  Vector2 mousePosition = Mouse.current.position.ReadValue();
ย  ย  ย  ย  mousePosition = mainCamera.ScreenToWorldPoint(mousePosition);

ย  ย  ย  ย  Vector2 direction = new Vector2(mousePosition.x - player.transform.position.x, mousePosition.y - player.transform.position.y);
ย  ย  ย  ย  direction.Normalize();

ย  ย  ย  ย  float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
ย  ย  ย  ย  Vector2 orbitPosition = Quaternion.Euler(0, 0, angle) * new Vector2(orbitRadius, 0);
ย  ย  ย  ย  transform.position = (Vector3)player.transform.position + (Vector3)orbitPosition + initialOffset;
ย  ย  ย  ย  transform.rotation = Quaternion.Euler(0, 0, angle);
ย  ย  }

}ย