์ฌ๊ธฐ ๊ณ์ ๋ถ๋ค์ย ๋์์ ๋ง์ด ๋ฐ์์ (์ ๋๋ฆ๋๋ก) ๊น๋ํ๊ฒ ์ฝ๋๋ฅผ ๋ง๋ค ์ ์์์ต๋๋ค.ย
๊ทธ๋ฐ๋ฐ ์์ง 2๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋๋ฐ ๊ตฌ๊ธ๋ง ํด๋ด๋ ํด๊ฒฐ๋ฐฉ๋ฒ์ด ๋์ ํ ๋ ์ค๋ฅด์ง ์์์ ์ง๋ฌธ๋๋ฆฝ๋๋ค.
์์ค์ฝ๋๋ ๋งจ ๋ฐ์ ์ ์ํ๊ฒ ์ต๋๋ค.
๋ง์ฐ์ค ์ปค์์ ๋ฐ๋ผ์ ์ผ์ ๋ฐ๊ฒฝ์ผ๋กย ํ๋ ์ด์ด ์ฃผ๋ณ์ ํ์ ํ๋ ๋ง๋๊ฐ ์์ -> ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ง๋๊ฐ ํ๋ ์ด์ด ์ชฝ์ผ๋ก ๋น๊ฒจ์ง ->ย
๋ฒํผ์ ๋ ์ ๋ฒํผ์ ๋๋ฅธ ์๊ฐ ๋งํผ์ ๊ฐ์ ๋ฐ๊ณ ๊ทธ ๊ฐ์ ๋ฐ๋ผ ๋ง๋๊ฐ ์ด๋ป๊ฒ ์์ง์ฌ์ง์ง ๊ฒฐ์ ๋จ -> ๊ฐ์ด ๋๋ฌด ์งง๊ฑฐ๋ ๊ธธ๋ฉด ๋ค์ ์๋ ๋ฐ๊ฒฝ์ผ๋ก ๋์๊ฐย
-> ๊ฐ์ด ์ ๋นํ๊ฑฐ๋ 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);
ย ย }
์ง๋ฌธ ๋๊ฐ ์์ 1. ์ด ์คํฌ๋ฆฝํธ์ ํด๋์ค๋ ๋ญ์? 2. ์ด ์คํฌ๋ฆฝํธ๋ฅผ enable, disable ํ๋ ์กฐ๊ฑด์ด ๋ญ์ง