[Unity] 2D 쿼터뷰 공간 바닥에 랜덤 스폰하기

2024. 4. 4. 13:28· ETC/Unity
SMALL

개발 진행중인 프로젝트는 2D게임인데, 쿼터뷰 형식으로 되어있다.

3D공간에 물체를 배치하고 Orthographic View로 보여주는게 아니라 각각의 장소가 모두 1장의 Sprite이다.

 

그렇기 때문에 공간 내에 물체를 랜덤하게 배치할 때 계산을 자칫 잘못하면 맵 밖으로 튀어나가거나 공중에 붕 떠있는 것처럼 보이게 된다.

 

 

 

위와 같은 상황을 방지하기 위해 바닥면을 기준으로 오브젝트를 배치해 주어야 하는데,

바닥면의 좌표를 구하는 방법은 축과 평행하지 않은 평면상의 좌표를 구하는 것과 같다.

 

먼저 바닥 위에 배치할 오브젝트 Sprite의 Pivot포인트를 Bottom으로 설정해 준다.

 

그 다음 위 그림과 같이 바닥면의 네 꼭짓점에 적당한 Padding을 준 위치에 네 개의 Empty Object를 생성한다.

 

 

    public GameObject[] vertexList = new GameObject[4];

그 다음 스크립트를 생성해 네 꼭짓점의 GameObject를 담아준다.

    public Vector2 GetRandomPosInPlace()
    {
        Vector3 top = vertexList[0].transform.position;
        Vector3 bottom = vertexList[1].transform.position;
        Vector3 left = vertexList[2].transform.position;
        Vector3 right = vertexList[3].transform.position;
        
        Vector2 diagonalPoint1 = Vector2.Lerp(top, bottom, Random.value);
        Vector2 diagonalPoint2 = Vector2.Lerp(left, right, Random.value);
        
        return Vector2.Lerp(diagonalPoint1, diagonalPoint2, Random.value);
    }

 

각 대각선 방향 점 사이의 좌표를 선형 보간 함수로 랜덤하게 뽑은 다음

두 좌표 사이를 다시 선형 보간하면 최종적으로 아래 그림과 같이 나온다.

 

 

여기서 끝내면 정말 좋겠지만...

아래 그림과 같이 Sprite의 순서가 맞지 않으면 부자연스러워진다.

 

Y좌표를 먼저 정규화한 뒤 100을 곱해보자

 

    public Vector2 GetRandomPosInPlace(out int OrderInLayer)
    {
        Vector3 top = vertexList[0].transform.position;
        Vector3 bottom = vertexList[1].transform.position;
        Vector3 left = vertexList[2].transform.position;
        Vector3 right = vertexList[3].transform.position;

        Vector2 diagonalPoint1 = Vector2.Lerp(top, bottom, Random.value);
        Vector2 diagonalPoint2 = Vector2.Lerp(left, right, Random.value);

        Vector2 finalPos = Vector2.Lerp(diagonalPoint1, diagonalPoint2, Random.value);

        float Normalized_FinalPosY = (finalPos.y - top.y) / (top.y - bottom.y);
        OrderInLayer = System.Math.Abs((int)(Normalized_FinalPosY * 100));

        return finalPos;
    }

 

 

 

 

    public void SpawnNPC(string npcName)
    {
        int OrderInLayer;
        Vector3 pos = CurrentPlace.GetComponent<SpawnOnFloor>().GetRandomPosInPlace(out OrderInLayer);
        GameObject npc = Instantiate(npcList[npcName], pos, Quaternion.identity);
        npc.transform.SetParent(CurrentPlace.transform);

        SpriteRenderer sr = npc.GetComponent<SpriteRenderer>();
        sr.sortingOrder = OrderInLayer;
    }
BIG
저작자표시 (새창열림)

'ETC > Unity' 카테고리의 다른 글

[Unity] Jenkins, Gitea를 활용해 유니티 자동빌드하기 - 1 -  (0) 2024.05.20
[Unity/게임수학] 2D 쿼터뷰 공간 Sprite Order (Vector2 수선의 발)  (0) 2024.05.07
[C#] The requested operation caused a stack overflow  (0) 2024.04.22
[Unity] Script에 의존하지 않고 스토리 씬 구현하기  (0) 2024.03.04
[Unity] for문에서 이벤트리스너 등록 시 문제  (0) 2024.02.11
'ETC/Unity' 카테고리의 다른 글
  • [Unity/게임수학] 2D 쿼터뷰 공간 Sprite Order (Vector2 수선의 발)
  • [C#] The requested operation caused a stack overflow
  • [Unity] Script에 의존하지 않고 스토리 씬 구현하기
  • [Unity] for문에서 이벤트리스너 등록 시 문제
Jade Choe
Jade Choe
Jade's Hello, World!Jade Choe 님의 블로그입니다.
Jade Choe
Jade's Hello, World!
Jade Choe
전체
오늘
어제
  • Jade's Hello World (55)
    • Projects (3)
      • DJade MAX Respect V (3)
    • Desktop App (9)
      • Win API (2)
      • C#.Net (3)
      • C, C++ (1)
      • DirectX (0)
      • Java (2)
    • Mobile App (13)
      • Android (12)
      • iOS (1)
    • Web App (3)
      • PHP (1)
      • HTML&CSS (0)
      • Javascript (0)
      • Python - Django (2)
    • ETC (25)
      • Unity (7)
      • Ubuntu (3)
      • macOS (0)
      • Git (11)
      • Docker (1)
      • Synology (3)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 깃
  • github
  • 사용법
  • ㅖㅗㅖ
  • 안드로이드 상태바
  • 노치대응
  • git 서버구축
  • 펀치홀
  • Git
  • 깃 서버 구축
  • 웹뷰 로딩
  • epicgames
  • 안드로이드
  • git 구축
  • 웹뷰
  • 깃 구축
  • nosuchmethoderror
  • 웹뷰 안뜸
  • 웹뷰 하얀화면
  • 방화벽등록
  • 깃허브
  • 컷아웃디스플레이
  • 에픽런처
  • ㄴ노
  • 웹후크
  • gitserver
  • Remote-SSH
  • 입문
  • 웹훅
  • SU-PQR1603

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
Jade Choe
[Unity] 2D 쿼터뷰 공간 바닥에 랜덤 스폰하기
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.