본문 바로가기
TIL

12.01 (TIL-Unity)

by 오랑이귀엽다 2023. 12. 1.

충돌과 각 컴포넌트의 이해

Unity에서 충돌과 관련하여 중요한 개념은 Collider와 Rigidbody 컴포넌트

이 두 컴포넌트는 Unity에서 물리 시뮬레이션과 충돌 감지를 처리하는데 필수적

 

Collider:

1. Collider 컴포넌트는 게임 오브젝트에 물리적 형태를 부여

이는 충돌 감지를 가능하게 하며, 여러가지 종류의 Collider가 있다.

2. 예를 들어 BoxCollider는 사각형, SphereCollider는 원형, MeshCollider는 복잡한 메시 형태의 Collider를 제공

Collider는 자체적으로 물리적인 움직임을 제어할 수는 없지만 충돌을 감지할 수 있다.

 

Rigidbody:

1. Rigidbody 컴포넌트는 게임 오브젝트에 물리 법칙을 적용

Rigidbody가 있는 오브젝트는 중력에 영향을 받고, 힘과 토크를 통해 움직일 수 있다.

 

2. 또한 Rigidbody가 부착된 오브젝트는 다른 Rigidbody나 Collider와 충돌할 수 있다.

 

충돌 발생 시

  • Unity는 OnCollisionEnter, OnCollisionStay, OnCollisionExit 등의 이벤트를 발생
  • 이 이벤트는 스크립트에서 처리하여 원하는 기능을 실행할 수 있다.
  • 예를 들어, 오브젝트가 땅에 닿으면 점프 가능 상태로 변경하거나, 오브젝트가 플레이어와 충돌하면 데미지를 입히는 등의 기능을 구현할 수 있다.

타일맵

Unity의 Tilemap 시스템을 사용하면 이러한 타일 기반의 게임 환경을 쉽게 만들 수 있다.

이 시스템을 사용하면 작은 스프라이트를 통해 광대한 게임 환경을 구성할 수 있으며,

복잡한 게임 레벨을 쉽게 디자인하고, 편집하고, 조작할 수 있다.

 

Tilemap 시스템은 다음의 구성 요소

  1. Tilemap GameObject: Unity의 타일맵 구조를 구성하는 데 사용됩니다. Tilemap Grid의 자식으로 위치하고, 특정 타일의 배치를 관리.
  2. Grid GameObject: 모든 타일맵이 위치하는 기본 격자를 나타냄
  3. Tilemap Renderer: Tilemap의 모양을 실제로 그리는 역할을 합다.
  4. Tilemap Collider 2D: 필요한 경우, Tilemap에 물리적인 경계를 추가하는 데 사용. 이를 통해 게임 캐릭터가 타일맵 환경과 상호작용할 수 있게 된다.
  5. Tile Assets: 개별 타일의 모양과 동작을 정의. 여러 개의 타일을 묶어서 Tileset이라고 부르기도 한다.

TileMap 준비하기

Create → 2D Object → Tilemap → Rectangular

 

이름수정

Create → 2D Object → Tilemap → Rectangular

 

Window → 2D → Tile Palette

 

Create New Palette → 이름 수정 Dungeon → Artwork\Level 폴더에 저장

 

Floor1 ~ 8 드래그 하여 추가 → Artwork\Level 폴더에 저장

 

모든 wall_* 추가

 

 

TileMap 그리기

Floor 하나 선택 후 그리기

 

Create → 2D Object → Tilemap → Rectangular → 이름변경 BackDesign

Tilemap Renderer → Order in Layer 2

그리기

 

Create → 2D Object → Tilemap → Rectangular → 이름변경 ForeDesign

Tilemap Renderer → Order in Layer 20

그리기

 

Create → 2D Object → Tilemap → Rectangular → 이름변경 Collision

Tilemap Collider 2D 추가

Tilemap → Color → a 0

 

그리기

 

 

 

조준(Aim) 시스템

쿼터니언(Quaternion)

  • 4차원 복소수를 이용한 회전 표현 방법입니다. (x, y, z, w) 형태로 표현되며, Unity에서 주로 사용
  • 오일러 각도(Euler angles)를 사용하여 회전을 표현할 경우 발생하는 짐벌 락(Gimbal Lock) 문제를 피할 수 있다
  • 직관적이지 않고 복잡해 보일 수 있지만, Unity에서는 쿼터니언을 사용하기 쉽게 만들어짐
  • 직접 값을 변경하거나 계산하는 대신, Unity의 내장 함수를 사용하는 것이 좋다. (예: Quaternion.Euler, Quaternion.LookRotation, Quaternion.Slerp 등).
  • 쿼터니언은 일반적으로 "정규화(normalized)"되어야 하는데, Unity에서는 이를 자동으로 처리한다. 하지만 직접 계산을 할 때는 정규화에 주의해야 한다.

아크탄젠트 (ArcTangent)

  • 아크탄젠트 함수는 삼각함수의 역함수. 특정 비율에 대한 각도를 계산하는 데 사용
  • 2차원 공간에서 점 또는 벡터에 대한 각도를 찾는 데 아크탄젠트 함수가 종종 사용.
  • 예를 들어, 벡터 (x, y)의 경우, Math.Atan2(y, x) 함수를 사용하여 벡터가 x축과 이루는 각도를 라디안으로 얻을 수 있다
  • 아크탄젠트 함수는 사인(sine)과 코사인(cosine) 함수를 이용하여 직각 삼각형에서 빗변의 각도를 계산하는 데 사용될 수 있다.
  • 이 기능은 게임 개발에서 많이 사용되며, 특히 객체가 특정 방향을 향하도록 만들거나 두 점 사이의 각도를 계산할 때 유용

마우스를 따라 회전하는 무기 만들기

오브젝트 준비하기

아래와 같이 오브젝트 준비

 

TopDownAimRotation 만들기

코드사용

더보기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TopDownAimRotation : MonoBehaviour
{
    [SerializeField] private SpriteRenderer armRenderer;
    [SerializeField] private Transform armPivot;

    [SerializeField] private SpriteRenderer characterRenderer;

    private TopDownCharacterController _controller;

    private void Awake()
    {
        _controller = GetComponent<TopDownCharacterController>();    
    }

    void Start()
    {
        _controller.OnLookEvent += OnAim;
    }

    public void OnAim(Vector2 newAimDirection)
    {
        RotateArm(newAimDirection);
    }

    private void RotateArm(Vector2 direction)
    {
        float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;

        armRenderer.flipY = Mathf.Abs(rotZ) > 90f;
        characterRenderer.flipX = armRenderer.flipY;
        armPivot.rotation = Quaternion.Euler(0, 0, rotZ);
    }
}

Player에 추가 → 아래와 같이 연결

 

 

'TIL' 카테고리의 다른 글

12.05 (TIL-Unity)  (1) 2023.12.05
12.04 (TIL-코딩문제)  (1) 2023.12.04
11.30 (TIL-코딩문제)  (0) 2023.11.30
11.29 (TIL-Unity)  (0) 2023.11.29
11.28 (TIL-코딩문제)  (0) 2023.11.28