[Unity] 종 스크롤 슈팅게임

펑크린·2021년 9월 6일

Unity

목록 보기
4/13

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

00. 플레이어 설정

  • 프로젝트를 시작하면 가장 먼저 Sprites폴더와 Scripts폴더를 만들어 둔다.
  • Sprites는 골드메탈 님의 유튜브 링크 참조.

  • Sprite Mode: Multiple
    요소가 여러 개인 스프라이트 텍스처는 인스펙터에서 Sprite Mode 를 반드시 Multiple 로 설정해야 한다.

  • Pixels Per Unit: 24
    눈금 하나당 Pixel의 개수를 지정한다. 제공되는 Sprite의 규격이 24x24이다.

  • Filter Mode: Point
    참고 링크

  • Compression: None

적용을 누르고 Sprite Editor를 켠다.

  • Type: Grid by Cell Size
  • Pixel Size: 24 x 24
  • Padding: 1 x 1

  • 화면 비율을 조절한다. 고전 슈팅 종 스크롤 게임이기 때문에 9:19로 맞추었다.

-

01. 플레이어 이동

  • 스크립트

  • 스크립트를 작성하고 Player에 달아준다.

  • public 변수 speed를 설정하고 되는지 테스트

  • 잘 동작하지만 테투리를 벗어나는 문제가 있다.

  • 경계를 설정해야할 필요가 있음을 알 수 있다.

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

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

  • Player의 Inspector또한 마찬가지로 Collider와 Rigidbody를 추가한다. 이 때 자신이 만든 로직을 사용하기 때문에 Body Type을 Kinematic으로 설정한다.

  • 경계마다 Is Trigger를 체크해야 경계가 동작한다.

    -

    02. 애니메이션

    설정

  • 이전에 만들어둔 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
- 스크립트를 위와 같이 수정한다.

profile
코 익 인 간

0개의 댓글