Unity 개발일지/[Unity2D]졸업프로젝트

[Unity2D] 8. 아이템 상자 랜덤 생성

knhoo 2024. 1. 29. 02:32
728x90

2023.11.24 아이템 랜덤 생성

 

아이템 상자도 랜덤한 위치에 생성되어야 한다.

 

1. 아이템 상자로 사용할 프리펩을 생성

 

2. 기존에 작성한 MapGenerator 스크립트에 

아이템 생성 함수를 추가해주었다.

 

(이전글)

 

https://knhoo.tistory.com/entry/Unity2D-4-%EA%B4%91%EB%AC%BC-%EB%9E%9C%EB%8D%A4-%EC%83%9D%EC%84%B1

 

[Unity2D] 4. 광물 랜덤 생성

로그라이크 장르 특성에 맞게 플레이 할 때 마다 광물의 위치도 랜덤하게 조정해야한다. 기존에 작성한 MapGenerator스크립트에 추가했다. (이전 글) https://knhoo.tistory.com/entry/Unity2D-3-%EB%9E%9C%EB%8D%A4-%E

knhoo.tistory.com

 

 [SerializeField] private GameObject chest; //아이템 상자
 
 private RectInt GenerateRoom(Node tree,int n)
    {
        RectInt rect;
        if (n == maximumDepth) //해당 노드가 리프노드라면 방을 만들어 줄 것이다.
        {
           rect = tree.nodeRect;
           int width = Random.Range(rect.width/2,rect.width-1); 
           //방의 가로 최소 크기는 노드의 가로길이의 절반, 최대 크기는 가로길이보다 1 작게 설정한 후 그 사이 값중 랜덤한 값을 구해준다.
           int height=Random.Range(rect.height / 2,rect.height - 1);  
           int x = rect.x + Random.Range(1, rect.width - width);
           //방의 x좌표이다. 만약 0이 된다면 붙어 있는 방과 합쳐지기 때문에,최솟값은 1로 해주고, 최댓값은 기존 노드의 가로에서 방의 가로길이를 빼 준 값이다.
           int y = rect.y + Random.Range(1, rect.height - height);        
           rect = new RectInt(x, y, width, height);
           FillRoom(rect);
           
           //추가된 부분!!
           int item_per = Random.Range(1, 10);
           if (item_per > 5) 
                SpawnItem(rect);
        }
        else
        {
            tree.leftNode.roomRect = GenerateRoom(tree.leftNode,n+1);
            tree.rightNode.roomRect = GenerateRoom(tree.rightNode, n + 1);
            rect = tree.leftNode.roomRect;
        }
        return rect;
    }
    
            //추가된 함수!!
     private void SpawnItem(RectInt rect)
    {   int chest_x = Random.Range(rect.x, rect.x + rect.width);
        int chest_y = Random.Range(rect.y, rect.y + rect.height);
        
        Vector3 vec = new Vector3Int(chest_x - mapSize.x / 2, chest_y - mapSize.y / 2, 0);
        //아이템 상자 생성
        Instantiate(chest, vec, transform.rotation);

    }

기존의 코드에서 방을 만들 때

방의 좌표값을 받아와

방의 좌표값 내의 랜덤한 위치에서

아이템상자가 생성되는 방식이다.

 

아이템 상자에는 중력을 부여하여

게임이 실행되면 방 안의 랜덤 위치에(공중에) 생성되었다가

바닥으로 떨어지게 된다.

 

추후에는 처음부터 방의 바닥에서만

아이템 상자가 생성되도록 수정해볼 계획이다.

 


결과 화면

728x90