2020-05-23 오브젝트 충돌 감지 Collider(2D 연습)
어제 오브젝트 충돌 감지에 대해 배워서, 3D보다는 2D 마리오 게임 같은 예제로 연습을 해보면 어떨까?
하고 찾아보다가 해당하는 예제를 찾았지만, 버전이 하위버전이라, 현재쓰고있는 버전으로 컨버팅해서 다시 만들었다.
키보드로 조작하며, A는 후진, D는 전진, 스페이스바는 점프.
어셋에 애니메이터가 붙어있었는데, 사용법을 찾아보니 다 제각각이라서, 2시간동안 검증해보다가 끝내 실패했다.
예제를 만들면서 생각해 봤는데, 아주 사소한 것에 궁금증이 생겼다.
맵을 구현할때, 오브젝트로 만들어야하는건가, 아니면 캔버스로 만들어야되는 것인가에 대한 궁금증이었다.
오로지 UI를 구성할때만 캔버스, 이미지를 사용해야하는 건지 궁금하다.
찾아본결과로는 유니티에서는 되도록이면 UI를 구성할때만큼은 캔버스를 사용하도록 권장하고 있다.
그 이유는 Rect Transform이 아닌 Transform은 해상도 변경에 취약하고, 그에 반해 Rect Transform은
앵커의 개념이 존재하기 때문에, 해상도 변경에도 전혀 문제가 없다고 한다.
그렇다면, 배경 맵이라는 것도 사실상 해상도 변경에도 문제가 없어야하는데, 그렇다면 어떤 것을 이용해서 만드는게 보편적이며, 유지보수도 편한 건지 모르겠다.
Hero.class
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEditor;
using UnityEngine;
public class Hero : MonoBehaviour
{
Rigidbody2D rigid;
int speed = 10;
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
}
void OnTriggerEnter2D(Collider2D other)
{
if (other.gameObject.tag == "Block")
{
Debug.Log("캐릭터가 블록을 통과했다.");
}
}
private void Start()
{
}
void moveHero()
{
if (Input.GetKey(KeyCode.A)) {
transform.position = new Vector2(transform.position.x - 3f * Time.deltaTime, transform.position.y);
}
if (Input.GetKey(KeyCode.D)) {
transform.position = new Vector2(transform.position.x + 3f * Time.deltaTime, transform.position.y);
}
if(Input.GetKey(KeyCode.Space)){
transform.position = new Vector2(transform.position.x , transform.position.y + 3f * Time.deltaTime);
}
}
private void Update()
{
moveHero();
}
}
|
소스코드를 보면 Rigidbody2D 라고 있는데,
Box Collider 2D 컴포넌트를 붙힌 오브젝트와 Box Collider 2D 컴포넌트를 붙힌 오브젝트 사이에 충돌을 감지하기 위해서는 두 오브젝트중 적어도 하나는 Rigidbody 컴포넌트가 필요하다.
여기서, 두 오브젝트 둘다 가지고 있어도 상관없다.
현재 프로젝트에서는 캐릭터와, 블록 각각 Box Collider 2D가 붙어있고,
나는 현재 스크립가 붙어있는 캐릭터에게 Rigidbody를 붙혀두었기 때문에, 충돌이 잘 구현될 것이다.
만약 Box Collider 2D 컴포넌트의 영역보다 캐릭터가 더 크다면 Edit Collider를 누르고 편집하면된다.
그아래 OnTriggerEnter2D이라는 부분이 있는데, 이 키워드는 Box Collider 2D 컴포넌트의 Is Trigger탭의 체크 유무에 따라 체크가 되면 실행되고, 체크가 안되어있으면 실행되지 않는 부분이다.
현재 스크립트가 붙어 있는 오브젝트가 (other.gameObject.tag == "Block") "Block"이라는 태그를 가진 오브젝트를 통과 했다면, if절의 본문이 실행된다.
예를 들어 마리오가 코인을 먹는다고 가정했을때, 마리오와 코인이 서로 충돌을 해야 동전이 사라지고, 카운트가 올라가며, 동시에 이펙트가 발생한다.
여기서 자연스럽게 동전을 먹으려면 서로 충돌시에 통과가 되어야 자연스럽게 보일 것이다.
이런 경우 is Trigger로 통과 유무를 감지하여 이벤트를 넣을 수 있다.
실행화면
참고
콜라이더 관련
유니티 콜라이더 Collider 이용하는 트리거 Trigger / 콜리젼 Collision (1)
해당 티스토리 페이지는 필자가 유니티 C# 개발을 하면서 학습한 내용들을 기록하고 공유하는 페이지입니다 ! - 틀린 부분이 있거나, 수정된 부분이 있다면 댓글로 알려주세요 ! - 해당 내용을 공
chameleonstudio.tistory.com
키보드입력 이동
유니티 캐릭터 움직이기 / 키보드 왼쪽, 오른쪽 화살표로 캐릭터 이동
해당 티스토리 페이지는 필자가 유니티 C# 개발을 하면서 학습한 내용들을 기록하고 공유하는 페이지입니다 ! - 틀린 부분이 있거나, 수정된 부분이 있다면 댓글로 알려주세요 ! - 해당 내용을 공
chameleonstudio.tistory.com
애니메이터관련
유니티)기초 Animation, Animator Controller
The Animation View 하이라키창에서 움직일 오브젝트를 선택하고 애니메이션 창에서 AddProperty를 필요한 속성을 추가한다. 왼쪽에는 속성과 값을 설정할 수있고 오른쪽에는 원하는 시간대에 설정값을
funfunhanblog.tistory.com