210716
Unity2D_Basic #2
게임오브젝트 물리, 충돌
Rigidbody에 2D 가 붙은 경우 2D용 rigidbody이다.
Rigidbody
Add Component -> Rigidbody2D
Collider 2D
2차원 공간에서 오브젝트의 충돌 범위를 나타내는 컴포넌트
-Box / Circle / Edge / Polygon / Capsule / Composite
Offset : 충돌 범위 중심점
Size : 충돌 범위 크기
-두 오브젝트가 충돌하기위한 필수 조건
1. 두 오브젝트 모두 Collider2D 컴포넌트를 가지고 있어야 한다
2. 둘 중 하나 이상의 오브젝트가 Rigidbody2D 컴포넌트를 가지고 있어야 한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Movement2D : MonoBehaviour
{
private float moveSpeed = 5.0f; // 이동 속도
private Rigidbody2D rigid2D;
private void Awake()
{
rigid2D = GetComponent<Rigidbody2D>(); // 게임오브젝트의 컴포넌트(Rigidbody2D)에 접근
}
private void Update()
{
// Negative left, a : -1
// Positive right, d : 1
// Non : 0
float x = Input.GetAxisRaw("Horizontal"); // 좌우
// Negative down, s : -1
// Positive up, w : 1
// Non : 0
float y = Input.GetAxisRaw("Vertical"); // 상하
rigid2D.velocity = new Vector3(x, y, 0) * moveSpeed;
}
}
player - Box Collider2D, Rigidbody2D
obstacle - Box collider2D
장애물에 부딪히게 되면 자연스럽게 멈추게 된다.
(Rigidbody2는 오브젝트에 물리를 적용,처리하는 클래스로 클래스 내부에 이동 관련 함수가 작동하고 있다. 속력(velocity의 초기 값이 (0,0) 이기 때문에 움직이지 않는다.)
기존의 transform.position += ... 이동 코드 대신 Rigidbody2D의 Velocity변수만 설정해주면 Rigidbody2D에 의해서 이동이 가능하다.
-충돌 이벤트 함수
매개변수 -> Collision2D collision
(현재 컴포넌트를 가지고 있는 오브젝트에 부딪힌 오브젝트 정보)
-OnCollision2D()
OnCollisionEnter2D() : 두 오브젝트가 충돌하는 순간 1회 호출
OnCollisionStay2D() : 충돌 직후 맞닿아 있는 동안 매 프레임 호출
OnCollisionExit2D() : 두 오브젝트가 떨어져서 충돌이 종료되는 순간 1회 호출
-OnTrigger2D()
(뚫고 지나간다)
OnTriggerEnter2D() : 두 오브젝트가 충돌하는 순간 1회 호출
OnTriggerStay2D() : 충돌 직후 맞닿아 있는 동안 매 프레임 호출
OnTriggerExit2D() : 두 오브젝트가 떨어져서 충돌이 종료되는 순간 1회 호출
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CollisionEvent : MonoBehaviour
{
[SerializeField]
private Color color;
private SpriteRenderer SpriteRenderer;
private void Awake()
{
SpriteRenderer = GetComponent<SpriteRenderer>();
}
// 충돌 발생시 1회
private void OnCollisionEnter2D(Collision collision)
{
SpriteRenderer.color = color;
}
// 충돌이 유지되는 동안 매 프레임 호출
private void OnCollisionStay2D(Collision2D collision)
{
Debug.Log(gameObject.name + " : OnCollisionStay2D");
}
// 충돌 종료시 1회
private void OnCollisionExit2D(Collision2D collision)
{
SpriteRenderer.color = Color.white;
}
}
벽과 충돌시 해당 벽의 색을 변경
(OnCollision2D 이용)
내가 소속된 게임오브젝트의 컴포넌트 정보
GetComponent<컴포넌트>()
내가 아닌 다른 오브젝트의 컴포넌트 정보
게임오브젝트.GetComponent<컴포넌트>()
using System.Collections;
using System.Collections.Generic;
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.transform.position += moveDirection * moveSpeed * Time.deltaTime;
}
private void OnTriggerExit2D(Collider2D collision)
{
// trigger종료시 하얀색 변경
moveObject.GetComponent<SpriteRenderer>().color = Color.white;
// 오브젝트의 위치를 (0,3,0)으로 설정
moveObject.transform.position = new Vector3(0, 3, 0);
}
}
캡슐과 충돌(is Trigger 체크)시 상단 마름모가 이동