집게사장의 꿈

퍼즐 오브젝트의 Sort 정렬 본문

제작/한폭의 그림을 만들리

퍼즐 오브젝트의 Sort 정렬

Krapboss 2024. 6. 15. 21:14
문제

퍼즐을 클라이언트가 지정하고  진행을 위한 각 퍼즐 조각들을 정렬할 필요가 있었음

 

그에 대한 방법으로 Scene에서 Z 축을 기준으로 퍼즐 조각들이 될 오브젝트를 배치하고, 배치된 오브젝트의 Sort를 스크립트를 통해 정합니다.

 

규칙

 

Sorting 정렬 0~ -N
의 범위에서 오브젝트의 Sort를 지정
배경 배경이 되는 기본 틀이 되는 오브젝트는 맨 뒤에 위치함

 

 

퍼즐 배치의 예시

 

 

 

 

 

정렬

 

자식 오브젝트 중 PuzzleSortData를 찾아서 Z 축을 기준으로 정렬을 실시하여 순서를 지정한다.

using UnityEngine;
using System.Linq;

/// <summary>
/// 퍼즐 정렬을 위한 중간 데이터
/// </summary>
public class PuzzleSortContainer : MonoBehaviour
{
    [SerializeField] PuzzleSortData[] datas;

    private void Awake()
    {
        Destroy(this);
    }

    public void SortAllPuzzleData()
    {
        FindChildData();

        if (datas.Length < 1 || datas == null) { Debug.LogWarning("PuzzleData[] 존재하지 않습니다."); return; }

        //z 축을 기준으로 내림차순으로 정렬합니다. (- 값 일수록 카메라와 가까워짐)
        PuzzleSortData[] puzzleDatas =  (from data in datas
                                    orderby data.transform.position.z ascending // 오름차순
                                    select data).ToArray();

        int sorting = -1;
        foreach (PuzzleSortData data in puzzleDatas)
        {
            data.SetSort(sorting--);
        }

        Debug.Log($"1 : {puzzleDatas[0].name} / LAST  {puzzleDatas[puzzleDatas.Length - 1].name} PuzzleData Sort 정렬 완료");
    }


    //하위 데이터 초기화
    public void Initialize()
    {
        if (datas.Length < 1 || datas == null) { Debug.LogWarning("PuzzleData[] 존재하지 않습니다."); return; }

        foreach(PuzzleSortData data in datas)
        {
            data.SetInit();
        }

        datas = null;

        Debug.Log("하위 데이터 정렬 초기화");
    }

    public void FindChildData()
    {
        datas = GetComponentsInChildren<PuzzleSortData>();
    }
}

 

 

 

각 SortData 들은 자신의 Sort를 가지며, 하위 SpriteRenderer를 찾아 Sprite의 Sort를 지정합니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 퍼즐 정렬을 위한 개별 데이터
/// </summary>
public class PuzzleSortData : MonoBehaviour
{
    [SerializeField] int Sort= -999;//정렬 번호
    [SerializeField] SpriteRenderer[] spriteRenderer;//모든 스프라이트 렌더러


    private void Awake()
    {
        Destroy(this);
    }

    public void SetSort(int sort)
    {
        if (Sort != -999) { Debug.LogWarning($"이미 정렬된 값이 존재합니다. SortingOrder : {Sort}"); return; }

        FindSpriteRenderer();

        Sort = sort;
        foreach (var renderer in spriteRenderer) renderer.sortingOrder = Sort;
    }

    public void SetInit()
    {
        Sort = -999;
        foreach (var renderer in spriteRenderer) renderer.sortingOrder = 0;

        spriteRenderer = null;
    }

    //하위 스프라이트 렌더러를 찾습니다.
    public void FindSpriteRenderer()
    {
        //if (spriteRenderer.Length > 0) return;
        spriteRenderer = GetComponentsInChildren<SpriteRenderer>();
    }
}

 

 

 

 

 

게임 시작 시

 

게임 시작 시 모든 Z 축은 0이 되며, Sort는 기본적으로 1로 지정한다.

 

그 후, 퍼즐을 배치하게 되면 정해진 Sort로 SpriteRenderer에 지정한다. 

'제작 > 한폭의 그림을 만들리' 카테고리의 다른 글

기본 기능 완성  (0) 2024.06.17
중복된 퍼즐 조각의 해결  (0) 2024.06.17
카메라 입력 및 OrthographicSize  (0) 2024.06.16
중간 결산 24.6.15  (0) 2024.06.15
UI를 통한 퍼즐 조각 꺼내기  (0) 2024.06.15