Git Product home page Git Product logo

unrealplugin_horrorcore's Introduction

Horror Core

Horror Core는 공포 게임에서 사용될 게임 시스템용 플러그인을 목표로 합니다.

이름 및 폴더

플러그인

  • 접두사로 Horror를 이용합니다.
  • 접미사 Editor는 테스트와 같이, Editor에서만 존재해야 하는 코드 및 애셋이 존재합니다.

CPP

  1. 플러그인또는 엔진 컨텐츠 단위로
  2. Responsibility(책임) + Class(주요 부모 클래스)의 이름으로 정리합니다.

블루프린트 폴더

  1. 플러그인또는 프로젝트의 컨텐츠 단위로
  2. 1층으로 구성된,
  3. 클래스 타입으로 분류합니다.
  • 블루프린트 클래스 상속은 애셋 확장으로 이용합니다.
  • Category, ParentClass등 검색옵션으로 찾습니다.
  • 목적또는 역활은 무엇이다에 비해 자주 변경됩니다.
  • 따라서 상속 받은 하위 폴더별 구성은 이용하지 않습니다.
  • 접미사를 이용하여 핵심적인 부모클래스로 분류합니다.
  • 캐릭터의 애니메이션과 머티리얼은 접두사를 이용하여 분리합니다.
  • 서로 강하게 결합되어 있고, 몇개 안되는 경우, 하위 폴더로 분류합니다.
  • 클래스를 나타내므로 복수표현은 하지 않습니다.

월드 아웃라이너

  1. 레벨로 분류합니다.
  2. 보다 세부적인 분류가 필요한 경우 공간을 기준으로 분류합니다.

설치

에디터에 HorrorCore를 적용하는 방법은 Plugin 폴더에 (Git bash)서브모듈을 추가하여 사용합니다.

More

각각의 내용에 대해서는 Wiki를 참고할 수 있습니다. 이 리포지토리는 플러그인이며 Overview를 담고있는 프로젝트는 Unreal_HorrorCore에서 확인 할 수 있습니다.

unrealplugin_horrorcore's People

Contributors

kbmhansungb avatar

Watchers

 avatar

unrealplugin_horrorcore's Issues

Editor에 모듈 추가 후 Automation 수정하기

  • 테스트가 수정될 때마다 다시 빌드해야 함.
  • 케이스가 많아지자 관리하기 힘듬.

Editor로 모델 수정 후, 테스트 정의부에서 데이터 테이블을 이용하여 테스트하도록 해야함.

움직일 수 있는 액터

요약

마우스의 움직임에 따라 물체를 회전하고 작동시킵니다. 물체의 반응은 마우스가 이동한 만큼 반응해야 합니다.

이동의 경우 물체를 잡고 드래그 하면, 마우스가 이동한 만큼 이동해야 합니다. 마찬가지로 회전의 경우, 축에서 멀리있는 점을 잡고 회전시키면 작게 회전하고, 축에서 가까이 있는 접을 잡고 회전하면 보다 많이 회전하게 됩니다.
- 책상위에 종이를 올린 상태에서, 손가락으로 종이를 누른 후, 손가락을 움직입니다. 종이가 이동해도, 손가락과 종이의 상대 위치는 변경되지 않습니다. 이와 유사하게, 문을 열기 위해 손으로 잡고, 문을 밀면, 문과 손의 상대위치는 크게 바뀌지 않습니다.
- 마우스는 플레이어가 컴퓨터와 상호작용하기 위한 손입니다. 위의 이유로, 플레이어가 마우스를 이용해 상호작용 한다면, 가능한 실제와 비슷한 결과를 내는 것을 목표로 합니다.

추가적으로 폰의 상태에 따라, 위의 동작이 달라질 수 있습니다.

다음을 지원할 목적으로 필요 합니다.

  • 문을 잡고 엶
  • 원판 또는 벨브를 회전
  • 작은 큐브를 움직이는 목적

다음과 같이 작동해야 합니다.

  1. 마우스 입력으로
  2. 프로퍼티에서 설정한 변수를 바탕으로
  3. 물체가 이동가능한지 검사하여, 이동시키되
  4. 자연스럽게 이동하도록 (충돌이 있을 때, 가능한 자연스럽게 위치를 보정해야 함)

작성 후 문서로 정리해야 합니다.

기능에 대한 묘사

문을 연다

  1. (Player)문을 클릭하고 드래그 한다.
  2. (Movement)문을 마우스의 상대 좌표에 도달하도록 회전시킵니다.
    • 일반적으로 문은 회전축을 기준으로 회전하도록 되어 있습니다. 회전축은 Yaw이며 XYZ Axis, Roll, Pitch는 무시됩니다.

원판을 회전시킨다

  1. (Player)원판의 한 축을 클릭하고 드래그 한다.
  2. (Movement)원판을 마우스의 상대 좌표에 도달하도록 원판을 회전시킵니다.

작은 큐브를 움직인다

  1. (Player)작은 큐브를 클릭하고 드래그 합니다.
  2. (Movement) 평면 위의 움직임을 나타내게 됩니다.

손 컴포넌트

손에 아이템을 들고 움직일 때 결합하여 같이 움직이는 것이 아닌 아이템의 좌표를 원하는 좌표로 부드럽게 이동시킵니다. 이는 카메라가 흔들릴 때 아이템을 실제로 들고 있는 것 처럼 보이기 위해서 입니다.

  • 1인칭을 고려해야 합니다.

아이템

요약

아이템은 월드에 스폰되어 있어 들고있거나 인벤토리에 넣을 때 필요한 데이터를 가지고 있습니다.

아이템이 손에 들려있는 것은 월드에 스폰되는 것을 의미하고, 인벤토리에 있는 것은 아이템이 아이콘 형태로 있는 것을 의미합니다.

월드에 스폰되어 있는 아이템을 들 수 있습니다. 그리고 손에 들고있는 아이템을 월드에 배치할 수 있습니다. 예로 양초를 월드에 배치할 수 있습니다.

인벤토리에 있는 아이템은 겹칠 수 있는 아이템과 겹칠 수 없는 아이템으로 존재합니다. 예로 배터리 등의 소모성 아이템은 겹칠 수 있습니다.

요구

  1. HorrorItemInterface를 구현하는, 프리미티브 데이터 애셋에
  2. 아이콘 상태로 있어야할 정보와
  3. 액터 상태로 있어야 할 정보를 필요로 합니다.

완성하면 문서에 추가해야 합니다.

아이템의 월드 배치

Q키를 누르면 주손에 들고있는 물체를 바닥에 배치합니다.

  • 물체의 목적지는 크로스 포인트가 화면에서 가리키는 점입니다.
  • 배치시 배치 애니메이션은 아이템에서 구현됩니다.

공포 이벤트

이벤트는 플레이어의 캐릭터가 어떠한 상호작용을 했을 때 이에 따른 대상의 반응을 나타냅니다.

  • 호러이벤트 호출 순서는 호러 이벤트, 연쇄적인 이벤트 순으로 호출됩니다.

보통 이벤트 (HorrorEvent)

  • 전등이 꺼집니다. LightComponent의 Visibility를 false로 설정합니다. 즉 전등이 꺼집니다.
  • 기기가 작동합니다. ActorSequenceComponent를 Tag를 통해 찾아 실행시킵니다.

HorrorEventComponent에 인스턴스를 구현하는 것으로 이벤트를 추가할 수 있습니다.

연쇄적인 이벤트 (BindEvent)

  • 전등이 꺼지자 기기가 작동하고 이상한 소리가 들립니다.
  • 챕터 2에서 전등을 키면 전등이 깜빡거립니다.
  • 귀신이 쫒아올 때 주변 전등이 불안정해집니다.
  • HorrorEventComponent에 HorrorEvent를 바인딩 하는 것으로 가능합니다.
  • 연쇄적 이벤트는 하나의 보통 이벤트와 바인딩 합니다. 다른 보통 이벤트와 연결되어 있으면 연쇄적 이벤트이며, 아니면 보통 이벤트 입니다.

인벤토리

인벤토리는 월드에서 해당하는 위치에서 플레이어와 상호작용 할 수 있게 구현되어 있습니다. 플레이어는 화면을 움직여 마치 커서처럼 이용합니다.

인벤토리 이차원으로 슬롯으로 구성되어 있습니다. 그리고 인벤토리마다 크기가 다르게 할 수 있습니다.

이차원으로 구성된 슬랏 위젯 위에 인벤토리에 들어있는 아이템 위젯이 구현됩니다.

인벤토리의 소모성 아이템과 상호작용

인벤토리 창에서 우클릭으로 아이템 상호작용 리스트를 엽니다.

아이템 상호작용 목록은 아이템 애셋에서 구현 됩니다.

상호작용 버튼을 클릭하면 아이템과 상호작용 합니다.

인벤토리위젯에 사용할 위젯 클래스의 선언

인벤토리 위젯을 InventoryComponent에서 사용하기에 맞게 수정.

  • 에디터에서 위젯을 상속받아 HorrorInventoryComponent에 클래스 변수를 선언하여 사용함.
  • Pawn에서 인벤토리와 손의 상호작용과 관련된 로직을 작성하는 것으로 계획함.

호러 인벤토리 위젯은 인벤토리와 상호작용 하기 위한, 인터페이스 창을 의미함.

인벤토리에 아이템을 저장할 때

  1. 손에 들고 있는 아이템 액터를, 손에서 놓고, 인벤토리에 저장합니다.
  2. 아이템 액터는 파괴되고 아이템이 인벤토리에 저장됩니다.

인벤토리에 아이템을 꺼낼 때

  1. 인벤토리에 있는 아이템을 꺼내고, 아이템 액터를 월드에 스폰합니다.
  2. 스폰된 아이템 액터를 손에 듭니다.
  • 아이템을 꺼냈는데, 아이템 액터(스폰 실패)가 유효하지 않으면...

관찰할 수 있는 액터

게임의 진행 또는 플레이어에게 메시지를 전달하기 위해 관찰할 수 있는 액터가 필요합니다. 이 액터는 플레이어가 관찰을 한다면, 화면의 가운데로와, 이동시키고, 회전시킬 수 있습니다.
관찰할 수 있는 액터는 물리법칙을 적용하지 않습니다. 이는 물리오류, 및 의도치 않은 상황(플레이어가 도달할 수 없는 위치에 간다거나)로 인해 너무 복잡하다고 생각했습니다.

관찰할 수 있는 액터가, 특정한 조건에 의한 반응을 필요로 할 수 있습니다. 예를 들어 특정 각도로 쳐다봤을 때 노티파이를 발생시킨다거나, 조건을 만족하면 애니메이션을 재생하는 경우를 들 수 있습니다.

관찰할 수 있는 액터는 플레이어에게 이것이 무엇이다라는 메시지를 발 생 시킬 수 있습니다.

언리얼에서 특정컴포넌트의 포지션과 회전이 변경되었을때 모든자식 컴포넌트의 콜리젼을 포함하여 충돌하는지 알아야 합니다.

언리얼에서 특정컴포넌트의 포지션과 회전이 변경되었을때 모든자식 컴포넌트의 콜리젼을 포함하여 충돌하는지 알아야 합니다.

삽질끝에 내린결론은 자신을 포함한 모든 자식컴포넌트에서 프리미티브 컴포넌트인경우 월드의 컴포넌트 스윕으로 검사하는 것입니다. (필요한 이그노어 설정 후)

여기서 제가 궁금한것은

조금더 편한 방법이 있는가?
충돌값을 가지고 자연스럽게 위치가 수정된 결과를 얻는 방법은? 예로 책상위에 종이를 손가락으로 누르고 움직일때 종이가 물체에 저항되어 로테이션이 변경되는 것을 예로 들 수 있습니다.
공부할 목적으로 피직스 컨스트레인을 사용하지 않고 만들고 있었습니다.

추가적으로 피직스 컨스트레인의 코드 작동을 설명한 내용이 있는지 궁금합니다.

Originally posted by @kbmhansungb in #3 (comment)

인벤토리 컴포넌트 수정

인벤토리 컴포넌트는 FHorror2DInventoryData를 월드 스페이스 위젯으로 표시됩니다.

  • Pawn에서 HandComponent와 InventoryComponent의 상호작용 로직을 작성합니다.

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.