Giter Club home page Giter Club logo

lost_grade-1's Introduction

Lost Grade


Unity 게임엔진을 이용하여 중세 판타지 컨셉을 가진 Quarter View 형식의 3D RPG 게임을 설계, 제작, 개발하는 졸업 작품입니다.

로그인(데이터베이스)

게임을 실행하면 Login Scene이 실행됩니다. 로그인 시도 시, 아이디를 통해 온라인 데이터베이스 테이블(구글 스프레드 시트)에 저장된 계정의 정보를 불러와 자동으로 플레이어 캐릭터를 인스턴스화하여 생성합니다. 로그인이 아닌, Sign Up 기능을 이용하여 계정을 등록할 경우 새로운 계정 정보가 저장됩니다.

로그인

카메라(Main Camera)

카메라는 기본적으로 플레이어를 바라보며 Lerp를 이용해 마우스의 휠을 움직이는 방향에 따라 줌인/줌아웃이 되도록 구현하였습니다.

카메라

카메라(Mini Camera)

또한 아래 사진과 같이 화면 우측 상단에 미니맵을 배치하여 효율적으로 주변 지형을 파악할 수 있도록 하였습니다. 미니맵은 플레이어 캐릭터의 +Y축 방향에 위치하여 플레이어를 바라보며 촬영한 장면을 Main Canvas에 렌더링되도록 하여 구현하였습니다.

미니카메라 카메라

이동 및 공격

RayCasting을 이용해 마우스로 클릭한 지점으로 플레이어 캐릭터가 이동하고, 몬스터를 클릭할 시 해당 몬스터에 Target Lock을 걸어 공격할 수 있습니다. 공격 및 피격 등의 이벤트 발생 시 효과음이 발생하도록 하였습니다. 몬스터 처치 시 소량의 경험치를 획득하며 레벨 업이 가능합니다. 레벨에 따른 능력치는 StatData.json 파일로 관리중입니다.

이동및공격

물체를 가리는 오브젝트 반투명화

플레이어 캐릭터를 가리는 물체의 셰이더를 교체하여 반투명화 하도록 하였습니다. 플레이어로부터 카메라위치 방향으로 Raycast하여 충돌한 오브젝트 중 Layer를 Block으로 설정한 오브젝트를 List로 저장한 후, List에 저장된 오브젝트의 셰이더를 Transparent Shader로 교체하여 Alpha값을 조절하고, 더 이상 오브젝트가 캐릭터를 가리지 않을 때, 원래의 Shader로 교체하는 방식으로 구현하였습니다.

오브젝트투명화

중력

기본적으로 0.5G 수준의 중력가속도를 Gravity.cs 스크립트로 적용 하였습니다. 하지만 지면이 고르지 못한 경우 캐릭터가 Y축 방향으로 떨리는 문제가 발생하여 캐릭터 및 몬스터 주변 4방향의 지형의 높이의 평균을 구하여 해당 문제를 해결하였습니다.

중력

몬스터 생성

SpawningPool.cs에서 몬스터의 무작위 생성을 구현하였습니다. 일정한 크기의 Sphere내에서 NavMeshAgent를 통해 플레이어의 이동이 가능한 구역을 탐색하여 몬스터가 랜덤한 position에 생성되도록 하였습니다. 몬스터의 최대 수를 따로 설정해 두며 Enumerator를 사용하여 몬스터 처치 시 5초의 대기시간을 가진 후에 재생성되도록 합니다.

메인 UI

화면상에 표시되는 필수적인 UI인 Main UI를 구현하였습니다. 체력, 경험치, 레벨, 보유한 돈 등을 표시하는 Status Group, 보유 스킬과 사용가능한 아이템의 슬롯을 표시하는 Skill Item Group, 미니맵을 렌더링하는 MiniMapRen을 Main Panel로 묶어 Main Canvas의 하위 Component로 위치하였습니다.

메인UI

오브젝트(상점)와의 상호작용

두 개의 상점 Weapon Shop과 Potion Shop을 구현하였습니다. 상점의 UI를 활성화하기 위해선 상점 앞의 Interactive Zone과 Player Character의 Collider 충돌을 인식해야 합니다. 충돌이 인식되면 Trigger가 실행되어 플레이어캐릭터 근처에 키보드의 G키를 누르라는 작은 UI가 생성됩니다. 이를 통해 플레이어 캐릭터는 Object와 상호작용할 수 있습니다. G키를 이용하여 상호작용 하면 Shop의 UI가 활성화 됩니다. 모든 UI는 에셋을 재구성하여 직접 디자인 하였습니다. 구매하고자 하는 아이템의 가격을 클릭하면 해당 아이템의 이름과 선택한 개수를 Dictionar형식의 SelectedList에 저장합니다. 이후 SelectedList의 Key값으로 저장된 string을 참조하여 대기열에 해당 이름을 가진 icon을 sprite로 로드합니다. Buy버튼을 통해 구매한 아이콘은 플레이어의 inventory에 저장됩니다. 대기열과 인벤토리에는 보유한 아이템의 이미지와 수량이 함께 표시되도록 하였습니다. 또한 현재 보유한 Gold와 선택한 아이템의 총 가격, 구매 시 잔액이 UI에 표시되며 잔액이 0보다 작을 경우 빨간색으로 글씨가 바뀌며 구매되지 않습니다.

상점 상점 상점

인벤토리

플레이어의 아이템을 보관하는 인벤토리를 구현하였습니다. 상점의 대기열과 비슷한 원리로, 아이템의 이름과 수량을 저장하는 Inven_Items를 Dictionary형으로 선언하였습니다. addItem함수의인자로 새로 추가할 아이템들의 Dictionary를 받아 새로운 아이템을 추가합니다. 가령 상점에서 아이템을 구매시 addItem(SelectedList)와 같은 방법으로 아이템이 추가되는 것입니다. PlayerStat에서는 Inventory를 PlayerInventory로 인스턴스화하여 멤버로 가지고있고 PlayerStat을 멤버(_stat)로 갖는 Shop에서는 _stat.PlayerInventory.addItem(SelectedList);를 통해 인벤토리에 아이템을 저장합니다.

아이템 사용

인벤토리에 가지고 있는 아이템 중 체력을 회복할 수 있는 물약의 경우 Main UI 하단의 퀵슬롯에 등록이 되어 왼쪽부터 순서대로 키보드의 1, 2, 3번 키를 눌러 사용할 수 있습니다. 물약에 따라 회복되는 체력의 양이 다릅니다. 또한 소진된 아이템의 경우 인벤토리에서 소멸합니다.

아이템

스킬 사용

키보드의 Q와 W는 스킬 이벤트가 발생되도록 구현되어 있습니다. Q스킬은 강타, W스킬은 방어력 증가입니다.

스킬

사운드

Bgm은 SoundManager를 통해 관리합니다. 공격, 레벨 업, 스킬 사용 등의 상황에서의 효과음은 이벤트 발생과 동시에 처리됩니다.

포탈

맵 이동, 즉 Scene간의 전환을 위한 포탈을 구현하였습니다. 같은 Scene내의 이동이 아니기 때문에 플레이어 캐릭터의 position을 변경하는 것이 아니라, SceneManagerEx.cs에 구현한 LoadScene함수를 통해 새로운 씬을 불러오도록 하였습니다. 새로운 씬에도 원래 씬으로 이동할 수 있는 포탈을 생성하여 양방향 이동이 가능합니다. LoadScene은 Login 및 SignUp scene에서도 사용했었는데, 포탈을 이용한 LoadScene은 상점의 Interactive Zone과 같은 방식으로 구현한 포탈과의 상호작용을 통해 실행 할 수 있습니다.

포탈

lost_grade-1's People

Contributors

ksg1766 avatar kkh97 avatar child-of-coding avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.