유니티의 Play Mode에서 활성화되는 유니티 물리 시뮬레이션을 Edit Mode에서 사용하여 리지드바디와 콜라이더를 이용하는 오브젝트들을 물리 시뮬레이션을 이용하여 자연스러운 배치가 가능합니다. Play Mode가 시작될 때 오브젝트가 끼거나 공간이 남아 불필요한 움직임을 미리 계산하여 오브젝트들의 안정적인 배치가 가능합니다.
📺 미리 보기
- 간단하게 오브젝트를 배치하여 Play Mode로 진입하면 물리연산에 의해 서로 겹쳐있거나, 바닥에서 떨어져 있는 오브젝트들이 물리에 의해 튀거나, 떨어져야 하는 문제점이 있습니다. 이러한 문제점을 이 Tool을 이용하여 해결할 수 있습니다.
- Edit Mode에서 물리를 활성화하는 Tool을 이용해 미리 물리 시뮬레이션을 이용하여 오브젝트들의 안정적인 위치를 계산하여 저장할 수 있게 해줍니다.
💬 서론
- 이 기능은 Edit Mode 에서 실제 오브젝트들의 위치가 변경되게 하는 Tool이므로 신중하게 사용해야 합니다. 아래의 주의 사항을 꼭 숙지하고 사용하세요.
1. 이 기능은 Simulation 기능에 집중되어 작성되었습니다.각 사용자 행동의 예측 불가능한 예외적인 처리는 따로 하지 않았습니다. 이 기능을 사용하기 전 사용 방법 및 주의 사항을 꼭 숙지하세요.
2. Scene을 Edit 모드에서 수정합니다. 의도하지 않은 물리 시뮬레이션 결과나 나올 수 있으니 주의하세요.
3. 이 기능은 Scene을 자동으로 저장하지 않습니다. 시뮬레이션 결과가 잘못되었다고 생각되면 다시 Scene을 불러오는것을 통해 이전 결과로 돌아갈 수 있습니다.
4. Lock 기능은 현재 활성화 된 리지드바디 컴포넌트의 Constraints를 설정합니다. 시뮬레이션이 끝난 후 Unlock을꼭 하십시오.
5. Lock이 걸려 있을 때 오브젝트를 제거하거나, 변경하는 등 시뮬레이션과 관련되지 않은 행동을 수행하면 문제가 발생할 수 있습니다.
- Lock 기능을 이용하여 시뮬레이션을 하고싶지 않은 오브젝트를 제외하고 선택한 오브젝트만 시뮬레이션을 할 수 있는 기능이 있어 더욱 효율적으로 사용할 수 있습니다.
📖 구현 내용
- tool 구현을 위한 핵심 스크립트에 대한 내용을 다룹니다.
- 이 기능은 Physics.simulationMode를 이용하여 구현하였습니다.
GUILayout.BeginHorizontal();
// Set green button style
mGreenButtonStyle = new GUIStyle(GUI.skin.button);
mGreenButtonStyle.normal.textColor = Color.green;
// Set orange button style
mOrangeButtonStyle = new GUIStyle(GUI.skin.button);
mOrangeButtonStyle.normal.textColor = Color.red;
// Display "Enable Physics" button as enabled and clickable when mIsRunningPhysics is false
GUI.enabled = !mIsRunningPhysics;
if (GUILayout.Button("Enable Physics", mGreenButtonStyle))
{
mIsRunningPhysics = true;
}
// Display "Disable Physics" button as enabled and clickable when mIsRunningPhysics is true
GUI.enabled = mIsRunningPhysics;
if (GUILayout.Button("Disable Physics", mOrangeButtonStyle))
{
mIsRunningPhysics = false;
}
// Reset GUI.enabled to its original state for other UI elements
GUI.enabled = true;
GUILayout.EndHorizontal();
- GUI Layout에서 Enable Physics, Disable Physics 버튼을 이용하여 물리 시뮬레이션 활성화 여부를 토글할 수 있도록 하였습니다.
- mIsRunningPhysics의 활성화 여부에 따라 EditorWindow내 Update가 호출되어 Simulate할 수 있도록 합니다.
private void Update()
{
if (mIsRunningPhysics)
{
StepPhysics();
}
if (mRigidbodyLockDatas.Count > 0)
{
Log($"{mRigidbodyLockDatas.Count} rigidbodies are in locked!", LogType.Warning);
}
}
- mIsRunningPhysics가 활성화 되어 있는 경우 StepPhysics() 함수를 호출하여 각 프레임별로 물리 시뮬레이션을 하도록 합니다.
- 이 Tool은 Scene의 설정을 변경할 Lock 기능을 포함하고 있어, 이를 사용할경우 지속적으로 Warning Debug를 남겨 사용자의 실수로 Scene의 데이터가 원치않는 방향으로 설정되지 않도록 경고합니다.
private void StepPhysics()
{
Physics.simulationMode = SimulationMode.Script;
Physics.Simulate(Time.fixedDeltaTime);
Physics.simulationMode = SimulationMode.FixedUpdate;
}
- Unity의 simulationMode를 Script로 설정을 한 후 Simulate를 호출하여 Edit Mode에서도 Simulation하도록 합니다.
✅ 사용 방법
- 미리보기 또는 아래의 GIF를 통해 사용 방법을 확인하세요.
- Github 또는 아래 첨부파일에서 .unitypackage를 다운로드 받아 사용할 수 있습니다.
- Tools/Bonnate/Non-Playmode Physics Simulator을 선택합니다.
- 연두색 버튼인 Enable Physics를 누르면 물리 시뮬레이션이 활성화됩니다.
- 반대로 빨간색 버튼인 Disable Physics를 누르면 비활성화됩니다.
- [주의] Lock Except Selections는 선택하지 않은 모든 활성화된 Rigidbody 컴포넌트의 Constraints를 FreezeAll로 설정합니다. 이 값은 Unlock All 버튼을 클릭하면 원래 상태로 돌아옵니다.
- [주의]하지만, Lock을 한 상태에서 Scene을 저장하여 유니티 에디터를 끄는 등 예측 불가능한 행동을 하는경우 해당 설정 자체가 적용될 수 있습니다. Lock을 했다면, 꼭 Unlock All을 눌러 기존 상태로 돌아가세요
🕹️ Unity Affiliate
- Unity Affiliate Program 파트너로서 아래의 배너를 통해 접속하신 경우 수수료를 받을 수 있습니다.
- 아래 배너의 에셋들은 '실시간 무료 에셋 랭킹'을 나타냅니다.
'unity tools & functions' 카테고리의 다른 글
[유니티] BoxColliders does not support negative scale or size. 해결 Tool (1) | 2023.11.21 |
---|---|
.OBJ 파일을 쉽게 수정하는 Tool (MeshWiz 1.0) (0) | 2023.09.22 |
[유니티] WAV. 파일의 decibel 조절 tool (0) | 2023.09.16 |
[유니티] 에셋의 이름을 편리하게 변경 (0) | 2023.09.15 |
[유니티] 중복 Enum ID 업데이트 툴 (0) | 2023.07.12 |