본문 바로가기

유니티(플랫포머 맵 만들기 ) _ 멋쟁이사자처럼 유니티 부트캠프 후기 31회차

@salmu2025. 7. 3. 11:24
반응형

[31회차 수업내용] 250630

 

1. 2D rendering Asset 만들기 

  • Project > Setting > Create 에서 Rendering > URP Asset (with 2D renderer) 추가 
    URP Asset (with 2D Renderer)
    • 2D 게임 전용 렌더 파이프라인 설정을 자동으로 만들어줌
    • 내부적으로 2D Renderer를 기본으로 연결해줌.
    • 타일맵, 2D Light, Sprite 등에 최적화되어 있음
  • Edit > Project Setting > Graphics > Default Render Pipleline > 새로 생긴 두개의 파일 중 Asset 파일 적용
  • Shader Graph에서 2D Sprite 전용 셰이더를 만들기 위해서도 URP가 필요.
  • 나중에 2D 효과(VFX Graph), 커스텀 쉐이더 등을 만들 때 기본 렌더러로는 불가능.

 

 

2. Rule Tile
:주변 타일의 위치(상하좌우, 대각선)를 기준으로 자동으로 규칙에 맞는 타일 이미지를 배치하는 ScriptableObject

    • 타일 연결이나 자연스러운 경계선 처리가 자동으로 됨
      1. Project 창에서 우클릭 →
      2. Create > 2D > Tiles > Rule Tile 선택
      3. 이름 정하기 (예: GroundTile)
      4. Rule Tile을 클릭해서 Inspector 창에서 규칙 설정

초록색 화살표 This (●) 해당 방향에 같은 Rule Tile이 있어야
빨간색 X Not This (✖) 해당 방향에 같은 타일이 없어야
없음 (회색칸) Don't Care (?) 그 방향은 조건에서 제외 (있든 없든 상관없음)

 

 

중앙 아이콘 

None 회전/반전 없이 정확히 해당 조건과 일치할 때만 적용
Rotated 회전된 형태도 인식 (90°, 180°, 270° 포함)
Mirror X 좌우로 뒤집힌 모양도 인식 (좌우 대칭)
Mirror Y 상하로 뒤집힌 모양도 인식 (상하 대칭)
Rotated + Mirror X 회전 + 좌우 반전도 인식
Rotated + Mirror Y 회전 + 상하 반전도 인식

 


*대각선은 언제?

땅의 윗면 계단 구조에서 자연스러운 적용을 위해
모서리 타일 (왼쪽 위) 위치를 정확히 특정해야 하기 때문
넓은 평지 내부 어느 방향이든 이어지게 하기 위해
좁은 벽 끝 특정한 외형 유지 필요

 

 

 

3. 맵만들기

  • CameraFollow 설정
  • 뒷배경 설정
Sprite Renderer > Draw Mode Tiled
Size 배경을 얼마나 넓게/높게 늘릴지 설정
Tile Mode Adaptive 또는 Continuous (보통 Adaptive 권장)
Order in Layer 다른 오브젝트와의 겹침 순서 조정 (배경은 보통 -1 이하)

 

* Tile Mode 비교

Continuous 무한히 반복되지만 경계 보정이 없음 픽셀 기반 반복 타일
Adaptive 반복 + 경계 자동 보정 (디폴트) 배경 이미지, 자연스러운 패턴
Stretch 이미지 자체를 늘림 (반복 아님) 배경으로 한 장 이미지만 쓸 때

 

  • background 타일맵 콜라이더 설정 
    • Tile collider / composite collider / Rigid Body (모두 2D)
    • rigidbody-static
    • tag - ground

 

 

 

 

 

4. 맵의 이벤트 만들기

4.1 밀 수 있는 상자

  • Rigidbody2D + BoxCollider2D 사용하여 밀 수 있는 상자 구현
  • 위에서도 점프 가능하게 하려면 ground 태그 필요

 

 

4.2 사다리 오르기

  • Tiled 활용하면 같은 모양 늘릴 수 있음
  • Rigidbody 2D, Collider Trigger 추가 <콜라이더 크기 조정하기>
  • Tag Ladder 추가

//기존 knightcontroller_keyboard에 추가

private bool isLadder;

void OnTriggerEnter2D(Collider2D other)
{
    
    if (other.CompareTag("Ladder"))
    {
        isLadder = true;
        // 중력을 0으로 설정하여 사다리를 오를 수 있도록 함.
        knightRb.gravityScale = 0f;
        knightRb.linearVelocity = Vector2.zero; //정지
    }
}

void OnTriggerExit2D(Collider2D other)
{
    if (other.CompareTag("Ladder"))
    {
        isLadder = false;
        knightRb.gravityScale = 2f;
        knightRb.linearVelocity = Vector2.zero;//정지
    }
}

        
void Move()
{

    // 사다리 타는 상태이며, 위아래 입력이 있을 때만 실행
    if (isLadder && inputDir.y != 0)
    {
        // Rigidbody2D의 Y축 선형 속도를 입력 방향 * 이동 속도로 설정
        knightRb.linearVelocityY = inputDir.y * moveSpeed;
    }
}

 

 

  • Ground의 콜라이더에 막히지 않게 Platform Effector 2D 컴포넌트 추가
      • Collider 2D 컴포넌트의 “Used by Effector” 체크박스 활성화
      • Add Component 버튼 클릭 → Platform Effector 2D 추가
         플랫폼(발판) 콜라이더를 “위에서만 통과 가능”하게 만들고, 아래쪽에서 올라갈 때는 막히지 않도록 하는 데 사 
Use One Way ✔ 기본값. 위에서 밟고 아래에서 통과 가능
Use One Way Grouping 발판 여러 개를 하나처럼 처리하고 싶을 때 사용
Surface Arc 충돌을 감지하는 각도 범위 (기본: 180도)
Use Side Friction 옆면 충돌 시 마찰력 적용 여부
Use Side Bounce 옆면 충돌 시 튕김 적용 여부
Rotational Offset 회전 오브젝트에 쓸 수 있는 충돌각 회전 오프셋

 

 

 

 

안돼서 봤더니 콜라이더 크기조정을 안했다.



4.3 점프 발판 만들기

  • 점프 발판 애니메이션에 Collider 추가 / Trigger 설정 / 애니메이터에 Trigger 만들어서 연결 
// PushPlatform 스크립트: 플레이어가 닿으면 1초 후 위로 튕겨 올리고 애니메이션 재생
public class PushPlatform : MonoBehaviour
{
    private Animator animator;            // 애니메이터 컴포넌트 참조
    private Rigidbody2D targetRb;         // 플레이어의 Rigidbody2D 참조
    [SerializeField] private float pushPower = 50f; // 밀어올리는 힘

    void Start()
    {
        // 자신의 Animator 컴포넌트 가져오기
        animator = GetComponent<Animator>();
    }
    
    void OnTriggerEnter2D(Collider2D other)
    {
        // 태그가 "Player"인 오브젝트가 트리거에 닿았을 때
        if (other.CompareTag("Player"))
        {
            // 해당 오브젝트의 Rigidbody2D 가져오기
            targetRb = other.GetComponent<Rigidbody2D>();

            // 1초 후 PushCharacter() 호출
            Invoke("PushCharacter", 1f);
        }
    }

    private void PushCharacter()
    {
        // 플레이어를 위로 튕겨 올리기
        targetRb.AddForceY(pushPower, ForceMode2D.Impulse);

        // 플랫폼 애니메이션 실행 (예: 눌리는 모션)
        animator.SetTrigger("Push");
    }
}

*리마인드

Invoke("함수이름", 지연시간초);

 

 

 

 

 

4.4 움직이는 발판 (삼각함수이용)

  • tilemap / 콜라이더 추가 
  • 오류방지 - Z회전 막기
using System.Timers;
using UnityEngine;

public class MovingPlatform : MonoBehaviour
{
    // 이동 방향 타입 정의 (수평, 수직)
    public enum MoveType { Horizontal, Vertical }
    public MoveType moveType; // 이동 방향 선택 변수

    public float theta;       // 움직임에 사용할 각도 값 (시간에 따라 증가)
    public float power = 0.1f; // 진폭, 즉 움직임 크기
    public float speed = 1f;   // 움직임 속도

    private Vector3 initPos;   // 초기 위치 저장

    void Start()
    {
        // 시작 시 현재 위치 저장 (기준 위치)
        initPos = transform.position;
    }

    void Update()
    {
        // 시간 경과에 따라 theta 증가 (각도 증가)
        theta += Time.deltaTime * speed;

        // moveType에 따라 수평 또는 수직으로 이동
        if (moveType == MoveType.Horizontal)
            // 초기 X 위치에서 sin(theta) 값을 곱한 만큼 좌우로 움직임
            transform.position = new Vector3(initPos.x + power * Mathf.Sin(theta), initPos.y, initPos.z);
        else if (moveType == MoveType.Vertical)
            // 초기 Y 위치에서 sin(theta) 값을 곱한 만큼 상하로 움직임
            transform.position = new Vector3(initPos.x, initPos.y + power * Mathf.Sin(theta), initPos.z);
    }

    // 플레이어가 플랫폼과 충돌 시작할 때 호출
    void OnCollisionEnter2D(Collision2D other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            // 플레이어를 플랫폼 자식으로 설정해서 플랫폼 이동에 같이 움직이도록 함
            other.transform.SetParent(transform);
        }
    }

    // 플레이어가 플랫폼과 충돌 종료할 때 호출
    void OnCollisionExit2D(Collision2D other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            // 부모 관계 해제해서 독립적으로 움직이도록 설정
            other.transform.SetParent(null);
        }
    }
}
SetParent(transform) 자식으로 붙인다 (같이 움직이게 함)
SetParent(null) 부모 관계를 끊고 독립시킴

 

  • Rigidbody2D > Body Type:
    • Dynamic → 물리 적용됨 (회전, 중력 등)
    • Kinematic → 직접 움직이되, 물리 영향 안 받음  / 움직이는 플랫폼은 Kinematic이 가장 적절
    • Static → 안 움직임
     

점프하는 플레이어 - Continuous 추천

 

 

 

 

4.5 빛 추가

  • URP Asset (with 2D Renderer) 적용됨 (→ Project Settings > Graphics > URP 에셋 연결됨)
  • Hierarchy → Right Click → Light → 2D → 선택

종류

Freeform Light 2D 손으로 그린 듯 자유로운 모양
Point Light 2D 원형 빛 (전구처럼 퍼짐)
Global Light 2D 전체 화면에 광원 적용 (배경 밝기 조절에 좋음)
Sprite Light 2D 스프라이트 형태에 따라 빛나는 느낌
Parametric Light 2D 정해진 모양(별, 오각형 등)으로 확장 가능

 

설정

Color 빛의 색상
Intensity 밝기 정도
Falloff 가장자리로 갈수록 빛이 줄어드는 정도
Outer/Inner Radius 빛의 퍼지는 범위 (Point Light 등)
Blend Style Index 렌더러와 연동된 스타일 (기본은 0)
Target Sorting Layer 어떤 레이어에 적용할지 선택 (예: “Background”만 빛나게 등)

 

 

 

 

화면이 작아서 그런가 어려운 내용을 배우는 것보다 간단간단한걸 여러개 실습할때가 수업을 따라가기 더 힘든거같다. 그래도 잘 정리해주시는 분들이 많아서 복습을 원활하게 할 수 있었다. 맵스러운 곳에서 다양한 기능들을 구현해보는데 거의 다 배운것들로 활용해서 신기했다. 끼임이나 매끄러움이나 조절 잘 하려면 멀었다는 생각이 든다. 

반응형
salmu
@salmu :: SMU 각종 기록

목차