오늘은 스파르타 코딩 클럽 unity 게임 개발 과정 22일차(타일맵과 마우스 에임따라가기)

2023. 11. 28. 21:55스파르타코딩클럽 게임개발

반응형

오늘은 타일맵과 에임살펴보자!

타일맵

✔️ 타일맵으로 우리의 무대를 만들어봅시다.

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이라고 부르기도 합니다.

1. 타일맵 만들기

사용하기 편하게 Inspector 옆에 놔두자
새로운 Palette를 만들자
새로운 폴더  Artwork을 만들어주고
그안에다가 다시 Level폴더를 생성시킨다 Level폴더에서 폴더선택을 클릭하고
원하는 이미지를 드래그한뒤
이렇게 넣어주자
Tiles 폴더 생성뒤 폴더 선택
그러면 이곳에 에셋이 생성된다.
이 이미지는 벽면과 여러가지 오브젝트다 원하는 것을 추가하자

이제 준비는 끝났다.

그려보자

타일 하나를 선택해서 바닥을 그려보자
바닥을 다 그리면 앞에 보일 벽과 뒤에 보일 벽을 추가로 그리기 위해 타일맵을 더 만들자
Focus On 을 사용하면 겹친 타일맵을 자세히 볼 수 있다.
위에서 보이는 벽을 만들자
새로 만들어서 같은 방식으로 아래에서 보이는 벽을 만들자

이번엔 보이지 않는 벽을 만들건데 이동하지 못하는 투명벽을 만들것이다.

위와 같은 방식으로 만들지만 이런식으로 겹쳐서 만드는것을 볼수있다.
Tiemap Collider 2D를 달아주면 크기에 맞춰서 조정해준다.
하지만 이러면 눈에 보이는데.. 그렇다면 색을 조정하면 된다
투명도를 0으로 만들면?
짜잔 보이지 않는 벽이 정말 보이지 않게 되었다.
이제 플레이어에 콜라이더를 달아주면?
짜잔 이렇게 벽에 가로막혀 이제 완전히 사로잡힌 메르시를 볼수있다 흐흐흫...

이젠 메르시에게 무기를 쥐어주자!

01_ 핵심 내용

✔️ 이후 수업에서 사용될 내용의 이론을 먼저 확인해 봅시다.

  • 쿼터니언(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;       // 팔의 SpriteRenderer
    [SerializeField] private Transform armPivot;               // 팔의 회전 중심 축
    [SerializeField] private SpriteRenderer characterRenderer;  // 캐릭터의 SpriteRenderer

    private TopDownController _controller;                     // TopDownController 컴포넌트 참조

    private void Awake()
    {
        _controller = GetComponent<TopDownController>();      // TopDownController 컴포넌트 가져오기
    }

    void Start()
    {
        _controller.onLookEvent += OnAim;                      // onLookEvent 이벤트에 OnAim 메서드 연결
    }

    // 조준 시 호출되는 메서드
    public void OnAim(Vector2 newAimDirection)
    {
        RotateArm(newAimDirection);                             // 팔을 회전시키는 메서드 호출
    }

    // 팔을 주어진 방향으로 회전시키는 메서드
    private void RotateArm(Vector2 direction)
    {
        float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;  // 주어진 방향으로 각도 계산

        // 팔의 SpriteRenderer를 상하로 뒤집음
        armRenderer.flipY = Mathf.Abs(rotZ) > 90f;

        // 캐릭터의 SpriteRenderer를 팔의 뒤집힌 상태에 맞춰 좌우로 뒤집음
        characterRenderer.flipX = armRenderer.flipY;

        // 팔의 중심 축을 이용하여 주어진 각도로 회전
        armPivot.rotation = Quaternion.Euler(0, 0, rotZ);
    }
}

Arm Renderer에 이미지 Arm Pivot에 WeaponPivot 그리고 Character Renderer에 캐릭터 이미지를 넣으면??
마력탄이 마우스의 에임에 따라가는 것을 볼 수 있다.

 

다들 커여운 메르시를 보고가세용.

반응형