๊ฒ์ ํ๋ค๊ฐ ํ ๋ฒ์ฉ์ ๊ทธ๋๋ ๊น์ง(?)๋๋๋งํ ๊ณตํฌ ์ด๋ฒคํธ๋ฅผ ์ ๋ฒ ์๊ฐ์ ๋ง๋ค์๋ค. ์ด๋ฒ์๋ ์ (๋ฌด๋น)์ ์ง ํ์ ๋ฐ์์ ์จ๊ธฐ ๋ฒํผ('Fํค')๋ฅผ ๋๋ ์ ๋, ์จ๋๋ก ํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค์ด์ผ ํ๋ค.
1. ์์ํ์๋ง์ ๋ฒ๊ทธ ๋ง์ฃผ์น๊ธฐ
ํ์ ๋ถ๋ถ์ด ๋ ์ด์ด๊ฐ ๋๋์ด์ ธ ์์ง ์์์, ์ ๋ํฐ์์ ์ค๋ธ์ ํธ๋ก ์กด์ฌํ์ง ์๋ ์ํฉ์ด๋ค. ๊ทธ๋์ ๋ฐํ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํ ๋น ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ณ , ์ฝ๋ผ์ด๋๋ฅผ ๋ถ์ฐฉํด์คฌ๋ค.
๊ทธ๋ฆฌ๊ณ ํ ์คํธ๋ฅผ ์ํด, ์บ๋ฆญํฐ๋ฅผ ์กฐ์ํ์ฌ ๋ฌ๋ฆฌ๋ฉด์ ์ ํํ์ฌ ํ์ ์๋ก ์ฌ๋ผ๊ฐ๊ฒ ํ๋ คํ๋ค. ๊ทผ๋ฐ ๋ง์ฝ ์ ํ ์ค๊ฐ์ ํ์ ์ธก๋ฉด ์ฝ๋ผ์ด๋ ๋ถ๋ถ์ ๋ฟ์ด๊ฒ ๋๋ฉด ์๋์ ๊ฐ์ด ๋ ๊ฒ์ฒ๋ผ ๋๋ค.
์ ์์ ์ธ ์ํฉ์ด๋ผ๋ฉด, ์์ ๊ฐ์ด ๋ผ์๋ค๋ฉด ๋ฐฉํฅ ์กฐ์์ด ์๋ค ํ๋๋ผ๋ ์ค๋ ฅ์ ์ํด ์์ฐ์ค๋ฝ๊ฒ ์๋๋ก ๋ฏธ๋๋ฌ์ ธ ๋ด๋ ค์์ผ ํ๋ค. ๋ญ๊ฐ ๋ฌธ์ ์ผ์ง ์ฌ๋ฌ๊ฐ์ง ์๊ฐ์ ํด๋ดค๋ค.
- Rigidbody 2D์ velocity๋ฅผ ํตํด ์ด๋์ ์ ์ดํ๋๋ฐ, ํ์ ์ธก๋ฉด์ ๋งํ๋ ์๋ ๊ฐ์ด 0์ผ๋ก ๋๋ค.
- ๋ฌผ๋ก position์ ์ด๋ํ๋ ๋ฐฉ๋ฒ์ ํํ์ด๋ ๋ฌผ๋ฆฌ ์ฐ์ฐ์ ์ํด ๋ฐ๋ ค๋๊ธด ํ ๊ฑฐ๋ค.
- ์ด ๋ถ๋ถ์ ์๊ด ์๋ ๊ฒ ๊ฐ๋ค.
- ์ ํ ์ค์๋ ์ด๋ ํค ์
๋ ฅ๊ณผ ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ ์ ํ์ ํ์ง ๋ชปํ๋๋ก ๋ง์๋จ๊ธฐ ๋๋ฌธ์ด๋ค.
- ๊ธฐ๋ฅ์ ์์ ํ๊ณ ํ ์คํธํด๋ดค์ง๋ง, ๊ทผ๋ณธ์ ์ผ๋ก ํด๊ฒฐํ์ง๋ ๋ชปํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๋ฒ๊ทธ์ ์์ ์ ๋นผ์๊ฒจ์, ๋ฏธ์ฒ ์๊ฐ์น ๋ชปํ๋ ๋ถ๋ถ๋ ์์๋๋ฐ ํ์ ๋ฐ์ ์จ์ ์ ์์ด์ผ ํ๋, ๋น์ฐํ ํ์ ๋ฐ์ ์บ๋ฆญํฐ๊ฐ ์ง๋๋ค๋๋ฉฐ ์๋ค๊ฐ๋ค ํ ์ ์์ด์ผ ํ๋ค. ๋ด ์์ ์ง์์ ๋จธ๋ฆฌ๋ก๋ ๋์ ํ ๋ชจ๋ฅด๊ฒ ์ด์ ์ง๋ฌธํ๊ณ ๊ตฌ๊ธ๋ง์ ํด๋ดค๋ค. ๋ฌธ์ ๋ ํ์ ์ธก๋ฉด์ ๋ง์ฐฐ๋ ฅ ๋๋ฌธ์ด์๋ค. ํ์์ ๋ถ์ฌ๋์ ์ฝ๋ผ์ด๋์ ์ธก๋ฉด ๋ถ๋ถ์๋ ๋ง์ฐฐ๋ ฅ์ด ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ์บ๋ฆญํฐ๊ฐ ๋ฐํ์ ๋ฏธ๋๋ฌ์ ธ ๋ด๋ ค์ค์ง ๋ชปํ ๊ฒ์ด์๋ค.
๋ํ, ๊ตฌ๊ธ๋งํ๋ฉด์ ์์ ํด๊ฒฐํด์ผํ ๋ ๋ฌธ์ ๋ฅผ ํ ๋ฒ์ ํด๊ฒฐํ ์ ์๋ ๊ฒ๋ ์์๋๋ค. ๋ฐ๋ก, Platform Effector 2D ์ปดํฌ๋ํธ์๋ค. ์ด๊ฑธ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด์!
2. Platform Effector 2D ์ ์ฉํ๊ธฐ
๊ฐ๋จํ๊ฒ ์ด ์ปดํฌ๋ํธ๊ฐ ์ด๋ค ๊ธฐ๋ฅ์ ์ํํด์ฃผ๋์ง ์ค๋ช ํ์๋ฉด, ์ฝ๋ผ์ด๋์ ์ผ๋ฐฉํฅ ์ถฉ๋ ์ฒ๋ฆฌ์ ์ธก๋ฉด ๋ง์ฐฐ ๋ฐ ๋ฐ๋ฐ๋ ฅ ์ค์ ์ ํ ์ ์๋ ๋ ์์ด๋ค. ์๋ฌดํผ ํ์์ ์ด ์ปดํฌ๋ํธ๋ฅผ ๋ถ์ฐฉํด์คฌ๋ค.
์ฝ๋ผ์ด๋๊ฐ ์ด ํ๋ซํผ ์ดํํฐ์ ์ํฅ์ ๋ฐ๋๋ก, ์ฝ๋ผ์ด๋์ Used By Effector ์ต์ ์ ํ์ฑํ ํด์ค์ผ ํ๋ค. ํ์ ์์์๋ ์ถฉ๋ ์ฒ๋ฆฌ๊ฐ ๋๊ณ , ์๋์์๋ ์ถฉ๋ ์ฒ๋ฆฌ๊ฐ ๋์ง ์๋๋ก ํด์ผ ํ๋ค. ์ด๋ ๊ฒ ํด์ผ, ํ์ ๋ฐ์ ์บ๋ฆญํฐ๊ฐ ๋์๋ค๋ ์ ์๊ณ ๋ฐ์์ ์ ํํ์ฌ ํ์ ์๋ก ์ฌ๋ผ๊ฐ ์๋ ์๋ค.
๊ทธ๋ฌ๋, ํ๋ซํผ ์ดํํฐ์ Use One Way ์ต์ ์ ํ์ฑํ ํด์คฌ๋ค. ์ฃผ์ธ๊ณต ์บ๋ฆญํฐ์ ์ฝ๋ผ์ด๋๊ฐ ํ๋ ๋ฐ์ ์์ผ๋ฏ๋ก Use One Way Grouping์ ๋นํ์ฑํํ๋ค.
Surface Arc์ 160๋ ์ ๋๋ก ์คฌ๋ค. ์ด ๊ฐ๋๋ฅผ ๋ฒ์ด๋ ๊ณณ์์ ๋ค์ด์ค๋ ๊ฑด ์ถฉ๋ ์ฒ๋ฆฌํ์ง ์๋๋ค. ๊ธฐ๋ณธ๊ฐ์ด 180๋์ธ๋ฐ, ์ด๋ฌ๋ฉด ํ์์ ์ธก๋ฉด๊น์ง ๋งํ๋ ์กฐ๊ธ ๊ฐ๋๋ฅผ ์๊ฒ ์ค ๊ฒ์ด๋ค.
๋ง์ง๋ง์ผ๋ก ์ธก๋ฉด์์ ๋ฏธ๋๋ฌ์ง์ง ๋ชปํ๋ ๋ฒ๊ทธ๋ฅผ ์์ ํด์ค์ผ ํ๋ค. ํ๋ซํผ ์ดํํฐ์ Use Side Friction ์ต์ ์ ๋นํ์ฑํ ํด์คฌ๋ค. ์ด๋ก์จ, ๊ณจ๋จธ๋ฆฌ๋ฅผ ์ํ๊ฒ ํ๋ ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
ํ ์คํธ ์์์ ์ฐ์ผ๋ฉด์ ๋ ๋ค๋ฅธ ๋ฒ๊ทธ๋ฅผ ํ๋ ๋ฐ๊ฒฌํ์ง๋ง, ์ด๊ฑด ์๊ฐ์ด ๋จ์ผ๋ฉด ์์ ํด์ผ๊ฒ ๋ค. ์ฌ์ค ๋ฒ๊ทธ๋ผ๊ธฐ ๋ณด๋จ, ์ ์ ์ ์คํฌ๋ก๋ ์ธ์ ํด์ค ์๋ ์๋ ์์ญ์ด๊ธด ํ๋ค.
3. ํ์ ๋ฐ์ ์จ๊ธฐ ๊ตฌํํ๊ธฐ
ํ์ ์ ๋ถ๋ถ ์ฝ๋ผ์ด๋๋ ๋ง ๊ทธ๋๋ก ๋ฐํ ์ญํ ์ ์ํํ๋ ์ค๋ธ์ ํธ์ด๊ธฐ ๋๋ฌธ์, ์บ๋ฆญํฐ๊ฐ ์จ์ ์ ์๋ ์์ญ์ ๋ค์ด์๋์ง๋ฅผ ํ์งํ๋ ๊ฒ ๋ํ ํ์ํ๋ค. ์ ๋น ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ณ , is Trigger๋ฅผ ํ์ฑํํ ์ฝ๋ผ์ด๋๋ฅผ ํ๋ ๋ถ์ฐฉํด์ ๋ฐฐ์นํด์คฌ๋ค.
๊ทธ๋ฆฌ๊ณ ๋, ์๋ก์ด ๋น ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค์ด์ ์คํ๋ผ์ดํธ ๋ ๋๋ฌ(Sprite Renderer) ์ปดํฌ๋ํธ๋ฅผ ๋ฌ์์คฌ๋ค. ์จ์ด์๋ ๋ชจ์ต์ ์คํ๋ผ์ดํธ๋ฅผ ๋ฃ์ด์คฌ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์ค๋ธ์ ํธ๋ ๋นํ์ฑํ ํด๋๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๋ฒ์ ๋ง๋ค์๋ ์ํธ์์ฉ ๊ฐ๋ฅํ ์ค๋ธ์ ํธ์ ๋ถ์ผ "InteractiveObject" ์คํฌ๋ฆฝํธ๋ฅผ ๋ถ์ฌ์คฌ๋ค. "IsDynamicHiddenSpace"๋ ํญ๋ชฉ๋ ์๋กญ๊ฒ ์ถ๊ฐ๋ ๊ฑธ ๋ณผ ์ ์๋๋ฐ, ์ด๋ฐ๊ฐ ์ค๋ช ํ๋๋ก ํ๊ฒ ๋ค. ์จ์ ์ ์๋ ์ค๋ธ์ ํธ์ด๋ฏ๋ก, ObjectType์ "eCanHideObject"๋ก ์ค์ ํด์คฌ๋ค.
๊ทธ๋ฆฌ๊ณ , "InteractiveObject" ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ๊ฐ ์์ ํด์คฌ๋ค. ์จ์ ๋ชจ์ต์ ์คํ๋ผ์ดํธ ์ด๋ฏธ์ง๋ฅผ ๋ด๊ณ ์์ ๋ณ์์ ์บ๋ฆญํฐ๊ฐ ์๋ ๊ทธ ์์น์์ ์จ์ ๋ชจ์ต์ ๋ณด์ด๊ฒ ํ ๊ฑด์ง์ ๋ํ "IsDynamicHiddenSpace" bool ๋ณ์๋ฅผ ์ถ๊ฐํด์คฌ๋ค.
InteractiveObject ์คํฌ๋ฆฝํธ
public SpriteRenderer hidingSprite; // ์ถ๊ฐ
public bool isDynamicHiddenSpace; // ์ถ๊ฐ
public ObjectType objectType;
private SujiController suji;
private string objectTag;
...
public void Interaction()
{
...
if (objectType == ObjectType.eCanHideObject)
{
suji.Hide(hidingSprite, isDynamicHiddenSpace); // ๋งค๊ฐ๋ณ์ ์ถ๊ฐ
}
}
SujiController ์คํฌ๋ฆฝํธ
์จ์ ์ด๋ฏธ์ง๊ฐ ๋ด๊ธด ๋ณ์์ ์ ์ ๊ณต๊ฐ์ธ์ง ๋์ ๊ณต๊ฐ์ธ์ง์ ๋ํ ์ ๋ณด๋ฅผ Hide() ํจ์์ ๋งค๊ฐ๋ณ์์์ ๋ฐ์๋ค.
public void Hide(SpriteRenderer hidingSprite, bool isDynamicHiddenSpace)
{
if (isJumping)
return;
if (!isHiding)
{
isHiding = true;
ControlEnableMyBody(false);
}
else
{
isHiding = false;
ControlEnableMyBody(true);
}
OnOffHiddenSpritePlayer(hidingSprite, isDynamicHiddenSpace); // ์ถ๊ฐ
}
private void OnOffHiddenSpritePlayer(SpriteRenderer hidingSprite, bool isDynamicHiddenSpace)
{
if (isDynamicHiddenSpace)
{
hidingSprite.transform.position = new Vector3(this.transform.position.x,
hidingSprite.transform.position.y,
this.transform.position.z);
}
hidingSprite.gameObject.SetActive(IsHiding);
}
OnOffHiddenSpritePlayer()๋ ํจ์๋ฅผ ์๋ก ๋ง๋ค์ด์ ์ฌ์ฉํด์คฌ๋ค. ์ด๋ ๊ฒ ํ๋ฉด, ๊ฐ๋จํ๊ฒ ์จ๋ ๊ฒ์ ๋ง๋ค ์ ์๋ค.
์์ฑ ๋ฐ ํ๊ธฐ
์ด๊ธฐ ๊ณํ์๋ ์จ๋ ์ ๋๋ฉ์ด์ ๋์๊น์ง ๋ฃ์ด์ ๊ตฌํํ ์๊ฐ์ด์๋๋ฐ, ๊ทธ๊ฒ๊น์ง๋ ๋น ๋ฏํ ๋ฏ ํด๋ณด์๋ค. ๊ทธ๋์ ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์จ๋ ๊ฒ์ ๊ตฌํํ๋ค.
์ ์ ๊ตฌํํ๋ ๊ฒ ํ๋ ๋์ฉ ๋ง์ด ์๊ธฐ๋ค๋ณด๋, ์ด์ ๋ฒ๊ทธ๊ฐ ์์ฃผ ์ถ๋ชฐํ๋ ๊ฒ ๊ฐ๋ค. ๊ฒ์์ ํญ์ ๋ฒ๊ทธ๊ฐ ๋์ค๋๊ตฌ๋...๋ผ๋ ์๊ฐ์ด ๋ค์๊ณ , ๊ทธ๊ฑธ ํด๊ฒฐํ๋ ๊ณผ์ ์์ ๋ ํ๋ ๋ฐฐ์ฐ๊ฒ ๋ ๊ฒ ๊ฐ๋ค.
๋ค์์๋ ๋ฌด๋น ์ง๊ณผ ์ฌ๋น๋ฌธ์ด ์ด๋ฆฌ๋ ๋ชจ์ , ์ผ์ง์๋ ํ ๋ฒ๋ ๋์ค์ง ์์์ง๋ง ์ด์ ์ (๊ฒฝ๊ด, ๋ฌด๋น)๋ ๋ํ๋ ์์ ์ด๋ค. ๋จผ์ ๋ฌด๋น ์ง๊น์ง ๊ฐ๋ ๊ธธ๋ชฉ์์ ํ๋ ์ด์ด๋ฅผ ๋ฐฉํดํ ๊ฒฝ๊ด์ ์ ๋ณผ ์๊ฐ์ด๋ค.