์ ๊ฐ ๊ตฌํํ๊ณ ์ ํ๋ ๋ฐฉํฅ์ ์บ๋ฆญํฐ๊ฐ ์ผ์๋งต ๋ฐ์์๋ ์ค์ ํ ์ต๋์๋๋ก ์ด๋ํ๋ค๊ฐ
์ผ์๋งต์ผ๋ก ๋ค์ด๊ฐ๋ฉด ํค๋ณด๋์์ ์์ ๋ผ๋ ๋ผ๊ธฐ ์ง์ ์ด๋ํ๋ ๋ฐฉํฅ์ผ๋ก ์ต๋์๋*2๋ก ์ด๋ํ๊ธธ ๋ฐ๋ผ๊ณ ,
์ผ์๋งต ์์์ ๋ฐฉํฅ์ ์ด์ง๋ง ํ์ด๋ ์ผ์๋งต ๋ด์์๋ ์ด์ง ํ์ ๋ฐฉํฅ์ผ๋ก ์ต๋์๋*2๋ก ์ด๋ํ๊ณ ์ ํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ํ์ฌ ๋จธ๋ฆฌ์์ผ๋ก ์ด๋ ๊ตฌํ์ ์ด๋ป๊ฒ ํด์ผํ ์ง ์ดํด๊ฐ ๊ฐ์ง์์ต๋๋ค.
ย
ํ์ฌ ๋งต ์ํ์ ๋๋ค.
์ผ์๊ธธ์ ํ์ผ๋งต์ผ๋ก ๋ง๋ค์๊ณ , Material2D๋ฅผ ์ด์ฉํด Friction ๋ง์ฐฐ๋ ฅ์ 0์ผ๋ก ๋ง๋ค์์ต๋๋ค.
Composite Collider 2D์ Is Trigger๋ฅผ ์ฒดํฌํด์ ํ๋ ์ด์ด์ ์ถฉ๋๊ฐ์ง๊ฐ ์ ์์ ์ผ๋ก ์ด๋ค์ง๊ณ ์์์ ์ฒดํฌํ๊ณ ,
Geometry Type์ Polygons๋ก ํ์ฌ ๋นํ๊ธธ ๋ด๋ถ๋ ์ฝ๋ผ์ด๋๋ฅผ ๊ฐ๋ ์ฑ์๋์ ์บ๋ฆญํฐ๊ฐ ์์ผ๋ก ๋ค์ด๊ฐ๋ ๊ณ์ํด์ ์ถฉ๋์ด ๊ฐ์ง๋ฉ๋๋ค.
OnTriggerEnter2D๋ก ์ผ์๋งต์ ๋ค์ด์ค๋ฉดย ย isSliding = true;๋ก ํ์ฌ ๋ฏธ๋๋ฌ์ง๊ณ ์๋ ์ํ์์ ๋ํ๋ด๋ ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์๊ณ ,
OnTriggerExit2D๋ก ์ผ์๋งต์์ ๋๊ฐ๋ฉดย ย isSliding = false;๋ก ๋๋ ๋ฏธ๋๋ฌ์ง์ง ์๊ณ ์๋ ์ํ์์ ๋ํ๋ด๋ ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
ํ์ฌ ์บ๋ฆญํฐ ์ํ์ ๋๋ค.
ย ย private void Update()
ย ย {
ย // ์ํ์ข์ฐ ํค๋ณด๋ ๊ฐ ์ ๋ ฅ๋ฐ์
ย ย ย ย h = Input.GetAxisRaw("Horizontal");
ย ย ย ย v = Input.GetAxisRaw("Vertical");
ย ย ย ย //stop speedย ย addForce๋ก ์ด๋ํ๊ธฐ ๋๋ฌธ์ ํค๋ณด๋์์ ์์ ๋ผ๋ ํผ์ ๋๋ฆฌ๊ฒ ์ด๋ํ๋๊ฒ์ ๋ง์
ย ย ย ย if (Input.GetButtonUp("Horizontal"))
ย ย ย ย {
ย ย ย ย ย ย rb.velocity = new Vector2(rb.velocity.normalized.x * 0, rb.velocity.y);
ย ย ย ย }
ย ย ย ย //stop speedย ย addForce๋ก ์ด๋ํ๊ธฐ ๋๋ฌธ์ ํค๋ณด๋์์ ์์ ๋ผ๋ ํผ์ ๋๋ฆฌ๊ฒ ์ด๋ํ๋๊ฒ์ ๋ง์
ย ย ย ย if (Input.GetButtonUp("Vertical"))
ย ย ย ย {
ย ย ย ย ย ย rb.velocity = new Vector2(rb.velocity.x, rb.velocity.normalized.y * 0);
ย ย ย ย }
ย ย ย ย Debug.Log("x์๋ : " + rb.velocity.x + "y์๋ : " + rb.velocity.y + "์ฌ๋ผ์ด๋ฉ ์ฌ๋ถ : " + isSliding);
ย ย }
ย ย ย
ย ย void FixedUpdate()
ย ย {
ย // ์ํ์ข์ฐ ์ด๋
ย ย ย ย rb.AddForce(Vector2.right * h, ForceMode2D.Impulse);
ย ย ย ย rb.AddForce(Vector2.up * v, ForceMode2D.Impulse);
ย // ์ต๋์๋ ์ ํ
ย ย ย ย if (rb.velocity.x > maxSpeed) // right max speed
ย ย ย ย {
ย ย ย ย ย ย rb.velocity = new Vector2(maxSpeed, rb.velocity.y);
ย ย ย ย }
ย ย ย ย else if (rb.velocity.x < maxSpeed * (-1))// left max speed
ย ย ย ย {
ย ย ย ย ย ย rb.velocity = new Vector2(maxSpeed * (-1), rb.velocity.y);
ย ย ย ย }
ย ย // ์ต๋์๋ ์ ํ
ย ย ย ย if (rb.velocity.y > maxSpeed) // right max speed
ย ย ย ย {
ย ย ย ย ย ย rb.velocity = new Vector2(rb.velocity.x, maxSpeed);
ย ย ย ย }
ย ย ย ย else if (rb.velocity.y < maxSpeed * (-1))// left max speed
ย ย ย ย {
ย ย ย ย ย ย rb.velocity = new Vector2(rb.velocity.x, maxSpeed * (-1));
ย ย ย ย }
ย ย }
์ํ์ ์ง์์ด ์ฝํ๊ณ , ์ด๋์ ๋ํ ์ ํํ ์ดํด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ ์ํ์์ ์ฝ๋๋ฅผ ์ธํฐ๋ท์์ ์ฐพ์์ ๊ตฌํํ๋ค๋ณด๋
ํ์คํ ๋ด๊ฐ ์ํ๋๋๋ก ๊ตฌํ์ด ํ๋ ๊ฒ๊ฐ์ต๋๋ค.
ํน์ ์ด๋ค๋ฐฉ์์ผ๋ก ํด์ผํ๋์ง ์๋ ค์ฃผ์ค์ ์์ผ์ค๊น์?
ํด๋น ๋งํฌ์ ๋๊ธ๋ค ๋ณด์๋ฉด ์๋ฆฌ์ ์ธ ๋ถ๋ถ ํ์ ํ๋๋ฐ ๋์์ด ๋์ค๋ฏ์~
https://discussions.unity.com/t/icy-slippery-floor/40434