프로젝트 일지/Unity

[Unity/TIL] 3D 퍼즐 플랫폼 게임 - 팀 프로젝트 일지 (2)

톰마토 2025. 3. 14. 23:02

우헤헤

목차
- 물리 버튼 제작 마무리
  ㄴ Spring Joint의 프로퍼티
- Player ↔ 오브젝트 상호작용 조작감 개선
  ㄴ 픽업 위치 개선
  ㄴ 픽업 오브젝트 회전 기능 추가

물리 버튼 제작 마무리

이전 글 - 2025.03.13 - [프로젝트 일지/Unity] - [Unity/TIL] 3D 퍼즐 플랫폼 게임 - 팀 프로젝트 일지 (1)

어제 실제 세계의 버튼과 같은 구조로 Spring Joint를 달아서 사용할 것 같다는 결론이 났었는데, 문제가 생겼다. 그렇게 하면 연결된 두 물체가 한 물체로 여겨져서, 서로 충돌 이벤트가 발생하지 않는다.

버튼의 바닥부분과 뚜껑 사이에 스프링이 있고, 무게에 의해 뚜껑이 내려가면 바닥면과 충돌하면 버튼이 눌린 것으로 인식되어야 하는데 OnCollisionEnter에 들어오지 않는다!! 그래서 결국 ConnectedBody를 비운 방식으로 사용하게 되었다. 

Spring Joint의 프로퍼티

Spring Joint의 프로퍼티들도 조금씩 이해가 되기 시작했다.

  • Spring은 스프링 강도
  • Damper는 원위치 돌아올때 감소하는 힘이라는데 쉽게 말하자면 Damper를 약하게 하면 푸딩처럼 찰방거리고 세게 하면 뻑뻑한 버튼처럼 움직인다.
  • Mass Scale을 늘려 관성의 크기를 조정할 수 있다. 예를 들어 연결된 두 물체의 질량이 각각 1, 10일 때 1인 물체에 10의 Mass Scale을 적용하면 두 물체의 속도 변화량이 같아진다. Joint의 massScale 문서

Spring Joint에서 Mass Scale은 스프링이 물체에 작용하는 힘을 얼마나 증폭할지 결정하는 값이다. 그래서 기본값 1에서 3으로 변경하여 버튼이 3배 더 무거운 것처럼 동작하게 된다. 그래서 버튼을 눌러 움직이려면 3배 더 큰 힘이 필요하게 된 것이다.

 

물리 버튼과 함께 사용할 컴퓨터 사용하는 퍼즐 시스템을 어느정도 완성했다. 컨셉도 취향에 맞고 퍼즐 요소가 꽤? 많이? 만족스러워서... 이번 프로젝트 즐겁게 임하고 있다.


 Player ↔ 오브젝트 상호작용 조작감 개선

1. 픽업 위치 개선

👾1차 기능 합치기 테스트 후 발견된 문제점 : 

Player가 물건을 들고 이동할 때 물건이 다른 물건들과 건물을 뚫고 다녔다. 물건을 잡은 지점보다 더 멀리에 물건이 잡히는 현상도 부자연스럽고, 그로 인해 잡힌 물건이 다른 물건들에 가려 안보이는 경우도 많았다. 

🗝️원인 :

픽업 가능한 maxDistance에 물건이 잡혀서 부자연스러운 연출이 생겼다. 

💡해결 방법 :

물건을 잡고 있는 동안에 Raycast를 쏴서 부딪힌 곳 앞에 물건이 오도록 했다. 이런 모양새가 게이머들에게 익숙한 모습이라고 생각했다. 

아래가 해당 부분 코드인데, Raycast의 길이로 들어가는 heldDistacne는 물건을 잡는 순간에 그 물건과 플레이어 사이의 거리를 계산해서 넣어줬다.

벽뚫리는 현상 보완하는 코드

수정한 모습(1.5배속)

2. 픽업 오브젝트 회전 기능 추가

👾두 번째 문제점 :

Portable 오브젝트들의 freeze rotation을 x,y,z축에 모두 설정해줬다. 그런데 물건을 들고 어딘가에 딱 맞게 넣어야 하는 상황이 있을 때 문제가 된다. 물건이 애초에 끼워야 하는 모양대로 생성된 것이 아니라면 물건을 이리저리 회전시켜보며 맞출 수 있어야 한다. 

💡해결 방법 :

VR 게임에서 자주 본 기능인데, 특정 키를 눌러 물건을 회전시키는 것이다. 예를 들면 q키를 눌러 가로로 (y축)회전, e키를 눌러 세로로 (x축)회전 하는 기능이 필요하다. 

우선 한 방향으로 회전하는 것부터 구현하게 되었다. 회전 키가 눌리면 그동안 회전하도록 코루틴을 사용했다. 키가 캔슬되면 코루틴을 멈춘다. 플레이어는 꾹 누르는 동안 회전하는 것으로 경험하게 된다.

누르는 동안 회전시키는 코드

꾹 누르며 회전시키는 중