반응형
[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
- 타일 연결이나 자연스러운 경계선 처리가 자동으로 됨
- Project 창에서 우클릭 →
- Create > 2D > Tiles > Rule Tile 선택
- 이름 정하기 (예: GroundTile)
- 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 → 안 움직임

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”만 빛나게 등) |
화면이 작아서 그런가 어려운 내용을 배우는 것보다 간단간단한걸 여러개 실습할때가 수업을 따라가기 더 힘든거같다. 그래도 잘 정리해주시는 분들이 많아서 복습을 원활하게 할 수 있었다. 맵스러운 곳에서 다양한 기능들을 구현해보는데 거의 다 배운것들로 활용해서 신기했다. 끼임이나 매끄러움이나 조절 잘 하려면 멀었다는 생각이 든다.
반응형
'프로그래밍 > 유니티 부트캠프' 카테고리의 다른 글
| 유니티(공격 판정 / 체력바 / 아이템 드롭) _ 멋쟁이사자처럼 유니티 부트캠프 후기 33회차 (1) | 2025.07.05 |
|---|---|
| 유니티(몬스터 행동패턴 (Finite State Machine, 유한 상태 머신) 만들기 ) _ 멋쟁이사자처럼 유니티 부트캠프 후기 32회차 (1) | 2025.07.05 |
| 유니티(사운드매니저 / 설정창 / 씬 전환) _ 멋쟁이사자처럼 유니티 부트캠프 후기 30회차 (0) | 2025.07.03 |
| 유니티(Camera Follow / 표지판 팝업 UI 인터랙션/ 씬 내부 맵 이동/타이핑 코루틴) _ 멋쟁이사자처럼 유니티 부트캠프 후기 29회차 (0) | 2025.06.27 |
| 유니티(콤보 공격 구현, 타일맵 Props 실습) _ 멋쟁이사자처럼 유니티 부트캠프 후기 28회차 (1) | 2025.06.26 |