스킬사용이 가능해진 상태에서 스킬키를 입력받으면 초록색 원형 이미지를 보여준다.

그리고 레이캐스트로 y을 고정하고 x와z값으로 마우스 위치를 받아 움직여주도록 했다.

 

 

사용은 마우스 왼쪽클릭을 한번더 하면 발동하도록 처리했다.

 

 

함수호출순서로는

 

1.업데이트에서 입력키 받음

2.등록된 스킬인지 확인,해당 스킬 mp가 현재 mp보다 작은지

스킬 State =true,기본 공격State = false,

3.이펙트 풀에서 스킬오브젝트 가져옴

4.사정거리 표시(하얀 테두리),  초록색테두리 위치 업데이트(Ray캐스트) / 테이블에서 데이터 가져옴

 

마우스 클릭

발동

6. 테두리들 오브젝트 크기 원위치,및 오브젝트 비활성화

7. 초록색테두리(마우스 위치)로 이펙트 게임오브젝트 상태 true

8. 스킬오브젝트 주위기준으로 가까운 거리에 있는 몬스터들에게 데미지 처리 -> 플로팅텍스트 등등

9. 플레이어 mp감소,MP UI업데이트 

10. 스킬슬롯 UI쿨타임 시작,(해당 스킬 State =false 쿨타임이 끝날때 까지)

 

발동 후

11.기본공격 State = true, 스킬공격 State = false

12.이팩트 오브젝트 비활성화

13. 쿨타임 다되면 현재 mp값과 스킬가능상태 or 불가능상태 체크

14. 스킬슬롯 UI 업데이트 

 

 

 

 

 

반응형

펙스오브엑자일 처럼 무기의 잼을 장착할 수 있도록 하고싶었다. 잼을 장착한 무기는 특정할 스킬을 쓸 수 있도록

대장장이 NPC를 만들고 거기에 무기와 잼을 끌어다 놓으면 잼 장착이 가능하도록 했다.

 

잼 장착

잼이 장착되면 아이템슬롯에서 어떤잼이 장착되었는지 볼 수 있고

잼의 맞는 이팩트가 추가된다.

 

그리고 잼스킬이 활성화 된다.

 

잼 장착 해제

잼이 장착된 무기를 끌어다 놓으면 장착된 잼이 잼칸에 보여진다. 그리고 해제가 되면 인벤토리 비어있는 공간으로 다시 돌아간다.

 

 

아이템 고유ID 부여

인벤토리에 들어온 아이템은 고유ID를 갖기때문에 잼이 장착된 잼과 그렇지 않은 잼 구별이 가능하도록 했다.

 

 

 

 

반응형

 

캐릭터 선택

 

선택하는 직업의 캐릭터의 림 라이트를 적용해서 어떤 캐릭터가 선택되었는지 표현하도록 했다.

잘 안보이는 것 같기도..

 

몬스터 피격

몬스터 피격도 어떤 몬스터가 피격당했는지 표현되도록 했다.

 

여러 몬스터들을 피격한 경우

 

 

 

몬스터는 몸통전체가 같은 메테리얼로 적용되어있어서 몸통 Renderer로 한 부분만 알고 있으면 되지만 히어로 캐릭터 같은 경우는 머리, 몸통, 팔다리가 모두 분리되어있다. 아마도 부위마다 변경이 가능한 리소스라 나뉘어있는 듯하다.

 

모든 몬스터들은 같은 메테리얼을 쓰기때문에 메테리얼을 바꾸면 피격당하지 않은 몬스터들도 림 라이트 효과가 들어간다.

 

피격당한 몬스터의 메테리얼만 바꾸도록 MaterialPropertyBlock를 사용했다. 

 

(MaterialPropertyBlock의 대한 내용은 따로 정리 해야겠다.)

 

 

 

반응형

 

 

우선 PPT로 행동트리를 그려봤다. 

공격패턴은 근접2개 그리고 원거리 이펙트공격,점프공격이있다.

 

BT대로 구현한 내용을 Gif로 보면

 

근접공격 사거리(true)-> 근접공격

 

원거리 공격 사거리(true)-> RandomAction -> 점프공격 (확률45%)

 

원거리 공격 사거리(true)-> RandomAction -> 플레이어 추적 (확률45%)

원거리 공격 사거리(true)-> RandomAction -> 원거리 공격 (확률10%)

 

위험 체력 체크(true)-> 스켈레톤소환 -> 체력회복

 

 

반응형

몬스터로밍 범위를 테이블 값으로 불러왔었는데 이게 확장성도 낮고 낭떠러지, 등등 불규칙적인 맵에 적용하기가 힘들다.

그래서 인스펙터창에서 로밍 범위를 정하도록 바꾸었다.

 

 

 

기즈모를 이용하여 몬스터가 어디로 로밍범위를 보여주도록 했다.

 

 

반응형

 

스킬북UI

UI 구성은 왼쪽은 일반 스킬, 오른쪽은 잼스 킬로 무기의 잼을 장착할 수 가있는데 잼이 장착된 무기로 가능한 스킬이 생기게 된다.

 

잼 장착은 대장장이 NPC를 통해 만들 예정

 

스킬등록

선택팝업창UI는 재사용.

스킬을 등록하기 위해서는 두가지 조건이 있다. 스킬등록 포인트가 있어야하고 이전 스킬 등록 여부

 

 

 

스킬등록이되면 실제 입력키를 받는 딕셔너리에 추가하도록 했다.

스킬등록 취소

스킬등록을 해제하면 담겨있던 딕셔너리에서도 제거하도록 했다. 실제로 입력키를 받지 않도록 하기 위해서이다.

이게 좋을까 아니면 딕셔너리는 그대로 둔 채 그 입력키를 무효화시키는 코드를 추가하는 게 좋을지

 

 

스킬사용

밑에 있는 스킬슬롯에 표시되어 있는 숫자1~8, 그리고 F1~F4까지 입력키로 스킬을 사용한다.

 

스킬 사용가능 조건 :

1. WeaponState가 0(맨주먹)이면 스킬 사용 불가능

2. 재사용시간이 경과되지 않으면 사용 불가능

3. Mp가 부족하면 불가능

 

 

1
2

 

3
스킬마다 소모MP가 다르기 때문에 사용 가능한 스킬만 활성화 되어있다.

반응형

일단 몬스터들은 마을맵에 몬스터 5종류?(고블린, 샤먼 고블린(원거리), 오크, 성난 돼지)

 

그리고 던전 씬의 2~3(보스 포함) 종류 정도 될 것 같다. 마을 씬에 입장하면 몬스터가 동적으로 생성된다. 그러 몬스터들은 각각 자기의 BT에 맞게 움직인다.

 

공격 판정

플레이어는 공격할 때 자기 공격 가능 범위(무기마다 다름)를 체크하고 그중에서 가장 가까운 몬스터들을 찾는다. (콜라이더를 사용하지 않음) 원래는 논타깃으로 플레이어가 정확히 몬스터가 있는 방향에서 공격을 해야 대미지 처리를 했지만 맞추기가 어려워 가장 가까운 몬스터가 있는 방향으로 회전하도록 했다.  

 

 

공격

공격은 기본 공격(히어로 공격력 + 무기 데미지)과 크리티컬 대미지 두 가지로 대미지를 입힐 수 있다. 크리티컬 확률은 플레이어 스텟인 크리티컬 확률로 나오도록 했다. 

 

 

UI처리

UI는 공격하고 있는 몬스터의 이름, 방어력, 체력을 뜨는  UI가 있고, 데미지 값을 보여주는 플로팅 텍스트가 있다.

플로팅 텍스트는 애니메이션 효과와 크리티컬 대미지인 경우 좌우로 흔들리는 효과는 트윈으로 처리했다.

플로팅텍스트 애니메이션

애니메이션 : 스케일 -> Y값 조절 -> 잠시 멈춤 -> 알파 값 조절

 

 

 

 

반응형

몬스터 종류는 아직 생각한 건 몇 가지 없지만 일단 가장 기본적인 근접 공격 몬스터를 만들 계획이었다.

 

몬스터들의 애니메이션은 믹스 아모(https://www.mixamo.com/#/)에서 구했다. 참 좋은 사이트이다.

 

보스 몬스터가 아닌 기본 몬스터는 플레이어보다 매우 단순하다. Idle, Walk, Run, Die, Attack 이 정도?

 

그러고 이제 이 몬스터들은 상황에 맞게 움직이기 위해 BT를 적용했다.

 

몬스터 종류의 따라 다르지만 처음 제작한 고블린은 BT는 이렇게 구성했다.

 

먼저 죽었는지 판단하고, 그렇지 않으면 다음 행동 조건을 체크하면서 해당하는 해동을 실행하도록 했다.

그 체크 조건들은 1) 공격 사거리인가? 2) 발견 거리인가? 3) 플레이어가 살아있나?

 

 

 

사실 조금 헤맸던 게 Sequence순서의 따라 동작이 의도했던 대로 안될 수가 있었기 때문에 시간이 걸렸던 것 같다. 

 

예를 들어 Sequence4와 Sequence순서가 바뀌었다고 가정하고 행동을 예상해보면 몬스터는 발견 거리가 되면 플레이어에게 달려간다. 그러고 원래라면 공격 거리가 되면 공격을 해야 하는데 계속 달려만 갈 것이다. 

 

공격 거리는 발견 거리보다 당연히 작을 수밖에 없기 때문에 Sequence6만 계속 실행될 것이다.

(물론 다른 BT함수를 만들거나 변형하면 될 수도 있지만 나는 생각이 안 났다.) 

 

 

로밍 (Squecne6)
추적 Squecne4,Squecne5
공격->추적->로밍

 

반응형

일단 퀘스트는 총 4가지 상태로 나뉜다. 

1) 받기 전

2) 받은 후

3) 완료

4) 현재 퀘스트와 관련 없는 상태

 

1) 받기 전 (퀘스트 수락)

캐릭터를 새로 생성하고 마을 씬에 들어오면 첫 번째로 퀘스트가 주어진다. 

오른쪽에 알림창같은 팝업으로 퀘스트 이름, 퀘스트 설명, 달성 현황이 표시되도록 했다.

NPC에게 받음

 

퀘스트 상태에 따라 대화 상자의 버튼과 NPC머리위 아이콘이 달라진다.

 

퀘스트를 받은후

 

퀘스트 받기 전  /  퀘스트 완료 후 

아이콘

받기 전&관련 없는 상태는 대화 상자 아이콘

받은 후는 물음표 아이콘,

퀘스트 완료상태인데 보상받기 전은 느낌표 아이콘을 보여주도록 한다.

 

받기전
받은 후

 

완료 후


2) 받은 후 (퀘스트 진행상태 로그 창)

퀘스트 로그 창을 단축기를 통해 열면 현재 받은 퀘스트 목록들을 볼 수 있다. 보상 아이템과 보상 골드, 보상 경험치 등을 확인할 수 있다.

4) 완료 (퀘스트 달성)

퀘스조건을 만족하면 퀘스트알림창과 퀘스트 로그창에 완료표시가 보여진다.

 

 

반응형

 

인벤토리 아이템 정보창

 

인벤토리에서 어떤 아이템인지 표시해주고 그 아이템의 대한 설명이 필요하다.

당연하지만 모든 아이템은 가지고 있는 정보가(공격력, 방어력, 회피율 등등) 다르다.

클릭하면 재생됨

 

 

아이템타입 enum

 

여기서   모든 아이템은 아이템정보창을 하나로 쓰기에 발생되는 문제? 가있다. 

  아이템 타입의 따라 출력되는 정보가 다르기에.  해당하는 아이템의 정보가 아닌 경우 '0'으로 표시될수가 있다. (ex 무기인데 방어력이 표시되는 경우 기획에 따라 다를수있긴 하지만)

 

먼저 모든아이템들이 공통적으로 입력되는 것은 Sprite이미지, 아이템이름, 아이템 설명

 

아이템 타입의 따라 분류를 해보자

무기 타입일 경우 무기 타입, 무기 등급, 공격력, 크리티컬, 공격 속도, 무기 등급

방어구 타입은 방어구 타입, 방어구 등급, 방어력, 회피율, HP

 이런 식으로 나뉘게 된다.

 

해당하는 아이템의 능력치에 해당하는 Text는 켜주고 그렇지 않은 능력치인 경우는 꺼주는 과정이 필요하다.

그런데 이렇게 해도 또 문제가 발생한다.

 ----------------

공격력

공격 속도

방어력

체력

----------------

UI Text가 이런 식으로 배치되어있는데 여기서 공격력과 체력만 사용하면 중간의 공격 속도와 방어력은 오브젝트를 꺼주는데 그럼 중간에 텅 비게 된다.

----------------

공격력

 

 

체력

----------------

이런 식으로 표시될 거다.

이문제는 Grid Laydout Group를 이용하면 해결이 가능하다.

 

장착 아이템 수치 표시

장착을 하면 현재 캐릭터의 수치를 표시해줘야 한다.

예를 들어 체력 : '히어로 체력+아이템 스텟'  '(+ 아이템 스텟)' 이런 식으로 능력치를 표시한다.

 

클릭하면 재생됨

 

 

여기서도 당연히 아이템을 장착할 때 스텟 값을 변경하는 과정에는 여러 가지 경우가 있다. 

 '(+ 아이템 스텟'

아이템을 장착/해제할 경우 :  현재 장착되어있는 모든 아이템들의 정보를 계산하여 표시 

'히어로 체력+아이템 스텟'

여기서 그냥 현재 히어로 스텟에 아이템 스텟을 더하면 안 된다. 그 아이템을 뺄 경우와 아이템 능력치가 곱하기나, 나누기, 퍼센트로 들어갈 경우가 있기 때문에 원본 스텟을 복사하여 사용하는 게 좋다. 원본스텟은 레벨업을 할경우?를 제외하고는 건들지 않도록 하는게 좋다.

반응형

무기 타입은 총 8가지

맨손, 한손검, 양손검, 메이스, 한 손 창, 양손 창, 한 손 도끼, 양손 도끼가 있다.

 

일단 한 손무기중에서 공격애니메이션을 제외한 대기,이동,점프등등 같은 애니메이션을 사용하고 공격애니메이션은 메이스와 한손도끼는 비슷하기에 같게 만들었다.

한손검은 다른 한손 무기 애니메이션보다 속도가 빠르다.

 

무기 리소스 모양의 무기 타입을 맞추는 것이라 시간이 들었다. 

플레이어 애니메이터

WeaponState로 무기가 스왑 되면 해당하는 애니메이션으로 넘어가도록 했다.

무기 스왑

무기 타입별 애니메이션

각 무기타입별 애니메이션은 아래와 같은 구조로 4개의 서브 스테이트로 다시 분류된다.

공격 애니메이션

마우스 좌측으로 연속 입력의 따라 3단 공격까지 가능하다.

 

무브 애니메이션

 

스킬 애니메이션

 

생활 콘텐츠용

 

반응형

콜라이더 그리드 관리

 

월드맵에서 모든 땅 포함 오브젝트 콜라이더 유지 비용을 줄이기 위해 그리드 형식 콜라이더를 켜주고 꺼주는 시스템을 만들었다. 플레이어가 없는 위치의 콜라이더가 활성화될 필요가 없기 때문이다.

 

플레이어가 위치한 그리드를 제외한 모든 다른 그리드에 포함된 오브젝트의 콜라이더는 꺼주도록 한다. 

 

 

월드맵

활성화된 그리드는 초록색 비활성화된 그리드는 빨간색으로 기즈모 색상을 변경하여 보여주고 있다.

크기는 12x12로 총 144개의 그리드로 나누고 한 그리드당 스케일 값은 50이다. 

그리드는 플레이어가 위치한 그리드를 중심으로 최소 4개(가장자리에 있을 때)~최대 9(자신 포함 8방) 개까지 켜준다.

 

월드맵의 총 3천개 이상의 오브젝트들이 있으며 게임시작과 동시에 각오브젝트의 위치를 통하여 그리드로 관리된다.

 

 

반응형

RPG 게임이기에 플레이어는 NPC는 몬스터 등 상호작용할 객체들이 많다.

그렇기 때문에 인터페이스 인터렉션을 만들어 사용하면 꽤 좋을 것 같다고 생각했다.

 

일단 플레이어와 상호작용하는 기본들이다.

1. InterType : 인터렉션타입 (NPC, 몬스터, 아이템 루팅 박스 등등

2. enable : 이 객체와 플레이어가 인터렉션을 사용할수 있는지 상태 체크용

3. InterString : 나는 그 객체를 상호작용 시도할 수 있다는 상태를 보여주기 위함으로 썼다.

4. sInterPlayerAni : 이 객체를 만났을 때 플레이어가 취하는 애니메이션들을 가지고 있다.

5. ShowInter() : InterString과 마찬가지로 이상태가 되면 객체가 발생하는 행동들이 있다.

6. ActionKey() : 5번이 활성화된 상태에서 2번 조건이 true이고 플레이어가 액션키 버튼을 누르면 실행되는 행동

7. EndIter() : 인터렉션이 끝난 후 처리

8. NonShowInter() : 5번과 반대되는 경우 

 

사용 

NPC와 대화

 

1. InterType : NPC(대화하기) 

3. InterString : 대화하기

5. ShowInter() : NPC 손 흔들기 애니메이션, 인터렉션 UI상태 true 

6. ActionKey() : 5 플레이어가 F키 누르면 NPC는 대화하는 애니메이션을 작동하고, 퀘스트 창을 출력 , 카메라 줌인

7. EndIter() : 퀘스트 창 닫고, 카메라 줌아웃

8. NonShowInter() : 인터렉션 UI상태 false

 

생활컨텐츠 : 벌목

 

반응형

사실 리소스랑 맵과 캐릭터와 딱 어울리는 UI를 찾는 게 어려웠다.

그래도 가능한 제일 어울리고 이쁜 UI를 만들고 싶었기에 열심히 찾았다.

 

그리고 요즘 핫한 패스오브엑자일 원형 HP, MP통처럼 그냥 일반 HP바처럼 가만히 있는 것이 아닌 실제 피가 가만히 있지 않듯 물결 흐르는 쉐이더 효과가 이쁘다.

사실 UI 짬뽕이 돼서 이질감이 살짝 없진 않지만 나중에 바뀌더라도 일단 이렇게 작업을 해야겠다.

반응형

직업선택 (미완성 상태)

위치 값 한 곳을 두고 캐릭터를 클릭하면 그 위치로 캐릭터가 걸어 나온 뒤 공격 애니메이션을 취한다. 이미 걸어 나온 캐릭터가 있는 상태에서 다른 직업의 캐릭터를 클릭하면 그 캐릭터는 뒤로 이동하고 새로 선택한 캐릭터가 위치한다.

 

캐릭터 커스텀 아이징

메쉬를 로드해서 교체하는 방식이다. 이때 유저가 선택하는 커스텀 데이터는 저장이 필요하다. 인게임 속 다른 방어구를 착용하고 장착 해제를 했을 때 이상태로 복귀가 필요하기 때문이다.

 

 

반응형

로비 씬

저장 데이터를 3개의 슬롯으로 형식으로 놓고 저장, 삭제하는 방식으로 UI를 만들었다.

 

그리고 "새로운 영웅을 만드시겠습니까"라는 "예", "아니오"로 선택하는 팝업창은 출력되는 문자열과 실행될 함수를 델리게이트로 넘겨서 팝업창은 동적으로 생성되고 다시 한번 사용할 때는 재활용된다.

데이터가 있는 슬롯을 선택할 경우
새로운 캐릭터를 생성할 경우

한번 생성하고 재활용한다.

 

 

데이터가 있는 경우는 현재 데이터중 유저ID,직업,레벨,골드 주요 정보만 출력된다.

반응형

RPG게임은 테이블이 2D프로젝트보다 확실히 많았다. 

구글 스프레드시트 테이블

Config,
Hero,
NPC,
Monster,
Weapon,
Armor,
ItemPotion,
ItemGem,
ItemETC,
Quest,
Conversation,
Message,

일단 이정도이고, 작업하다가 컨텐츠가 늘어날 수도 있겠다.

모든 테이블의 항목들은 nID의 고윳값을 가지고 있고, 그 테이블의 데이터를 항목에 따라 분류가 필요한 부분은 enum을 사용해 분류하도록 했다.

예를 들어 각 무기들은 nID는 4000번대이고 eWeaponType으로 무기 타입을 분류되도록 했다.

enum : eWeaponType

이런식으로 Type으로 분류가 필요한 데이터들을 enum설정하여 효율적으로 데이터를 얻어 올수있도록 구성을 했고, 실질적인 구현부에서는 잘해봐야겠다.

반응형

2D프로젝트는 Git으로 프로젝트를 관리했으니 이번에는 SVN으로 하였다.

 

SVN이란?

SubVersion의 줄임말로 자유 소프트웨어 버전 관리 시스템이다. 명령행 인터페이스에서 사요앟는 명령어를 따서 "SVN"이라고 줄여서 부른다.

 

버전관리나 여러명에서 작업하는 프로젝트의 경우 각자 만든 소스의 통합과 같은 까다로운 문제를 해결을 도와준다.

 

TortoiseSVN 이란?

마이크로소프트 윈도우용 서브버전 클라이언트 프로그램

 

설치방법 : 

다운로드 :  https://tortoisesvn.net/downloads.html 

 

자신의 컴퓨터 bit를 확인하고 다운로드 하면 된다.

 

 

그런다음 윈도우에 저장소로 만들 폴더를 하나 생성해주고. 마우르 오른쪽을 누르면 아래와 같이 TortoiseSVN관련 메뉴들이 보이게 된다.

[Repo-browse] 를 선택하면 URL이 나오는데  SVN주소를 입력해준다.

 

CheckOut  

내컴퓨터 파일과 SVN의 파일을 연결시키는것이다.

 

[URL of Repository] 는 체크아웃받으려는 SVN 서버에 있는 대상

[Checkout directory] 는 체크아웃받은 파일을 저장할 컴퓨터 주소

 

 

 

Commit

Update : 현재 SVN저장소에 있는 파일을 내림

Commit : 새로 추가된 파일을 SVN으로 올림

반응형

+ Recent posts