* ๋คํฌ ๋ชจ๋๋ฅผ ํค๊ณ ๋ณด์๋ฉด ์ผ๋ถ ํ ์คํธ๊ฐ ์ ๋ณด์ด์ง ์์ต๋๋ค ! *
โช์์ ์ถ์ฒ ๐จ
( ๋จ์์บ๋ฆญํฐ์ ๋จธ๋ฆฌ์ ๊ฒ์ ์์ ์ฃผ์๋ค. ) ( ์ถํ ๊ฒ์ ์์ดํ ์ผ๋ก ๋ค์ ์ค๊ฒ ํ ์์ )
๋ณธ ์ฝ๋๋ ์๋น์ ๋ถ๋ถ์ ๊ณจ๋๋ฉํ๋์ ๊ฐ์ข ์ฝ๋๋ฅผ ๋ณด๊ณ ์์ฑํ์์ต๋๋ค.
โ Player ์์ง์ ์คํฌ๋ฆฝํธ
float hAxis;
float vAxis;
public float Speed;
public float JumpPower;
public float DJumpPower;
๋ณ์ ์ ์ธ ํด์ค๋ค.
float | ์ค์ |
int | ์ ์ |
public | ์ธ์คํํฐ์์ ๋ณ๊ฒฝ ๊ฐ๋ฅ ํ ๊ฐ |
์ ๋งํ ์ฐ์ฐ์ int๋ก ํด์ผ์ง ์ข ๋ ๋นจ๋ผ์ง๋ค๋๊ฑธ ์ฑ ์์ ๋ณธ ์ ์๋ค.
์ ํํด์ง์ง ์๋๋ผ๋, ์์ซ์ ๊ณ์ฐํ๋๊ฒ ๊ต์ฅํ ๋ณต์กํด์ง๋ค๊ณ ..(๋์ถฉ์์ฝ)
bool JDown;
bool isJump;
bool isDodge;
bool wDown;
bool dDown;
bool JJDown; //๋๋ธ์ ํ ๋ฒํผ
bool isJJDown; //๋๋ธ ์ ํ๋ฅผ ํ๊ณ ์๋๊ฐ?
bool | ์ฐธ์ธ๊ฐ ๊ฑฐ์ง์ธ๊ฐ? ์กฐ๊ฑด๋ฌธ๊ณผ ๊ฒฐํฉํ๋ฉด ์ฝ๋์ ํ๋ฆ์ ์กฐ์ ํ ์ ์๋ ๊ฐ๋ ฅํ ๋๊ตฌ โ |
Rigidbody rigid;
Vector3 moveVec;
Vector3 DodgeVec;
Animator anim;
Rigidbody | GameObject๊ฐ ๋ฌผ๋ฆฌ ์ ์ด๋ก ๋์ํ๊ฒ ํ๋ค. |
Vector3 | 3D ๊ณต๊ฐ ์์์ X,Y,Z ( ๋ณ์ ์ ์ธํ๊ณ ๋ฌด์กฐ๊ฑด ์ด๊ธฐํ ํด์ผํจ ) |
void Awake()
{
rigid = GetComponent<Rigidbody>();
anim = GetComponentInChildren<Animator>();
}
GetComponent | ๊ฒ์ ์ค๋ธ์ ํธ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์ค๋ ํจ์. |
void Update()
{
GetInput();
move();
Jump();
Trun();
Dodge();
}
ํธ์ถ ํด์ฃผ๊ธฐ.
void GetInput()
{
hAxis = Input.GetAxisRaw("Horizontal");
vAxis = Input.GetAxisRaw("Vertical");//
wDown = Input.GetButton("Walk");//๊ฑท๊ธฐ
JDown = Input.GetButtonDown("Jump");//์ ํ
JJDown = Input.GetButtonDown("Jump");//๋๋ธ์ ํ
dDown = Input.GetButtonDown("Dodge");//ํํผ
}
GetInput() : ํค ์ ๋ ฅ
(ํ ๋ด์ฉ ์ถ์ฒ โ)
GetAxisRaw | InputManager์ ์
๋ ฅ๋ ํค๋ฅผ ๋๋ฅผ๋, ๊ฐ์ ๋ฐํ nagative button์ ๋๋ฅด๋ฉด ์์๊ฐ, positive button์ ๋๋ฅด๋ฉด ์์๊ฐ ๋ฐํ |
GetButton | ํค๋ฅผ ๋๋ ์๋๋ true๋ฅผ ๋ฐํ, ๊ทธ๋ ์ง ์๋ค๋ฉด false๋ฅผ ๋ฐํ. |
GetButtonDown | ํค๋ฅผ ๋๋ ์ ๋, ๋ฑ ํ๋ฒ true๋ฅผ ๋ฐํ |
๐ Horizontal,Vertical ๐
void move()
{
moveVec = new Vector3(hAxis,0,vAxis).normalized;
if(isDodge)
moveVec = DodgeVec;
anim.SetBool("isRun",moveVec != Vector3.zero);
anim.SetBool("isWalk",wDown);
}
normalized | ๋ฐฉํฅ๊ฐ์ด 1๋ก ๋ณด์ ๋ ๋ฐฑํฐ(ํผํ๊ณ ๋ผ์ค) |
!=(bool) | ๊ฐ์ง ์๋ค. ์๋๋ค. |
anim | animator์ ๋ณ์๋ช
, move๋ Run์ํ์ด๋, ์ ๋๋ฉ์ด์ Run์ Vector3.zero๊ฐ ์๋๋ ์คํ๋๊ฒ ํ๋ค. |
Transform์ด๋์ ๋ฌผ๋ฆฌ ์ถฉ๋์ ๋ฌด์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
์ผ๋จ์ RigidBody์ Collision Detection์ Continuuous๋ก ๋ณ๊ฒฝ.
void Trun()
{
transform.LookAt(transform.position+moveVec);
if(moveVec != Vector3.zero)
{
Quaternion newRotation = Quaternion.LookRotation(moveVec);
rigid.rotation = Quaternion.Slerp(rigid.rotation,newRotation,rorateSpeed*Time.deltaTime);
}
}
์ฐ๋ฆฌ๊ฐ ๋์๊ฐ๋ ๋ฐฉํฅ์ผ๋ก ๋ฐ๋ผ๋ณด๋ ์คํฌ๋ฆฝํธ
Quaternion | ์ค๋ก์ง ํ์ ๋ง์ ๋ค๋ฃจ๋. x,y,z์ถ ์ง์ ์ ๊ทผํ์ฌ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ ์ ๊ณตํด์ฃผ๋ ํจ์๋ฅผ ์ฌ์ฉ ํด์ผํจ. |
Lookat | Look At์ ์ด์ฉํ๋ฉด ๊ฒ์ ์ค๋ธ์ ํธ์ ์ ๋ฐฉํฅ์ด Look At์์ ์ง์นญํ๋ ์ค๋ธ์ ํธ๋ฅผ ๋ฐ๋ผ๋ณธ๋ค. |
MoveRotation(Qiaternion) | ๋ชฉํ ํ์ ๊ฐ์ผ๋ก ๋ฐ๋ก ํ์ |
Slerp | ๋ชฉํ ํ์ ๊ฐ์ธ์ง ํ์ ์๋์ ๋ฐ๋ผ ์ฒ์ฒํ ํ์ ์ํค๋ ํจ์ |
Time.deltatime | pc์ฑ๋ฅ๊ณผ๋ ๋ค๋ฅด๊ฒ ๋์ผํ Fps๋ฅผ ๋ณด์ฌ์ค. |
void Jump()
{
if(JDown &&!isJump &&!isDodge)
{
rigid.AddForce(Vector3.up*JumpPower,ForceMode.Impulse);
anim.SetBool("isJump",true);
anim.SetTrigger("doJump");
isJump = true;
}
else if( JJDown &&!isDodge &&!isJJDown )
{
rigid.AddForce(Vector3.up*DJumpPower,ForceMode.Impulse);
anim.SetBool("isJJDown",true);
anim.SetTrigger("doJump");
isJJDown = true;
}
}
์ ํ์ ๋๋ธ์ ํ ๊ตฌํ ๐โ๏ธ
&& | and ์ฐ์ฐ์, ์์ชฝ ๋ชจ๋ true๋ฉด true |
ForceMode | ์ด๋ค์์ผ๋ก ํ์ ์ ๋ฌํ ๊ฒ์ธ๊ฐ? |
Impulse | (๋๊ฐ ๋ฐ๋ฏ์ด)์งง์ ์๊ฐ์ ํ, ๋ฌด๊ฒ์ ์ฉ |
1๋จ ์ ํ (if)
๋๋ธ ์ ํ(else if)
๋๋ธ ์ ํ ์ฝ๋๋ ๋ด๊ฐ ๋ง๋ ์ฝ๋๋ผ, ์ด์ง ์ด์ํ๋ฐ.
JJDown๋ฅผ ํ๋ ๋ ๋ง๋ค์ด์ ์ ๋๋ฉ์ด์ ํ๋ผ๋ฉํฐ๋ง ์ ์ฐ๊ฒฐ ํด์คฌ๋ค.
void Dodge()
{
if(dDown&&moveVec != Vector3.zero && !isJump &&!isDodge )
{
DodgeVec = moveVec;
Speed*=2;
anim.SetTrigger("doDodge");
isDodge = true;
Invoke("DodgeOut",0.5f); //๋ฐธ๋ฐ์ค ๋๋ ์ด
}
}
void DodgeOut()
{
Speed *= 0.5f;
isDodge = false;
}
ํํผ
Invoke | ํจ์ ์คํ ์ง์ฐ ์ํฌ ์ ์๋ค. |
void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.tag == "Floor")
{
anim.SetBool("isJump",false);
isJump = false;
anim.SetBool("isJJDown",false);
isJJDown = false;
}
}
๋ฌดํ ์ ํ ์ ํ ์กฐ๊ฑด
OnCollisionEnter | Collision์ ๋ค์ด๊ฐ์๋ ์คํ |
๋ง์ฝ Player๊ฐ ๋ฟ์์๋ Collision์ด Floor๋ค
๊ทธ๋ฌ๋ฉด isJump,isJJDonw์ false ์์ผ์ฃผ๊ธฐ. ( ๋ค์ true๊ฐ ๋๋ ค๋ฉด ์ ํํค๋ฅผ ๋๋ฌ์ผ ํ๋ค.!)
โ Unity Tag ์ค์ ๋ฐฉ๋ฒ ๐
floor์์ ํ์ดํ ๋ฒํผ์ ๋๋ฅด๊ณ Add Tag ํด๋ฆญ
+๋ชจ์์ ๋๋ฌ์
ํ๊ทธ๋ฅผ ์ถ๊ฐํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
์ค์ํ์ ์
Tag๋ฅผ ์ด์ฉํด ์ด๋ฐ์์ผ๋ก ์ฝ๋ ์์ฑ์ ํด์ฃผ๊ฒ ๋๋๋ฐ,
๋ณธ์ธ์ด ์ค์ ํ ํ๊ทธ์ ๋๊ฐ์ด ์ค์ ํด์ฃผ์ ์ผ ํฉ๋๋ค.
์๋๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์, ์ฝ๋๊ฐ ์ ๋๋ก ์๋์ด ๋์ง ์๋๋ค๋ฉด ์คํ์๊ฐ ์๋์ง ๋จผ์ ํ์ธ ํด์ฃผ์ธ์.
โ animator ์ ๋๋ฉ์ดํฐ ์ค์ ๐ณ
์ค๋ฅธ์ชฝ ํด๋ฆญํ Animator ์์ฑํ
Player์๊ฒ ๋ฃ์ด์ฃผ๊ธฐ.
๋ค๋ชจ๋ ๋ชจ์์ Bool
๋๊ทธ๋ ๋ชจ์์ Trigger.
์คํฌ๋ฆฝํธ์ ์์ฑํ๋๋ก + ๋ฒํผ ๋๋ฌ์ ๋ง๋ค์ด์ค๋๋ค.
ํ๋ผ๋ฉํฐ.
์์ ํด๋์ animation ํด๋์์ ๋ง์์ ๋ค๊ณ ํ๋์ ์๋ง๋ ์ ๋๋ฉ์ด์ ์ ๊ฐ์ง๊ณ ์์ ๋๋๊ทธ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
๋ณดํต ์ ๋๋ฉ์ด์ ์ด๋ฆ์ ๋ค ์ ํ์๋๋ฐ
Idle์ ์๋ฌด๊ฒ๋ ํ์ง ์๋ ๋ณดํต์ ์ํ์ผ๋ ์คํ๋๋ ์ ๋๋ฉ์ด์ ์ ๋๋ค.
Any State ๋ชจ์ต์ ๋๋ค.
์์ง ์ค๋ช ๋์ง ์์.. Get,Attack ๋ถ๋ถ์ ์ ์ธํ๊ณ ๋ด์ฃผ์๋ฉด ๋๊ฒ ์ต๋๋ค.
Jump ๋ถ๋ถ์ ๋๋ค.
Any state ๋ฅผ jump์ ์ฐ๊ฒฐํด์ฃผ๊ณ jump์ doubleJump๋ฅผ ์ฐ๊ฒฐ ํด์ค๋๋ค.
Land๋ ์ฐฉ์ง ์ ๋๋ค.
any state -> jump inspector์ ๋๋ค.
Conditions์ + ๋ฒํผ์ ๋๋ฌ์ trigger๊ฐ์ ๋ฃ์ด์ค๋๋ค.
๋๋ธ์ ํ๋ ๋ฐ๋ก ๋ง๋ค์ด๋ isJJDown์ ๋ฃ์ด์ค๋๋ค.
bool๊ฐ์ ์ผ์ต๋๋ค.
์ง๊ธ ํ์ฌ (1๋จ)์ ํ๋ฅผ ํ๊ณ ์๋๊ฐ? ๋ฅผ ์ํด์
(1๋จ ์ ํํ์ ๊ฐ๋ฅ ํ ์กฐ๊ฑด์ )
์ด๋ฐ์์ผ๋ก ์ ๋๋ฉ์ด์ ํ๋ผ๋ฉํฐ๋ฅผ ์ฐ๊ฒฐ ํด ์ค๋๋ค.
์ฐธ! Has Exit Time ์ ๊บผ์ฃผ๋๋ก ํด์
Exit์ผ๋ก ๋๊ฐ๋ ์๋ฌด๊ฒ๋ ์ ๋ฃ์ด์ฃผ์๋ฉด ๋๊ฒ ์ต๋๋ค.
์๋ชป๋ ์ ์ด๋ ๊ถ๊ธํ์ ์ ์
๋๊ธ๋ก ์๋ ค์ฃผ์ธ์ !
๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
