곧 최종프로젝트가 시작된다.
최종프로젝트를 3D로 하자고 했으니 Unity의 Physics 시스템에대해 기본기를 다지는 시간을 가져보려고 한다.
학습 목표는 아래와 같다.
(이미 사용중인 부분들도 있지만 복습한다 생각하고 기본부터 공부해보려고 한다. 간단한 부분들은 정의만 하고 넘어가겠다.)
1. Rigidbody와 Collider
2. Raycast
3. Physics Material
4. 간단한 물리 기반 상호작용(끌기, 밀기, 충돌 등)
5. 폭발효과 구현해보기
1. Rigidbody와 Collider
Rigidbody: 중력, 속도, 회전과 같은 물리적 동작을 처리(이동, 점프 등을 할때 물리연산으로 처리가 가능함)
Collider: 충돌을 감지하는 물리적 경계(여러가지 종류가 있음 (Box, Sphere, Capsule, Mesh))
2. Raycast
Raycast: 가상의 레이를 쏴서 경로상의 오브젝트를 감지한다.
레이 시각화 : 에디터에서 레이를 시각화하여 편리한 디버깅이 가능하다.
Debug.DrawRay(transform.position, transform.forward * rayDistance, Color.red);
3. Physics Material
Physics Material을 사용하여 오브젝트 간의 마찰 및 반발력을 조정할 수 있다.
Bounciness: 반발력
Friction: 마찰력
오브젝트에 적용하려면 Collider에 Physics Material을 추가해주면 된다.
마찰력감소 > 미끄러워짐
반발력 증가 > 충돌 후 튕김
4. 물리 기반 상호작용
오브젝트를 밀거나 옮기는 간단한 상호작용을 구현해보자.
(아래의 예제는 가독성을 위해 간단하고, 예외처리가 없이 작성되었으니 구현하는 방법만 보도록 하자)
오브젝트 밀기
public class PushObject : MonoBehaviour
{
public float pushForce = 5f;
// 캐릭터 컨트롤러의 Collider에 다른 Collider가 감지되었을때
void OnControllerColliderHit(ControllerColliderHit hit)
{ // 충돌한 collider에 연결된 Rigidbody를 가지고오고
Rigidbody rb = hit.collider.attachedRigidbody;
if (rb != null)
{ // Rigidbody가 있다면 플레이어의 이동방향으로 AddForce를 호출
Vector3 force = hit.moveDirection * pushForce;
rb.AddForce(force, ForceMode.Impulse);
}
}
}
여기서 hit.moveDirection 이것은 CharacterController가 충돌한 순간의 이동 방향이다.
(이동 방향 벡터의 단위 벡터로 반환이 됨)
이번앤 드래그 앤 드롭으로 Rigidbody가 있는 오브젝트를 옮기는 효과를 구현해보자.
(카메라 캐시를 하지 않은건 불편해도 참아주길 바란다.)
주석을 작성했었는데.. 사실 이렇게 간단한 코드에 주석을 작성하면 더러워보이기만해서 그냥 지웠다.
public class DragObject : MonoBehaviour
{
private Rigidbody selectedObject;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit))
{
selectedObject = hit.collider.attachedRigidbody;
}
}
if (Input.GetMouseButtonUp(0) && selectedObject != null)
{
selectedObject = null;
}
if (selectedObject != null)
{
Vector3 mousePos = Input.mousePosition;
mousePos.z = Camera.main.WorldToScreenPoint(selectedObject.position).z;
selectedObject.position = Camera.main.ScreenToWorldPoint(mousePos);
}
}
}
5. 폭발효과를 만들어보자
간단하다. 하지만 그냥 해보자
OverlapSphere는 정해진 크기의 Sphere를 만들어서 해당 Sphere에 들어온 Collider를 감지할 수 있다.
overlapspherenonalloc이라고 원하는 만큼만 감지하도록 하여 메모리를 미리 지정하여 성능을 개선할 수 있는 방법도 있으니 참고하길 바란다.
using UnityEngine;
public class ExplosionEffect : MonoBehaviour
{
public float explosionForce = 10f;
public float explosionRadius = 5f;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Explode();
}
}
void Explode()
{
Collider[] colliders = Physics.OverlapSphere(transform.position, explosionRadius);
foreach (Collider nearby in colliders)
{
Rigidbody rb = nearby.GetComponent<Rigidbody>();
if (rb != null)
{
rb.AddExplosionForce(explosionForce, transform.position, explosionRadius);
}
}
}
}
AddExplosionForce는 Rigidbody클래스에 기본적으로 포함된 메서드이다. 폭발력을 적용할 때 사용된다.
'[UNITY],[C#] > TIL : UNITY' 카테고리의 다른 글
Unity와 C#의 기본 개념 다지기 (0) | 2024.11.22 |
---|---|
[Unity] 최적화 방법들을 알아보자 (0) | 2024.11.20 |
3. DOTween 활용하기 (0) | 2024.11.18 |
2. DOTween 을 배워보자 (0) | 2024.11.15 |
1. DOTween 이랑 씨름하기 (0) | 2024.11.14 |