• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    해결됨

특정 좌표에 오브젝트가 있는지를 체크할 수 있나요?

19.08.24 15:21 작성 조회수 7.14k

0

강좌에 직접있는 내용이 아니라서 죄송스럽습니다.
영상만 보기보다 실습을 해 가면서 하려고 복습겸 셀프 프로젝트를 해 보고 있습니다.

플레이어를 중심으로 일정 범위까지 자동으로 배열에서 랜덤으로 타일을 꺼내서 필드를 만드는 것을 구현중에 있습니다. (재민님께서 번역해 주신 2D로그라이크 만들기를 참고했습니다) 
=> 탐험이 진행될수록 필드가 랜덤으로 넓어지는걸 예상하고 있습니다.

우선 시작지점에서 유저 중심으로 타일을 구현하는 것 까지는 성공했습니다만, 유저가 이동할 경우 타일이 구현되지 않은 지역에만 새롭게 타일을 까는 방법을 모르겠습니다.


- 처음에는 그냥 간단히 x,y,z값 넣어서 null인지 비교하면 될까 했는데, Vector3는 null로 확인할 수 있는게 아니라고 하더군요.
- new Vector3를 특정 오브젝트의 transform.position으로 지정하고 그 오브젝트의 포지션이 null인가 보려고 했는데 그것도 안되더군요. (오브젝트의 포지션으로 지정한 시점에서 이미 그 위치에 체크용 오브젝트가 있으니 null이 아니게 되네요)

검색을 해 봐도 잘 못찾겠습니다.
그리고 사실 Sorting Layer도 구분해서 확인이 되었으면 하는데 일단 그건 또 다음 문제일듯 합니다.

추가로..
Unity C#에 x,y두가지 위치값을 가지는 배열을 만들수가 있나요?
이 질문을 다른곳에 했을 때 다른 대안을 설명해주시면서 x,y좌표를 가진 int check[40][40] 같은걸 만들라고 알려주신 분이 계시는데, C#에서는 안되는거 같은데 맞는지요.

답변 3

·

답변을 작성해보세요.

1

보통은 트리거를 가진 콜라이더를 해당 게임 오브젝트에게 추가하는 방식으로 구현합니다. 리지드바디 컴포넌트를 사용하지 않고, 트리거가 체크된 Primitive 형태의 콜라이더만 쓴다면야 성능 문제는 심각하지 않을 것이라 생각합니다.

트리거를 가진 콜라이더를 타일에 추가하고, Physics.Overlap*** 계열 메서드나 Physics.***Cast 계열의 메서드를 사용하여 좌표와 검사할 영역의 반지름, 레이어 마스크 등을 찍어주면 해당 좌표에서 겹치는 콜라이더를 가진 게임 오브젝트를 선택적으로 가져와 줄 것입니다.

0

이미 해당 오브젝트들의 정보를 리스트(배열)로 쥐고 있는 상태라면, "특정 좌표에 오브젝트가 있는지" 검사할 필요가 없습니다!

즉 "(3,3)에 오브젝트가 있는지 검사"하는게 아니라 "오브젝트가 (3,3)에 있는지 검사"하면 됩니다.

생성한 발판을 리스트에 등록한 다음, 검사가 필요하면 리스트의 모든 배열을 순회해서 오브젝트가 (3,3)에 있는지 검사하는 방식으로 하면 됩니다.

0

Hun Chang님의 프로필

Hun Chang

질문자

2019.08.24

제민님 직접 답변 주셨네요 감사합니다.
강의도 만드셔야 되고, 다른 일도 있으시고 바쁘신줄 알고 있습니다. 무리하지 마시고 나중에 여유가 되실 때 답변주셔도 좋습니다. (강의 더 보면서 기다리겠습니다.)
죄송합니다. 답변을 주셨는데 저것들을 이용해서 어떻게 해야될지 감이 안잡힙니다.

Overlap은 아마도 어메이징 볼링에서 탄환이 폭발할때 범위 내의 오브젝트를 다 가져와서 데미지를 주고 폭파반경으로 날려버릴때 썼던걸로 기억합니다. 
Cast계열은 RayCast형태로 제민님의 강좌에서 오브젝트를 옮길때랑, 2D 로그라이크 강의에서 이동할 장소에 벽이 있는지 확인할 때 사용한 기억이 있습니다.
둘 다 이미 있는 오브젝트를 체크하는 경우에 사용하는 기능인듯 합니다.

제가 만들고 있는것은 탑뷰 형태의 2D 우주탐험 게임을 생각중에 있습니다.
Player가 이동할 바닥 Background를 타일 형태로 하여 주인공을 기점으로 일정 범위까지만 생성 해 두고, 주인공이 이동하면 주인공의 시야가 이동하기에 새로운 중심점을 기점으로 아직 열리지 않은(=생성되지 않은) 필드를 생성하려고 합니다.
주인공의 시야가 5x5의 사각형이라고 할 때, 주인공이 오른쪽으로 한칸 이동하면 5x5중에서 좌측 4x5는 이미 생성 된 필드이며 가장 오른쪽 세로 한줄 1x5가 새롭게 생성되야 되는 필드입니다. 
말씀해주신 기능, OverlapBox등을 사용해서 기존 4x5를 확인할 수 있고 가져올 수 있다고 생각은 됩니다. 

배열끼리는 빼기가 안되니까.
혹시...
리스트 A = 주인공의 시야에 들어가는 25칸의 좌표 정보들
배열 B = Overlap으로 수집한 것들의 포지션 정보들
리스트 A에서 배열 B를 빼서 남은 리스트 A의 각 좌표에 필드를 생성하면 되려나요?

일단 해 보겠습니다. 감사합니다.