출처: 골드메탈 님의 유튜브 콘텐츠 클론코딩


Sprite Mode: Multiple
요소가 여러 개인 스프라이트 텍스처는 인스펙터에서 Sprite Mode 를 반드시 Multiple 로 설정해야 한다.
Pixels Per Unit: 24
눈금 하나당 Pixel의 개수를 지정한다. 제공되는 Sprite의 규격이 24x24이다.
Filter Mode: Point
참고 링크
Compression: None
적용을 누르고 Sprite Editor를 켠다.


스크립트
스크립트를 작성하고 Player에 달아준다.
public 변수 speed를 설정하고 되는지 테스트

잘 동작하지만 테투리를 벗어나는 문제가 있다.
경계를 설정해야할 필요가 있음을 알 수 있다.

경계를 설정할 GameObject를 4방위로 각각 만든다.

각각의 object를 위와 같이 Collider와 Rigidbody를 추가한다.
BodyType은 static으로 한다.

Player의 Inspector또한 마찬가지로 Collider와 Rigidbody를 추가한다. 이 때 자신이 만든 로직을 사용하기 때문에 Body Type을 Kinematic으로 설정한다.
경계마다 Is Trigger를 체크해야 경계가 동작한다.


이전에 만들어둔 Sprite를 4개씩 선택하여 Player 오브젝트에 넣어주면 자동으로 Animator가 생성된다.
Center, Left, Right를 생성하고 window - animation - animator를 실행한다.

서로를 가리키도록 Transition을 생성한다.

파라미터에 Input을 추가한다.
이전에 생성한 Transition에 Center로 바뀔 때는 0, Left로 바뀔 때는 -1, Right로 바뀔 때는 1을 설정한다.

2D에서는 즉각적으로 변하면 되기 때문에 Transition Duration을 0으로 설정하고 Has Exit Time의 체크를 해제한다.
스크립트
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { public bool isTouchTop; public bool isTouchBottom; public bool isTouchLeft; public bool isTouchRight; Animator anim; void Awake() { anim = GetComponent<Animator>(); } void Update() { Move(); } void Move() { // 수평 움직임, GetAxisRaw는 -1, 0, 1의 값만 들어온다. float h = Input.GetAxisRaw("Horizontal"); if ((isTouchLeft && h == -1) || (isTouchRight && h == 1)) h = 0; // 수직 움직임, GetAxisRaw는 -1, 0, 1의 값만 들어온다.
float v = Input.GetAxisRaw("Vertical"); if ((isTouchBottom && v == -1) || (isTouchTop && v == 1)) v = 0; // MonoBehaviour의 멤버변수 transform으로 현재 위치 대입 Vector3 curPos = transform.position; // 매개변수로 x, y, z축 값 전달, 속도를 곱하고 2d에서는 반드시 deltaTime의 값을 곱해줘야 한다. // 컴퓨터 환경에 따라 프레임이 달라지게 되는데 이 때 어떤 환경이라도 같은 결과를 보여주기 위함이다. Vector3 nextPos = new Vector3(h, v, 0) * speed * Time.deltaTime; // 다음 위치 설정 transform.position = curPos + nextPos; // 좌우 버튼을 눌렀을 경우에만 애니메이션이 바뀐다. if(Input.GetButtonDown("Horizontal") || Input.GetButtonUp("Horizontal")) { // 파라미터의 값을 설정 anim.SetInteger("Input", (int)h); } } void OnTriggerEnter2D(Collider2D collision) { if(collision.gameObject.tag == "Border") { switch(collision.gameObject.name) { case "Top": isTouchTop = true; break; case "Bottom": isTouchBottom = true; break; case "Left": isTouchLeft = true; break; case "Right": isTouchRight = true; break; } } } void OnTriggerExit2D(Collider2D collision) { if (collision.gameObject.tag == "Border") { switch (collision.gameObject.name) { case "Top": isTouchTop = false; break; case "Bottom": isTouchBottom = false; break; case "Left": isTouchLeft = false; break; case "Right": isTouchRight = false; break; } } } } | cs |
