[Unity] Unity Polygon Collider Select Random Point 본문
반응형
개인적으로 프로젝트를 진행하는 중
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해야한다. 주의
반응형
'프로그래밍 > ㄴ기타' 카테고리의 다른 글
[Unity] 안드로이드 클립보드 복사 붙여넣기 하기 / Android Clipboard copy and paste (0) | 2020.12.28 |
---|---|
[Unity] APK용량 줄이기, 빌드 리소스 확인 (Apk size reduce or optimize) (0) | 2020.11.05 |
[Unity/GPGS] 구글 리더보드 UI에 띄우기 Google play leaderboard with custom UI (0) | 2020.09.02 |
[Unity] 유니티 웨비나 CATRIX 최적화 사례 정리 (0) | 2020.04.04 |
[Unity] 16진수 컬러값을 Unity Color형식으로 변환하기 (0) | 2019.11.13 |
Comments