프로그래밍/ㄴ기타
[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해야한다. 주의
반응형