게임프로젝트/애니팡 모작

블럭 랜덤 생성하기

pudding81 2024. 5. 13. 16:58

 

블럭 컨트롤러

- 블럭에 랜덤 스프라이트 적용

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using static Unity.Collections.AllocatorManager;

public enum BlockName
{
   Chick, Bear,Cat,Monkey, Mouse, Pig, Rabbit
}

public class BlockController : MonoBehaviour
{
    BlockName blockName;

    
    SpriteRenderer spriteRenderer;
    public Sprite[] sprites;

    // 열거형 BlockName에 포함된 모든 블록 이름을 배열에 저장
    private BlockName[] blockNames = (BlockName[])System.Enum.GetValues(typeof(BlockName));


    
    public BlockName selectedAnimal; // 사용자가 선택한 동물을 저장할 변수







    void Start()
    {
        // 스프라이트의 이름을 기반으로 블록 이름을 설정합니다.
        blockName = GetSpriteName();

        spriteRenderer = GetComponent<SpriteRenderer>();

       

        // 스프라이트의 이름을 기반으로 블록 이름을 설정합니다.
        switch (GetComponent<SpriteRenderer>().sprite.name)
        {
            case "Chick":
                blockName = BlockName.Chick;
                break;
            case "Bear":
                blockName = BlockName.Bear;
                break;
            case "Cat":
                blockName = BlockName.Cat;
                break;
            case "Monkey":
                blockName = BlockName.Monkey;
                break;
            case "Mouse":
                blockName = BlockName.Mouse;
                break;
            case "Pig":
                blockName = BlockName.Pig;
                break;
            case "Rabbit":
                blockName = BlockName.Rabbit;
                break;
           
        }


       
        // 블록의 스프라이트를 랜덤으로 설정합니다.
        SetRandomSprite();

    }



   
    // 선택된 동물에 해당하는 스프라이트로 설정하는 함수
    private void SetSprite(string animalName)
    {
        // 스프라이트 이름에 해당하는 스프라이트로 설정합니다.
        foreach (Sprite sprite in sprites)
        {
            if (sprite.name == animalName)
            {
                spriteRenderer.sprite = sprite;
                break;
            }
        }
    }



    // 랜덤으로 스프라이트를 설정하는 함수
    public void SetRandomSprite()
    {
        if (spriteRenderer != null && sprites.Length > 0)
        {
            // 현재 선택된 스프라이트 리스트를 만듭니다.
            List<Sprite> availableSprites = new List<Sprite>(sprites);

            // 선택된 스프라이트가 기존에 선택된 스프라이트와 겹치지 않도록 반복해서 선택합니다.
            while (true)
            {
                // 랜덤으로 인덱스 선택
                int randomIndex = Random.Range(0, availableSprites.Count);
                Sprite randomSprite = availableSprites[randomIndex];

                // 이미 선택된 스프라이트와 겹치지 않는 경우 스프라이트를 설정하고 종료합니다.
                if (!IsSpriteOverlap(randomSprite))
                {
                    spriteRenderer.sprite = randomSprite;
                    break;
                }
                // 겹치는 경우 선택된 스프라이트 리스트에서 제거합니다.
                else
                {
                    availableSprites.RemoveAt(randomIndex);
                    // 만약 모든 스프라이트가 이미 선택되어 겹치는 경우, 무한루프를 빠져나갑니다.
                    if (availableSprites.Count == 0)
                    {
                        Debug.LogWarning("모든 스프라이트가 이미 선택되어 겹칩니다.");
                        break;
                    }
                }
            }
        }
        else
        {
            Debug.LogError("SpriteRenderer component is not attached or sprites array is empty!");
        }
    }

    // 이미 선택된 스프라이트와 겹치는지 확인하는 함수
    private bool IsSpriteOverlap(Sprite newSprite)
    {
        // 현재 스프라이트
        Sprite currentSprite = spriteRenderer.sprite;

        // 현재 스프라이트가 없거나 새로운 스프라이트가 없으면 겹치지 않는 것으로 판단합니다.
        if (currentSprite == null || newSprite == null)
        {
            return false;
        }

        // 현재 스프라이트와 새로운 스프라이트가 같은 경우 겹치는 것으로 판단합니다.
        if (currentSprite == newSprite)
        {
            return true;
        }

        // 이 외의 경우 겹치지 않는 것으로 판단합니다.
        return false;
    }




    public BlockName GetSpriteName()
    {
        // SpriteRenderer가 있을 때 현재 스프라이트의 이름을 확인하고 해당하는 BlockName 멤버를 반환합니다.
        if (spriteRenderer != null && spriteRenderer.sprite != null)
        {
            string spriteName = spriteRenderer.sprite.name;

            // 스프라이트의 이름에 따라 해당하는 BlockName 멤버를 반환합니다.
            switch (spriteName)
            {
                case "Chick":
                    return BlockName.Chick;

                case "Bear":
                    return BlockName.Bear;

                case "Cat":
                    return BlockName.Cat;

                case "Monkey":
                    return BlockName.Monkey;

                case "Mouse":
                    return BlockName.Mouse;

                case "Pig":
                    return BlockName.Pig;

                case "Rabbit":
                    return BlockName.Rabbit;

                default:
                    // 모든 경우에 대해 값을 반환하도록 수정
                    return BlockName.Chick; // 예시로 기본값으로 Chick을 반환하거나, 다른 처리 방법 선택 가능
            }
        }

        // 스프라이트가 없을 경우에는 기본값을 반환하거나 예외 처리 등을 수행할 수 있습니다.
        return BlockName.Chick; // 기본값으로 Chick을 반환하도록 설정합니다.

      

    }



}

 

 

보드 

 

- 보드, 셀, 블럭 생성

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using static Unity.Collections.AllocatorManager;


public class TBoard2 : MonoBehaviour
{
    public int rowCount = 7;
    public int colCount = 7;
    public GameObject cellPrefab; // 셀 프리팹
    public GameObject blockPrefab; // 블록 프리팹
   

    private GameObject[] blockPrefabs; // 블록 프리팹

    private GameObject[,] cells;
    private GameObject[,] blocks;
   


    string spriteName;
  

    public BlockController blockController;

  

    private void Start()
    {


        // 보드, 셀, 블록 생성
        CreateBoard();
        CreateCells();
        CreateBlocks();
      

    }

    private void CreateBoard()
    {
        // 보드 생성 및 설정
      //  GameObject boardObject = new GameObject("Board");
        this.transform.position = Vector2.zero;

    }

    private void CreateCells()
    {
        cells = new GameObject[rowCount, colCount];

        // 셀 생성 및 이차원 배열에 할당
        for (int row = 0; row < rowCount; row++)
        {
            for (int col = 0; col < colCount; col++)
            {
                // 각 셀의 위치 계산
                Vector2 cellPosition = new Vector2(col, row); // 2D 벡터 사용

                // 셀 생성
                GameObject cellObject = Instantiate(cellPrefab, cellPosition, Quaternion.identity);

                // 보드판의 자식으로 설정
                cellObject.transform.parent = transform;

                // 이차원 배열에 할당
                cells[row, col] = cellObject;
            }
        }
    }

    // 스프라이트 이름을 BlockName으로 변환하는 메서드
    private BlockName GetBlockNameFromSpriteName(string spriteName)
    {
        switch (spriteName)
        {
            case "Chick":
                return BlockName.Chick;
            case "Bear":
                return BlockName.Bear;
            case "Cat":
                return BlockName.Cat;
            case "Monkey":
                return BlockName.Monkey;
            case "Mouse":
                return BlockName.Mouse;
            case "Pig":
                return BlockName.Pig;
            case "Rabbit":
                return BlockName.Rabbit;
                
            default:
                return BlockName.Chick; // 기본값으로 Chick을 반환하거나 다른 처리 방법을 선택하세요.
        }
    }



    
    private void CreateBlocks()
    {
        blocks = new GameObject[rowCount, colCount];

        // 블록 생성 및 연속된 블록 확인
        MakeBlock();

       


    }

    private void MakeBlock()
    {
        // 블록 생성 및 이차원 배열에 할당
        for (int row = 0; row < rowCount; row++)
        {
            for (int col = 0; col < colCount; col++)
            {
                // 각 블록의 위치 계산
                Vector2 blockPosition = cells[row, col].transform.position;

                // 블록 생성
                GameObject blockObject = Instantiate(blockPrefab, blockPosition, Quaternion.identity);


                BlockController blockController = FindObjectOfType<BlockController>();




                // 보드판의 자식으로 설정
                blockObject.transform.parent = transform;

                // 스프라이트 이름을 BlockName으로 설정


                string spriteName = blockObject.GetComponent<SpriteRenderer>().sprite.name;
                // 블록의 스프라이트를 랜덤으로 설정합니다.
                
                BlockName blockName = GetBlockNameFromSpriteName(spriteName);

                // 이차원 배열에 할당
                blocks[row, col] = blockObject;





            }
        }

      

    }


   




   

}