2D Sprite Animation

À¯´ÏƼ 4.3 ¹öÀüºÎÅÍ 2D ±â´ÉÀÌ Ãß°¡ µÇ¾ú´Ù.
ÀÌÀü¿¡´Â Ä«¸Þ¶ó¸¦ Á÷±³ Ä«¸Þ¶ó·Î ¸¸µé¾î¼­ 2D ±â´ÉÀ» »ç¿ëÇÏ´øÁö, ¾Æ´Ï¸é 2DToolkit Ç÷¯±×ÀÎÀ» »ç¿ëÇؼ­ ¸¸µé¾ú´Ù.

< 2D ¸ðµå·Î ÇÁ·ÎÁ§Æ® »ý¼º >

À¯´ÏƼ ½ÃÀÛÇÒ ¶§ ÇÁ·ÎÁ§Æ® À§ÀÚµåÀÇ "Create New Project" ÅÇ¿¡¼­ ¾Æ·¡¸¦ º¸¸é Setup default for¿¡¼­ 2D·Î ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇÑ´Ù.

ÀÌ¹Ì ÇÁ·ÎÁ§Æ®¸¦ »ý¼ºÇß´Ù¸é Project Settings¿¡¼­ ¹Ù²Ü¼ö ÀÖ´Ù.

¸Þ´º / Edit / Project Settings / Editor·Î Editor SettingsÀ» ½ÇÇàÇÑ´Ù.
"Default Behavior Mode"ÀÇ Mode¸¦ 2D·Î ¹Ù²Û´Ù.

¸®¼Ò½º¿Í ³»¿ëÀ» °¡Á®¿Í¼­ ¹ø¿ªÇÑ°ÍÀÌ´Ù.
http://blog.cshool.jp/2013/12/5133.html

< ½ºÇÁ¶óÀÌÆ® ¼³Á¤ >

½ºÇÁ¶óÀÌÆ® À̹ÌÁö¸¦ Asset Æú´õ¿¡ º¹»çÇÑ´Ù.

½ºÇÁ¶óÀÌÆ® À̹ÌÁö¸¦ ÇѲ¨¹ø¿¡ ¸ðµÎ ¼±ÅÃÈÄ, Inspectorâ¿¡¼­ ¿É¼ÇÀ» ¼³Á¤ÇÑ´Ù.

Texture Type : 2D ¾Ö´ÏÀ̹ǷΠSprite·Î ¼³Á¤
Sprite Mode : ÇÑ Àå¿¡ ÇϳªÀÇ À̹ÌÁö¹Ç·Î Single·Î ¼³Á¤
Packing Tag : ÆÑÅ· À̸§ÀÌ °°À¸¸é ÇϳªÀÇ À̹ÌÁö·Î ÆÑÅ· µÈ´Ù.
Pixels To Units : À¯´ÏƼÀÇ ±âº»´ÜÀ§´Â 1mÀÌ´Ù. 100À» ÀÔ·ÂÇϸé 100Çȼ¿ÀÌ 1m°¡ µÈ´Ù.
Pivot : À̹ÌÁöÀÇ Áß½ÉÁ¡
Filter Mode : ÅؽºÃÄ°¡ 3D¿¡ ÀÇÇØ Transform µÇ¾úÀ» ¶§, ¾î¶»°Ô ÇÊÅÍ µÇ´ÂÁö ¼³Á¤
 

< Sprite Packer·Î ÅؽºÃÄ È®ÀÎ >

Packing Tag°¡ bird·Î ¼³Á¤ µÇ¾î ÀÖ´Ù.

¸Þ´º / Window / Sprite Packer·Î È®ÀÎ ÇÒ ¼ö ÀÖ´Ù.
Sprite Packer ´ëÈ­ »óÀÚ¿¡ "Sprite packing is disabled. Enable it in Project editorSettings." ¸Þ½ÃÁö°¡ ÀÖÀ¸¸é  Sprite Packer Mode¸¦ È°¼ºÈ­ ½ÃÄÑ¾ß º¼¼ö ÀÖ´Ù.

È°¼ºÈ­´Â ¸Þ´º / Edit / Project Settings / Editor·Î Editor Settings¿¡¼­ Sprite Packer Mode¸¦ "Always Enabled"·Î ¼öÁ¤ÇÏ¸é µÈ´Ù.

< Sprite ¹èÄ¡ >

¸Þ´º / GameObject / Sprite·Î  ½ºÇÁ¶óÀÌÆ® ¿ÀºêÁ§Æ®¸¦ »ý¼ºÇÑ´Ù.
¿ÀºêÁ§Æ® À̸§Àº Player·Î Á¤ÇÑ´Ù.
ÀÓÀÇÀÇ ½ºÇÁ¶óÀÌÆ® À̹ÌÁö Çϳª¸¦ ½ºÇÁ¶óÀÌÆ® ·»´õ·¯ÀÇ Sprite·Î µå·¡±×ÇÑ´Ù.
Scene â¿¡¼­ ¹èÄ¡µÈ Sprite Object¸¦ º¼¼ö ÀÖ°Ô µÈ´Ù.

 

< ½ºÇÁ¶óÀÌÆ®¿¡ ¾Ö´Ï¼ÇÀÌ¼Ç ±â´É Ãß°¡ >

Player ¿ÀºêÁ§Æ® Ŭ¸¯
¸Þ´º / Component / Miscellaneous / Animator·Î Animator ÄÄÆ÷³ÍÆ® »ý¼º
Apply Root MotioÀº ÇØÁ¦ ÇÑ´Ù.
¾Ö´Ï¸ÞÀ̼ÇÀÇ ¿òÁ÷ÀÓÀÌ °ÔÀÓ¿ÀºêÁ§Æ®ÀÇ ÁÂÇ¥ À̵¿¿¡ ¿µÇâÀ» ³¢Ä¥¶§ Àû¿ëÇÑ´Ù.

< ºó Animation µ¥ÀÌÅÍ »ý¼º >

Animator ÄÄÆ÷³ÍÆ® Ãß°¡ ÈÄ,
¸Þ´º / Window / AnimationÀ» ¼±ÅÃÇÏ¿© Animation âÀ» ¶ç¿î´Ù.

ºó ¾Ö´Ï¸ÞÀÌ¼Ç µ¥ÀÌÅ͸¦ »ý¼ºÇÏÀÚ.
Add Curve ¹öÆ°À§¿¡ »ó, ÇÏ È­»ìÇ¥ ¹öÆ°À» Ŭ¸¯, ´Ù½Ã "Create New Clip" ¹öÆ°À» Ŭ¸¯ÇÑ´Ù.

"Create New Animation" âÀÌ ¶á´Ù.
ÀÔ·ÂÀº Player@fly.animÀ¸·Î ÇÑ´Ù. @´Â ¾Ë¾Æº¸±â ½±µµ·Ï Çϱâ À§ÇØ ³ÖÀº °ÍÀÌ´Ù.
ÇÁ·ÎÁ§Æ® â¿¡ ¾Ö´Ï¸ÞÀÌ¼Ç µ¥ÀÌÅÍ°¡ »ý¼ºµÈ´Ù.

< ¾Ö´Ï¸ÞÀÌ¼Ç µ¥ÀÌÅÍ ÆíÁý >

1) Hierarchy¿¡¼­ Plyaer °ÔÀÓ¿ÀºêÁ§Æ® ¼±ÅÃ

2) "Create New Clip" ÄÁÆ®·Ñ¿¡ Player@fly°¡ ¼±Åà µÇ¾ú´ÂÁö È®ÀÎ

3) "Add Curve"Ŭ¸¯

"Sprite Renderer" µå¶ø´Ù¿î ¹öÆ° Ŭ¸¯

Sprite "+" Ŭ¸¯

Project ºä¿¡¼­ fly ½ºÇÁ¶óÀÌÆ®¸¦ ŸÀÓ¶óÀÎÀ¸·Î µå·¡±× Çؼ­ ¹èÄ¡ÇÑ´Ù.

Ç÷¹ÀÌ ¹öÆ°À» ´­·¯ ¹Ì¸®º¸±â·Î È®ÀÎÇÑ´Ù.

°È±â ¾Ö´Ï¸ÞÀ̼ǵµ "Create New Clip"À¸·Î Player@walk.anim¶ó´Â À̸§À¸·Î Ãß°¡ÇÑ´Ù.

< ¾Ö´Ï¸ÞÀÌ¼Ç Àüȯ >

½ºÆĸ®ÀÌÆ® ¾Ö´Ï¸ÞÀÌ¼Ç Àüȯµµ MecanimÀ» ÀÌ¿ëÇؼ­ ¾Ö´Ï¸ÞÀÌ¼Ç ÀüȯÀ» ÇÑ´Ù.
¾Ö´Ï¸ÞÀÌ¼Ç ÀüȯÀ» Çϱâ Àü¿¡ PlayerÀÇ Inspector View¿¡¼­ Animator ÄÄÆ÷³ÍÆ®ÀÇ Controller°¡ Player·Î ¼³Á¤ÀÌ ¾ÈµÇ¾ú´Ù¸é Project ºä¿¡¼­ Player¸¦ µå·¡±× Çؼ­ ¼³Á¤ÇÑ´Ù.

¸Þ´º / Window / Animator¸¦ Ŭ¸¯ÇÏ¿© Animator ºä¸¦ ¶ç¿î´Ù.

1) Animator View¸¦ Ŭ¸¯Çϸé Player@fly, Player@walk°¡ Ãß°¡ µÇ¾î ÀÖÀ»°ÍÀÌ´Ù.
¿ìŬ¸¯ÇÏ¿© "Make Transition"À¸·Î ¾Ö´Ï¸ÞÀÌ¼Ç ³ëµå¸¦ ¿¬°áÇÑ´Ù.

2) bool ŸÀÔÀÇ Grounded ÆĶó¸ÞÅ͸¦ Ãß°¡ÇÑ´Ù.
°øÁß¿¡ ÀÖÀ¸¸é ³¯±â ¾Ö´Ï¸ÞÀ̼Ç, ¶¥¿¡ ÀÖÀ¸¸é °È±â ¾Ö´Ï¸ÞÀ̼ÇÀ» Çϱâ À§Çؼ­ÀÌ´Ù.

3) Æ®·£Áö¼Ç¿¡ Grounded ¼Ó¼º ºÎ¿©
fly¿¡¼­ walk Æ®·£Áö¼Ç : Grounded°¡ trueÀ϶§
 

walk¿¡¼­ fly Æ®·£Áö¼Ç : Grounded°¡ falseÀ϶§
 

½ÇÇà ¹öÆ°À» ´­·¯ Grounded Parameters üũ¹Ú½º¸¦ Ŭ¸¯Çؼ­ ¾Ö´Ï¸ÞÀ̼ÇÀÌ °È±â·Î ÀüȯµÇ´ÂÁö È®ÀÎÇÑ´Ù.

< Physics2D ¼³Á¤ >

¸®Áöµå ¹Ùµð Ãß°¡ : ¸Þ´º / Component / Physics 2D / Rigidbody 2D
Ãæµ¹ ¹Ú½º Ãß°¡ : ¸Þ´º / Component / Physics 2D / Circle Collider 2D

Ridgidbody 2D ÄÄÆ÷³ÍÆ®¿¡¼­ "Fixed Angle"À» üũÇÑ´Ù.
±×·¸Áö ¾ÊÀ¸¸é À̵¿ÇÒ ¶§, ȸÀüÇϸ鼭 ±¼·¯°¡°Ô µÈ´Ù.

Interpolate´Â ¹°¸® ÇÁ·¹ÀÓ »çÀÌÀÇ º¸°£ÀÌ´Ù.
ÀÚ¼¼ÇÑ ¼³¸íÀº ¿©±â http://www.unitystudy.net/bbs/board.php?bo_table=tip&wr_id=2

< ÁöÇü ¼³Á¤ >

½ÇÇàÇϸé ÁöÇüÀÌ ¾ø±â ¶§¹®¿¡ ij¸¯ÅÍ°¡ ¾Æ·¡·Î °è¼Ó ¶³¾îÁø´Ù.

Cube °ÔÀÓ¿ÀºêÁ§Æ®·Î ¹Ù´Ú°ú º®À» ¸¸µç´Ù.
À̸§Àº floor, wall1, wall2·Î ÇÑ´Ù.

¸Þ´º / Component / Physics 2D / Box Collider 2D¸¦ Ãß°¡ÇÑ´Ù.
2D ij¸¯ÅÍ¿Í Ãæµ¹Àº 2D³¢¸® ÇØ¾ß Ãæµ¹ÀÌ Àß µÈ´Ù.


¹Ù´Ú°ú º®À¸·Î ¹üÀ§¸¦ ¹þ¾î³ªÁö ¾Êµµ·Ï ÇÑ´Ù.

< ½ºÅ©¸³Æ®·Î ¾Ö´Ï¸ÞÀÌ¼Ç Àüȯ>

°øÁÖ¿¡ ÀÖÀ» ¶§ fly ¾Ö´Ï¸ÞÀ̼Ç, ¶¥À§¿¡ ÀÖÀ» ¶§ walk ¾Ö´Ï¸ÞÀ̼ÇÀ¸·Î ÀüȯÇÏ´Â ½ºÅ©¸³Æ®¸¦ Ãß°¡ ÇÑ´Ù.

public  LayerMask groundLayer;

 

bool  grounded = Physics2D.Linecast (

    transform.position + transform.up * 1,

    transform.position - transform.up * 0.1f, groundLayer

    );

¹Ù´Ú°ú Ãæµ¹Çϴ üũ´Â 2D ray ÇÔ¼öÀÎ Physics2D.Linecast( )·Î üũÇÑ´Ù.
3¹ø° ÀÎÀÚÀÎ ·¹À̾ »ý·«ÇÏ¸é ¸ðµç Ãæµ¹ µ¥ÀÌÅ͸¦ °Ë»çÇÑ´Ù.

ÀÎÀÚ¸¦ ´ÙÀ½°ú °°ÀÌ ³Ö´Â ¹æ¹ýµµ ÀÖ´Ù.
1 << LayerMask.NameToLayer("ground")

ij¸¯ÅÍÀÇ Ãæµ¹ ¸Þ½¬µµ Ãæµ¹ Ã¼Å© ÇÏ°í À־ ¹Ù´Úüũ°¡ Á¤»óÀûÀ¸·Î µÇÁö ¾Ê´Â´Ù.
¹Ù´Ú°ú º®¸¸ Ray¸¦ üũ Çϵµ·Ï ·¹À̾ ¼³Á¤ÇÑ´Ù.

"Add Layer..."·Î gound ·¹À̾ Ãß°¡ÇÏ¿© ¹Ù´Ú°ú º®ÀÇ ·¹À̾ ¼³Á¤ÇÑ´Ù.

floor, wall1, wall2 °ÔÀÓ¿ÀºêÁ§Æ®¿¡ ground ·¹À̾î·Î ¼³Á¤
Player ½ºÅ©¸³Æ®¿¡¼­ groundLayer¸¦ "ground"·Î ¼³Á¤ÇÑ´Ù.

°ÔÀÓ ½ÃÀÛ ¹öÆ°À» ´©¸£¸é ÁöÇüÀ§¿¡ ¶³¾îÁú¶§ °È±â ¾Ö´Ï¸ÞÀ̼ÇÀ¸·Î º¯È¯µÈ´Ù.

< non-Physics À̵¿ >

ChangeSpriteDirection( ) ÇÔ¼ö´Â ³ªÁß¿¡ ¼³¸íÇÏ°Ú´Ù.
ÁÂ, ¿ì ¹æÇâ¿¡ µû¶ó ÅؽºÃĸ¦ Á¿ì·Î µÚÁý´Â´Ù.

void MoveNonPhysics()

{

    float speed = 7.0f;

    float h = Input.GetAxis("Horizontal");

    transform.Translate( Vector3.right * h * speed * Time.deltaTime);

 

    float v = Input.GetAxis("Vertical");

    transform.Translate( Vector3.up * v * speed * Time.deltaTime);

 

    ChangeSpriteDirection(h);

}

< Physics À̵¿ >

rigidbody2D.AddForce( )¸Þ¼Òµå·Î À̵¿ ÇÑ´Ù.
Á¦ÇÑ ¼Óµµ ÀÌ»óÀ̸é Á¦ÇÑ ¼Óµµ·Î ¼³Á¤ÇÑ´Ù.

Mathf.Sign(float f) : °ªÀÌ ¾çÀ̰ųª 0À϶§ 1·Î º¯È¯µÇ¸ç, f°¡ À½ÀÇ °ªÀ϶§ -1·Î º¯È¯µÈ´Ù

private float walkForce = 30f;

private float flyForce = 50f;

private float maxWalkSpeed = 30.0f;

private float maxFlySpeed = 5.0f;

 

void MovePhysics()

{

    float h = Input.GetAxis( "Horizontal" );

    float v = Input.GetAxis( "Vertical" );

 

    if(rigidbody2D.velocity.x < maxWalkSpeed)

    {

        rigidbody2D.AddForce (Vector2.right * h * walkForce);

    }

 

    if( v > 0 && rigidbody2D.velocity.y < maxFlySpeed )

    {

        rigidbody2D.AddForce( Vector2.up * v * flyForce );

    }

 

    if( Mathf.Abs( rigidbody2D.velocity.x) > maxWalkSpeed )

    {

        rigidbody2D.velocity = new  Vector2(

            Mathf.Sign(rigidbody2D.velocity.x) *maxWalkSpeed, rigidbody2D.velocity.y

            );

    }

 

    ChangeSpriteDirection(h);

}

< ÁÂ, ¿ì ¹æÇâÀ¸·Î ÅؽºÃÄ ¹Ù²Ù±â >

ÅؽºÃÄ À̹ÌÁö°¡ ¹Ù¶óº¸°í ÀÖ´Â ¹æÇâÀº ¿À¸¥ÂÊÀÌ´Ù.
 h´Â ÁÂ, ¿ì ÀԷ°ªÀÌ´Ù.

facingRight°¡ falseÀÌ°í h > 0
facingRight°¡ trueÀÌ°í h true 0 À̸é ÅؽºÃÄÀÇ ÁÂ, ¿ì°¡ ¹Ù²ï´Ù.
½ºÄÉÀÏÀÌ À½¼öÀ̸é Á¿찡 ¹Ù²ï´Ù.

private bool facingRight = true;

 

void ChangeSpriteDirection(float h)

{

    if((h> 0 && facingRight == false) || (h <0 && facingRight))

    {

        facingRight = (h > 0);

        transform.localScale = new  Vector3 ((facingRight? 1 : -1), 1, 1);

    }

}


Tip : À¯´ÏƼ¿¡¼­ 2D À̹ÌÁö¸¦ ¹Ì·¯¸µ ÇÒ·Á¸é ½ºÄÉÀÏ °ªÀ» À½¼ö·Î ÁØ´Ù.
¼öÆò ¹Ì·¯¸µÀº (-1, 1, 1), ¼öÁ÷ ¹Ì·¯¸µÀº (1, -1, 1) °ªÀ» ÁØ´Ù.

¼Ò½º - Player.cs

ÇÁ·ÎÁ§Æ® - 2DSpriteTest.zip