
๐ ๋ฌธ์ ์ํฉ
Unity6 ์์ง์ ์ฌ์ฉํด๋ณด๊ณ ์ ๊ฐ๋จํ 3D ๊ฒ์์ ๋ง๋ค์ด๋ณด๋ ค๊ณ ํ๋ค. 2D ์์ ์ Aseprite๋ก ์ง์ ๋ํธ๋ฅผ ์ฐ์ด ๊ฐ๋จํ๊ฒ ๋ง๋ค ์ ์์์ง๋ง, 3D Asset์ ์ง์ ๋ง๋๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค. ๊ทธ๋์ Asset Store์์ "FREE Low Poly Human - RPG Character" Asset๊ณผ "Low-Poly Simple Nature Pack" Asset์ ๋ค์ด ๋ฐ์๋ค.
[ ์์ ์ ๋ณด ]
[ FREE Low Poly Human - RPG Character ]
[ Low-Poly Simple Nature Pack ]
https://assetstore.unity.com/packages/3d/environments/landscapes/low-poly-simple-nature-pack-162153

๊ทธ๋ฌ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. "FREE Low Poly Human - RPG Character" Asset์ Human Prefab ์ธ์๋ ๋ค์ํ Animation๊น์ง ์ ๊ณต์ ํด์คฌ๋๋ฐ, ์๋ค๋ก ๋ฌ๋ฆฌ๋ Animation์ ์ ์์ ์ผ๋ก ์ ์ฉ์ด ๋์์ผ๋, ์ข์ฐ๋ก ๋ฌ๋ฆฌ๋ Animation์ ๋ฐ๋๋ก ์ ์ฉ๋๋ค๋ ๊ฒ์ด๋ค. ์ฆ, D ํค๋ฅผ ๋๋ ์ ๋ RunRight Animation Clip์ด ์คํ๋๋๋ก ํ๋๋ฐ ์ผ์ชฝ์ผ๋ก ๋ฐ๋ ๋ชจ์ ์ด, A ํค๋ฅผ ๋๋ ์ ๋ RunLeft Animation Clip์ด ์คํ๋๋๋ก ํ๋๋ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ฐ๋ ๋ชจ์ ์ด ์ ์ฉ๋๋ค๋ ๊ฒ์ด๋ค.
ํด๋น Asset ๋ฆฌ๋ทฐ๋ฅผ ๋ด๋ ๋๋ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฒช๋ ์ฌ๋์ ์์๊ณ , ๊ตฌ๊ธ์ 'Unity Animation ๋ฐฉํฅ ๋ฌธ์ '๋ก ๊ฒ์ํด๋ด๋ ๋ฑํ ๋์์ด ๋ ๋งํ ์ ๋ณด๋ ์์๋ค. ์ฌ์ง์ด GPT๊ฐ ๋์ ธ์ค ํด๊ฒฐ ๋ฐฉ์๋ ์ ๋ถ ์๋ํด๋ดค์ง๋ง, ๊ฒฐ๊ตญ ๊ณ ์น์ง ๋ชปํ๋ค. ๋๋์ฒด Animation Clip ์์ฒด์ ๋ฌธ์ ๊ฐ ์๋ ๊ฑด์ง, ์๋ ์ขํ๊ณ๋ ๋ก์ปฌ ์ขํ๊ณ ์ถฉ๋ ๋๋ฌธ์ธ์ง, ์๋๋ฉด ๊ทธ๋ฅ ๋ด ์ฝ๋๊ฐ ๋ฌธ์ ์ธ ๊ฑด์ง ์ ํ ๊ฐ์ด ์กํ์ง ์์๋ค. ๊ทธ๋์ ๊ทธ๋ฅ ์ด๊ฒ์ ๊ฒ ๋๋ฌ๋ณด๋ค๊ฐ ๊ฒฐ๊ตญ ๊ณ ์น ๋ฐฉ๋ฒ์ ๊ณต์ ํ๋ ค ํ๋ค. (์ฆ, 100% ๋ช ํํ ํด๊ฒฐ์ฑ ์ ์๋ ๐ ) ํน์ ์ด ์ค๋ฅ์ ์ ํํ ์์ธ์ ์์๋ ๋ถ์ด ๊ณ์๋ค๋ฉด ๊ผญ ๋๊ธ๋ก ์๋ ค์ฃผ์ธ์. ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค! (๊ธ๋ก ๋ณด๋ฉด ๊ธ๋ฐฉ ํด๊ฒฐํ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ์ง๋ง, ์ด ์ค๋ฅ ๊ณ ์น๋ ๋ฐ๋ง 2์ผ ๊ฑธ๋ฆผ ใ )
[ ๊ธฐ์กด PlayerController Script ]
using UnityEngine;
public class PlayerController : MonoBehaviour
{
Rigidbody _rigid;
Animator _anim;
public float _speed = 3f;
void Awake()
{
_rigid = GetComponent<Rigidbody>();
_anim = GetComponent<Animator>();
}
void FixedUpdate()
{
if (Input.GetKey(KeyCode.W)) // ์์ผ๋ก ์ด๋
MoveCharacter(Vector3.forward, "RunForward");
else if (Input.GetKey(KeyCode.S)) // ๋ค๋ก ์ด๋
MoveCharacter(Vector3.back, "RunBackward");
else if (Input.GetKey(KeyCode.D)) // ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
MoveCharacter(Vector3.right, "RunRight");
else if (Input.GetKey(KeyCode.A)) // ์ผ์ชฝ์ผ๋ก ์ด๋
MoveCharacter(Vector3.left, "RunLeft");
else
_anim.Play("Idle");
}
void MoveCharacter(Vector3 dir, string animName) {
_anim.Play(animName);
_rigid.MovePosition(_rigid.position + dir * _speed * Time.deltaTime);
}
}
[ ์คํ ํ๊ฒฝ ]
โ Unity ๋ฒ์ : Unity 6 (6000.0.38f1)
โ ํ๋ซํผ ๋น๋ : Windows
โ ์ด์์ฒด์ : Windows 10 Education (๋ฒ์ : 22H2)
โ CPU : AMD Ryzen 5 5600 6-Core Processor 3.50 GHz
โ GPU : NVIDIA GeForce RTX 3050
โ RAM : 16.0GB
๐ ํด๊ฒฐ ๋ฐฉ๋ฒ #1 (Animation Clip Property ์ค์ )
๋ณธ๊ฒฉ์ ์ผ๋ก ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ธฐ ์ ์, Animation ํญ์ Animation Clip Property ๊ธฐ๋ฅ์ ๋ํด ์ดํด๋ณด๊ณ ์ ํ๋ค.
Animation Clip Property (๋ฐ๋ณต ์ฌ์ ๋ฐ ํฌ์ฆ ์ ์ด)
1๏ธโฃ Loop Time
~> ์ ๋๋ฉ์ด์ ํด๋ฆฝ์ ๋๊น์ง ์ฌ์ํ๊ณ , ๋์ ๋๋ฌํ๋ฉด ๋ค์ ์ฌ์์ ์์
~> Loop Pose : ๋ชจ์ ์ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ๋ณต
~> Cycle Offset : ์ ๋๋งค์ด์ ์ด ๋ค๋ฅธ ์๊ฐ์ ์์ํ๋ ๊ฒฝ์ฐ์ ์ค์
2๏ธโฃ Root Transform Rotation
~> Bake into Pose : ๋ฃจํธ ํ์ ์ ๋ผ๋์ ์์ง์์ ๋ฒ ์ดํฌ
~> Based Upon : ๊ธฐ๋ณธ ๋ฃจํธ ํ์
โข Original : ์์ค ํ์ผ์ ์๋ ํ์ ์ ์ ์ง
โข Root Node Rotation : ๋ฃจํธ ๋ ธ๋์ ํ์ ์ ์ฌ์ฉ (Generic Animation Type์๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
โข Body Orientation : ์์ฒด๋ฅผ ์์ผ๋ก ํฅํ๊ฒ ํจ (Humanoid Animation Type์๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
~> Offset : ๋ฃจํธ ํ์ ์ ๋ํ ์คํ์ (๊ฐ๋)
3๏ธโฃ Root Transform Position (Y)
~> Bake into Pose : ์์ง ๋ฃจํธ ๋ชจ์ ์ ๋ผ๋์ ์์ง์์ ๋ฒ ์ดํฌ (๋ฃจํธ ๋ชจ์ ์ผ๋ก ์ ์ฅํ๋ ค๋ฉด ๋นํ์ฑํ)
~> Based Upon (at Start) : ๊ธฐ๋ณธ ์์ง ๋ฃจํธ ํฌ์ง์
โข Original : ์์ค ํ์ผ์ ์์ง ํฌ์ง์ ์ ์ ์ง
โข Root Node Position : ์์ง ๋ฃจํธ ํฌ์ง์ ์ ์ฌ์ฉ (Generic Animation Type์๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
โข Center of Mass : ์ง๋ ์ค์ฌ์ ๋ฃจํธ ํธ๋์คํผ ํฌ์ง์ ๊ณผ ๋ง์ถค (Humanoid Animation Type์๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
โข Feet : ๋ฐ์ ๋ฃจํธ ํธ๋์คํผ ํฌ์ง์ ๊ณผ ๋ง์ถค (Humanoid Animation Type์๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
~> Offset : ์์ง ๋ฃจํธ ํฌ์ง์ ์ ๋ํ ์คํ์
4๏ธโฃ Root Transform Position (XZ)
~> Bake into Pose : ์ํ ๋ฃจํธ ๋ชจ์ ์ ๋ผ๋์ ์์ง์์ ๋ฒ ์ดํฌ (๋ฃจํธ ๋ชจ์ ์ผ๋ก ์ ์ฅํ๋ ค๋ฉด ๋นํ์ฑํ)
~> Based Upon : ๊ธฐ๋ณธ ์ํ ๋ฃจํธ ํฌ์ง์
โข Original : ์์ค ํ์ผ์ ์ํ ํฌ์ง์ ์ ์ ์ง
โข Root Node Position : ์ํ ๋ฃจํธ ํธ๋์คํผ ํฌ์ง์ ์ ์ฌ์ฉ (Generic Animation Type์๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
โข Center of Mass : ๋ฃจํธ ํธ๋์คํผ ํฌ์ง์ ๊ณผ ๋ง์ถค (Humanoid Animation Type์๋ง ์ฌ์ฉ ๊ฐ๋ฅ)
~> Offset : ์ํ ๋ฃจํธ ํฌ์ง์ ์ ์คํ์
5๏ธโฃ Mirror
~> ์ด Clip์ ์ข์ฐ๋ฅผ ๋ฐ์ (Animation Type์ด Humanoid๋ก ์ค์ ๋ ๊ฒฝ์ฐ์๋ง ํ์)
6๏ธโฃ Additive Reference Pose
~> ํ์ฑํํ๋ ค๋ฉด Additive Animation Layer์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ Reference Pose์ Frame์ ์ค์
~> Pose Frame : Reference Pose๋ก ์ฌ์ฉํ Frame ์๋ฅผ ์ ๋ ฅ (ํ์๋ผ์ธ์ ํ๋์ ๋ง์ปค๋ฅผ ๋๋๊ทธํ์ฌ ์ด ๊ฐ์ ์ ๋ฐ์ดํธํ๋ ๊ฒ๋ ๊ฐ๋ฅ)
์.. ์ ๋ด์ฉ์ Unity ๊ณต์ ๋ฌธ์์ ์ค๋ช ์ ๊ทธ๋๋ก ๊ฐ์ ธ์จ ๊ฑด๋ฐ ์์งํ ๋งํ์๋ฉด ๋ฌด์จ ์๋ฆฌ์ธ์ง ํ๋๋ ์ดํด๊ฐ ์๋๋ค. ๊ทธ๋์ ์ฝ๊ฒ ์ค๋ช ์ ํ์๋ฉด, "Bake into Pose" = "์ง๊ธ ์ด ํฌ์ฆ ๊ทธ๋๋ก ๊ตฝ๊ฒ ๋ค" = "๊ฒ์ ์ค๋ธ์ ํธ๊ฐ ์ ๋๋งค์ด์ ์ ์ํฅ์ ๋ฐ์ง ์๋๋ก ํ๊ฒ ๋ค"๋ก ์ค๋ช ํ ์ ์๋ค. ์ฆ, Rotation, Position (Y), Position (XZ)์ "์ด๋๋ฅผ" ๊ตณํ์ง ๊ฒฐ์ ํ๋ ๊ฒ์ผ๋ก, ์ ๋๋งค์ด์ ์ ์ํด ๊ฒ์ ์ค๋ธ์ ํธ๊ฐ ํ์ ํ ์ง, ์์๋๋ก ์์ง์ผ์ง(Y), ์๋ค์ข์ฐ(XZ)๋ก ์ด๋ํ ์ง๋ฅผ ๋ฐ๋ก ์ค์ ํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ "Based Upon" = "~๊ธฐ๋ฐ์ผ๋ก" = "์ด๋๋ฅผ ๊ธฐ์ค์ผ๋ก"์ด๋ฉฐ, "Offset" = "์๋์ผ๋ก ๊ฐ ์กฐ์ "์ผ๋ก ์ค๋ช ํ ์ ์๋ค.


์ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ .anim ํ์ผ์ด ํฌํจ๋ FBX ํ์ผ์ ์ ํํ ํ, Inspector ์ฐฝ์์ Animation ํญ์ผ๋ก ์ด๋ํ๋ค.
๊ทธ ๋ค์, Clips ์น์ ์์ ์ค์ ํ๊ณ ์ ํ๋ .anim ํ์ผ์ ์ ํํ ๋ค, Root Transform Rotation ํญ๋ชฉ์ Offset ๊ฐ์ ์ ์ ํ๊ฒ ์์ ํ๋ค.


๋ณธ์ธ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ Animation Clip์ 'RunLeft'์ 'RunRight'์ด๋ฏ๋ก, ๋ .anim ํ์ผ์ Offset์ ๋ชจ๋ ์์ ํด์คฌ๋ค.
Unity์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ์ ์ขํ๊ณ(X์ถ์ ์์ ๋ฐฉํฅ์ ์ค๋ฅธ์ชฝ, Y์ถ์ ์์ ๋ฐฉํฅ์ ์์ชฝ, Z์ถ์ ์์ ๋ฐฉํฅ์ ์์ชฝ)๋ฅผ ์ฌ์ฉํ๋ฏ๋ก, RunLeft Animation Clip์ Offset์ 90์ผ๋ก, RunRight Animation Clip์ Offset์ -90์ผ๋ก ์ค์ ํด์คฌ๋ค.
โ ์๋ฌธ์ #1
ํ์ฌ ๋ฐ์ํ ์ค๋ฅ๋ ์ผ์ชฝ ๋ฐฉํฅ์ ํฅํด ๋ฌ๋ฆฌ๋ Animation์ธ RunLeft Animation Clip์ด ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ ํฅํด ๋ฌ๋ฆฌ๋ ๊ฒ๊ณผ, ์ค๋ฅธ์ชฝ ๋ฐฉํฅ์ ํฅํด ๋ฌ๋ฆฌ๋ Animation์ธ RunRight Animation Clip์ด ์ผ์ชฝ ๋ฐฉํฅ์ ํฅํด ๋ฌ๋ฆฌ๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด 'Unity์ ์ผ์ ์ขํ๊ณ์์ X์ถ์ ์์ ๋ฐฉํฅ์ด ์ค๋ฅธ์ชฝ์ด๋ฏ๋ก, RunLeft Animation Clip์ Offset ๊ฐ์ ์์๋ก ์ค์ ํ์ฌ ์ผ์ชฝ์ผ๋ก ํ์ ์ํค๊ณ , RunRight Animation Clip์ Offset ๊ฐ์ ์์๋ก ์ค์ ํ์ฌ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ ์์ผ์ผ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ฐฉํฅ์ผ๋ก ๋ฌ๋ฆฌ์ง ์์๊น?' ์ ๊ฐ์ ์๋ฌธ์ด ๋ค ์ ์๋ค.
์ด์ ๋ํ GPT์ ๋ต๋ณ์ FBX๋ ๋ค๋ฅธ 3D ๋ชจ๋ธ ํ์ผ์ ๊ฐ์ ธ์ฌ ๋, ๋ชจ๋ธ ์์ฒด์ ๋ก์ปฌ ์ขํ๊ณ๊ฐ Unity์ ์ขํ๊ณ์ ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํ๋ค. ์ฆ, Animation์ด ๋ง๋ค์ด์ง ํด์ ์ถ ๊ธฐ์ค๊ณผ Unity์ ์ถ ๊ธฐ์ค์ด ์๋ก ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํ์ ๋ฐฉํฅ์ด ๋ฐ๋๋ก ์ ์ฉ๋ ์ ์๋ค๋ ๊ฒ์ด๋ค. (Blender, Maya, 3ds Max ๋ฑ์ ์ธ๋ถ ํด์ ์ค๋ฅธ์ ์ขํ๊ณ๋ฅผ ์ฌ์ฉ)
โ ์๋ฌธ์ #2
์ ๋ต๋ณ์ ๋ฃ๊ณ ๋ค์ '๊ทธ๋ ๋ค๋ฉด ์ Runforward Animation Clip๊ณผ Runbackward Animation Clip์ ์ ์์ ์ผ๋ก ์๋ํ๊ฑฐ์ง?' ์ ๊ฐ์ ์๋ฌธ์ด ๋ค์๋ค.
์ด์ ๋ํ GPT์ ๋ต๋ณ์ Unity์์ ์ ๋ฐฉํฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก Z์ถ ์์ ๋ฐฉํฅ์ด๊ณ , ๋๋ถ๋ถ์ ๋ชจ๋ธ๋ ์ด ๊ธฐ์ค์ ๋ง์ถฐ ์ ์๋์ง๋ง, ์ข์ฐ ๋ฐฉํฅ(X์ถ ๊ธฐ์ค)์ FBX ๋ชจ๋ธ์ ๋ง๋ ํด๋ง๋ค ์ถ ๊ธฐ์ค์ด ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํ๋ค.
โ ์๋ฌธ์ #3

์ ๋ต๋ณ์ ๋ฃ๊ณ GPT์๊ฒ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ .anim ํ์ผ์ meta ํ์ผ์ ๋ถ์ํด๋ฌ๋ผ๊ณ ํ๋๋, meta ํ์ผ์๋ ์ถ ๊ธฐ์ค ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ง ์์๋ค. ๊ทธ๋์ ์ด๋ฒ์๋ FBX ํ์ผ ์์ฒด๋ฅผ ๋ถ์ํด๋ฌ๋ผ๊ณ ํ๋๋ฐ, RunLeft.fbx ํ์ผ๊ณผ RunRight.fbx ํ์ผ ๋ชจ๋ UpAxis : 1(Y), FrontAxis : 2(Z), CoordAxis : 0(X), CoordAxisSign : 1(์์ ๋ฐฉํฅ)๋ก, ์ ๋ถ Unity ์ถ ๊ธฐ์ค๊ณผ ๋์ผํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ถ ๊ธฐ์ค ์์ฒด์๋ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฑด๋ฐ.. ๋์ฒด ๋ญ๊ฐ ๋ฌธ์ ์ธ ๊ฑธ๊น? Unity Import ์ฒ๋ฆฌ ๋ฐฉ์์ด ๋ฌธ์ ์ธ ๊ฑด๊ฐ? ์๋๋ฉด ๊ทธ๋ฅ ์ง์ง ๋จ์ํ ์ ์์์ ์ค์์ธ ๊ฑธ๊น? ๋๋ฌด ๋ต๋ตํ๋ค...
๋ญ, GPT์ ๋ต๋ณ์ด ํญ์ ์ ๋ต์ธ ๊ฑด ์๋๋๊น 100% ํ์ ํ ์๋ ์๋ค. ๊ทธ๋ ์ง๋ง ์ด ์ค๋ฅ์ ์ ํํ ์์ธ์ ๋๋ ๋ชจ๋ฅด๊ณ , GPT๋ ๋ชจ๋ฅด๋ ๊ฑด ํ์คํ ๊ฒ ๊ฐ๋ค ใ ใ ์ด ์ค๋ฅ์ ๋ํ ํ์คํ ํด๊ฒฐ์ฑ ์ ์์ง ๋ชป ์ฐพ์์ง๋ง, ๊ณ์ ๋ต๋ ์๋ ์ค๋ฅ์ ์๊ฐ์ ๋ญ๋นํ๋ ๊ฒ๋ณด๋ค๋ ์ด ์ฌ์ค์ ๋ธ๋ก๊ทธ์ ํฌ์คํ ํด์ ๋ง์ ์ฌ๋๋ค์ด ์ด ๊ธ์ ๋ณด๊ณ ํจ๊ป ๋จธ๋ฆฌ๋ฅผ ๋ง๋์ ์ ๋ต์ ์ฐพ์๋์ผ๋ฉด ํ๋ค. ์ ๋ ๊ฐ์ ์ค๋ฅ๋ฅผ ๊ฒช์ผ์ ๋ถ์ด ๊ณ์๋ค๋ฉด, ๊ทธ๋ฆฌ๊ณ ์ด ์ค๋ฅ๋ฅผ ํด๊ฒฐํ์ ๋ถ์ด ์๋ค๋ฉด ๊ผญ ์๋ ค์ฃผ์๋ฉด ์ข๊ฒ ๋ค.

์๋ฌดํผ, ์ ์ค์ ์ ํตํด ์ค๋ฅ๊ฐ ์ ์์ ์ผ๋ก ์์ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+ ์ถ๊ฐ ์ง์
FBX(Filmbox) ํ์ผ
~> ์ฃผ๋ก 3D ๋ชจ๋ธ๊ณผ Animation Data๋ฅผ ์ ์ฅํ๋ ํ์ผ ํ์
~> Unity์์ 3D ์บ๋ฆญํฐ ๋ชจ๋ธ, Animation, Mesh, Texture ๋ฑ์ Import ํ ๋ ์์ฃผ ์ฌ์ฉ๋๋ค.
~> FBX ํ์ผ์๋ 3D ๋ชจ๋ธ(Mesh์ Polygon ์ ๋ณด), ๋ผ๋ ๊ตฌ์กฐ(Rigging, Skeleton), Animation Data(์์ง์ ์ ๋ณด), Material ๋ฐ Texture ์ ๋ณด ๋ฑ์ ๋ด์ ์ ์๋ค.
๐ ํด๊ฒฐ ๋ฐฉ๋ฒ #2 (ํ๋์ Animation์ผ๋ก ์บ๋ฆญํฐ ํ์ )
[ ๋ณ๊ฒฝ๋ PlayerController Script #1 ]
using UnityEngine;
public class PlayerController : MonoBehaviour
{
// ...
void FixedUpdate()
{
Vector3 moveDir = GetInputDirection();
if (moveDir != Vector3.zero)
MoveCharacter(moveDir.normalized);
else
_anim.Play("Idle");
}
Vector3 GetInputDirection()
{
Vector3 direction = Vector3.zero;
if (Input.GetKey(KeyCode.W)) // ์์ผ๋ก ์ด๋
direction += Vector3.forward;
if (Input.GetKey(KeyCode.S)) // ๋ค๋ก ์ด๋
direction += Vector3.back;
if (Input.GetKey(KeyCode.D)) // ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
direction += Vector3.right;
if (Input.GetKey(KeyCode.A)) // ์ผ์ชฝ์ผ๋ก ์ด๋
direction += Vector3.left;
return direction;
}
void MoveCharacter(Vector3 dir)
{
// ์บ๋ฆญํฐ ํ์
Quaternion targetRotation = Quaternion.LookRotation(dir);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 10f);
// ์บ๋ฆญํฐ ์ด๋
Vector3 newPosition = _rigid.position + dir * _speed * Time.deltaTime;
_rigid.MovePosition(newPosition);
_anim.Play("RunForward");
}
}
์ด ๋ฐฉ๋ฒ์ ๊ทธ๋ฅ ์์ ํฅํด ๋ฌ๋ฆฌ๋ 'RunForward' Animation Clip๋ง ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค. ์ฆ, ๋ฌธ์ ๊ฐ ๋๋ 'RunRight'์ 'RunLeft' Animation Clip ์์ฒด๋ฅผ ์์ ์ฐ์ง ์๋ ๊ฑฐ๋ค. ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ฐ๋ผ ์บ๋ฆญํฐ๊ฐ ๋ฐ๋ผ๋ณผ ๋ฐฉํฅ์ ๊ณ์ฐํ๊ณ , ๊ทธ ๋ฐฉํฅ์ผ๋ก ์บ๋ฆญํฐ๋ฅผ ํ์ ์ํจ ๋ค์, ๊ทธ๋ฅ 'RunForward' Animation Clip๋ง ์ฌ์์ํค๋ ๋ฐฉ์์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด Animation ๋ฐฉํฅ ๋ฌธ์ ์์ฒด๊ฐ ๋ฐ์ํ ์ผ์ด ์์ผ๋๊น, ์คํ๋ ค ๊น๋ํ๊ฒ ํด๊ฒฐ๋๋ค.

์ ์ค์ ์ ํตํด ์ค๋ฅ๊ฐ ์ ์์ ์ผ๋ก ์์ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๊ทธ๋ฌ๋ ์ด ๋ฐฉ๋ฒ์ ์ฒซ ๋ฒ์งธ๋ ์ธ ๋ฒ์งธ ํด๊ฒฐ ๋ฐฉ๋ฒ๊ณผ๋ ์ด๋ ๋ฐฉ์ ์์ฒด๊ฐ ๋ค๋ฅด๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ค์ ์บ๋ฆญํฐ๊ฐ ํญ์ ์์ ๋ณด๋ฉด์ ์ด๋ํ์ง๋ง, ์ด ๋ฐฉ๋ฒ์ ์ ๋ ฅ ๋ฐฉํฅ์ ๋ฐ๋ผ ํ๋ ์ด์ด ์์ฒด๊ฐ ์ง์ ํ์ ํ๋ฉด์ ์ด๋ํ๋ค. ๊ทธ๋์ ์บ๋ฆญํฐ๊ฐ ์ค์ ๋ก ๋ฐ๋ผ๋ณด๋ ๋ฐฉํฅ๊ณผ ์ด๋ ๋ฐฉํฅ์ด ํญ์ ์ผ์นํ๋ค๋ ํน์ง์ ๊ฐ์ง๋ค.
๐ ํด๊ฒฐ ๋ฐฉ๋ฒ #3 (๋ฐ๋ ๋ฐฉํฅ์ Animation ์ฌ์์ ํตํ ์ฐํ)
[ ๋ณ๊ฒฝ๋ PlayerController Script #2 ]
using UnityEngine;
public class PlayerController : MonoBehaviour
{
// ...
void FixedUpdate()
{
// ...
else if (Input.GetKey(KeyCode.D)) // ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
MoveCharacter(Vector3.right, "RunLeft");
else if (Input.GetKey(KeyCode.A)) // ์ผ์ชฝ์ผ๋ก ์ด๋
MoveCharacter(Vector3.left, "RunRight");
// ...
}
// ...
}
์ด ๋ฐฉ๋ฒ์ ๋ฐ๋ Animation Clip์ ์ฌ์์ํค๋ ๋ฐฉ์์ด๋ค. ์๋ฅผ ๋ค์ด, ํ๋ ์ด์ด๊ฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ๋ ค๊ณ ํ๋ฉด ์๋๋ผ๋ฉด RunRight Animation Clip์ ์ฌ์ํด์ผ ํ๋๋ฐ, ์ฌ๊ธฐ์๋ ๋ฐ๋๋ก RunLeft Animation Clip์ ์ฌ์์ํจ๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ์ผ์ชฝ์ผ๋ก ์ด๋ํ ๋๋ RunRight Animation Clip์ ์ฌ์์ํจ๋ค. ์ด๋ ๊ฒ ํ๋ฉด Animation ๋ฐฉํฅ์ด ๊ผฌ์ฌ๋ ๊ทธ๋ฅ ๋ฐ๋๋ก ํ์ด์ ๋ง์ถฐ๋ฒ๋ฆฌ๋ ๊ฑฐ๋ค. ์ ์ด์ Animation์ด ๋ฐ๋๋ก ์คํ๋๋ฉด์ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ฏ๋ก, ์์ ๋ฐ๋ Animation์ ํ์ด์ฃผ๋ ์์ผ๋ก ํด๊ฒฐํ๋ ์ ์ด๋ค.

์ ์ค์ ์ ํตํด D ํค๋ฅผ ๋๋ ์ ๋ RunLeft Animation Clip์ด, A ํค๋ฅผ ๋๋ ์ ๋ RunRight Animation Clip์ด ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ ์ค์ ์ ํตํด์๋ ์ค๋ฅ๊ฐ ์ ์์ ์ผ๋ก ์์ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
+ ์ถ์ฒ
https://docs.unity3d.com/kr/2021.1/Manual/class-AnimationClip.html
'๐ Unity Engine Study > ๐ Unity ์ฐธ๊ณ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Unity Default Script Template ๋ณ๊ฒฝ (0) | 2025.02.25 |
---|---|
Unity ๊ฐ๋ฐ ์ค ์๋กญ๊ฒ ์ ์ง์๋ค ์ ๋ฆฌ (0) | 2024.02.08 |
Unity ์ธ๋ฒคํ ๋ฆฌ ์์ฑ (0) | 2024.02.07 |
Unity 2D Tilemap Extras ์ฌ์ฉ ๋ฐฉ๋ฒ (0) | 2024.02.05 |
Unity Scene ์ ํ์ BGM ์ ์ง ๋ฐ ๋ณผ๋ฅจ ์กฐ์ (0) | 2024.02.02 |