Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

시작은 0부터

2. Component, RigidBody, AddForce(), GetAxis(), velocity, Collision, Trigger, FindObjectOfType 본문

Unity 학습일지

2. Component, RigidBody, AddForce(), GetAxis(), velocity, Collision, Trigger, FindObjectOfType

0base 2022. 8. 9. 21:48

    유니티에는 C#처럼 객체 지향이면서 클래스와는 다른 컴포넌트라는 개념이 있다. 클래스는 붕어빵을 찍어내는 붕어빵틀의 개념이라고 익혔다. 붕어빵을 찍어내기 위한 구성, 붕어빵 틀 기계, 불, 밀가루 반족, 앙금 등의 재료를 멤버변수로 가졌기 때문에 붕어빵을 만들 때마다 일일이 각각의 기계, 불, 반죽 등등을 만들지 않아도 붕어빵 틀 안에 그에 해당하는 요소들이 멤버변수로 지정되어있기 때문에 간편하게 동일한 멤버변수를 사용하는 객체를 생성하는 데 용이하다.

 

하지만 붕어빵이 아니라 식빵을 만든다면?

이미 만들고 사용중인 붕어빵틀(클래스)로 붕어빵만 찍다가 식빵을 만들 수는 없다. 식빵에는 붕어빵 틀 기계나 앙금 같은 멤버변수는 불필요하기 때문이다. 이러한 문제를 해결하기 위해 유니티에서는 클래스 개념이 아닌 컴포넌트(요소) 개념을 사용한다.

 

Component

: 오브젝트를 구성하는 요소. 클래스가 여러 멤버변수를 묶어서 간편하게 사용하게 하는 기능이라면, 컴포넌트는 각 변수들을 더 세분화하여 쪼개서 부품처럼 조립해서 사용하는 개념이다. 붕어빵을 만들 때는 붕어빵 틀 기계, 밀가루 반죽, 앙금 등의 각 컴포넌트를 사용하고, 식빵을만들 때는 오븐, 밀가루 반죽, 우유 등의 컴포넌트를 사용하여 그때 그때 생성할 오브젝트의 속성에 맞는 부품들을 끌어다 쓰는 개념이다.

 

GetComponent<Rigidbody>();

:자신의 내부에 있는 리지드바디 컴포넌트를 가져온다. 가져올 컴포넌트<속성>(); 이 형식이다.

 

*같은 오브젝트 안에서 컴포넌트 간의 멤버변수 공유하기

: 플레이어 오브젝트 안에 Move 컴포넌트와 Attack 컴포넌트가 따로 있다고 가정할 때, Attack 컴포넌트에서 Move 컴포넌트 안에 있는 플레이어 현재 위치값을 나타내는 멤버변수 player_Pos를 사용하고 싶다면

 

Class Attack : MonoBehavior
{
    Move m;
    Vector3 getPlayerPos = m.player_Pos;
}

컴포넌트 이름(Move)과 클래스 내부에서 지정할 이름(m)을 선언하고,

컴포넌트 내부 변수 이름(m.player_pos)를 사용하면 된다.

 

유니티에서 오브젝트를 움직일 때, 유니티 내부 기능인 RigidBody를 이용해 중력작용을 구현할 수 있다. 

https://docs.unity3d.com/kr/2021.3/Manual/class-Rigidbody.html

 

리지드바디 - Unity 매뉴얼

Rigidbody 는 GameObject 가 물리 제어로 동작하게 합니다. 리지드바디는 힘과 토크를 받아 오브젝트가 사실적으로 움직이도록 해줍니다. 리지드바디가 포함된 모든 게임 오브젝트는 중력의 영향을

docs.unity3d.com

RigidBody

: 물체의 무게, 중력 영향 여부, 마찰, 축 고정 등 기본적인 중력 관련 기능들을 모두 포함하고 있는 컴포넌트.

 

AddForce();

: 관성이 적용되어 입력시 바로 힘이 작용되지 않고 서서히 힘이 가속을 받아 점진적으로 증가한다

이름에 걸맞게, 마치 무언가가 힘을 주고 미는 듯이 움직인다.

 

velocity();

: 이전 속도를 지우고 새로운 속도를 사용하는 것. 즉, 관성을 무시하고 속도가 즉시 변경된다. 그러나 속도는 즉각적으로 반영되더라도 힘에 대한 입력값이 없을 때 바로 멈추지 않고, 미끄러지면서 멈춘다.

 

충돌 관련 함수

//충돌이 시작되는 순간 호출
OnCollisionEnter(Collision collision)

//충돌중일 때 프레임마다 호출
OnCollisionStay(Collision collision)

//충돌이 끝날 때 호출
OnCollisionExit(Collision collision)

트리거 관련 함수

//트리거가 발동되는 순간
OnTriggerEnter(Collider other)

//트리거가 On인 매 프레임마다
OnTriggerStay(Collider other)

//트리거가 꺼질 때 호출
OnTriggerExit(Collider other)

 

충돌과 트리거의 차이

둘 다 충돌 체크를 하지만 stay 상태에서 호출 빈도의 차이가 크다. 충돌에서의 stay는 메모리 과부하가 걸릴정도로 빠르게 호출하지만, 트리거 함수는 상대적으로 적게 호출하기 때문에 충돌 관련 디버그를 할 때는 충돌함수가 아닌 트리거 함수로 하는 것이 좋다.

 

FindObjectOfType<A>();
실행중인 모든 오브젝트 중에서 A 컴포넌트가 존재하는 모든 오브젝트를 찾는다.

A a = FindObjectOfType<A>();
A[] a = FindObhectsOfType<A>(); // 여러개 찾는 경우는 s를 붙인다. ( 배열값 반환 )

b = FindObjectOfType<A>().transform;
A 컴포넌트를 가지고 있는 오브젝트를 찾아 그 위치를 가져온다.