본문 바로가기

관리 메뉴

[Unity] Unity Polygon Collider Select Random Point 본문

프로그래밍/ㄴ기타

[Unity] Unity Polygon Collider Select Random Point

최갓 2020. 10. 25. 00:41
반응형

개인적으로 프로젝트를 진행하는 중

 

Polygon Collider 2D 영역에 랜덤으로 오브젝트를 스폰할 일이 생겼다

 

하여 이것저것 방법을 찾아보았지만, 명쾌한 방법은 나오지 않아

다음과 같은 코드를 작성하였다.

 

방법은 polypoint의 point중 가장 크고 작은 위치를 찾아낸 후 

해당 영역 안을 랜덤으로 고르고, 고른 위치가 collider랑 충돌한다면 사용하는 식이다

 

 private void Awake()
    {
        m_vCollider = GetComponent<PolygonCollider2D>();
        Vector2[] vPoints = m_vCollider.GetPath(0);
        for (int i = 0; i < vPoints.Length; ++i)
        {
            if (m_vMaxPoint == Vector2.zero)
                m_vMaxPoint = vPoints[i];
            if (m_vMinPoint == Vector2.zero)
                m_vMinPoint = vPoints[i];

            if (vPoints[i].x > m_vMaxPoint.x)
                m_vMaxPoint.x = vPoints[i].x;
            if (vPoints[i].y > m_vMaxPoint.y)
                m_vMaxPoint.y = vPoints[i].y;

            if (vPoints[i].x < m_vMinPoint.x)
                m_vMinPoint.x = vPoints[i].x;
            if (vPoints[i].y < m_vMinPoint.y)
                m_vMinPoint.y = vPoints[i].y;
        }
    }

    private void FixedUpdate()
    {
        m_fSpawnTimer += Time.fixedDeltaTime;
        if (m_fSpawnTimer > m_fSpawnDleay)
        {
            m_fSpawnTimer = 0.0f;
            if (m_vSpawnList.Count >= m_iMaxSpawnCount)
                return;

            m_fSpawnDleay = Random.Range(1.0f, 5.0f);

            GameObject vTree = Instantiate(m_vTreeObject, gameObject.transform);
            if (vTree != null)
            {
                vTree.SetActive(true);
                Vector2 vSpawnPoint = Vector2.zero;
                while (true)
                {
                    vSpawnPoint.x = Random.Range(m_vMinPoint.x, m_vMaxPoint.x);
                    vSpawnPoint.y = Random.Range(m_vMinPoint.y, m_vMaxPoint.y);                    
                    if (m_vCollider.OverlapPoint(transform.TransformPoint(vSpawnPoint)))
                    {
                        vTree.transform.localPosition = vSpawnPoint;
                        m_vSpawnList.Add(vTree);
                        break;
                    }
                }
            }
        }
    }
    

 

고른 point를 transform.TransformPoint로 월드좌표로 변경 후 overlapPoint해야한다. 주의

반응형
Comments