Unity/Study

유니티 로그라이크 방 타입에 맞는 오브젝트 생성

홍삼맛 2023. 12. 21. 21:08

로그라이크 방 오브젝트 생성

  • 방이 생성될 때 해당 방 타입에 맞는 오브젝트 생성 [아이템, 장애물, 적]

기능 구현

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로 해당 방이 클리어되었음을 표시한다

구현 결과

 

생성된 방에서 전투와 보상을 적용