대외 활동/유니티 스터디

[unity] physics효과 주기 (collider, rigidbody, AddForce ...)

ballbig 2021. 7. 22. 03:04
728x90
# sprint1 : 물리법칙이 적용되는 오브젝트로 변환시키기

1. 원하는 게임 오브젝트를 생성해준다.

 

2. 해당 오브젝트에 물리 법칙을 적용시기기 위해

Inspector창 -> Physics (이때, 2D오브젝트인 경우엔 Physics2D를 선택해준다.) -> Rigidbody를 추가해준다.

 

3. 충돌효과를 주기 위해 Collider를 적용시킨다.

 

(빨간 공은 Rigidbody가 적용되어 중력이 작용하는 반면,

●파란 공은 Rigidbody가 적용되지 않아 중력이 작용하지 않는 모습)

이렇게 설정해주는 경우, 오브젝트에 물리 법칙 (중력, 힘작용, 충돌 등...)이 적용됩니다.

 

 

꿀팁

🍯 rigidbody 적용된 오브젝트가 중력과 물리연산의 영향을 무시하도록 설정하는 법

Rigidbody2D 항목 -> BodyType을 "kinematic"으로 설정해준다.

Kinematic 적용된 오브젝트는 중력과 외부의 힘에 영향을 받지 않는다.

 

 

 

🍯 오브젝트에 적용되는 중력의 크기 조정하기

Rigidbody2D 항목 -> Gravity Scale의 값을 변경해준다.

(이때, 이 값이 클수록 더 큰 중력을 받는다. 즉, 낙하속도가 빨라진다.)

 

 

# sprint2 : 오브젝트에 물리적인 힘 가하기

오브젝트에 물리적인 힘을 가하고자할 때에는 아래 함수를 이용하여 구현해 줄 수 있다.

object.rigid.AddForce( );

이때, 함수에 전달되는 대표적인 파라미터는 다음과 같다.

파라미터 내용
transform.up 위쪽 방향으로 크기가 1인 벡터
transform.right 오른쪽 방향으로 크기가 1인 벡터

- 힘의 크기를 증가시켜주고 싶다면 파라미터에 원하는 값을 곱해줍니다.

ex) transform.up * 10.5f : 위쪽 방향으로 크기 10.5의 힘을 가한다.

 

- 아래방향 또는 왼쪽 방향으로 힘을 가하고자 한다면 음수를 곱해준다.

ex) -transform.up : 위쪽방향의 음의 방향 즉, 아랫방향이 된다.

ex) -transform.right : 오른쪽방향의 음의 방향 즉, 왼쪽방향이 된다.

 

[예시 코드]

위 코드는 if 조건문에 Input.GetKeyDown(Key.Space)를 써주었는데, 

Input.GetKeyDown(Key.Space)는 스페이스바를 눌렀을 때 "true"를 반환해준다.

 

따라서 위 코드를 해석하면 다음과 같다.

-> if (Input.GetKeyDown(KeyCode.Space)) : 스페이스바를 눌렀을 때

->this.rigid.AddForce(transform.up * this.jumpforce); : 위쪽 방향으로 크기가 "this.jumpforce"이 힘을 가하라

 

[실행 모습]

스페이스바를 눌렀을 때 공이 위로 튀어 오르는 모습

 

 

[코드]

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

public class NewBehaviourScript : MonoBehaviour
{
    Rigidbody rigid;
    float jumpforce = 780f;
   
    void Start()
    {
        this.rigid = GetComponent<Rigidbody>();
    }

        void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            this.rigid.AddForce(transform.up * this.jumpforce);
        }
    }
}

 

 

# sprint3 : 두 오브젝트가 충돌 했을 때 이벤트 주기

1. 어떤 오브젝트와 충돌하는 지를 판단해주기 위해 다음과 같이 오브젝트에 tag를 달아준다.

 

2. 충돌함수를 이용해 충돌 시 수행되는 이벤트를 구현한다.

아래의 함수는 오브젝트가 다른 오브젝트와 충돌했을 때 호출되는 함수이다. 

void OnCollisionEnter(Collision other)

 

 

[예시코드]

위 코드는 "sunx"라는 태그를 가진 오브젝트와 충돌하는 경우 현재 오브젝트에 오른쪽으로 힘을 가하는 코드이다.

 

 

[실행 모습]

빨간공에 "sunx"라는 태그를 달아준 상황. 파란공과 빨간공(=sunx)이 충돌하는 경우 파란 공에 오른쪽으로 힘이 작용한다.

 

[코드]

void OnCollisionEnter(Collision other)
    {
      if(other.gameObject.tag == "sunx")
        {
            Debug.Log(other.gameObject.tag);
            this.rigid.AddForce(transform.right * this.jumpforce);
        }
    }

 

 

🚨주의 사항🚨

오브젝트의 충돌을 판정해주기 위해선

오브젝트 하나에 Rigidbody, 오브젝트 모두에 Collider 적용되어 있어야 하며,

Collider항목의 "Is Trigger" 체크되어 있어야 한다.

 

판점 & 충돌후 반응 모두를 구현해주기 위해선

Collider뿐만 아니라, Rigidbody또한 오브젝트 모두에 적용되어 있어야 한다.