MonoBehaviour는 유니티에서 사용되는 CCMonoBehaviour를 상속받은 클래스는 new를 통해서 인스턴스화 될 수 없다.따라서 클래스를 인스턴스화 하기 위해 아무 기능을 하지 않는 GameObject를 생성하고인스턴스화 하고싶은 클래스를 컴포넌트로 넣어서
사용자의 키 입력을 기다렸다가, 키 입력을 받으면 모든 클래스에 알리는 역할을 한다.기존에 작성된 코드에서 InputManager의 인스턴스를 추가하고 (InputManager는 Monobehaviour를 상속받지 않았기 때문에 new를 통한 인스턴스화가 가능하다.)
기존 Object 객체에서 사용되는 함수들을 Monobehaviour 없이 구현하기 위해(Managers 스크립트에서 new를 통해 인스턴스화 하기 위해) 새로 구현을 한다.기존 Managers에서 ResourceManager의 인스턴스화를 추가했다.
카메라가 계속 플레이어를 따라다니며, 마우스를 클릭한 곳으로 플레이어가 이동하는 코드를 짜 보았다.MouseAction 이벤트를 추가하고, 마우스 왼쪽 버튼을 누르면 Press를 Invoke, 버튼을 떼는 순간 Click을 Invoke 한다.InputManager에서
마우스 클릭을 통해서만 플레이어가 이동을 하도록 변경하였다. 동시에 마우스 버튼을 누르고 있을 때도 플레이어 이동이 가능하도록 if (evt == press) 문을 삭제하였다.기존 PlayerController의 Update()에서 사용되던 코드를 세부적으로 나눠서 U
앞선 게시글에서 말했듯이 UI를 툴 상에서 드래그&드롭으로 설정한다면 프로젝트 규모가 커질수록 단점이 많아지게 된다. 그렇기 때문에 UI를 코드 상에서 자동화 할 필요성이 있다.UI의 클릭과 드래그를 구분하기 위해 Define.cs에 UIEvent라는 enum을 추가했
스택을 이용해 팝업 UI를 관리한다. 씬 UI같은 경우에는 스택이 필요가 없으므로 스택을 사용하지 않는다.또한 객체들을 씬 내에서 정리하기 위해 Root라는 프로퍼티를 사용해 게임이 실행될 때 씬 내에서 Root 객체 내에 저장되게 하였다.
UI_Base를 상속받아 사용하면서 override 된 init()을 사용한다.기존 UI_Base에는 init()함수가 없었기 때문에 UI_Base 클래스를 추상 클래스로 변경하고 abstract init() 함수를 추가했다.
기존 Instantiate 함수를 사용하면 게임 실행 시 오브젝트의 이름에 (Clone)이라는 텍스트가 붙는다.그대로 사용해도 상관은 없지만 보기에 불편하기에 SubString() 함수를 사용해 (Clone) 텍스트를 삭제했다.이 부분이 텍스트를 삭제하는 역할을 한다.
유니티에서 기본적으로 SceneManager를 제공하지만, 기능을 확장시키기 위해 따로 구현했다.Define 클래스에 Scene이라는 enum을 추가해 Scene들을 관리한다.BaseScene은 추상 클래스이며 init()함수를 통해 EventSystem을 Scene에
사운드 리소스들을 BGM, Effect 등으로 구분하여 관리하기 위한 배열 하나와코드의 최적화를 위한 Dictionary 타입 변수 하나를 선언했다.위에 선언한 배열과 함수 내에서 선언한 배열을 사용해 게임 실행 시 @sound라는 컴포넌트를 생성하도록 한다.path를
유니티에서 성능 향상을 위해 게임 내에 객체를 생성할 때 일일히 프리팹을 가져와 인스턴스화 하는것은 성능에 부하가 심하게 된다. 따라서 처음에 게임을 시작할 때 여러 개의 객체를 생성한 뒤, 그 객체들을 비활성화 했다가 필요시에 활성화를 하는 방법으로 성능 부하를 줄일
게임 내에서 사용되는 데이터를 코드 안에 정의한다면 유지보수 측면에서 매우 불리해진다.(게임 내 수치를 변화하는 패치를 할 때마다 스토어에 새로 올려야 한다.)따라서 수치 등을 Xml 혹은 Json 파일로 저장하고 코드로 불러오는 방식으로 게임 내 데이터를 관리하는 것
유니티 엔진에 관한 실습을 다 진행했으니, 본격적으로 게임을 만드는 과정에 대해 들어간다. 에셋 불러오기 https://assetstore.unity.com/packages/3d/environments/fantasy/medieval-town-exteriors-2702
https://assetstore.unity.com/packages/3d/characters/animals/dog-knight-pbr-polyart-135227위 에셋을 적으로 사용했다.https://assetstore.unity.com/package
저번 포스트에서는 마우스를 적 위에 올렸을 때 평소와는 다른 커서가 나오도록 설정했다. 이번 포스트에서는 적을 클릭했을 때의 행동을 정하도록 한다.땅을 처음 클릭하고 마우스를 누르고 있는 상태에서 포인터를 움직이면 캐릭터가 포인터를 따라 움직여야 한다. 하지만 적을 처
https://assetstore.unity.com/packages/3d/animations/warrior-pack-bundle-2-free-42454공격 애니메이션을 위한 에셋이다.플레이어의 이동과 적에게 커서를 올렸을때의 행동을 구현했으니, 이제 공격을 구
WorldSpace UI 기존에 사용하던 UI들은 다 2D UI인데 만약 캐릭터 위에 체력 게이지를 2D UI로 처리한다면 캐릭터가 멀리 있을 때 캐릭터의 크기는 작지만 UI의 크기는 그대로인 현상이 발생한다. 즉 UI를 3D 공간에 위치시킬 필요가 있다. 먼저 Sl
지금까지 공격과 공격 시 체력바 변화를 구현했으니, 이제는 몬스터의 AI를 구현할 차례이다.PlayerController로 플레이어를 관리 했던것처럼 몬스터 또한 컨트롤러 스크립트로 관리할 것이다.그 전에 PlayerController와 MonsterController
게임의 오브젝트들의 체력이 0이 되었을 때 만약 게임오브젝트를 무작정 제거한다면, 오브젝트는 제거됐지만 다른 객체에서 계속해서 제거된 오브젝트에 접근하려고 하기 때문에(다른 객체에서 플레이어의 컴포넌트에 접근하려고 한다든지) 에러가 발생한다.따라서 게임 내의 오브젝트를
플레이어가 몬스터를 죽이고 레벨 업을 하기 전에 먼저 코드를 수정한다.지금까지 체력이 주는 상황을 대미지를 주는 주체의 컨트롤러에서 OnHitEvent()함수를 통해 처리했는데 사실 체력이 주는 상황은 대미지를 받는 주체의 컨트롤러에서 처리하는 것이 합리적이다.이유는
이번엔 몬스터를 게임이 실행되기 전에 미리 배치하지 않고 게임이 실행되고 나서 자동으로 생성되게 해 볼 것이다.먼저 몬스터를 스폰하는 스크립트를 작성해준다.코루틴을 사용해 랜덤 생성한 벡터에 적을 생성하도록 하였다.필드 내에 총 몇마리의 적이 있어야 되는지 정하고, 그