[유니티]탑다운 슈팅 따라하기 #9 장애물 배치
- 게임 개발 - Unity3d
- 2020. 4. 3. 18:10
안녕하세요 유랑입니다.
실력향상을 위해서 오늘은 유튜브를 따라하면서 공부하겠습니다.
궁금하신점 있으시다면 댓글로 남겨주세요^^
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 장애물 배치