[유니티]탑다운 슈팅 따라하기 #9 장애물 배치

안녕하세요 유랑입니다.

 

 

실력향상을 위해서 오늘은 유튜브를 따라하면서 공부하겠습니다.

궁금하신점 있으시다면 댓글로 남겨주세요^^

 

 

 

1. 탑다운 슈팅 따라하기

 

 

이번 강의는 Sebastian Lague님께서 만든 예제이며,

유튜브를 보시면 자세한 내용을 배우실 수 있습니다.

 

유튜브 사이트 => 유튜브 

 

 

 

유니티 슈팅

 

 

 

1-1) 장애물 배치

 

 

이번 시간에는 장애물을 배치해 보겠습니다.

그러기 위해서 셔플 알고리즘을 사용할텐데요.

흔히 노래 재생할 때도 이 방법을 사용합니다.

랜덤으로 뽑고, 뽑은 값을 별도의 리스트에 추가 이걸 반복합니다.

 

 

 

유니티 슈팅

 

 

 

1-2) 스크립트 작성 -㉠Utility

 

 

Utility 스크립트를 만든 후 셔플 알고리즘을 작성해 주겠습니다.

제너릭 구조이며, 리스트와 시드 값을 받으면 

값을 섞어 결과를 반환해 줍니다.

 

 

 

유니티 슈팅

 

 

 

1-3) 스크립트 작성 -㉡MapGenerator

 

 

MapGenerator 스크립트에 셔플 값을 이용해 장애물을 생성해 주겠습니다.

 

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class MapGenerator : MonoBehaviour
{
    public Transform tilePrefab; // 타일 프리팹
    public Transform obstaclePrefab; // 장애물 프리팹
    public Vector2 mapSize; // 맵 사이즈

    [Range(0, 1)]
    public float outlinePercent; // 테두리 영역

    List<Coord> allTileCoords; // 모든 좌표 리스트
    Queue<Coord> shuffledTileCoords; // 셔플된 좌표 리스트

    public int seed = 10; 

    void Start()
    {
        GenerateMap();
    }
    // 맵 생성
    public void GenerateMap()
    {
        allTileCoords = new List<Coord>();
        for (int x = 0; x < mapSize.x; x++)
        {
            for (int y = 0; y < mapSize.y; y++)
            {
                allTileCoords.Add(new Coord(x, y)); // 좌표 리스트 추가
            }
        }
        shuffledTileCoords = new Queue<Coord>(Utility.ShuffleArray(allTileCoords.ToArray(),seed));

        string holderName = "Generated Map";
        if (transform.Find(holderName))
        {
            DestroyImmediate(transform.Find(holderName).gameObject);
        }

        Transform mapHolder = new GameObject(holderName).transform;
        mapHolder.parent = transform;

        for (int x = 0; x < mapSize.x; x++)
        {
            for (int y = 0; y <mapSize.y; y++)
            {
                Vector3 tilePosition = new Vector3(-mapSize.x / 2 + 0.5f + x, 0, -mapSize.y/2 + 0.5f + y); // 타일 위치 설정
                Transform newTile = Instantiate(tilePrefab, tilePosition, Quaternion.Euler(Vector3.right * 90)); // 타일 생성
                newTile.localScale = Vector3.one * (1 - outlinePercent); // 테두리 영역 설정
                newTile.parent = mapHolder; // 부모 설정
            }
        }
        int obstacleCount = 10;
        for (int i = 0; i < obstacleCount; i++)
        {
            Coord randomCoord = GetRandomCoord();
            Vector3 obstaclePosition = CoordToPosition(randomCoord.x, randomCoord.y);
            Transform newObstacle = Instantiate(obstaclePrefab, obstaclePosition + Vector3.up * 0.5f, Quaternion.identity);
            newObstacle.parent = mapHolder;
        }
    }
    // Coord를 Vector3로 변환
    Vector3 CoordToPosition(int x, int y)
    {
        return new Vector3(-mapSize.x / 2 + 0.5f + x, 0, -mapSize.y / 2 + 0.5f + y);
    }
    // 랜덤 좌표 반환
    public Coord GetRandomCoord()
    {
        Coord randomCoord = shuffledTileCoords.Dequeue();
        shuffledTileCoords.Enqueue(randomCoord);
        return randomCoord;
    }

    public struct Coord
    {
        public int x;
        public int y;

        public Coord(int _x, int _y)
        {
            x = _x;
            y = _y;
        }
    }
}

 

 

기존 타일 좌표 리스트와 셔플된 리스트를 따로 구별하기 위해 만들었습니다.

이 때 리스트와 큐 형태로 만들었는데, 문법이 어려울 수 있으니 잘 따라와주세요.

 

 

 

유니티 슈팅

 

 

우선 맵이 생성될 때 좌표값을 리스트에 추가한 후

셔플시켜줍니다.

그리고 이 좌표값을 이용해 장애물을 생성해 주겠습니다.

 

 

유니티 슈팅

 

 

장애물 생성을 위해 좌표를 반환하는 코드도 추가해 줄게요^^

 

 

유니티 슈팅

 

 

장애물은 3dCube를 생성하여 만들어 주세요.

이름을 변경한 후 프리팹으로 만들어 주겠습니다.

 

 

유니티 슈팅

 

 

장애물 구별을 위해 머티리얼 적용을 꼭 해주세요.

 

 

유니티 슈팅

 

 

인스펙터 창에서 장애물 프리팹을 추가해 주세요.

 

 

유니티 슈팅

 

 

우리는 지난 시간에 에디터 상에서 맵 설정을 가능하도록 구현해 주었죠?!

그렇기에 Seed 값을 바꾸게되면 바로 수정된 장애물 위치로 보여지게 됩니다ㅎㅎ

 

 

유니티 슈팅

 

 

 

2. 마무리

 

 

오늘 강의는 여기까지입니다.

탑다운 슈팅을 따라하면서 장애물 배치를 해보았습니다.

감사합니다.

 

 

 

수업자료: 탑다운 슈팅 따라하기 #9 장애물 배치

 

 

 

 

 

 

 

 

 

댓글

Designed by JB FACTORY