// 다 작성한 글 날려서 슬프다 ㅜ 다시 작성한다

// 아마도 이게 마지막 강의(?), 답변 글일 꺼야 ㅜ

// 나중에 게임 개발일지로 돌아올게


월드 좌표, 로컬 좌표에 대해 설명하려고 해


월드 좌표란? 

화면을 기준으로 삼는 좌표


로컬 좌표란?

오브젝트를 기준으로 삼는 좌표


라고 생각하면 되는데 이해가 안갈거야 



viewimage.php?id=2abcdd23dad63db0&no=29bcc427bd8777a16fb3dab004c86b6fe0f25512895f218ced112c1029e51c146791f73a7ee842d5a0733fb5045254e5602c2d6792cb03e480aface13556


하얀색 원, 빨간색 원, 폭탄이 있어 

하얀색 원(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


viewimage.php?id=2abcdd23dad63db0&no=29bcc427bd8777a16fb3dab004c86b6fe0f25512895f218ced112c1029e51c146791f77e2cb92fd6a3773ab7053a07b2e6855cc52697ad3037d7


이런식으로 만들고 싶다는거지?

배경이론(?)을 말해주면 위의 좌표체계와 단순 계산만 알면되


일단 BoxCollider에 대해서 알아보자

viewimage.php?id=2abcdd23dad63db0&no=29bcc427bd8777a16fb3dab004c86b6fe0f25512895f218ced112c1029e51c146791f77e2cb92fd6a3773ab7053a07e2de612139205043ed4b48


우리가 필요한건 위치, 크기만 조절하면 되니까 


viewimage.php?id=2abcdd23dad63db0&no=29bcc427bd8777a16fb3dab004c86b6fe0f25512895f218ced112c1029e51c146791f77e2cb92fd6a3773ab7053a54e5dbc2f0d72e664c7bfb69

Offset은 오브젝트를 기준으로 삼는 collider의 로컬 좌표이고

Size는 collider의 가로 세로 크기야


그러면 우리는 테두리 부분만 콜라이더로 처리할 것 이니까 

위치랑 크기를 계산해줘서 적용시키면 되는거지




viewimage.php?id=2abcdd23dad63db0&no=29bcc427bd8777a16fb3dab004c86b6fe0f25512895f218ced112c1029e51c146791f77e2cb92fd6a3773ab7053a56effc777a1cb60580895c6f

가로가 X, 세로가 Y이고 가운데 점(0,0)이 있을 때

상단바의 위치는 (0, Y/2)이고 가로길이는 X이지 이해되지???

좌측바의 위치는 (-X/2, 0)이고 세로길이는 Y이지 이해되지???


그러면 하단바와 우측바는??

하단바의 위치는 (0, -Y/2)이고 가로길이는 X

우측바의 위치는 (X/2, 0)이고 세로길이는 Y


이대로 그냥하면 될 것같지만 아직 두께를 넣지 않았으니까 두께를 넣어보면



viewimage.php?id=2abcdd23dad63db0&no=29bcc427bd8777a16fb3dab004c86b6fe0f25512895f218ced112c1029e51c146791f77e2cb92fd6a3773ab7053a01e00eecf5cbf4db0f4171b8

초록색이 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) / 20);
        leftCollider.offset = new Vector2((-image_size_x + Thickness) / 20);
    }
}
 
cs

// 의문점이 드는데 왜 이렇게 테두리만 콜라이더 씌우려는 거야?