// 다 작성한 글 날려서 슬프다 ㅜ 다시 작성한다
// 아마도 이게 마지막 강의(?), 답변 글일 꺼야 ㅜ
// 나중에 게임 개발일지로 돌아올게
월드 좌표, 로컬 좌표에 대해 설명하려고 해
월드 좌표란?
화면을 기준으로 삼는 좌표
로컬 좌표란?
오브젝트를 기준으로 삼는 좌표
라고 생각하면 되는데 이해가 안갈거야
하얀색 원, 빨간색 원, 폭탄이 있어
하얀색 원(0,0,0)이랑 빨간색 원(3,2,0)을 보면 x로 3, y로 2 차이가 있는 게 직관적으로 보이지
그런데 하얀색 원(0,0,0)이랑 폭탄(-3,-2,0)을 보면 위치가 같아보이는데 x로 -3, y로 -2차이가 나는거지
이해가 안될 수 있는데 Hierarchy 창을 보면 빨간색 원의 자식으로 폭탄이 들어있어
그러니까 폭탄은 빨간색 원을 기준으로 삼는 로컬 좌표를 이용하는 거야
빨간색 원 (3,2,0)을 기준으로 x로 -3, y로 -2를 이동하면 (0,0,0) 이 나오잖아
이게 폭탄의 월드 좌표야 그래서 하얀색 원의 월드 좌표 (0,0,0)과 폭탄의 월드 좌표 (0,0,0)이 같으니까 동일한 위치인 거지
내가 어렵게 설명한 것 같은데
쉽게 생각하면 우주를 생각해봐
우주공간에서의 좌표가 월드 좌표이고
태양계는 태양을 기준으로 하는 로컬 좌표인거고
달과 같은 위성은 지구를 기준으로 하는 로컬 좌표를 이용하겠지
로컬 좌표를 이용하는 이유는 여러 이유가 있겠지만 계산이 간단해 진다는 것 때문에 사용하는 것 같아
예를 들어 달의 좌표를 계산할 때
우주를 기준으로 좌표를 찍어주는 것 보다
지구를 기준으로 좌표를 찍는게 더 간단하고 편하지
이하는 질문글에 대한 답변이야 ---
질문글 : http://gall.dcinside.com/mgallery/board/view/?id=game_dev&no=13282&page=1
이런식으로 만들고 싶다는거지?
배경이론(?)을 말해주면 위의 좌표체계와 단순 계산만 알면되
일단 BoxCollider에 대해서 알아보자
우리가 필요한건 위치, 크기만 조절하면 되니까
Offset은 오브젝트를 기준으로 삼는 collider의 로컬 좌표이고
Size는 collider의 가로 세로 크기야
그러면 우리는 테두리 부분만 콜라이더로 처리할 것 이니까
위치랑 크기를 계산해줘서 적용시키면 되는거지
가로가 X, 세로가 Y이고 가운데 점(0,0)이 있을 때
상단바의 위치는 (0, Y/2)이고 가로길이는 X이지 이해되지???
좌측바의 위치는 (-X/2, 0)이고 세로길이는 Y이지 이해되지???
그러면 하단바와 우측바는??
하단바의 위치는 (0, -Y/2)이고 가로길이는 X
우측바의 위치는 (X/2, 0)이고 세로길이는 Y
이대로 그냥하면 될 것같지만 아직 두께를 넣지 않았으니까 두께를 넣어보면
초록색이 Collider이고 초록색의 높이가 t라고 하면 초록색 점(상단 coliider의 위치)는 (0, (y/2 - t/2))이고 크기는 (X, t)이고
같은 방식으로 상하좌우를 하면 짜잔 완성
// 원래 상하Collider하고 좌우Collider가 겹치는 부분이 있는데 그건 상하의 x크기를 두께*2만큼 빼거나 좌우의 y크기를 두께*2만큼 빼면되
// 나는 그냥 겹치게 만들었어
이하 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | using System.Collections; using System.Collections.Generic; using UnityEngine; public class EdgeCollider : MonoBehaviour { public float Thickness; private BoxCollider2D topCollider; private BoxCollider2D bottomCollider; private BoxCollider2D rightCollider; private BoxCollider2D leftCollider; private float image_size_x; private float image_size_y; // Use this for initialization void Awake () { topCollider = this.gameObject.AddComponent<BoxCollider2D>(); bottomCollider = this.gameObject.AddComponent<BoxCollider2D>(); rightCollider = this.gameObject.AddComponent<BoxCollider2D>(); leftCollider = this.gameObject.AddComponent<BoxCollider2D>(); // 이미지 크기 image_size_x = this.GetComponent<SpriteRenderer>().sprite.bounds.size.x; image_size_y = this.GetComponent<SpriteRenderer>().sprite.bounds.size.y; // Collider 크기 조정 topCollider.size = new Vector2(image_size_x, Thickness); bottomCollider.size = new Vector2(image_size_x, Thickness); rightCollider.size = new Vector2(Thickness, image_size_y); leftCollider.size = new Vector2(Thickness, image_size_y); // Collider 위치 조정 topCollider.offset = new Vector2(0, (image_size_y - Thickness) / 2); bottomCollider.offset = new Vector2(0, (-image_size_y + Thickness) / 2); rightCollider.offset = new Vector2((image_size_x - Thickness) / 2, 0); leftCollider.offset = new Vector2((-image_size_x + Thickness) / 2, 0); } } | cs |
// 의문점이 드는데 왜 이렇게 테두리만 콜라이더 씌우려는 거야?
감사합니다! 아 그리고, 테두리에 콜라이더를 씌우는 이유는, 박스 안에 있는 플레이어가 빠져나오지 못하도록 하려고 그러는 거에요:)
친절추
저기 죄송한데... 저는 Transform의 크기가 아닌, Sprite Renderer Sliced된 크기를 늘려서... Sliced Size가 커져도, Transform Size가 커지지 않는 한, 콜라이더도 커지거나 하지를 않아요T.T
비추 누구임?
강좌추
츤츤한얀데레 // 딴거 하고 있어서 시간날때 수정해줄게
image_size_x = this.GetComponent<SpriteRenderer>().size.x; image_size_y = this.GetComponent<SpriteRenderer>().size.y; 로 바꿔바
설명글은 닥치고 개추얌 - dc App