1. 오늘의 목표
Box형 장애물을 만들려고 했다.
밀어내면 밀리는데, 특정 캐릭터만 밀 수 있는 장애물.
그런데 이제 회전하면 안되는....
(그리고 여기서 이렇게 시간이 많이 걸릴 줄은 몰랐다)
2. 제작 개시🛠️
1. 일단 충돌하는 캐릭터를 구분짓자.
Tag를 Player로 통합하면서, 개와 고양이는 Layer로 구분하게 되었다.
내가 확인하고자 하는 Layer가 달라질 경우에도 유동적으로 사용할 수 있도록, int charLayer 변수를 만들어 충돌한 게임 오브젝트 레이어를 할당했다.
Debug로그에서는 해당 레이어가 잘 불러와졌는지, 충돌한 오브젝트를 확인하는 용도로 사용했다.
2. RayCast를 써보자
실패한 방법이다.
일단 생성할 때, Kinematic을 켰다. (Dynamic으로 할 경우, Layer=Dog 가 아닌 다른 오브젝트(ex. 고양이) 가 밀어도 밀리고, 튕기기 때문이다.)
그에따라 transform.Translate(pushDirection * adjustedSpeed * Time.deltaTime, Space.World); (처음에는 adjustedSpeed도 없었다)를 이용해서 상자의 위치를 바꾸었는데,
이 코드의 문제는 실제로 '이동'시키는 것이 아니라, 물체의 자리를 '바꾸어'서 '이동시키는 것 처럼' 보이게 하는 것이다.
즉, 앞에 Collider가 붙은 오브젝트가 있어도, 그냥 마우스로 Scenes 창에서 움직인 것처럼 겹쳐진다.
결과: 벽도, 고양이도, 전부 뚫는다.
그래서 RayCast를 사용하려고 했다.
RayCast는 일종의 광선을 쏴서, 해당 거리 안에 오브젝트가 있다면 충돌처리를 해준다.
보통 에너미가 접근하면 쫓아오는 로직 등에서 많이 사용한다. (그 외에도 여러 방면에서 많이 사용한다.)
처음에는 transform.position을 기본값으로 잡은 결과, 오브젝트가 멈추긴 하는데 정확하게 벽에 맞닿았을 때 멈추지 않았다. (벽을 반즈음 투과했다.)
그에 따라, BoxCollider 2D를 가져와 조정하는 작업을 거쳤다.
Vector2 adjustedOrigin = (Vector2)transform.position + (boxSize.x / 2) * pushDirection;
transform 포지션에서 상자크기 /2 * 미는 방향을 더하여 양 옆으로 범위를......잡으려고 했었다.
(원점인 transformPosition + 상자 절반크기만큼 범위를 하면, 통상적으로 상자 사이즈에 딱 맞게 범위가 잡힌다.)
그러나 무엇이 문제였을까...
그 절반 사이즈가 밖으로 튀어나와 버린 것은...
아무리 밀어도 붙지 않고, 심지어 조작자인 개가 올라타면 자동으로 이동하는 발판이 되어있었다. (양 옆으로 오가는 발판을 만들 거라면 차라리 이 방법을 쓰는 걸 고려해보는 것도 좋을 법 했다....)(하지만 다른 방법이 나을 것이다.)
그렇게 고민하던 결과, 해답은 너무나도 쉬운 코드가 되었다.
3. 그러니까...position을 Freeze하면 되잖아.
Layer를 구분하는 로직은 수정할 필요가 없었다.
Dynamic으로 바꾸면, 다시 중력의 영향을 받게 된다. 또한 다른 오브젝트들과의 상호작용들도 발생한다.
그런데, Rigidbody에는 Constraints 요소가 있다.
이런 애들인데.
즉, x, y, z축을 고정시켜 해당 축 방향으로는 움직일 수 없게 만드는 것이다.
2D 환경에서는 Z축으로 돌아간다 = 회전이므로 FreezeRotation이 되는 것이다.
그러면 우리가 하면 되는 일: 강아지가 밀 때는 회전을 금지시키고, 위로 솟아오르지 않게 한다.
강아지와 떨어졌을 경우, 회전을 금지시킴과 동시에 옆으로 이동시키지 않는다.
단 Y축을 해제하는 이유: 중력의 영향을 받게 하기 위해서)
이렇게 하자 어처구니 없게도(...) 벽에 딱 맞게 상자를 옮길 수 있었다. (Collider만큼 밀리니까)
생각보다 방법은 쉬운 곳에 있었다...
3. 내일의 할 일
내일은 최소한 게임이 구동되도록 해야한다.
고양이의 물고기, 강아지의 뼈다귀에 점수를 만들어, 게임에서 사용될 점수를 만들 생각이다.
가능하면 버튼을 이용한 상호작용으로, 다른 오브젝트가 '작동하는' 구성도 짜고 싶다.
'Unity_본캠프' 카테고리의 다른 글
[내일배움캠프 28일차] 델리...케이트...람...다? (2) | 2025.05.16 |
---|---|
[내일배움캠프 25일차] Oh, Event. (2) | 2025.05.13 |
[내일배움캠프 23일차] Unity팀 프로젝트: 트랩 / 클리어용 아이템 (0) | 2025.05.09 |
[내일배움캠프 22일차] 뭐라고요 string이 반환이 된다고 (0) | 2025.05.08 |
[내일배움캠프 21일차] 유니티 입문 특강 개인프로젝트 (0) | 2025.05.07 |