Yang.공부방

프로토타입..언제 마무리하지...unitypackage

오늘 한 작업

길찾기 보완 (타겟과 가장 가까운 캐릭터 vec2값 넣어주기)

건물 짓는 곳 제한

캐릭터 이동모션 ( idle을 안하는거 보완...해야함)


앞으로 해야 할 작업

1. 캐릭터 랜덤타일 찾아서 움직이기

2. 길찾기 조금더 보완하기

3. 건물 클릭하면 UI창 뜨기


코드 정리랑.. 아직 구현 못한것들 해야하는데...




TestNearCharacter.unitypackage



추가할 것 : 이동방향 바라보기, 이미 건물로 갔던 캐릭터의 경로 재설정



프로토타입.unitypackage




빌딩 생성 후 갈 수 없게 완성

보완할 점 : 특정 구간에서 길 찾는 게 어색함 , 타일 위에 이미 빌딩이 있다면 건설 못하게 해야 함

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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
 
public class TestIsometric_4 : MonoBehaviour
{
    public Button moveBtn;
    public Button buildingBtn;
    public int colCount, rowCount;
    public Vector2 startPos;
 
    private GameObject mapTile;
    private Coroutine routine;
    private int tileWidth = 64;
    private int tileHeight = 32;
    private int col = 0//행
    private int row = 0//열
 
    private GameObject character;
    private GameObject building;
    private GameObject motherNode;
    private GameObject targetNode;
    private GameObject selectedTile;
 
    private Dictionary<Vector2, GameObject> dicFIndTile = new Dictionary<Vector2, GameObject>();
    private List<GameObject> closeList = new List<GameObject>();
    private List<GameObject> movePositionList = new List<GameObject>();
    
    void Start()
    {
        this.CreateCharacter();
        this.CreateMap();
        this.TileCheck();
 
        this.moveBtn.onClick.AddListener(() =>
        {
            this.FIndNextPos();
        });
        this.buildingBtn.onClick.AddListener(() =>
        {
            this.Createbuilding();
        });
    }
 
    void TileCheck()
    {
        if (this.routine != null)
        {
            StopCoroutine(this.routine);
        }
        this.routine = StartCoroutine(this.TileCheckImpl());
    }
 
    IEnumerator TileCheckImpl()
    {
        while (true)
        {
            if (Input.GetMouseButtonDown(0))
            {
                Vector2 worldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
 
                RaycastHit2D hit = Physics2D.Raycast(worldPos, Vector2.zero);
 
                if (hit.collider != null && !hit.collider.GetComponent<TestTile>().isBlock)
                {
                    this.ClearMap();
                    this.targetNode = hit.collider.gameObject;
                    hit.collider.GetComponent<SpriteRenderer>().color = Color.cyan;
                }
            }
            yield return null;
        }
    }
    public void Createbuilding()
    {
        if (routine != null)
        {
            StopCoroutine(this.routine);
        }
        this.routine = StartCoroutine(this.CreatebuildingImpl());
    }
 
    private IEnumerator CreatebuildingImpl()
    {
        var building = Instantiate(Resources.Load<GameObject>("Prefabs/isoTile"));
 
        while (true)
        {
            Vector2 ray = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            RaycastHit2D hit = Physics2D.Raycast(ray, Vector2.zero);
            building.transform.position = ray;
 
            if (Input.GetMouseButtonDown(0))
            {
                if (hit.collider != null)
                {
                    hit.collider.gameObject.GetComponent<TestTile>().isBlock = true;
                    
                    building.transform.position = hit.collider.gameObject.transform.position;
                    break;
                }
            }
            yield return null;
        }
 
        this.TileCheck();
    }
 
    private void FIndNextPos()
    {
        if (this.routine != null)
        {
            StopCoroutine(this.routine);
        }
        this.routine = StartCoroutine(this.FindNextPosImpl());
    }
 
    private IEnumerator FindNextPosImpl()
    {
        while (true)
        {
            var dir = (this.motherNode.transform.position - this.character.transform.position).normalized;
            var nextNode = Vector2.Distance(this.character.transform.position, this.motherNode.transform.position);
            var distance = Vector2.Distance(this.character.transform.position, this.targetNode.transform.position);
 
            this.character.transform.position += dir * 2f * Time.deltaTime;
 
            if (nextNode <= 0.05f)
            {
                if (distance <= 0.05f)
                {
                    Debug.Log("도착");
 
                    this.TileCheck();
                    break;
                }
                
                this.FindNode();
                Debug.Log("다음");
            }
            yield return null;
        }
    }
 
    private void CharacterMovePoint()
    {
        var mother = this.motherNode.GetComponent<TestTile>().vec2;
        var data = this.character.GetComponent<TestTile>().vec2;
        var motherX = mother.x - 1;
        var motherY = mother.y - 1;
        var maxX = mother.x + 1;
        var maxY = mother.y + 1;
        
        if (data.x == motherX && data.y == mother.y)
        {
            //Debug.Log("오른쪽아래");
            this.character.GetComponent<Animator>().Play("hero_rightdown");
            //Debug.Log(data);
        }
        if (data.x == mother.x && data.y == maxY)
        {
            //Debug.Log("오른쪽위");
            this.character.GetComponent<Animator>().Play("hero_rightup");
            //Debug.Log(data);
        }
        if (data.x == maxX && data.y == mother.y)
        {
            //Debug.Log("왼쪽위");
            this.character.GetComponent<Animator>().Play("hero_leftup");
            //Debug.Log(data);
        }
        if (data.x == mother.x && data.y == motherY)
        {
            //Debug.Log("왼쪽아래");
            this.character.GetComponent<Animator>().Play("hero_leftdown");
            //Debug.Log(data);
        }
    }
 
    private void FindNode()
    {
        var mother = this.motherNode.GetComponent<TestTile>().vec2;
        var motherX = mother.x - 1;
        var motherY = mother.y - 1;
        var maxX = mother.x + 1;
        var maxY = mother.y + 1;
 
        this.character.GetComponent<TestTile>().vec2 = mother;
 
        if (motherX < 0)
        {
            motherX = 0;
        }
        if (motherY < 0)
        {
            motherY = 0;
        }
 
        for (int x = (int)motherX; x <= maxX; x++)
        {
            for (int y = (int)motherY; y <= maxY; y++)
            {
                if (x < this.colCount && y < this.rowCount)
                {
                    var data = new Vector2(x, y);
 
                    var tile = this.dicFIndTile[data];
 
                    if (tile.GetComponent<TestTile>().isBlock != true && !this.closeList.Contains(tile))
                    {
                        if (data.x == motherX && data.y == mother.y || data.y == mother.y)
                        {
                            this.movePositionList.Add(tile);
                        }
                        if (data.y == motherY && data.x == mother.x || data.x == mother.x)
                        {
                            this.movePositionList.Add(tile);
                        }
                        
                        this.movePositionList.Remove(motherNode);
                        this.closeList.Add(motherNode);
                        if (!this.closeList.Contains(tile))
                        {
                            tile.GetComponent<SpriteRenderer>().color = Color.grey;
                            this.SetFGH();
                        }
                    }
                }
            }
        }
        this.NextNode();
        this.CharacterMovePoint();
    }
    
    private void NextNode()
    {
        IEnumerable<GameObject> sortNode = this.movePositionList.OrderBy(x => x.GetComponent<TestTile>().f);
        this.selectedTile = sortNode.FirstOrDefault<GameObject>();
        this.motherNode = this.selectedTile;
        this.motherNode.GetComponent<SpriteRenderer>().color = Color.blue;
    }
    
    private void ClearMap()
    {
        Debug.Log("타일초기화");
 
        for (int i = 0; i < colCount; i++)
        {
            for (int j = 0; j < rowCount; j++)
            {
                var tiles = new Vector2(j, i);
 
                var tile = dicFIndTile[tiles];
 
                Debug.LogFormat("{0}       {1}", tile.GetComponent<TestTile>().isBlock, tiles);
 
                tile.GetComponent<SpriteRenderer>().color = Color.white;
            }
        }
        this.closeList.Clear();
        this.targetNode = null;
        this.selectedTile = null;
 
        this.movePositionList.Clear();
    }
 
 
    #region FGH 활성화 비활성화
    private void SetActiveFGH(GameObject tile)
    {
        if (!this.movePositionList.Contains(tile))
        {
            tile.GetComponent<TestTile>().G.gameObject.SetActive(false);
            tile.GetComponent<TestTile>().F.gameObject.SetActive(false);
            tile.GetComponent<TestTile>().H.gameObject.SetActive(false);
        }
        else
        {
            tile.GetComponent<TestTile>().G.gameObject.SetActive(true);
            tile.GetComponent<TestTile>().F.gameObject.SetActive(true);
            tile.GetComponent<TestTile>().H.gameObject.SetActive(true);
        }
    }
    #endregion
    private void SetFGH()
    {
        foreach (var tile in this.movePositionList)
        {
            var getG = tile.GetComponent<TestTile>().g;
            var getH = tile.GetComponent<TestTile>().h;
            getG = Mathf.Round(Vector2.Distance(tile.GetComponent<TestTile>().vec2, this.motherNode.GetComponent<TestTile>().vec2) * 10);
            var dx = Mathf.Abs(tile.GetComponent<TestTile>().vec2.x - this.targetNode.GetComponent<TestTile>().vec2.x);
            var dy = Mathf.Abs(tile.GetComponent<TestTile>().vec2.y - this.targetNode.GetComponent<TestTile>().vec2.y);
 
            getH = (dx + dy) * 10;
 
            tile.GetComponent<TestTile>().f = getG + getH;
        }
    }
 
    #region 맵, 타일 생성
    private void CreateCharacter()
    {
        if (this.character == null)
        {
            this.character = Instantiate(Resources.Load<GameObject>("Prefabs/hero"));
 
            this.CreatedCharacter(character, this.startPos.x, this.startPos.y);
        }
    }
 
    private void CreateMap()
    {
        while (true)
        {
            this.mapTile = Instantiate(Resources.Load<GameObject>("Prefabs/tile"));
 
            this.mapTile.tag = "Tile";
 
            this.mapTile.transform.SetParent(this.transform);
 
            this.CreatedMap(this.mapTile, this.col, row);
            this.dicFIndTile.Add(new Vector2(col, row), mapTile);
            this.col++;
 
            if (this.col >= this.colCount)
            {
                this.col = 0;
                this.row++;
            }
            if (this.row >= this.rowCount)
            {
                row = 0;
                break;
            }
        }
    }
 
    private void CreatedCharacter(GameObject character, float x, float y)
    {
        var vec2 = new Vector2(x, y);
 
        if (character.GetComponentInChildren<TextMesh>())
        {
            character.GetComponentInChildren<TextMesh>().text = string.Format("({0},{1})", x, y);
            this.SetActiveFGH(character);
        }
 
        character.AddComponent<TestTile>();
        character.GetComponent<TestTile>().vec2 = vec2;
 
        var screen = this.MapToScreen(vec2);
 
        var screenPos = Camera.main.ScreenToWorldPoint(new Vector2(screen.x + 512, screen.y + 384 + 100));
 
        character.transform.position = new Vector3(screenPos.x, screenPos.y, 0);
    }
 
    private void CreatedMap(GameObject tileMap, float x, float y)
    {
        var vec2 = new Vector2(x, y);
 
        if (tileMap.GetComponentInChildren<TextMesh>())
        {
            tileMap.GetComponentInChildren<TextMesh>().text = string.Format("({0},{1})", x, y);
            this.SetActiveFGH(tileMap);
        }
 
        if (vec2 == this.character.GetComponent<TestTile>().vec2)
        {
            this.motherNode = tileMap;
        }
 
        tileMap.AddComponent<TestTile>();
        tileMap.GetComponent<TestTile>().vec2 = vec2;
 
        var screen = this.MapToScreen(vec2);
 
        var screenPos = Camera.main.ScreenToWorldPoint(new Vector2(screen.x + 512, screen.y + 384 + 100));
 
        tileMap.transform.position = new Vector3(screenPos.x, screenPos.y, 0);
    }
 
    public Vector2 MapToScreen(Vector2 mapPos)
    {
        var screenX = mapPos.x * this.tileWidth - (mapPos.y * this.tileWidth);
        var screenY = mapPos.y * -tileHeight - (mapPos.x * tileHeight);
 
        return new Vector2(screenX, screenY);
    }
    #endregion
}
 
cs










[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
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
 
public class TestIsometric_MoveCharacter : MonoBehaviour
{
    public Button btn;
    public int colCount, rowCount;
    public Vector2 startPos;
 
    private GameObject mapTile;
    private Coroutine routine;
    private int tileWidth = 64;
    private int tileHeight = 32;
    private int col = 0//행
    private int row = 0//열
    
    private GameObject my;
    private GameObject motherNode;
    private GameObject targetNode;
    private GameObject selectedTile;
 
    private Dictionary<Vector2, GameObject> dicFIndTile = new Dictionary<Vector2, GameObject>();
    private List<GameObject> closeList = new List<GameObject>();
    private List<GameObject> movePositionList = new List<GameObject>();
 
    void Start()
    {
        this.CreateMap();
        this.CreateTile();
        this.TileCheck();
 
        this.btn.onClick.AddListener(() =>
        {
            this.FIndNextPos();
        });
    }
 
    void TileCheck()
    {
        if (this.routine != null)
        {
            StopCoroutine(this.routine);
        }
        this.routine = StartCoroutine(this.TileCheckImpl());
    }
 
    IEnumerator TileCheckImpl()
    {
        while (true)
        {
            if (Input.GetMouseButtonDown(0))
            {
                Vector2 worldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
 
                RaycastHit2D hit = Physics2D.Raycast(worldPos, Vector2.zero);
 
                if (hit.collider != null)
                {
                    this.ClearMap();
                    this.targetNode = hit.collider.gameObject;
                    hit.collider.GetComponent<SpriteRenderer>().color = Color.cyan;
                }
            }
            yield return null;
        }
    }
 
    private void FIndNextPos()
    {
        if (this.routine != null)
        {
            StopCoroutine(this.routine);
        }
        this.routine = StartCoroutine(this.FindNextPosImpl());
    }
 
    private IEnumerator FindNextPosImpl()
    {
        while (true)
        {
            var dir = (this.motherNode.transform.position - this.my.transform.position).normalized;
            var nextNode = Vector2.Distance(this.my.transform.position, this.motherNode.transform.position);
            var distance = Vector2.Distance(this.my.transform.position, this.targetNode.transform.position);
 
            this.my.transform.position += dir * 2f * Time.deltaTime;
 
            
            if (nextNode <= 0.05f)
            {
                if (distance <= 0.05f)
                {
                    Debug.Log("도착");
                    this.TileCheck();
                    break;
                }
                this.FindNode();
                Debug.Log("다음");
            }
            
            yield return null;
        }
        
    }
 
 
    private void FindNode()
    {
        var mother = this.motherNode.GetComponent<TestTile>().vec2;
 
        var motherX = mother.x - 1;
        var motherY = mother.y - 1;
        var maxX = mother.x + 1;
        var maxY = mother.y + 1;
 
        if (motherX < 0)
        {
            motherX = 0;
        }
        if (motherY < 0)
        {
            motherY = 0;
        }
 
        for (int x = (int)motherX; x <= maxX; x++)
        {
            for (int y = (int)motherY; y <= maxY; y++)
            {
                if (x < this.colCount && y < this.rowCount)
                {
                    var data = new Vector2(x, y);
 
                    var tile = this.dicFIndTile[data];
 
                    if (tile.GetComponent<TestTile>().isBlock != true && !this.closeList.Contains(tile))
                    {
 
                        if(data.x == motherX && data.y == mother.y || data.y == mother.y)
                        {
                            this.movePositionList.Add(tile);
                        }
                        if (data.y == motherY && data.x == mother.x || data.x == mother.x)
                        {
                            this.movePositionList.Add(tile);
                        }
                        
                        this.movePositionList.Remove(motherNode);
 
                        this.closeList.Add(motherNode);
                        if (!this.closeList.Contains(tile))
                        {
                            tile.GetComponent<SpriteRenderer>().color = Color.grey;
                            this.SetFGH();
                        }
                    }
                }
            }
        }
        
        this.NextNode();
    }
    
    private void NextNode()
    {
        IEnumerable<GameObject> sortNode = this.movePositionList.OrderBy(x => x.GetComponent<TestTile>().f);
        this.selectedTile = sortNode.FirstOrDefault<GameObject>();
        this.motherNode = this.selectedTile;
        this.motherNode.GetComponent<SpriteRenderer>().color = Color.blue;
    }
 
    private void ClearMap()
    {
        Debug.Log("타일초기화");
 
        for (int i = 0; i < colCount; i++)
        {
            for (int j = 0; j < rowCount; j++)
            {
                var tiles = new Vector2(j, i);
 
                var tile = dicFIndTile[tiles];
                
                tile.GetComponent<SpriteRenderer>().color = Color.white;
            }
        }
        this.closeList.Clear();
        this.targetNode = null;
        this.selectedTile = null;
 
        this.movePositionList.Clear();
    }
 
 
    #region FGH 활성화 비활성화
    private void SetActiveFGH(GameObject tile)
    {
        if (!this.movePositionList.Contains(tile))
        {
            tile.GetComponent<TestTile>().G.gameObject.SetActive(false);
            tile.GetComponent<TestTile>().F.gameObject.SetActive(false);
            tile.GetComponent<TestTile>().H.gameObject.SetActive(false);
        }
        else
        {
            tile.GetComponent<TestTile>().G.gameObject.SetActive(true);
            tile.GetComponent<TestTile>().F.gameObject.SetActive(true);
            tile.GetComponent<TestTile>().H.gameObject.SetActive(true);
        }
    }
    #endregion
    
    private void SetFGH()
    {
        foreach (var tile in this.movePositionList)
        {
            var getG = tile.GetComponent<TestTile>().g;
            var getH = tile.GetComponent<TestTile>().h;
            getG = Mathf.Round(Vector2.Distance(tile.GetComponent<TestTile>().vec2, this.motherNode.GetComponent<TestTile>().vec2) * 10);
            var dx = Mathf.Abs(tile.GetComponent<TestTile>().vec2.x - this.targetNode.GetComponent<TestTile>().vec2.x);
            var dy = Mathf.Abs(tile.GetComponent<TestTile>().vec2.y - this.targetNode.GetComponent<TestTile>().vec2.y);
 
            getH = (dx + dy) * 10;
 
            tile.GetComponent<TestTile>().f = getG + getH;
        }
    }
 
    #region 맵, 타일 생성
    private void CreateTile()
    {
        if (this.my == null)
        {
            this.my = Instantiate(Resources.Load<GameObject>("hero"));
 
            this.CreatedTileMap(my, this.startPos.x, this.startPos.y);
        }
    }
 
    private void CreateMap()
    {
        while (true)
        {
            this.mapTile = Instantiate(Resources.Load<GameObject>("tile"));
 
            this.mapTile.tag = "Tile";
 
            this.mapTile.transform.SetParent(this.transform);
 
            this.CreatedTileMap(this.mapTile, this.col, row);
            this.dicFIndTile.Add(new Vector2(col, row), mapTile);
            this.col++;
 
            if (this.col >= this.colCount)
            {
                this.col = 0;
                this.row++;
            }
            if (this.row >= this.rowCount)
            {
                row = 0;
                break;
            }
        }
    }
 
    private void CreatedTileMap(GameObject tileMap, float x, float y)
    {
        var vec2 = new Vector2(x, y);
 
        if (tileMap.GetComponentInChildren<TextMesh>())
        {
            tileMap.GetComponentInChildren<TextMesh>().text = string.Format("({0},{1})", x, y);
            this.SetActiveFGH(tileMap);
        }
 
        if (tileMap == this.my)
        {
            this.motherNode = tileMap;
        }
 
        tileMap.AddComponent<TestTile>();
        tileMap.GetComponent<TestTile>().vec2 = vec2;
 
        var screen = this.MapToScreen(vec2);
 
        var screenPos = Camera.main.ScreenToWorldPoint(new Vector2(screen.x + 512, screen.y + 384 + 100));
 
        tileMap.transform.position = new Vector3(screenPos.x, screenPos.y, 0);
    }
 
    public Vector2 MapToScreen(Vector2 mapPos)
    {
        var screenX = mapPos.x * this.tileWidth - (mapPos.y * this.tileWidth);
        var screenY = mapPos.y * -tileHeight - (mapPos.x * tileHeight);
 
        return new Vector2(screenX, screenY);
    }
    #endregion
}
 
cs