오늘은 퍼즐에서 많이 사용되는 3블럭이 모이면 터지고 사라지는 부분을 구현할 예정이다.
목표를 정하고 구현해보자.
1. 퍼즐 클래스 만들어서 퍼즐 정보넣기
2. 같은 색상의 퍼즐이 3개가 닿으면 파괴되는 클래스
public class Puzzle : MonoBehaviour
{
//퍼즐 기본 정보클래스
public Color puzzleColor;
}
정도로 나누어 보았다.
이를 구현해보자.
/*같은 색상의 퍼즐이 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 상위 클래스를 만들고 공통부분은 구현하고, 하위 클래스로 상속받아 확장성을 넓히는 방법으로 리펙토링 해야 할 것같다.