들어가며
이번에 만드는데 좀 힘들었습니다... 스택오버플로우며 별의별 오류가 다 나서...
의외로 별게 아니었고 해결해서 쓰는 블로그입니다. (하하) 아직 개발 4일? 5일 차인데 벌써부터 구조가 개판이 되는 모습을 보니 큰일 났다는 생각이 매일 듭니다ㅎㅎ 언제 한번 각 잡고 구조 고쳐봐야죠..
오늘 만들 것
Push 시스템
이 게임의 가장 큰 특징 중 하나입니다. 글씨 블록 같은 상호작용한
블록들을 밀며 여러 가지 퍼즐을 풀어나가죠. 그 블록을 미는 시스템을 만들어볼 겁니다.
만들기 시작
설계 설명
밀려날 수 있는 것이 많기 때문에 IPushable 인터페이스를 만들고,
플레이어가 움직일 때 레이로 쏴서 인터페이스 감지 후, 그 인터페이스도 같이 움직이게 할 겁니다.
IPushable
별거 없습니다.
밀려날 수 있는 오브젝트 중 특정 조건에 따라 안 밀려날 수 있기 때문에 불값으로
밀려날 수 있는 상태인지 아닌지를 체크할 수 있게 하고,
밀리는 함수를 구현하면 됩니다.
Object 클래스
"BABA Is You"게임은 크게 보면 3가지 정도의 블록이 존재합니다
BABA, Wall와 같은 주어 역할을 하는 블록
Is, has, Make와 같은 동사 역할을 하는 블록
Push, You, hot, Melt, Win과 같은 목적어, 보어..? 같은 역할을 하는 블록
영어를 잘 못합니다.
때문에 Obejct클래스를 추상 클래스로 만들어 저 3가지를 구현할 것입니다.
오늘은 우선 그 오브젝트 클래스가 밀리는 거부터 해보도록 하죠.
간단합니다.
Move컴포는 전에 재사용을 위해 만들었습니다. 움직임, 롤백을 담담합니다.
(롤백은 나중에 따로 만들어 관리하려 합니다. 우선 테스트용)
이후 이걸 상속받아 Subject 클래스를 만들어줍니다.
이로써 구현은 끝났습니다. 이제 저 MoveObject를 제때 잘 실행해 주면 됩니다.
IPushable 감지
생각보다 별거 없습니다.
인풋을 받은 벡터를 Vector2 Int로 설정해 줄 때 그 벡터값으로
레이를 쏴서 IPushable을 감지 후, IsPushable이 True라면 MoveObject를 실행해 주면 됩니다.
아래 그 코드입니다.
private void PushDitect(Vector2 Vec)
{
RaycastHit2D hit = Physics2D.Raycast(transform.position+new Vector3(Vec.x*0.6f,Vec.y*0.6f,0), Vec,0.4f);
// 레이가 충돌한 경우 IPushable 인터페이스가 있는지 확인
if (hit.collider != null)
{
if (hit.collider.TryGetComponent(out IPushable pushable))
{
if (pushable.IsPushable)
{
Debug.Log("IPushable 객체 감지됨!");
pushable.MoveObject(Vec); // 감지된 객체에 동작 수행
}
}
else
{
Debug.Log(hit.collider.gameObject.name);
Debug.Log("IPushable이 아니거나 Pushable 상태 아님.");
}
}
else
{
Debug.Log("레이가 아무 객체와도 충돌하지 않음.");
}
}
사실 여기서 문제가 생겼었습니다.
레이에 감지가 되면 스택오버플로우가 뜨며 에디터가 프리징이 걸리는 거 였습니다.도저히 문제가 생길 수 없는데.. 하고 멘털이 조금 나갔었습니다.
그때 선생님께 문제를 말씀드렸더니 어디선가 While(true)처럼 무한로프 돌면서 문제가 생기는 것일 거다.라고 말씀하셔서 딱 하고 떠올랐습니다..
레이가 자기 자신도 감지하는 것이었습니다.
플레이어 움직임 -> 감지 시작-> 밀릴 물체 감지 완 -> 물체 움직임 -> 물체 감지 -> 자기 자신 감지->자기 자신 움직임 -> 자기 자신 감지 ->... 무한반복
이 때문에 레이의 시작 점을 자신 중앙, transform.position이 아닌 그 좌표에서 감지 방향만큼 일정량 이동하고, 레이 길이를 조정해서 바로 앞 한 칸만 감지할 수 있게 하면 완성입니다.
완성본
이후 완성본입니다.
이후 롤백을 무브 컴포마다 하는 것이 아닌 매니저를 놔 관리하게 하였는데,
플레이어의 턴에 맞게 롤백하는 것이 아닌 각자 움직인 거에 따라 롤백하게 해 놔서 플레이어와 따로 롤백하는 오브젝트를 볼 수 있었습니다.
때문에 다음엔 그걸 고치며, 다른 문제를 처리해 볼 것입니다.
마치며
현재 그래도 좀 블로그 쓰는 것에 맛 들렸습니다. 좀 더 자주, 좋은 퀄리티로 쓸 수 있으면 좋겠네요.
1일 1 커밋도 현재 8일째 하고 있는데 기분이 좋습니다.
팀프가 벌써 약 한 달 남았으니 열심히 해보겠습니다. :)
'개발일기 > VIY' 카테고리의 다른 글
[개발일지]VIY Push 버그 수정 #05 (2) | 2024.10.30 |
---|---|
[개발일지] VIY Rollback시스템 완..? #04 (1) | 2024.10.30 |
[개발일지] VIY 롤백시스템 #02 (3) | 2024.10.26 |
[개발일지] VIY 타일기반 움직임 시스템 #01 (2) | 2024.10.26 |
[개발일지] VIVI Is You 줄여서 VIU #00 (5) | 2024.10.24 |