앱 만들기/유니티2D

유니티 - 전투기 8방향으로 이동 하기.

나도 처음이야 2021. 6. 29.

타임 파일럿 이라는 아케이드 게임있었다.

사실 난 접해보지 못한 오락실 게임이였는데, 당시 비행 슈팅게임의 한 획을 그은 게임이라고 한다.

보시는 것 처럼,

전투기가 8방향으로 움직인다.

유니티로 아군 기체를 위와 같은 움직임으로 만들어 보면 어떨까란 생각을 해본다.

하기 처럼 말이다.

https://youtu.be/iso3DFqO1kU

 

위 처럼 8방향으로 동작하기 위해서는 

8방향의 이미지가 모두 필요할 수 도 있지만, 필자는 하기 3장의 이미지를 활용하여 8방향을 구현해 보았다.

이미지 로테이션을 통해서 가능하다. 

P1 은 가로 오른쪽,왼쪽

P2 는 상하 

P3 는 대각선 4방향

 

코드는 하기와 같다.

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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class OnkeyPressMove : MonoBehaviour
{
    public static int direction = 4;
    public Sprite[] sprites = new Sprite[direction]; // 방향에 따른 이미지를 교체하기 위해서.
    private SpriteRenderer spriteRenderer;
    public float speed = 10// 아군 비행기 속도
    float vx = 0;
    float vy = 0;
    Rigidbody2D rbody; // 자연스러운 비행기 움직임을 위해서...
    bool leftFlag = false;
    // Start is called before the first frame update
    void Start()
    {
        rbody = GetComponent<Rigidbody2D>();
        rbody.gravityScale = 0;
        rbody.constraints = RigidbodyConstraints2D.FreezeRotation;
        spriteRenderer = GetComponent<SpriteRenderer>();
        spriteRenderer.sprite = sprites[0];
    }
    void Update()
    {
        // 계속 시행한다
        vx = 0;
        vy = 0;
        if ( Input.GetKey("right"&& Input.GetKey("up"))
        { // 만약 오른쪽 키가 눌리면
            vy = speed;
            vx = speed; // 오른쪽으로 나아가는 이동량을 넣는다
            spriteRenderer.sprite = sprites[2];
            if (spriteRenderer.flipX == true)
            {
                this.transform.rotation = Quaternion.Euler(00-135);              
            }
            else
                this.transform.rotation = Quaternion.Euler(0045);
            //leftFlag = false;
        }else if (Input.GetKey("left"&& Input.GetKey("up"))
        { // 만약 오른쪽 키가 눌리면
            vy = speed;
            vx = -speed; // 오른쪽으로 나아가는 이동량을 넣는다
            spriteRenderer.sprite = sprites[2];
            if (spriteRenderer.flipX == true)
                this.transform.rotation = Quaternion.Euler(00-45);
            else
                this.transform.rotation = Quaternion.Euler(00135);
            //leftFlag = false;
        }
        else if (Input.GetKey("right"&& Input.GetKey("down"))
        { // 만약 오른쪽 키가 눌리면
            vy = -speed;
            vx = speed; // 오른쪽으로 나아가는 이동량을 넣는다
            spriteRenderer.sprite = sprites[2];
            if (spriteRenderer.flipX == true)
                this.transform.rotation = Quaternion.Euler(00-135);
            else
                this.transform.rotation = Quaternion.Euler(00-45);
         
        }
        else if (Input.GetKey("left"&& Input.GetKey("down"))
        { // 만약 오른쪽 키가 눌리면
            vy = -speed;
            vx = -speed; // 오른쪽으로 나아가는 이동량을 넣는다
            spriteRenderer.sprite = sprites[2];
            if (spriteRenderer.flipX == true)
                this.transform.rotation = Quaternion.Euler(0045);
            else
                this.transform.rotation = Quaternion.Euler(00-135);         
        }
        else if (Input.GetKey("right"))
        { // 만약 오른쪽 키가 눌리면
            speed = 20;
            vx = speed; // 오른쪽으로 나아가는 이동량을 넣는다          
            leftFlag = false;
            spriteRenderer.sprite = sprites[0];
            spriteRenderer.flipX = false;
            this.transform.rotation = Quaternion.Euler(000);
        }
        else if (Input.GetKey("left"))
        { // 만약 왼쪽 키가 눌리면
            speed = 20;
            vx = -speed; // 왼쪽으로 나아가는 이동량을 넣는다
           // this.transform.Rotate(0, 0, -90);
            leftFlag = true;
            spriteRenderer.sprite = sprites[0];
            spriteRenderer.flipX = true;
            this.transform.rotation = Quaternion.Euler(000);
        }
        else if (Input.GetKey("up"))
        { // 만약 위쪽 키가 눌리면
            speed = 20;
            vy = speed; // 위 방향으로 나아가는 이동량을 넣는다
            spriteRenderer.sprite = sprites[1];
            spriteRenderer.flipX = false;            
           this.transform.rotation = Quaternion.Euler(0090);
        }
        else if (Input.GetKey("down"))
        { // 만약 아래 키가 눌리면
            speed = 20;
            vy = -speed; // 아래로 나아가는 이동량을 넣는다
                         // Z축 90도 방향으로
            spriteRenderer.sprite = sprites[1];
            spriteRenderer.flipX = false;
           this.transform.rotation = Quaternion.Euler(00-90);
        }
        }
        void FixedUpdate()
        { // 계속 시행한다(일정 시간마다)
          // 이동한다
            rbody.velocity = new Vector2(vx, vy);         
        }
}
 
cs

여기에도 중요한 포인트가 있다.

바로, 하기 함수를 사용하여 transform의 방향을 바꾼다는 것. 즉, 스프라이트의 Z축 각도를 개발자가 원하는 대로 변경할 수 있다. Quaternion 객체를 잘 활용하자.

 this.transform.rotation = Quaternion.Euler(0045);

 

감사합니다 :)

반응형

댓글