기록 보관소

[Unity/유니티] 기초-물리 퍼즐게임: 물리기반 퍼즐 밑바탕 만들기[B54] 본문

유니티 프로젝트/물리 퍼즐게임

[Unity/유니티] 기초-물리 퍼즐게임: 물리기반 퍼즐 밑바탕 만들기[B54]

JongHoon 2022. 4. 15. 18:24

개요

유니티 입문과 독학을 위해서 아래 링크의 골드메탈님의 영상들을 보며 진행 상황 사진 또는 캡처를 올리고 배웠던 점을 요약해서 적는다.

현재는 영상들을 보고 따라하고 배우는 것에 집중할 것이며, 영상을 모두 보고 따라한 후에는 개인 프로젝트를 설계하고 직접 만드는 것이 목표다.

https://youtube.com/playlist?list=PLO-mt5Iu5TeYI4dbYwWP8JqZMC9iuUIW2 

 

유니티 강좌 기초 채널 Basic

유니티 개발을 처음 시작하시는 입문자 분들을 위한 기초 채널. [ 프로젝트 ] B00 ~ B12 (BE1) : 유니티 필수 기초 B13 ~ B19 (BE2) : 2D 플랫포머 B20 ~ B26 (BE3) : 2D 탑다운 대화형 RPG B27 ~ B37 (BE4) : 2D 종스크롤

www.youtube.com


물리 퍼즐게임: 물리기반 퍼즐 밑바탕 만들기[B54]

1. 모바일 환경 설정

새로운 프로젝트 생성
생성 완료. 이번 프로젝트는 모바일로 만들것이므로 잠시 여러 설정을 확인 및 변경해야한다
Edit -> Preferences
위 캡처처럼 Preferences의 External Tools 항목 아래 Android 목록에서 노란색 경고 표시가 없다면 문제 없이 진행할 수 있다
생성했던 프로젝트를 안드로이드 플랫폼으로 변경해준다
빌드가 되면 안드로이드 옆에 유니티 마크가 뜬다


2. 에셋 불러오기

골드메탈 홈페이지

 

Casual Physics Puzzle Assets Pack

Unity Package Ver. Zip Ver.

www.goldmetal.co.kr

압축해제하면 파일 하나가 나온다
실행시 뜨는 화면. Import 해주면 된다.
Import 완료


3. 배경 만들기

배경 색상과 카메라 사이즈 변경
에셋에서 배경으로 쓸 Background 스프라이트 생성
Mobile 해상도(9:19) 추가 및 적용
Square 생성
배경을 뒤로 빼준다
만들었던 square의 색깔과 위치를 바꿔 바닥처럼 만들어준다
Rigidbody와 Box Collider 추가
앞의 Bottom을 복사해서 수정해 벽으로 만들어준다
하나 더 만들어서 다른 한쪽 벽으로 만들어준다
만들었던 배경 요소들은 Empty를 만들어 그룹으로 묶어준다


4. 기본 동글 로직

Circle 스프라이트 생성 및 설정
스프라이트도 변경해주고 Rigid body의 Simulated를 끄고 스프라이트에 맞게 Collider Radius도 변경한다
경계선으로 쓸 Line 생성 및 설정
Dongle에서 사용할 스크립트 Dongle 생성
Dongle에 스크립트를 넣어준다

//Dongle 스크립트 파일

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

public class Dongle : MonoBehaviour {

	void Update() {
		Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
		float leftBorder = -4.2f + transform.localScale.x / 2f;	//좌측 벽 경계 설정
		float rightBorder = 4.2f - transform.localScale.x / 2f;	//우측 벽 경계 설정

		if (mousePos.x < leftBorder) {	//벽에 x축 접근 제한
			mousePos.x = leftBorder;
		}
		else if (mousePos.x > rightBorder) {
			mousePos.x = rightBorder;
		}

		mousePos.y = 8;	//Y축 고정해서 경계선 밑으로 내려가지 않도록 설정
		mousePos.z = 0;	//Z축 고정해서 맵 밖으로 나가지 않도록 설정
		transform.position = Vector3.Lerp(transform.position, mousePos, 0.2f);
	}
}
  • 좌측 우측 벽 위치에서 오브젝트의 Scale의 반지름만큼 더하거나 빼서 그 이상 이동하지 못하도록 해서 마우스가 벽을 넘어서 이동해도 그 이상 x축을 이동할 수 없도록 한 것이다.
  • Vector3 Camera.ScreenToWorldPoint(Vector3 position) : 스크린 좌표를 월드로 변환.
  • Vector3.Lerp(Vector3 a, Vector3 b, float t) : 현재 위치(a)에서 목표 위치(b)로 부드럽게 이동하는 함수. t값은 감도를 설정하며 0~1까지 설정할 수 있다.

시작 화면
마우스를 따라서 잘 움직이고 벽을 넘어가지 않는다


5. 끌어다 놓기

 

//Dongle 스크립트 파일

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

public class Dongle : MonoBehaviour {
	public bool isDrag;
	Rigidbody2D rigid;

	void Awake() {
		rigid = GetComponent<Rigidbody2D>();
	}

	void Update() {
		if (isDrag) {
			Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
			float leftBorder = -4.2f + transform.localScale.x / 2f; //좌측 벽 경계 설정
			float rightBorder = 4.2f - transform.localScale.x / 2f; //우측 벽 경계 설정

			if (mousePos.x < leftBorder) {  //벽에 x축 접근 제한
				mousePos.x = leftBorder;
			}
			else if (mousePos.x > rightBorder) {
				mousePos.x = rightBorder;
			}

			mousePos.y = 8; //Y축 고정해서 경계선 밑으로 내려가지 않도록 설정
			mousePos.z = 0; //Z축 고정해서 맵 밖으로 나가지 않도록 설정
			transform.position = Vector3.Lerp(transform.position, mousePos, 0.2f);
		}

	}

	public void Drag() {
		isDrag = true;
	}

	public void Drop() {
		isDrag = false;
		rigid.simulated = true;
	}
}
  • 동글을 끌어다 놓기위해서 isDrag 변수와 Drag(), Drop()함수를 만들었다. 손을 떼면 동글의 앞에서 비활성화했던 Rigidbody의 simulated가 true로 변경되면서 떨어지게 될 것이다.

Canvas와 Image 생성(Touch Pad로 이름만 변경했다)
Touch Pad를 화면 가득 채워주고 알파값을 0으로 만들어 투명하게 한 뒤, Event Trigger을 추가한다.

  • Event Trigger : 각종 액션들에 대한 이벤트 관리 컴포넌트
  • 여기서 이제 앞에서 만들었던 Drag(), Drop()함수를 이용할 것이다.

Event Trigger 설정
시작 직후. 마우스를 움직여도 이제 움직이지 않는다.
마우스를 클릭하고 옮기니까 따라서 움직인다
마우스를 떼니 떨어지는 모습

  • 기본 로직이 완성되었으니 프리펩으로 만들기 위해서 아래 설정들을 한다.

Dongle 태그 추가 및 설정
프리펩 폴더를 만들어서 넣어준다