유니티 로그라이크 방 타입에 맞는 오브젝트 생성Unity/Study2023. 12. 21. 21:08
Table of Contents
로그라이크 방 오브젝트 생성
- 방이 생성될 때 해당 방 타입에 맞는 오브젝트 생성 [아이템, 장애물, 적]
기능 구현
RoomBlueprint.cs
[CreateAssetMenu(fileName = "RoomBlueprint", menuName = "Blueprint/Room")]
public class RoomBlueprint : ScriptableObject
{
[SerializeField] private Sprite floor;
[SerializeField] private bool isReward;
[Header("Object Position")]
[SerializeField] private Vector2 rewardPosition;
[SerializeField] private List<PairWithObjectVector2> obstacleList = new();
[SerializeField] private List<PairWithObjectVector2> itemList = new();
[SerializeField] private List<PairWithObjectVector2> enemyList = new();
public Sprite Floor => floor;
public bool IsReward => isReward;
public Vector2 RewardPosition => rewardPosition;
public List<PairWithObjectVector2> ObstacleList => obstacleList;
public List<PairWithObjectVector2> ItemList => itemList;
public List<PairWithObjectVector2> EnemyList => enemyList;
}
- floor : 방의 바닥 이미지를 나타낼 Sprite
- isReward : 보상이 있는 방인지 여부를 나타내는 bool 필드값
- rewardPosition : 보상 생성 위치 Vector2 좌표
- PairWithObjectVector2 : Vector2 좌표와 관련된 오브젝트를 매핑하기 위한 간단한 클래스
- obstacleList : 장애물에 대한 정보를 담은 리스트
- itemList : 아이템에 대한 정보를 담은 리스트
- enemyList : 적에 대한 정보를 담은 리스트
Room.cs
/// <summary>
/// 방 내부의 콘텐츠 생성 => 장애물, 아이템, 적
/// </summary>
public void GenerateRoomContents(float delaySecond)
{
isArrived = true;
StartCoroutine(DelayGenerateRoom(delaySecond));
}
/// <summary>
/// 방 딜레이 생성
/// </summary>
/// <param name="delaySecond">딜레이 시간</param>
/// <returns></returns>
private IEnumerator DelayGenerateRoom(float delaySecond)
{
for (int i = 0; i < roomBlueprint.ObstacleList.Count; i++)
{
GenerateObject(roomBlueprint.ObstacleList[i].value1, roomBlueprint.ObstacleList[i].value2, objectContainer);
}
for (int i = 0; i < roomBlueprint.ItemList.Count; i++)
{
GenerateObject(roomBlueprint.ItemList[i].value1, roomBlueprint.ItemList[i].value2, objectContainer);
}
for (int i = 0; i < roomBlueprint.EnemyList.Count; i++)
{
GenerateObject(roomBlueprint.EnemyList[i].value1, roomBlueprint.EnemyList[i].value2, enemyContainer);
}
CheckRoomClear();
}
- GenerateRoomContents : 방 내부의 콘텐츠를 생성하는 메서드
- isArrived를 true로 설정하여 방에 도착했음을 나타낸다
- DelayGenerateRoom 코루틴을 시작한다
- DelayGenerateRoom : 방 생성을 지연시키는 코루틴
- roomBlueprint의 ObstacleList, ItemList, EnemyList에 정의된 콘텐츠를 순회
- GenerateObject 메서드를 통해 오브젝트를 해당 위치에 호출하여 생성한다
- objectContainer & enemyContainer는 생성된 오브젝트가 배치될 컨테이너를 나타낸다
방 클리어 조건 체크
/// <summary>
/// 방 클리어 조건 체크
/// </summary>
public void CheckRoomClear()
{
StartCoroutine(DelayCheck());
}
private IEnumerator DelayCheck()
{
yield return null;
// 적이 없고, 방이 클리어가 아닌 상태일 경우
// 잠겨있던 문 활성화, 체크시 보상까지 추가
if (enemyContainer.childCount == 0 && !isCleared)
{
OpenActivatedDoor();
if (roomBlueprint.IsReward)
{
RoomClearReward();
}
isCleared = true;
}
}
- CheckRoomClear : 방 클리어 됐는지 확인하는 메서드
- DelayCheck : 한 프레임 대기한 후 클리어 조건을 확인한다
- enemyContainer에 적이 없고, 방이 아직 클리어되지 않은 상태이면 문을 활성화하고 보상 처리
- isCleared = true로 해당 방이 클리어되었음을 표시한다
구현 결과
'Unity > Study' 카테고리의 다른 글
Update 사용 없이 Coroutine으로 게임 진행 구현 (0) | 2024.06.14 |
---|---|
유니티 실시간 딜레이 계산 (0) | 2024.01.24 |
유니티 로그라이크 다음 방으로 이동 (0) | 2023.12.19 |
유니티 로그라이크 문으로 방 연결하기 (0) | 2023.12.18 |
유니티 로그라이크 방 생성 (0) | 2023.12.15 |