2D ํ๋ทฐ ๊ฒ์์ ์ ์ํ๊ณ ์์ต๋๋ค.
์ด๋ ์
๋ ฅ๊ฐ์ ๋ฐ๋ผ direction ๊ฐ์ 8๊ฐ์ง๋ก ๋ณํ๊ณ
์ด๋์ ํ๋ฉฐ ๋ง์ฐ์ค ์ฐํด๋ฆญ์ ํ๋ฉด ์๋ ์ฝ๋ฃจํด์ด ์คํ๋๊ฒ ๋ง๋ค์์ต๋๋ค.
private IEnumerator PlayerDashRoutine(Vector3 direction)
{
float minDistance = 0.2f;
isPlayerDashing = true;
Vector3 targetPosition = player.transform.position + (Vector3)direction * movementDetails.dashDistance;
int layerMask = LayerMask.GetMask("Wall");
RaycastHit2D hit = Physics2D.Raycast(player.transform.position, direction, movementDetails.dashDistance + 0.1f, layerMask);
if(hit.collider != null)
{
targetPosition = hit.point - (Vector2)direction.normalized * 0.1f;
}
while(Vector3.Distance(player.transform.position, targetPosition) > minDistance)
{
player.movementToPositionEvent.CallMovementToPositionEvent(targetPosition, player.transform.position, movementDetails.dashSpeed, direction, isPlayerDashing);
yield return waitForFixedUpdate;
}
isPlayerDashing = false;
playerDashCooldownTimer = movementDetails.dashCooldownTime;
player.transform.position = targetPosition;
}
์๋๋ ๋ค๋ฅธ ๋์ฌ ์ด๋ฒคํธ ๊ด๋ จ ์คํฌ๋ฆฝํธ์ ๋์ฌ ํจ์์
๋๋ค.
private void MoveRigidBody(Vector3 movePosition, Vector3 currentPosition, float moveSpeed)
{
Vector2 unitVector = Vector3.Normalize(movePosition - currentPosition);
Vector3 newPosition = rigidBody2D.position + (unitVector * moveSpeed * Time.fixedDeltaTime);
rigidBody2D.velocity = unitVector * moveSpeed;
}
์บ๋ฆญํฐ๊ฐ ๋ฒฝ์ชฝ์ผ๋ก ๋์ฌ๋ฅผ ํ๋ฉด ๋ฒฝ๊ณผ ์บ๋ฆญํฐ์ ์ฝ๋ผ์ด๋๊ฐ ๋ถ๋ชํ ๋ฉ์ถ๊ฒ ๋ผ์ ๋์ฌ๋ฅผ ํ์๋ ์์ ๋ฒฝ์ด ์์ผ๋ฉด ๊ทธ๋งํผ ํ๊ฒํฌ์ง์
์ด ๋ณ๊ฒฝ๋๊ฒ ๋ง๋ค์ด๋ดค๋๋ฐ์.
๊ทธ๋ฐ๋ฐ ์๋ ๊ทธ๋ฆผ๊ฐ์ ์ํฉ์์ ๋์ฌ๋ฅผ ํ๋ฉด ํ๋ ์ด์ด์ ์ฝ๋ผ์ด๋์ ๋ฒฝ ์ฝ๋ผ์ด๋๊ฐ ๊ฒน์น๋ฉด์ ๋ค์ ๋ฉ์ถคํ์์ด ์๊น๋๋ค.
๋ณด๋ ๊ฐ์์์ ์ฝ๋ผ์ด๋์ ๋ถ๋ชํ๋ฉด ์ฝ๋ฃจํด์ ์ค์งํ๊ฒ ๋ง๋๋ ์ฝ๋๋ฅผ ๋ฃ๋๋ฐ ๊ทธ๋ ๊ฒ ํ๋ฉด ๋ชจ์๋ฆฌ์์์ ๋์ฌ๊ฐ ๋ถ๊ฐ๋ฅํด์ ์ด๋ป๊ฒ๋ ์ค์ง ์ฝ๋ ์์ด ํด๋ณด๋ ค๋๋ฐ ์ฌ๊ธฐ์ ๊ณ์ ๋งํ๋ค์.. ์ค๋ช ์ด ๋ถ์กฑํ ๋ถ๋ถ์ด ์์ผ๋ฉด ๋ง์ํด์ฃผ์ธ์. ๋์์ฃผ์ธ์ ํ๋๋ค ใ ใ
์ด๊ฑฐ ๋ต๋ณ ๋ฐ์ผ๋ฉด ์ญ์ ํ์ง๋ง์์ค ๋๋ ํด๊ฒฐ์ ๋ชปํจ ์ด ๋ฌธ์
Int wallMask = LayerMask.NameToLayer("wall") Int playerMask = LayerMask.NameToLayer("Player") ์ด๋ ๊ฒ ๋๊ฐ ๋ ์ด์ด ์ด๋ฆ์ ๋ฐ์์
while ๋ฃจํ ์์ Physics2D.IgnoreLayerCollision(playerMask, wallMask, true); ์ด๋ ๊ฒ ์ ๊ณ ์๋ก ์ํธ์์ฉํ์ง ์๊ฒ ๋ง๋ค๊ณ
๊ทธ๋ฌ๋ฉด ์ฑ๋ฅ ํผํฌ๋จผ์ค ๋ฌธ์ ์ผ์ด๋์ง ์์? ์ผ๋จ ํด๋ณผ๊ฒ ๊ณ ๋ง๋ค
์ฝ๋ฃจํด ๋ง์ง๋ง์ Physics2D.IgnoreLayerCollision(playerMask, wallMask, false); ์ด๋ ๊ฒ ๋ค์ ์ํธ์์ฉ ํ๊ฒ ๋ง๋๋๊น ์ผ๋จ ํด๊ฒฐ ๋๋ค. ์์ฒ๋ผ ๊ฒน์น๋ ์ํฉ์์ ์ด์ง ํ ๋ ํฌํธ ํ๋ฏ์ด ์์ผ๋ก ๋น ์ง๊ธด ํ๋๋ฐ ๋ด ์ ์์ ์ด๊ฒ ์ต์ ์ธ๊ฒ ๊ฐ๋ค. ์ด๊ฑธ๋ก ์๋ํด๋ณด๊ณ ์๋๋ฉด ๋ต๊ธ๋จ๊ฒจ์ค
์ผ๋จ ๋๋ ์ข ๋ค๋ฅธ ๋ฐฉ์์ด๋ผ ๋๋ ์ผ๋จ ํด๋ณด๊ณ ๋๋ ๋ค๋ฅธ๋ฐฉ์์ผ๋ก ์๊ฐ๊ฐท๋ณผ๋ฏ ๊ณ ๋ง๋ค