본문 바로가기
Programming/Unity

[Unity3D] 3D오브젝트 공간 정렬

by 타임박스 2020. 9. 21.
반응형


✔ Unity3D - 오브젝트 공간 자동 정렬

Object Position Sort



공간에 오브젝트를 특정 한 기준점에서 좌우로 정렬하고 싶은 경우에 사용한다.

X, Z방향으로 정렬하고 추가, 제거 가능

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

public class ObjectPositionSort : MonoBehaviour
{
    //테스트를 위한 오브젝트
    public GameObject testobj;
    //기준 포지션 
    public Transform standardPosition;
    private Vector3 standardVector;

    //기준포지션안에 관리될 오브젝트들
    private List<GameObject> items = new List<GameObject>();

    //Row 개수
    public int row = 2;

    //최대 정렬 가능한 개수
    public int MAX_COUNT = 10;

    //오브젝트간 간격
    public float distance = 2;

    // Start is called before the first frame update
    void Start()
    {
        standardVector = standardPosition.position;
    }

    //생성 테스트 예제
    public void CreateTest()
    {
        if(items.Count < MAX_COUNT)
        {
            GameObject game = Instantiate(testobj);
            game.name = Random.Range(1, 100).ToString();
            game.SetActive(true);
            AddItem(game);
        }
    }

    //아이템 추가
    public void AddItem(GameObject item)
    {
        //최대개수와 중복오브젝트는 패스
        if (MAX_COUNT > items.Count && !items.Contains(item))
        {
            items.Add(item);
            UpdateSort();
        }
    }

    //모두 삭제
    public void RemoveAll()
    {
        items.Clear();
    }

    //특정항목을 제거한다.
    public void RemoveItem(GameObject item)
    {
        if(items.Contains(item))
        {
            items.Remove(item);
            UpdateSort();
        }
    }

    //기준점에서 x,z 배열로 정렬
    public void UpdateSort()
    {
        float xOffset = standardVector.x;
        float zOffset = standardVector.z;

        for (int i = 0; i < items.Count; i++)
        {
            if(0 == i % row && i != 0)
            {
                xOffset = standardVector.x;
                zOffset += distance;
            }

            items[i].transform.position = new Vector3(xOffset + distance * (i % row), standardVector.y, zOffset);
        }
    }
}

 

자세한 내용은 아래 영상 참조

https://www.youtube.com/watch?v=r3jW6fGVkVI&feature=youtu.be

 

감사합니다.

 

반응형

댓글