게임프로젝트/애니팡 모작
블럭 랜덤 생성하기
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;
}
}
}
}