유니티 48

간단한 2D RPG 프로젝트 - (1) BaseController

이번 포스트에서는 유니티 엔진을 사용하여 간단한 2D RPG의 구성요소를 만들어보겠습니다.2D는 기본적으로 3D에 비해 구성이나 설계가 단순하기에 부담없이 사용할 수 있는 코드로 구성해보았습니다. 1) BaseControllerRPG게임에는 플레이어가 조종하는 캐릭터와 그렇지 않은 캐릭터가 존재합니다.그러나 2개의 요소 모두 공통적인 기능을 수행해야 하는 경우가 있습니다.이런 상황에서 상속을 통해 공통적인 기능은 부모가, 개별적인 기능을 따로 구현하는 것이 좋습니다.따라서 부모의 역할을 수행하는 BaseController를 만들어보겠습니다. using System.Collections;using System.Collections.Generic;using UnityEngine;public class Bas..

Collision과 Trigger

Unity를 다루다 보면 물리 충돌은 매우 빈번하게 일어납니다.물리 충돌은 게임에서 무언가를 판단하는 매우 중요한 기능이므로 물리 충돌 없이는 사실상 게임이 돌아가지 않는다고 봐도 무방할 정도입니다. 그리고 Unity에서는 이러한 충돌을 위해 2가지의 기능을 제공합니다.오늘은 위의 2가지 기능과 그 차이를 중점으로 한번 알아보겠습니다. 1) CollisionCollision은 실제 물리 충돌을 판단합니다.총알이 피격당하거나 휘두른 검에 맞는 등의 실제 물리 충돌을 판단하는 것이 바로 Collision입니다. Collision의 경우 판단하는 함수는 OnColiisionEnter() 입니다.그렇다면 판단하는 조건에 대해서도 알아봐야 하는 것이 당연합니다.Collision의 판단 조건은 다음과 같습니다. 충..

마우스 입력을 통한 캐릭터 이동

이번 포스트에서는 마우스 입력을 통한 캐릭터의 이동을 알아보겠습니다.조금만 응용해도 모바일 환경에서의 터치에 대한 입력으로도 변형이 가능한 유용한 예제입니다. 1) 소스코드public class PlayerController : MonoBehaviour{ bool moveToDest = false; Vector3 destPos; private void Update() { OnMouseDown(); if (moveToDest) { MovePlayer(); } } void OnMouseDown() { if (Input.GetMouseButtonDown(0)) { ..

스프라이트 시트

-사전요약스프라이트 시트의 Sprite Mode를 Multiple로 설정하면 스프라이트를 쪼갤 수 있습니다.스프라이트를 이상적으로 Slice하는 것은 Grid by Cell Size 옵션을 선택하고 X, Y값을 설정하는 것입니다.Slice하거나 스프라이트 시트에 변형을 가한 경우 반드시 Apply를 해주셔야 합니다.쪼갠 스프라이트의 크기가 작다면 Pixels Per Unit을 낮춰주세요, 크다면 올려주시면 됩니다.스프라이트가 뿌옇다면 Filter Mode를 Point(no Filter)로 설정하고, Compression을 None으로 설정하세요 유니티에서 2D 게임을 제작하는 경우에게임에 사용되는 많은 부분들을 하나로 모아놓은 스프라이트 시트를 주로 사용합니다.이번 포스트에서는 이런 스프라이트 시트를 사..

오브젝트 풀

게임에는 컴퓨터의 리소스와 직접적인 연관이 있는 요소가 있습니다.눈을 사로잡는 화려한 이펙트나 디테일하게 다뤄지는 물리 효과, 정교하게 다듬어진 모델링이 그러합니다. 그러나 컴포터의 리소스를 직접적으로 조절하는 것은 결국 게임의 역할입니다.최적화를 얼마나 잘 수행했느냐가 바로 리소스를 조정하고 게임을 더 재미있고 역동적으로 만들기 때문입니다. 이번 포스트에서 소개해드릴 오브젝트 풀은 바로 이 최적화와 관련이 있습니다.먼저 유니티 코리아에서 제공하는 오브젝트 풀과 관련되 동영상을 링크로 올려드리겠습니다. https://www.youtube.com/watch?v=jvJ1Vd7PGwk 오브젝트 풀은 총알이나 화살처럼 단순하지만 무수히 많이 생성되는 오브젝트를 다루는데 효과적입니다.떨어지는 물이 바위에 구멍을 ..

Package Manager를 통해 패키지가 설치되지 않는 문제

유니티는 Package Manager를 통해 패키지를 설치하는 것을 권장합니다.그런데 Package Manager를 사용하여 패키지를 설치하는 경우 설치가 이뤄지지 않는 문제가 발생합니다.  위와 같이 로그가 남겨지며 패키지가 제대로 설치되지 않는 문제가 발생합니다.검색을 여러 번 해보며 답을 찾아봤지만,캐시 지우기, 유니티 버전 업 등의 여러 해결책은 큰 도움이 되지 않았습니다.따라서 이 포스트에서 제가 위의 문제를 어떻게 해결했는지 알려드리겠습니다. C:\Users\사용자이름\AppData\Local\Unity\cache 설치 과정에서 따로 경로를 설정하지 않았다면 유니티에서는 패키지와 관련된 캐시를 위의 경로에 저장합니다.위의 경로에는 파일이 2개 존재하는데 각각 다음과 같습니다. (1) npm 폴..

Input Manager와 Input System

유니티에서는 두 개의 입력 시스템을 제공합니다.구형 입력 시스템인 Input Manager와 신형 입력 시스템인 Input System입니다. 사용자의 키 변경에 대응하기 위해 개발된 Input System은 기존의 Input Manager와는 다른 설정방법을 갖고 있습니다.저 역시도 이를 사용하는 방법을 배우는데 많은 문제를 겪어 Input Manager와 Input System을 비교해가면서 설명드리고자 합니다. 1) Input ManagerInput Manager는  Input.GetAxis() 함수로 입력값을 읽어들입니다.이때 GetAxis의 인자는 다음의 과정으로 확인할 수 있습니다.  GetAxis의 인자로 사용할 수 있는 것은 위의 Name입니다.위의 문자열을 통해 GetAxis는 축을 인지..

유니티 에디터에서 게임을 종료하고 싶은 경우

게임을 만들다 보면 특정 상황에서 게임을 종료해야 하는 경우가 있습니다.예를 들어, esc키를 누른다거나 도착지점에 입장을 했다거나 플레이어의 체력이 0이 된 경우가 그런 경우입니다. 그러기 위해서 보통public void QuitGame() { Application.Quit();} 위와 같은 형태로 사용하는 경우가 많습니다.하지만 위와 같은 코드는 게임을 배포한 후에는 문제없이 동작하지만유니티 에디터 상에서 Play 모드일때는 동작하지 않는 경우가 있습니다. 이런 경우에는 다음과 같이 작성해주시면 되겠습니다.public void QuitGame() { #if UNITY_STANDALONE Application.Quit(); #endif #if UNITY_EDITOR ..