[Unity]마찰력 및 저항력을 활용한 게임요소 구현하기

728x90

마찰력을 활용한 게임 요소 구현

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BoxState : MonoBehaviour
{
    public PhysicsMaterial2D slopeMaterial;
    private Rigidbody2D boxRigidbody2D;

    private float boxMass = 0f;
    private float gravity = 0f;
    private float friction = 0f;
    private float angle = 0f;

    void Start()
    {
        boxRigidbody2D = GetComponent<Rigidbody2D>();
        boxMass = boxRigidbody2D.mass; //질량값
        gravity = 9.8f * boxRigidbody2D.gravityScale; //중력값
        friction = slopeMaterial.friction; //마찰계수
        angle = transform.rotation.eulerAngles.z; 
        //기본적으로 쿼터니언으로 각도를 받기 때문에
        //쿼터니언을 오일러각으로 변경

        float pushForce = boxMass * gravity * Mathf.Sin(angle * Mathf.Deg2Rad); //m*g*sin(theta), 물체를 나아가게 하는 힘
        float frictionForce = friction * boxMass * gravity * Mathf.Cos(angle * Mathf.Deg2Rad); //마찰력*m*g*cos(theta), 물체가 나아가지 못하게하는 힘

        Debug.Log("Push: " + pushForce + " , Friction: " + frictionForce);

        if (pushForce > frictionForce)
            Debug.Log("움직임");
        else
            Debug.Log("정지");
    }
}

나아가는 힘(pushForce) > 마찰힘(frictionForce)  -> 물체가 미끄러져 내려감

  • pushForce = m*g*sin(theta) 
  • frictionForce = friction(최대정지 마찰계수)*m*g*cos(theta) 

 

pushForce > frictionForce 인 경우

 

 

pushForce < frictionForce 인 경우

 

저항력을 활용한 게임 요소 구현

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public enum Drag { Drag, Simulation };
public class DragController : MonoBehaviour
{
    public Drag ballMode;
    public float dragValue;
    private Rigidbody2D ballRigidbody2D;
    void Start()
    {
        ballRigidbody2D = GetComponent<Rigidbody2D>();
        ballRigidbody2D.velocity = transform.right;
    }

    void Update()
    {
        if (ballMode == Drag.Simulation)
            ballRigidbody2D.velocity = ballRigidbody2D.velocity * (1 - dragValue * Time.deltaTime);

    }
}

저항력 V * (1 - D * dt)

D : 항력계수, dt : 경과시간

Ball_Drag(위) : Drag값 0 / Ball_Simulation(아래) : Drag값 0.5

Ball_Drag Ball_Simulation

project settings - physics2d-Linear Sleep Tolerance

영상으로 보면 두 공 다 멈춘것 같지만 실제로 위치값을 보면 차이가 있음

Ball_Drag의 경우, Linear Sleep Tolerance값 0.01이 적용받아 멈추지만, Ball_Simuation은 매 프레임 값이 곱해져 좀더 나중에 멈춤

 

728x90