๊ด€๋ฆฌ ๋ฉ”๋‰ด

Creative Engineer Lab - Archive

[Unity]๊ตฌ์ฒด ๋“œ๋กญ ์‹œ๋ฎฌ๋ ˆ์ด์…˜(Slide_drop) ๋ณธ๋ฌธ

Unity & C# ๐Ÿ“‚

[Unity]๊ตฌ์ฒด ๋“œ๋กญ ์‹œ๋ฎฌ๋ ˆ์ด์…˜(Slide_drop)

์ธํ‘œ 2026 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
๋ฐ˜์‘ํ˜•