https://www.youtube.com/watch?v=SNjgew0VhHY&list=PLO-mt5Iu5TeZF8xMHqtT_DhAPKmjF6i3x&index=7
1. 타일 그리기
Sprite의 Tile을 이용해서 2D TileMap 을 사용해서 맵을 만든다.
팔레트 창 열기
Window > 2D > Tile Palette 로 팔레트 창을 열기
RandomTile asset 만들기
2D > Tiles > Rule Tile 으로 타일 에셋 생성
Rule Tile : 인접한 타일에 따라 이미지가 정해지는 타일
Number of Tiling Rules를 1로 설정
Output 을 Single 에서 Random으로 선택 후 , Size를 넉넉하게(10) 설정
6가지 타일 스프라이트를 적절하게 빈칸에 드랍(자물쇠 활용)
완성된 타일 에셋을 팔레트 창에 드래그드랍하여 덮어 씌우기
하이어라이키에 TileMap 만들기
2D Object > TileMap > Rectangular 선택
팔레트 창 하단의 Default Brush를 Line Brush로 변경
시작과 끝을 클릭해주면 알아서 라인을 그려주는 브러시
20*20의 박스를 그려주고 상단의 페인트를 누르고 속을 누르면 빈칸을 칠해준다.
룰 타일의 Noise 수치를 조절하여 원하는 형태의 타일맵 제작이 가능하다.
2. 재배치 이벤트 준비
Tilemap에 Tilemap Collider 2D 컴포넌트 추가
Tilemap에 Composite Collider 2D 컴포넌트 추가
Composite Collider 2D : 타일마다 나눠진 형태를 하나로 합치는 컴포넌트
- 기존 콜라이더에서 Used By Composite를 체크해야 사용할 수 있다.
Composite Collider 2D의 Is Trigger 체크
Rigidbody 2D에서 Body Type을 Static으로 설정
- 움직이면 안되기 때문에
인스펙터 상단의 Add Tag로 Ground, Area 추가
Tilemap을 Ground로 설정
Player 컴포넌트가 너무 많기 때문에 재배치 오브젝트를 Player의 자식으로 Create Empty(Area) 추가
Area에 Box Collider 2D 컴포넌트를 추가한다.
박스 콜라이더 2D 크기를 타일맵과 동일하게 늘리기(20*20)
- 이는 콜라이더 Is Trigger을 통해 타일맵을 이동시킬 시간을 정하기 위해서이다.
- 동일한 이유는 타일맵 4개를 사용해서 40*40의 박스를 만들것인데 이때 부자연스럽지 않게 하기 위한 적절한 크기이기 때문이다.
Box Collider 2D에서 Is Trigger 체크
Tag는 Area로 설정
3. 재배치 스크립트 준비
Reposition, GameManager 스크립트 생성
Reposition 스크립트를 타일맵 오브젝트에 추가하기
Player 정보가 Reposition에 필요한데 이를 위해 GameManager에서 정의한다.
게임매니저를 담당할 오브젝트 새로 생성(Create Empty)
GameManager 스크립트 컴포넌트로 추가
플레이어 타입의 공개 변수 선언
public Player player;
이후, 인스펙터에서 플레이어 변수에 플레이어(오브젝트)를 드래그드랍하여 초기화
장면이 하나라서 싱글톤 로직까지 작성하진 않는다.
static : 정적으로 사용하겠다는 키워드, 바로 메모리에 얹어버림.
- static으로 선언된 변수는 인스펙터에 나타나지 않는다.
public static GameManager instance;
void Awake()
{
instance = this;
}
정적 변수는 즉시 클래스에서 부를 수 있다는 편리함이 있다.
- 다른 클래스에서 GameManager.instance.player 로 접근 가능
4. 재배치 로직
OnTriggerExit2D 함수 작성
OnTriggerExit2D : 트리거가 체크된 콜라이더에서 나갔을 때 작동
- Tag가 Area인 오브젝트랑 부딛혔을 때 작도오디게
OnTriggerExit2D의 매개변수 상대방 콜라이더의 태그를 조건으로!
부딛힌 콜라이더의 태그가 Area가 아니라면~
private void OnTriggerExit2D(Collider2D collision)
{
if(!collision.CompareTag("Area"))
return;
}
- return 키워드를 만나면 더 이상 실행하지 않고 함수 탈출
재배치 로직의 거리를 측정을 위해 내위치와 타일 맵(자신)의 위치가 필요하다.
Vector3 playerPos = GameManager.instance.player.transform.position;
Vector3 myPos = transform.position;
float diffX = Mathf.Abs(playerPos.x - myPos.x);
float diffY = Mathf.Abs(playerPos.y - myPos.y);
Vector3 playerDir= GameManager.instance.player.inputVec;
float dirX = playerDir.x < 0 ? -1 : 1;
float dirY = playerDir.y < 0 ? -1 : 1;
- Vector3인 이유 Vector2 에서 Vector3로 자동 형변환을 지원하지 않기 때문
- 플레이어 위치 - 타일맵 위치 계산으로 거리 구하기
- Math.Abs() : 절대값 함수
- playerDir : Input 시스템을 통해 이동을 주었기 때문에, 이동 방향을 player.inputVec으로 알 수 있다.
- 이동방향을 저장하기 위한 변수 dirX, dirY
- 3항 연산자 : 조건식 ? true 실행문 : false 실행문
내 콜라이더의 태그의 따라 다른 로직을 구현
switch (transform.tag)
{
case "Ground":
break;
case "Enemy":
break;
}
- switch ~ case : 값의 상태에 따라 로직을 나눠주는 키워드
- transform.tag : 내 오브젝트의 transform의 태그(문자열)
-- transform은 기본적인 컴포넌트라 선언을 안해도 되나보다
Ground일 때 로직 구현
if(diffX > diffY)
{
transform.Translate(Vector3.right * dirX * 40);
}
else if (diffX < diffY)
{
transform.Translate(Vector3.up * dirY * 40);
}
- 두 오브젝트 거리 차이에서, X축이 Y출보다 크면 수평 이동.
- transform.Translate(값) : 지정된 값 만큼 현재 위치에서 이동
- Vector3.right : (1,0,0)
- Vector3.up: (0,1,0)
타일 맵 이쁘게 정렬하기
Scene 창의 Snap Increment의 Snapping 수치를 10으로 설정
스냅핑 이동 : ctrl을 + 기즈모 드래그
타일맵 오브젝트 Ctrl + D 로 3 번 복사하고 알맞게 배치
5. 카메라 설정
픽셀아트 그래픽이 깨져있어 이를 해결하기 위해
Main Camera 오브젝트에 Pixel Perfect Camera 컴포넌트 추가
Pixel Per Unit을 스프라이트에서 사용하는 수치와 맞추기(18)
Pixel Perfect Camera는 해상도가 짝수여야 작동함으로 드래그로 Game 창을 늘리거나 줄이기
Reference Resolution : 카메라 크기 계산을 위한 참고 해상도 (135, 270)
모바일로 보는법
Game창의 Simulator 기능으로 모바일 사황을 미리 확인 가능
*타일맵 크기, Area크기, 재배치 거리는 카메라 크기와 비슷하게 할것!
깔끔한 카메라 만들기
Window> Package Manager > Chinemachine 설치
하이어라이키에서 Chinemachine > Virtual Camera 생성
Virtual Camera가 카메라 감독의 역할을한다.(Main Camera에 시네머신브레인 컴포턴트 자동 추가)
Virtual Camera의 Follow에 플레이어 할당
- 이때 진동이 있다. 이를 해결하기 위해 Main Camera의 Chinemachine Brain의 Updata를 FixedUpdate로 변경
그림자가 안보인다
- 캐릭터 그림자가 잘 보이도록 타일맵 랜더러의 Order in Layer 낮추기
깃허브 올리기
Commit : ver 1.4
Description : Unrimited map
https://github.com/mekain80/CloneCode_Undead_Survivor