Artgineer_기술 배우는 아티스트

[Unity]구체 드롭 시뮬레이션(Slide_drop) 본문

Unity & C# 📂

[Unity]구체 드롭 시뮬레이션(Slide_drop)

인표몬 2025. 1. 15. 18:53
반응형

R - Reset / Space Bar - Stop & Play

 

구체에 Rigidbody를 부여, Collider를 구체와 슬라이드에 할당하여 시뮬레이션을 구현했습니다.

 

유니티 3d 프로젝트에서 매개변수는 대체로 기본값으로만 사용하는것이 가장 좋지만

 

좀 더 현실과 유사하게 하고자한다면 세부 컨트롤이 필요할 수 있다.

 

rigidbody는 기본적으로 할당 된 오브젝트가 물리엔진과 상호작용 하도록 되어있는데, Mass(질량)과 Drag(공기 저항), Angular Drag(회전 저항) 같은 값을 조정하여 실제 물리환경에 맞출 수 있다.

 

물체가 움직이는 방식에 영향을 미치기 때문에 물리 엔진의 정확도를 높이려면 질량, 속도, 중력 등의 세부 조절이 필요하다.

 

 

 

Collider는 기본은 단순한 형태로, 정확한 충돌을 위해서는 오브젝트 모델링을 최적화해야 한다.

너무 다각화 된 메쉬는 데이터 처리에 방해를 줄 수도 있고, 너무 단순한 메쉬는 원하는 결과를 얻지 못할 수 있기 때문에 적절한 옵션 조절이 필요하다.

 

Box나 Sphere, Cylinder 같은 단순한 형태의 경우 Mesh Collider 보다는 Box Collider 등을 할당하는것이 좋을 수 있다.

 

 

더보기

using UnityEngine;

public class SimulationController : MonoBehaviour
{
    public GameObject ball; // 구체
    private Rigidbody ballRigidbody;
    private Vector3 initialPosition; // 구체의 초기 위치
    private Quaternion initialRotation; // 구체의 초기 회전

    private bool isPaused = false; // 일시중지 상태

    void Start()
    {
        if (ball != null)
        {
            ballRigidbody = ball.GetComponent<Rigidbody>();

            // 초기 위치와 회전 저장
            initialPosition = ball.transform.position;
            initialRotation = ball.transform.rotation;
        }
    }

    void Update()
    {
        // Spacebar로 Pause/Resume 토글
        if (Input.GetKeyDown(KeyCode.Space))
        {
            TogglePause();
        }

        // R키로 Reset
        if (Input.GetKeyDown(KeyCode.R))
        {
            ResetSimulation();
        }
    }

    // Pause/Resume 기능
    public void TogglePause()
    {
        isPaused = !isPaused;

        if (isPaused)
        {
            Time.timeScale = 0; // 시간 흐름 멈춤
            if (ballRigidbody != null)
            {
                ballRigidbody.isKinematic = true; // 물리 중지
            }
        }
        else
        {
            Time.timeScale = 1; // 시간 흐름 재개
            if (ballRigidbody != null)
            {
                ballRigidbody.isKinematic = false; // 물리 재개
            }
        }
    }

    // Reset 기능
    public void ResetSimulation()
    {
        // 시간 및 물리 초기화
        Time.timeScale = 1;
        isPaused = false;

        if (ball != null)
        {
            // 구체를 초기 위치와 회전으로 이동
            ball.transform.position = initialPosition;
            ball.transform.rotation = initialRotation;

            // Rigidbody 속도 초기화
            if (ballRigidbody != null)
            {
                ballRigidbody.linearVelocity = Vector3.zero;
                ballRigidbody.angularVelocity = Vector3.zero;
            }
        }
    }
}

위 접은글은

스페이스바로 일시정지/시작 을 할 수 있고,

R 버튼으로 Reset 을 할 수 있는 스크립트이다.

 

 

스크립트를 빈 오브젝트에 할당해주고 각각 Sphere를 연결해주면 된다.

728x90