<유니티> 게임 오브젝트 물리와 충돌

상태
완료
담당자
날짜
숫자
0
using UnityEngine; public class Movement2D : MonoBehaviour { private float MoveSpeed = 5.0f; // 이동속도 private Rigidbody2D rigid2D; private void Awake() { rigid2D = GetComponent<Rigidbody2D>(); } private void Update() { float x = Input.GetAxisRaw("Horizontal");//좌우 이동 float y = Input.GetAxisRaw("Vertical"); //위아래 이동 rigid2D.velocity = new Vector3 (x, y, 0) * MoveSpeed; //transform.position += MoveDirection * MoveSpeed * Time.deltaTime; } }
C#
복사
rigid2D 권장 사용 방법
1.
컴포넌트와 동일한 타입의 변수 생성
2.
컴포넌트 정보를 얻어와서 변수에 저장
3.
컴포넌트 정보가 저장된 변수를 사용
Tip. 현재 방법과 같이 클래스 변수를 생성하고, 컴포넌트 정보를 한번만 저장하면 현재 클래스 내부 어디에서든 rigid2D 변수를 이용해 Rigidbody2D 컴포넌트 정보를 바꾸거나 얻어올 수 있다.
Tip. Rigidbody2D는 오브젝트에 물리를 적용, 처리하는 클래스로 클래스 내부에 이동 관련 함수가 작동하고 있다. 단지 이동 방향과 속도를 나타내는 속력(velocity)의 초기 값이 (0,0)이어서 움직이지 않는 것이다.
코드와 같이 기존의 transform.position +=.. 이동 코드 대신 Rigidbody2D에 있는 속력(velocity) 변수만 설정해주면 Rigidbody2D에 의해서 이동이 가능하다.

물리적인 충돌 + 이벤트 함수 : 물체 통과 X

using UnityEngine; public class Crash : MonoBehaviour { [SerializeField] private Color color; private SpriteRenderer spriteRenderer; private void Awake() { spriteRenderer = GetComponent<SpriteRenderer>(); } // <summary> 충돌이 일어나는 순간 1회 호출 private void OnCollisionEnter2D(Collision2D collision) { spriteRenderer.color = color; } // <summary> 충돌이 유지되는 동안 매 프레임 호출 private void OnCollisionStay2D(Collision2D collision) { Debug.Log(gameObject.name + " : OnCollisionStay2D() 메서드 실행"); } // <summary> 충돌이 종료되는 순간 1회 호출 private void OnCollisionExit2D(Collision2D collision) { spriteRenderer.color = Color.red; } }
C#
복사
[SerializeField]
해당 변수의 바로 윗줄에 작성 (현재는 private Color color;의 것) Transform의 position, rotation 변수들과 같이 Inspector View에서 변수의 옵션을 조절할 수 있게 해준다.
물리적인 충돌이 일어나고, 이벤트 함수가 호출
OnCollisionEnter2D() : 두 오브젝트가 충돌하는 순간 1회 호출
OnCollisionStay2D() : 충돌 직후 맞닿아 있는 동안 매 프레임 호출
OnCollisionExit2D() : 두 오브젝트가 떨어져서 충돌이 종료되는 순간 1회 호출
매개변수 Collision2D collision : 현재 컴포넌트를 가지고 있는 오브젝트에 부딪힌 오브젝트 정보

물리적인 충돌 X + 이벤트 함수 : 물체 통과 O

using UnityEngine; public class Crash : MonoBehaviour { [SerializeField] private Color color; private SpriteRenderer spriteRenderer; private void Awake() { spriteRenderer = GetComponent<SpriteRenderer>(); } // <summary> 충돌이 일어나는 순간 1회 호출 private void OnTriggerEnter2D(Collider2D collision) { spriteRenderer.color = color; } // <summary> 충돌이 유지되는 동안 매 프레임 호출 private void OnTriggerStay2D(Collider2D collision) { Debug.Log(gameObject.name + " : OnCollisionStay2D() 메서드 실행"); } // <summary> 충돌이 종료되는 순간 1회 호출 private void OnTriggerExit2D(Collider2D collision) { spriteRenderer.color = Color.red; } }
C#
복사
물리적인 충돌이 일어나지 않고, 이벤트 함수 호출
OnTriggerEnter2D() : 두 오브젝트가 충돌하는 순간 1회 호출
OnTriggerStay2D() : 충돌 직후 맞닿아 있는 동안 매 프레임 호출
OnTriggerExit2D() : 두 오브젝트가 떨어져서 충돌이 종료되는 순간 1회 호출
매개변수 Collider2D collison : 현재 컴포넌트를 가지고 있는 오브젝트에 부딪힌 오브젝트 정보

다른 게임 오브젝트의 컴포넌트 정보 변동

내가 소속된 게임 오브젝트의 컴포넌트 정보 : GetComponent<컴포넌트>()
내가 아닌 다른 게임 오브젝트의 컴포넌트 정보 : 게임오브젝트.GetComponent<컴포넌트>()
다른 게임 오브젝트의 정보는 코드와 같이 미리 변수를 게임오브젝트 정보를 저장해두고 사용할 수도 있고, 유니티에서 제공하는 함수를 이용해 탐색할 수도 있다.
using UnityEngine; public class TriggerEvent : MonoBehaviour { [SerializeField] private GameObject moveObject; [SerializeField] private Vector3 moveDirection; private float MoveSpeed; private void Awake() { MoveSpeed = 5.0f; } private void OnTriggerEnter2D(Collider2D collision) { moveObject.GetComponent<SpriteRenderer>().color = Color.black; } private void OnTriggerStay2D(Collider2D collision) { // moveObject 오브젝트를 moveDirection 방향으로 이동한다 moveObject.transform.position += moveDirection * MoveSpeed * Time.deltaTime; } private void OnTriggerExit2D(Collider2D collision) { // moveObject 오브젝트의 색상을 흰색(Color.white)으로 설정 moveObject.GetComponent <SpriteRenderer>().color = Color.white; // moveObject 오브젝트의 위치를 (0,4,0)으로 설정 moveObject.transform.position = new Vector3 (0, 4, 0); } }
C#
복사