Unity_개발일지_29

홍신영·2024년 11월 29일

Unity

목록 보기
31/69

오늘은 퍼즐에서 많이 사용되는 3블럭이 모이면 터지고 사라지는 부분을 구현할 예정이다.

목표를 정하고 구현해보자.
1. 퍼즐 클래스 만들어서 퍼즐 정보넣기
2. 같은 색상의 퍼즐이 3개가 닿으면 파괴되는 클래스

  1. 퍼즐정보에는 들어갈 색상
public class Puzzle : MonoBehaviour
{
    //퍼즐 기본 정보클래스
    public Color puzzleColor;
}
  1. 여기부터는 세부적으로 나누어 보자.
    2-1. layerMask를 이용해서 puzzle레이어 끼리만 충돌 시 효과가 발생하도록
    2-2. 퍼즐끼리 충돌 시 3개 이상이여야 하니, 퍼즐을 담을 list를 만들어 충돌 시 add로 추가하기
    2-3. list담기전에 퍼즐의 색상 비교하기
    2-4. 닿은 오브젝트 중복 검사하여 리스트에 추가하기
    2-5. 닿으면 자신과 닿아있어 리스트에 추가된 오브젝트 파괴, 리스트 초기화

정도로 나누어 보았다.
이를 구현해보자.

/*같은 색상의 퍼즐이 3개 이상 닿으면 파괴하는 클래스 */

[SerializeField] private LayerMask puzzleLayer;

private List<GameObject> collidingPuzzles = new List<GameObject>();
private Puzzle puzzle;

private void Awake()
{
    puzzle = GetComponent<Puzzle>();
}


// 퍼즐 레이어가 3개이상 충돌하면 파괴
private void OnCollisionEnter(Collision collision)
{
    if (((1 << collision.gameObject.layer) & puzzleLayer) != 0)
    {
        Puzzle otherPuzzle = collision.gameObject.GetComponent<Puzzle>();
        if(otherPuzzle != null && otherPuzzle.puzzleColor == puzzle.puzzleColor) //색상비교
        {
            //충돌한 퍼즐이 이미 리스트에 추가되었는지 검사
            if (!collidingPuzzles.Contains(collision.gameObject))
            {
                collidingPuzzles.Add(collision.gameObject);
            }

            if (collidingPuzzles.Count >= 2) //자기자신은 제외한 수
            {
                DestroyAllPuzzles();
            }
        }
    }
}

//퍼즐이 충돌에서 빠지면 리스트에서 삭제
private void OnCollisionExit(Collision collision)
{
    if (collidingPuzzles.Contains(collision.gameObject))
    {
        collidingPuzzles.Remove(collision.gameObject);
    }
}

//리스트에 있는 오브젝트 모두 파괴,자기자신 파괴 및 리스트 초기화
private void DestroyAllPuzzles()
{
    foreach (GameObject puzzle in collidingPuzzles)
    {
        Destroy(puzzle);
    }
    collidingPuzzles.Clear();
    Destroy(gameObject);
}

변경해야될 부분은 puzzle 상위 클래스를 만들고 공통부분은 구현하고, 하위 클래스로 상속받아 확장성을 넓히는 방법으로 리펙토링 해야 할 것같다.

profile
게임 클라이언트 개발자 / 게임 QA

0개의 댓글