물리가 동작하는 방식
OasisW의 물리는 엔티티에 붙인 두 컴포넌트와 프로젝트에 한 번 가져오는 물리 모듈로 움직입니다. 이 페이지는 세 요소가 각각 무엇을 맡는지, 물체가 왜 움직이지 않거나 통과하는지 이해하는 데 필요한 구조를 설명합니다. 직접 붙이는 절차는 충돌 판정 붙이기에 있습니다.
세 요소
| 요소 | 자리 | 맡는 일 |
|---|---|---|
| 물리 모듈(Ammo) | 프로젝트에 한 번. SETTINGS → PHYSICS → IMPORT AMMO, 또는 COLLISION 칸의 안내 버튼 | 실제 계산. 없으면 Rigid Body가 아무 오류 없이 멈춰 있습니다 |
| Collision | 엔티티마다 | 부딪히는 범위의 모양과 크기 |
| Rigid Body | 엔티티마다 | 움직이는 방식, 무게, 마찰, 튕김 |
물리 모듈을 가져오면 ASSETS에 Ammo 폴더가 생기고, SETTINGS의 SCRIPTS LOADING ORDER 맨 앞에 ammo.wasm.js, ammo.js가 들어갑니다(2026-10-29 확인).
조합에 따른 동작
2026-10-29 실측(각 1회 이상)에서 확인한 조합입니다.
| Collision | Rigid Body | 동작 |
|---|---|---|
| 있음 | Dynamic | 중력으로 떨어지고, 부딪히면 튕기거나 멈춥니다 |
| 있음 | Static | 움직이지 않고 다른 물체를 막습니다(바닥, 벽) |
| 있음 | 없음 | 물체를 막지 않습니다. 대신 들어오고 나가는 것을 알려 주는 트리거가 됩니다(triggerenter) |
| 없음 | 있음 | 물리 계산에 참여하지 않습니다. 실측에서 Collision 없이 Dynamic Rigid Body만 붙인 상자는 높이 4에 그대로 떠 있었습니다 |
Kinematic은 스크립트나 애니메이션으로 움직이면서 다른 물체를 미는 타입입니다. 중력을 받지 않고, 부딪혀도 밀려나지 않습니다. 실측에서 Kinematic 상자를 스크립트로 2.5미터 옮기자(translate, teleport 둘 다), 앞에 있던 Dynamic 상자가 밀려났습니다(각 1회).
중력과 단위
- 중력은 SETTINGS → PHYSICS → Gravity에서 정합니다. 처음 값은
0, -9.8, 0이고, Launch한 게임에서도 같은 값이었습니다. - 길이 단위는 미터, 무게(Mass)는 킬로그램으로 다룹니다. 기본
Box는 한 변 1미터입니다. - 엔티티마다 중력을 다르게 받게 하려면 Rigid Body의 Gravity Scale(처음 값
1)을 바꿉니다. 실측에서 0.6초 동안1인 상자는 1.72미터,0.25인 상자는 0.43미터 떨어졌습니다(1회).
물리로 움직이는 엔티티를 옮길 때
Dynamic 엔티티는 물리 모듈이 위치를 정합니다. 스크립트에서 setPosition으로 옮기면 물리 계산과 어긋날 수 있습니다. 물리로 움직이는 엔티티는 this.entity.rigidbody.teleport(x, y, z)로 옮기고, 힘은 applyForce(계속 미는 힘)·applyImpulse(한 번 툭 치는 힘)로 줍니다.
teleport로 상자를 높이 4로 옮기자 다시 떨어져 바닥에 닿았습니다(2회).applyImpulse(0, 5, 0)을 한 번 주자 바닥에 있던 상자(Mass 1)가 높이 0.5에서 1.73까지 뛰어올랐습니다(1회, 키보드·마우스·터치 입력의 점프 예제).applyForce는 부른 프레임에만 힘을 줍니다. Mass 1 상자에applyForce(0, 15, 0)을 1초 동안 매 프레임 주자 0.5초에 높이 1.08, 1초에 3.05까지 올라갔고, 최고 4.35에서 다시 내려왔습니다. 한 번만 부르면 상자는 움직이지 않았습니다(최고 0.500). 계속 밀려면update에서 매 프레임 부릅니다(2026-10-30, 각 1회).
부딪힘 받기
부딪힘은 스크립트의 이벤트로 받습니다. 막는 물체끼리는 collisionstart, 트리거에는 triggerenter를 씁니다. 자세한 내용은 충돌 이벤트 받기에 있습니다.