본문 바로가기

정리 카테고리/실습_과제

Unity_실습_2D 자동 전진, 전투




현재 맵에 적이 하나씩 생성되고 거리가 가까워지면 적을 때리고 체력이 없어지면 쓰러지는 동작을 한뒤 다시 생성된다.

(맵이 짧은건 블럭이동 확인을 시각적으로 용이하게 하려고 줄여 놓았다.)


이후 추가하려는 내용.

  -적도 공격한다.

  -적이 나오는 시점이 랜덤

  -배경도 움직인다.



 위에 목표가 되면 추가내용 ->다수적





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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Main : MonoBehaviour {
    
    public GameObject hero;//공격하는 케릭터
    public GameObject enermy;//적
    public GameObject block0;//바닥 0
    public GameObject block1;//바닥 1
    public GameObject block2;//바닥 2
    public GameObject block3;//바닥 3
    public GameObject block4;//바닥 4
    public GameObject block5;//바닥 5
    private tk2dSpriteAnimator ani; //공격케릭터 동작
    private tk2dSpriteAnimator ani2;//적 케릭터 동작
    private Vector3 enermyposition;//적 처음 위치
    private Vector3 setposition;//바닥 재생성 위치
    private Vector3 seeposition;//바닥이 이동하는 방향
    private int hp=10;//적 체력
    private bool checkClick = true;//중단버튼 클릭여부 확인
    private float checkMove;//움직인 거리 확인
    private int blockLoop=0;//움직일 블럭 확인
 
    void Start () {
        //적 처음 위치 저장
        enermyposition = enermy.transform.position;
        //움직임 준비
        ani = hero.GetComponent<tk2dSpriteAnimator>();
        ani2 = enermy.GetComponent<tk2dSpriteAnimator>();
        //블럭 위치 준비
        setposition = block0.transform.position;
        seeposition.Set(-9.4f, -0.96f, 0);
        
    }
    //버튼 준비
    private void OnGUI()
    {
        //버튼 영역 설정
        GUILayout.BeginArea(new Rect(1000300300));
        //자동 전투 시작버튼
        if (GUILayout.Button("Go!GO!", GUILayout.Width(200), GUILayout.Height(50)))
        {
            StartCoroutine(Auto());
        }
        //중단 버튼
        if (GUILayout.Button("Stop", GUILayout.Width(200), GUILayout.Height(50)))
        {
            ani.Play("Hero_Idle");
            checkClick = false;
        }
        //재시작 버튼
        if (GUILayout.Button("ReStart", GUILayout.Width(200), GUILayout.Height(50)))
        {
            checkClick = true;
            StartCoroutine(Auto());
        }
        //버튼 영역 끝
        GUILayout.EndArea();
    }
 
    //코루틴 시작
    IEnumerator Auto()
    {
        //중단버튼 클릭 확인후 반복
        while (checkClick)
        {
            //적과 아군 거리
            var dis = Vector3.Distance(this.enermy.transform.position, this.hero.transform.position);
            if (hp == 0)//적 체력이 0일때
            {
                //2초 대기
                yield return new WaitForSeconds(2);
                //포지션 재설정
                enermy.transform.position = enermyposition;
                //준비자세
                ani2.Play("Hero_Idle");
                //체력 재설정
                hp = 10;
            }
            //거리가 가까워지면 작동
            else if (dis <= 1)
            {
                hp--;//체력 감소
                ani.Play("Hero_Attack");//때리는 동작
                //히트동작 대기
                yield return new WaitForSeconds(0.231f);
                //히트동작에 메시지 출력
                Debug.Log("!!!!! 적의 남은체력은 <color=red>" + hp+"</color>");
                //체력이 없게되면 죽는동작 실행
                if (hp == 0) ani2.Play("Hero_Die");
                //때리는 동작 끝나는것을 대기
                yield return new WaitForSeconds(0.170f);
            }
            else
            {
                //달리는 동작
                ani.Play("Hero_Run");
                //움직임 속도 
                var step = 1 * Time.deltaTime;
                //블럭 이동거리 측정
                checkMove += step;
                //블럭 이동거리가 조건에 충족할떄
                if (checkMove >= 2.8)
                { //블럭 위치 재설정
                    switch (blockLoop)
                    {
                        case 0:
                            {
                                checkMove = 0;
                                block5.transform.position = setposition;
                                blockLoop++;
                                break;
                            }
                        case 1:
                            {
                                checkMove = 0;
                                block4.transform.position = setposition;
                                blockLoop++;
                                break;
                            }
                        case 2:
                            {
                                checkMove = 0;
                                block3.transform.position = setposition;
                                blockLoop++;
                                break;
                            }
                        case 3:
                            {
                                checkMove = 0;
                                block2.transform.position = setposition;
                                blockLoop++;
                                break;
                            }
                        case 4:
                            {
                                checkMove = 0;
                                block1.transform.position = setposition;
                                blockLoop++;
                                break;
                            }
                        case 5:
                            {
                                checkMove = 0;
                                block0.transform.position = setposition;
                                blockLoop = 0;
                                break;
                            }
                        defaultbreak;
                    }
                }
                //적 및 블럭들 이동을 시킴
                this.enermy.transform.position = Vector3.MoveTowards(enermy.transform.position, hero.transform.position, step);
                this.block0.transform.position = Vector3.MoveTowards(block0.transform.position, seeposition, step);
                this.block1.transform.position = Vector3.MoveTowards(block1.transform.position, seeposition, step);
                this.block2.transform.position = Vector3.MoveTowards(block2.transform.position, seeposition, step);
                this.block3.transform.position = Vector3.MoveTowards(block3.transform.position, seeposition, step);
                this.block4.transform.position = Vector3.MoveTowards(block4.transform.position, seeposition, step);
                this.block5.transform.position = Vector3.MoveTowards(block5.transform.position, seeposition, step);
            }
 
            //한프레임 쉼
            yield return null;
 
        }
 
    }
}
cs