[unity] physics효과 주기 (collider, rigidbody, AddForce ...)
# 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"라는 태그를 가진 오브젝트와 충돌하는 경우 현재 오브젝트에 오른쪽으로 힘을 가하는 코드이다.
[실행 모습]
[코드]
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또한 두 오브젝트 모두에 적용되어 있어야 한다.