위와 같은 효과를 내고 싶어서 꽤 고민했습니다.
우선 해당 장소로 들어왔다는 것을 어떻게 인식할 수 있을까 고민해봤는데 현재 위치를 계속 비교하는 것보다 Collider를 쓰는게 더 나을 것 같다고 판단했습니다.
입구에 BoxCollider를 배치해서 OnTriggerEnter2D가 호출되면 장소가 바뀌는 것으로 인식하려고 했으나
Trigger가 발동되어도 안으로 쭉들어가지 않고 그대로 다시 나와버리면 장소는 바뀌었다고 인식하지만 실제로는 바깥에 있게 되는 문제가 발생했습니다.
이걸 어떻게 해결해야할까 고민해보다가 OnTriggerExit2D가 호출되었을 때 Player의 위치를 비교해서 해당 장소의 안쪽에 위치한다면 안으로 이동한 것으로,
바깥에 존재한다면 바깥으로 나간것으로 인식하도록 했습니다.
이 때 필요한 것이 해당 장소의 좌측상단, 우측하단의 좌표입니다. 그래서 자식오브젝트에 좌표를 표시할 더미 오브젝트를 생성했습니다.
LeftTop과 RightBottom을 실제 해당 장소의 좌측 상단, 우측 하단에 위치시켰습니다.
*** 나중에 맵의 데이터들을 외부에 저장하게 된다면 Place의 위치, LeftTop, RightBottom의 좌표들을 전부 저장하는게 가능한 것인지 잘 모르겠습니다.
이렇게 해서 Player가 특정 장소의 안쪽으로 들어갔는지, 혹은 바깥으로 나갔는지 판단할 수 있게 되었습니다.
이제 다음으로 해야할 일은 해당 장소에 존재하는 InteractableObjects(상호작용 가능한 오브젝트들이라 이름 붙였습니다.)을 활성화 해주고
다른 장소의 InteractableObjects를 비활성화 해주는 것입니다.
그러기 위해선 특정 장소가 자신의 바깥 장소를 알고 있어야 합니다. 그렇게 되면 아래의 두 가지 경우로 모두 처리할 수 있게 됩니다.
1. 특정 장소로 들어갔다 -> 해당 장소의 오브젝트 활성화 + 바깥 장소의 오브젝트 비활성화
2. 특정 장소에서 나왔다 -> 해당 장소의 오브젝트 비활성화 + 바깥 장소의 오브젝트 활성화
장소를 나타낼 오브젝트에 위와 같은 변수를 갖는 스크립트 Place를 추가해주었습니다.
placeName은 해당 장소의 이름, outerPlaceName은 해당 장소의 바깥 장소의 이름, description은 화면에 표시할 이름입니다.
결국 장소, 오브젝트 등등의 데이터들을 외부에 따로 저장해두어야하기 때문에 바깥 장소의 이름과 오브젝트 모두 저장할 수 있도록 했습니다.
FindPlace라는 메소드를 이용해 리스트에 존재하는 장소 오브젝트들을 하나하나 비교하며 outerPlaceName을 placeName으로 갖는 오브젝트를 참조했습니다.
*** 후에 맵을 생성하는 부분을 따로 만들게 되면 그 때 FindPlace를 사용해 바로 outerPlace를 참조하도록 하고 outerPlaceName은 저장하지 않을 생각입니다.
아직 초보라 미숙한 점이 많습니다. 다른 분들의 생각을 들어보고자 글을 쓰려고 한거라 이런 부분을 구현하는데 있어서 더 좋은 방법을 알고 계시다면 알려주시면 너무 감사하겠고 어떤 식으로 하면 더 효율적일 수 있을지 같이 고민해봤으면 좋겠습니다.
LeftTop RightBottom가 왜 필요한지 모르겠는데 Collider가 집크기만하면 될거 같은데
그게 싫으면
https://ibb.co/48J6ry5
이 사진처럼 구현하면될거같은데
첫번째 말씀해주신건 밑에분 말씀처럼 입구에서 처리하는게 맞다고 생각했습니다 두번째 말씀해주신것도 떠올렸던 방법인데 두 Collider가 서로 다른 일을 해야하는데 OnTriggerExit2D에서 서로 다른 Collider를 구분하는게 가능한가요?? 자식오브젝트로 따로 둔다면 가능하겠지만 이렇게 되면 그냥 위치값을 한번 비교해주는게 더 나을 것 같다고 생각했습니다.
내가 생각한건 자식오브젝트 2개 만들어서 하나는 입구 하나는 콜라이더 추가해서 내부/외부 체크할려고한건데 그게 별로라고 생각하는거 같으니 기존 대로 위치값으로 하면될거같아
네! 조언 감사합니다
그냥 내부를 따로 두고 순간이동시키면 안됨?
그렇게 할 수도 있겠지만 저는 개인적으로 저런 느낌을 내고 싶었습니다. 밖에 있으면 지붕에 가려져서 오브젝트들이 보이지 않지만 내부로 들어가게 되는 순간 바로 안쪽이 보이고 자유롭게 왔다갔다 할 수 있었으면 좋겠다고 생각했습니다. 그냥 제 취향이라고 생각해주시면 감사하겠습니다
개 길게 써서 대충 읽었는데 니네 엔진에 있는지는 모르겠지만 걍 overlap트리거 비슷한 거 있으면 깔고 잘 다듬어라 만약 이상하게 작동하면 너가 이상하게 만진 거
저런 게 참 애매함... 경계선에서만 체크하는 게 당연히 합리적이지만, 여러 예외들이 발생할 수 있기 때문에 안정적인 시스템을 구축해놓아야 나중에 편하게 개발할 수 있음
참고로 나는 저런 경계에 트리거 콜라이더를 붙여놓고, 그 콜라이더에 부딪힌 상태에서는 그냥 수식계산을 해서 영역을 체크하고 있음
OnTriggerExit2D호출되는 타이밍이 플레이어 콜라이더가 크다면 바깥으로 나오고 나서도 좀 있다가 호출된다는 걸 생각할 필요가 있음
그리고 좌표는 더미 게임오브젝트 붙이기 보다는, 저 Place스크립트에 SerializeField로 저장하고 Gizmo로 씬 뷰에서 보일 수 있게 하는 게 더 좋을듯
FindPlace메서드 만든 건 잘한듯. Place를 이름으로 찾던, 오브젝트 레퍼런스로 찾던, 다양한 방법으로 쿼리할 수 있는 기능은 게임에 있어서 매우 중요함.
혹시 콜라이더에 부딪힌 상태에서는 수식계산을 하신다는게 무슨 말씀인지 더 설명해주실 수 있나요? 세번째 말씀해주신건 화면 상으로는 플레이어가 집 밖으로 나온 것 처럼 보이지만 내부적으로 밖으로 나오는 처리가 일어나지 않았을 때를 말씀하신 것 같은데 그 부분은 크게 지장이 없다고 생각했습니다. 더미 게임 오브젝트 만든 건 더 편하게 좌표값을 구하려고 했던 건데 오브젝트가 하나라도 적으면 더 좋을테니 필요하다고 생각되면 수정하겠습니다.
단순히 엣지 기준으로 바깥쪽인지 안쪽인지 좌표계산으로 하고 있어요. 참고로 scene gui 이벤트 받으면 Handle API를 쓸 수 있어요 좌표 관리가 편해지죠
아 그게 더 편할 수도 있겠네요 조언 감사합니다!
https://docs.unity3d.com/ScriptReference/Physics.OverlapBox.html
있네
ㅅㅂ 좀 찾아봐라
OverlapBox로 대충이라도 어떻게 구현할 수 있는지 알려주시면 감사하겠습니다
이거는 주기적으로 체크해야되서 별룬데