Unity2D_Basic #2

haechi·2021년 7월 16일
0

unity

목록 보기
23/39
post-thumbnail

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회 호출

  • OnCollision2D
    CollisionEvent.cs
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<컴포넌트>()

  • OnTrigger2D
    TriggerEvent.cs
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 체크)시 상단 마름모가 이동

참고
https://www.inflearn.com/course/%EA%B3%A0%EB%B0%95%EC%82%AC-%EC%9C%A0%EB%8B%88%ED%8B%B0-%EA%B8%B0%EC%B4%88/dashboard

profile
공부중인 것들 기록

0개의 댓글