시작은 0부터
2. Component, RigidBody, AddForce(), GetAxis(), velocity, Collision, Trigger, FindObjectOfType 본문
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
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 컴포넌트를 가지고 있는 오브젝트를 찾아 그 위치를 가져온다.
'Unity 학습일지' 카테고리의 다른 글
6. 코루틴 문제, Instantiate 와 SetActive (0) | 2022.08.14 |
---|---|
5. 코루틴(Coroutine), 자식 오브젝트 가져오기, Mathf.SmoothDampAngle (0) | 2022.08.13 |
4. RigidBody , LookAt, Material, 축 이동과 기울기 (0) | 2022.08.12 |
3. 축, Rotate 와 Position (0) | 2022.08.10 |
1. 콘솔 출력, 클래스, 벡터(Vector), Time.deltaTime (0) | 2022.08.08 |