개?발/Unity

유니티 3D 기초(기본개념) 물리(Rigidbody, Material 등)

YUEIC 2023. 10. 4. 00:02

물리효과 적용하기

Colider : 물리효과를 받기 위한 컴포넌트 (ex. 충돌)

충돌기준은 오브젝트의 크기가 아닌 colider의 크기(Radius)에 따름

컴포넌트 추가 - RigidBody : 물리효과를 받기 위한 컴포넌트

Rigidbody 컴포넌트 구성요소

-Mass : 충돌 무게, 중력가속도의 영향을 받지 않음, 수치가 높을수록 충돌이 무거워짐

위와 같이 구체를 떨어뜨려 다른 구체와 충돌시킬 경우

떨어지는 구의 Mass수치가 높을때 작용을 받는 구가 많이 밀림

떨어지는 구의 Mass수치가 낮을때 작용을 받는 구가 적게 밀림

-Use Gravity : 중력의 영향을 받을지 여부

-Is Kinematic : 외부 물리 효과를 무시 (다른 오브젝트에 의해 물리효과를 받지 않고 스크립트에 의한 영향만 유효, 움직이는 장애물과 같은 오브젝트를 만드는데 유용)

변수를 public으로 선언시 초기화 불필요, Inspector창의 요소로 생성되어 수정 가능

 

Material

재질

새로운 Material 추가
Material을 이루는 구성 요소

재질을 설정 후 Assets의 파일을 원하는 오브젝트의 Inspector에 추가

추가 전
추가 후

-Metalic : 금속재질 수치

-Smoothness : 빛 반사 수치

-Texture : 재질에 들어가는 이미지

-Tiling : 텍스쳐 파일 반복 타일 개수

-Emission : 텍스쳐 발광(밝기) 조절

 

Physics Material

탄성과 마찰을 다루는 물리적 재질

Physics Material 생성

오브젝트의 Inspector에 추가하면 Collider요소로 추가 됨

Physics Material 구성요소

-Bounciness : 탄성력, 높을수록 많이 튀어오름, 범위는 0~1

-Bounciness Combine : 다음 탄성을 계산하는 방식

-Dynamic Friction : 오브젝트가 움직일 때 마찰력, 낮을수록 많이 미끄러짐

-Dynamic Friction : 오브젝트가 정지했을 때 마찰력, 낮을수록 많이 미끄러짐

 

물체 움직이기

public class RBody : MonoBehaviour
{

    Rigidbody rigid;
    // Start is called before the first frame update
    void Start()
    {
        rigid = GetComponent<Rigidbody>();      //현재 오브젝트의 rigidbody를 가져와서 rigid변수에 할당
        //1.속력 바꾸기
        rigid.velocity = Vector3.right;         //rigidbody로부터 가져온 오브젝트의 속력을 변경(Start함수 안이기 때문에 최초 1프레임만 실행)
        
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        //2.힘 가하기
        if(Input.GetButtonDown("Jump")){
            rigid.AddForce(Vector3.up * 20, ForceMode.Impulse);  
            //jump가 입력될 때마다 Velocity에 힘(Froce)이 더해짐(Add)
            //AddForce(힘, 힘이 더해지는 연산방식), mass의 무게가 클 수록 많은 힘이 필요함, 주로 캐릭터의 점프를 구현하는데 사용
            Debug.Log(rigid.velocity);   //오브젝트의 속도를 console에 출력
        }
        Vector3 vec = new Vector3(Input.GetAxisRaw("Horizontal"),0, Input.GetAxisRaw("Vertical"));
        //오브젝트를 input에 저장된 키보드 입력을 토대로 x축 z축으로 이동
        rigid.AddForce(vec, ForceMode.Impulse);  //위 vec변수가 변형되는 값을 addForce가 받아서 처리

        //3.회전력
        rigid.AddTorque(Vector3.down); //AddTorque(Vec) : Vec방향을 축으로 회전력이 생김.
    }
}

ForceMode

1. 연속적인 힘

: 자동차의 엑셀을 밟아서 가속을 넣듯이 가속을 추가해주는 방식입니다.

: 이미 굴러가고 있는 중에 사용하기 적합합니다.

: 무게를 적용하려면 ForceMode.Force

: 무게를 무시하려면 ForceMode.Acceleration

2. 순간적인 힘

: 마치 뒤에서 누가 밀듯이 순간적으로 속도가 붙여주는 방식입니다.

: 정지 상태서 이동을 시작하려 할 때 적합합니다.

: 무게를 적용하려면 ForceMode.Impulse

: 무게를 무시하려면 ForceMode.VelocityChange

 

물리 충돌 이벤트

실제 물리적인 충돌로 발생하는 이벤트

private void OnCollisionEnter(Collision other) {}
    private void OnCollisionStay(Collision other) {}
    private void OnCollisionExit(Collision other) {}

콜라이더 충돌로 발생하는 이벤트

private void OnTriggerEnter(Collider other) {}
    private void OnTriggerStay(Collider other) {}
    private void OnTriggerExit(Collider other) {}

흰색 공이 컨트롤 가능한 오브젝트, 파란 공은 물리충돌 이벤트 처리, 빨간 상자는 콜라이더 충돌 이벤트 처리

private void OnTriggerStay(Collider other) {
            if(other.name == "Cube (1)"){
		            rigid.AddForce(Vector3.up * 2, ForceMode.Impulse);//오브젝트를 위로 띄운다.
            }
        }

 

 

 

흰색 공의 콜라이더 충돌 처리 스크립트

public class OtherBall : MonoBehaviour
{
    MeshRenderer mesh;  //오브젝트의 재질 접근은 MeshRenderer를 통해서.
    Material mat;
    // Start is called before the first frame update
    void Start()
    {
        mesh = GetComponent<MeshRenderer>();
        mat = mesh.material;
    }

    private void OnCollisionEnter(Collision other) {        //물리적 충돌이 시작될 때 호출되는 함수 (Collision other) = 충돌 정보 클래스
        if(other.gameObject.name == "Sphere"){              //오브젝트네임 Ball일 경우
            mat.color = new Color(0,0,0);                   //오브젝트의 색을 검은색으로
        }
    }

    // private void OnCollisionStay(Collision other) {      //물리적 충돌이 진행 중일 때 호출되는 함수
        
    // }

    private void OnCollisionExit(Collision other) {         //물리적 충돌이 끝날 때 호출되는 함수
        if(other.gameObject.name == "Sphere"){              //오브젝트네임 Ball일 경우
            mat.color = new Color(1,1,1);                   //오브젝트의 색을 흰색으로
        }
    }
}

파란공의 스크립트

콜라이더 충돌을 위해 빨간상자의 Box Collider 의 Is Trigger를 체크한다.
파란공이 충돌하자 코드에 의해 흰색으로 변한 모습(12시 방향)
흰색 공이 빨간 상자와 콜라이더 충돌중일 때의 모습. Vector3.up에 의해 상승중

 

'개?발 > Unity' 카테고리의 다른 글

유니티 3D 기초(기본개념)  (0) 2023.10.03