인벤토리 아이템 정보창

 

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

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

클릭하면 재생됨

 

 

아이템타입 enum

 

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

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

 

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

 

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

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

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

 이런 식으로 나뉘게 된다.

 

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

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

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

공격력

공격 속도

방어력

체력

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

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

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

공격력

 

 

체력

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

이런 식으로 표시될 거다.

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

 

장착 아이템 수치 표시

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

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

 

클릭하면 재생됨

 

 

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

 '(+ 아이템 스텟'

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

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

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

무기 타입은 총 8가지

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

 

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

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

 

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

플레이어 애니메이터

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

무기 스왑

무기 타입별 애니메이션

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

공격 애니메이션

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

 

무브 애니메이션

 

스킬 애니메이션

 

생활 콘텐츠용

 

UI오브젝트의 위치를 지정하는 것은 월드맵의 존재하는 오브젝트들의 위치를 변경하는 것과 다르다.

 

월드맵의 존재하는 오브젝트 Transform의 Position의 값으로 위치를  지정해준다.

 

 

하지만 UI는 아래와 같이 Rect Transform으로 위치를 지정해준다  

 

 

UI는 단말기의 보여지는 사각형의 스크린 뷰로 Canvas밑에서 관리된다. 그렇기에 다른 방법으로 위치를 지정해줘야 한다.

 

RectTransform으로 접근한 뒤 anchorePosition으로 접근해서 값을 지정해줄 수 있다.

 

 

 

 

추가적으로 ) RectTransform

Anchors사각형 왼쪽 하단 모서리와 오른쪽 상단 모서리의 앵커

Min :  사각형 크기의 일부로 정의되는 사각형 왼쪽 하단 모서리의 앵커 포인트. 0,0은 상위 사각형 왼쪽 하단 모서리의 앵커에 해당하고 1,1은 상위 사각형 오른쪽 상단 모서리의 앵커에 해당

 

Max :  사각형 크기의 일부로 정의되는 사각형 오른쪽 상단 모서리의 앵커 포인트. 0,0은 상위 사각형 왼쪽 하단 모서리의 앵커에 해당하고 1,1은 상위 사각형 오른쪽 상단 모서리의 앵커에 해당

 

Left, Top, Right, Bottom : 앵커를 기준으로 한 사각형 에지의 상대적인 포지션으로, 앵커에 의해 정의되는 사각형 안의 패딩

https://docs.unity3d.com/kr/current/Manual/class-RectTransform.html

문제점 : 빨간색 / 해결방법 : 파란색 / 느낀 점 : 녹색 

 

C#기본 문법이긴 하지만 그래도 컴파일 오류이기 때문에 포스팅했다.

 

우선 파셜 클래스의 대해서 알아보자  

파셜 클래스?

동일한 클래스명을 두고 이를 partial로 선언하는데, 컴파일러는 나중에 이를 합쳐 하나의 클래스로 인식한다.

 

그럼 언제 쓸까?

한 클래스에 여러 내용들이 있을 때, 또는 특징을 분할하여 가독성을 높이거나 여러 사람이 한 클래스를 작성할 때 사용하기도 한다고 한다.

 

 

나는 Character를 상속받는 Monster클래스를 세팅/행동으로 클래스 기능으로 두 개로 나누었다.

 

 

문제점 :  오류의 원인은 파셜로 만든 두 클래스가 다른 부모클래스를 상속받고 있었다.

 해결방법 : 같은 부모를 상속받도록 Character로 수정하니 해결됐다.

 

+) 파셜은 클래스만 아니라 인터페이스,구조체도 가능하다.

 

느낀 점 : 파셜클래스는 기존에도 사용했지만 다시 한번 찾아보게 되었다. 인터페이스나 구조체도 사용이 가능하다는 것도 알게 되었다. 

콜라이더 그리드 관리

 

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

 

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

 

 

월드맵

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

크기는 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

 

생활컨텐츠 : 벌목

 

문제점 : 빨간색 / 해결방법 : 파란색 / 느낀 점 : 녹색 

 

갑자기 나타난 오류. 코드 상의 오류는 아닌 것 같았다. 

문제점 : Assertion failed on expression: 'task.rasterData.vertexBuffer == NULL'

찾아보니 무기효과에 사용된 파티클에서 에러가났었다. 원래 잘됐었는데...

 

 

문제의 원인이 무엇인가 찾아봤다. 3.5이하 버전에서 나타는 오류라고 한다.

 

해결방법  : 3.5이상 버전업으로 해결했다.

 

느낀 점  : 코드이외의 나타나는 오류는 원인을 예측하기도 힘들고 해결방법도 쉽지 않다. 다행히 나 말고도 이런 오류를 발생하는 다른 사람들이 올려놓은 질문들로 해결을 하긴 했다. 그리고 버전을 변경하는거 자체가 많은 리소스등 많은 오류를 가져올 수 있어서 걱정헀지만 다행히 큰 문제들은 없었다. 

인벤토리 아이템 개수가 보이는 슬롯의 개수를 초과했을 때 스크롤 뷰로 처리하면 된다.

적용방법

생성 or 기존 이미지의 컴포넌트 추가

추가할 때는 UI -> Scroll View을 만들어준다.

나는 기존의 만든 이미지의 컴포넌트를 추가했다.

 

컴포넌트 살펴보기

Movement Type : 밑에 설명

Viewport : 표시하고자 하는 콘텐츠가 보일 배경? 공간

Content : 표시하고자 하는 슬롯

Scrollbar Horizontal/Vertical :  수평/수직 스크롤바

 

나 같은 경우는 수평 스크롤바는 필요 없으니 뺐다.

쉽게 슬롯들은 Content자식으로 넣어두면된다.

(Grid LayOut을 이용해 슬롯을 정렬)  

 

Movement Type

Unrestricted : 콘텐츠들이 드래그한곳으로 움직이며, 되돌아오지 않음

Elastic : 스크롤 영역 밖으로 나가도  다시 돌아옴

Clamped : 아예 못 나감

 

스크롤바와 Grid LayOut은 다른글에 포스팅하도록 해야겠다.

문제점 : 빨간색 / 해결방법 : 파란색 / 느낀 점 : 녹색 

 

이미지를 아틀라스 패킹하고 잘 로드되고 있다고 뜬금없이 몇몇의 이미지들이 뒤집혀 나왔다. 

 

아틀라스 오류? 패킹 과정 중에 오류? 인지 생각해보고 구글 검색을 했다. 검색으로 원하는 답변은 얻을 수 없었고, 아틀라스 프로퍼티타입을 위에서부터 하나하나씩 무슨 기능인지 확인했다.

 

유니티도큐먼트

확인과 동시에 내 아틀라스 설정과 비교하던 중 Allow Rotation이 체크되어있었다. 

 

체크를 해제하니 다시 원상태로 돌아왔다. 디폴트 값으로 체크가 디폴트 값이었다.

 

(유니티) 툴의 모든 프로퍼티의 기능들을 모르고 있을 때 이런 문제가 생기면 코드 상의 오류보다 해결하는데 더 많은 시간이 투자될 수도 있다. 최대한 많이 부딪혀보고 삽질도 많이 하다 보면 많은 경험과 노하우가 생길 것 같다 그전까지 열심히 개발과 공부를 해야겠다.

 

 

쉐이더코드

 

C# 유니티 스크립트 


2D이미지의 붙어있는 머테리얼

(obj는 Image)

쉐이더코드 변수의 값 받아오기

GetFloat("변수이름");

 

 

쉐이더코드 변수의 값 변경하기 

SetFloat("변수 이름", 변경할 값);


 

3D모델

1. material

2. sharedMaterial

두가지 접근방법이 있다.

 

material은 해당 오브젝트의 머테리얼만

sharedMaterial은 해당 머테리얼을 포함한 모든 오브젝트의 값을 변경하게된다.

material은 사용할때 각각으로 인스턴싱하기 때문에 배칭이 안된다. 

 

셰이더코드없이 노드구조로 셰이더효과를 낼 수 있는 어셋

 

어셋을 활용하기 위해서는 쉐이더의 기본용어는 알아두는게 좋다

UV좌표 : 텍스쳐 이미지를 3차원 공간의 폴리곤에 입히기위해 변환 기준이 되는 2차원 좌표계

UV 매핑 : D:2차원 그림을 3차원 모델로 만드는 3차원 모델링 프로세스

(자세한설명  https://kblog.popekim.com/2011/12/03-part-1.html)

 

그래픽스 파이프라인

3차원 컴퓨터 그래픽스에서 그래픽스 파이프라인(graphics pipeline) 또는 렌더링 파이프라인(rendering pipeline)은 3차원 이미지를 2차원 래스터 이미지로 표현을 하기위한 단계적인 방법

 

Shadero Sprite - 2D Shader Editor 사용방법

어셋다운로드

에셋을 다운로드하고 열면 이런 에디터화면이 나온다. 여기서 작업을하게된다.

Build Shader 생성

마우스 오른쪽 클릭 -> Build Shader 선택

 

Shadero Sprite Shader 스크립트 생성

유니티 프로젝트창에서 마우스 오른쪽 클릭

쉐이더 코드를 적용할 머테리얼도 같이 생성

 

쉐이더 코드 넣기

아까 생성한 쉐이더코드를 드래그앤드롭으로 놓는다.

머테리얼도 넣어둔다

 

적용할 이미지(텍스처) 추가

New Texture를 누르고 Select를 통해 원하는(쉐이더를 적용할) Sprite이미지를 선택한다.

 

Build Shader로 선을 이어준다

그러면 우측상단에 결과적용 이미지가 출력되는것을 볼 수 있다.

 

 

기본적인 효과설명

4Gradients

위치마다 다른 그라데이션효과

Twist UV 효과 UV->FX(UV)

Burn 효과  RGBA -> FX -> Burn FX

PlasmaFX

Gold효과

적용방법

쉐이더코드를 머테리얼에 적용후 그 머터리얼을 sprite에 적용

 

번외

쉐이더 그래프

유니티자체에도 쉐이더를 노드구조로 그리는 기능이 있음

프로젝트 생성할때 설정해주고 만들어야 쉐이더 그래프를 사용이 가능하다.

2018버전 Preview
2019버전 이상

튜토리얼 https://www.youtube.com/watch?v=VvK7sLbbLYE

 

랜더텍스처

 

Render Texture는 런타임에서 생성 및 갱신되는 특수한 Texture입니다. 사용하려면 먼저 새 렌더 텍스처를 만들고 Cameras 중 하나를 지정하여 거기에 렌더링합니다. 이제 정상적인 텍스처처럼 Material의 렌더 텍스처를 사용할 수 있습니다. Unity 표준 에셋의 Water 프리팹은 실시간 반사와 굴절을 생성하기 위해 렌더 텍스처를 실제 월드상에 사용하는 예입니다.

<https://docs.unity3d.com/kr/530/Manual/class-RenderTexture.html>

 

 

카메라가 비추는 화면을 다른 특정 이미지에서 보여줄 때 사용했다. 

 

1. 랜더텍스처 생성

랜더 텍스처를 생성한다.

2. 카메라 추가

일단 특정 오브젝트를 비추는 카메라가 있어야 한다. 그렇기에 카메라를 추가하고 

이곳에 아까 생성한 랜더 텍스처를 추가한다.

3. Raw 이미지 추가

Raw 이미지를 추가한다. 이 이미지 크기로 카메가 비추는 화면이 보이게 된다. 적절히 크기를 설정해주고

이쪽에도 랜더 텍스처를 넣어준다.

4. 추가 작업

 

보이긴 하는데 뒷배경도 나와 보기가 별로다. CullingMask를 통해 보일 오브젝트만 레이어로 분류하면 된다.

나 같은 경우는 ClearFlag를 Solid로 바꿔서 캐릭터만 보이도록 했다.

 

 

 

 

 

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

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

 

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

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

1. visual SVN 다운로드

 

다운로드 : https://www.visualsvn.com/

 

VisualSVN - Subversion-based version control for Windows

VisualSVN makes your life easier with a reliable plug-in that integrates Subversion seamlessly with Visual Studio. Learn more... download licensing

www.visualsvn.com

2. VISUALSVNSERVER 다운로드 누르고 자신의 OS비트를 확인하고 다운로드한다.

3. NEXT를 쭉 눌러준다.

Administration Tools Only는 다른 컴퓨터에 Visual SVN서버가 설치되어있고 원격으로 관리하는 경우에 선택

4. 경로설정 

Location : Visual SVN Server 프로그램이 설치될 경로를 설정

Repositories : Commit한 소스들이 업로드 될 최상위 경로 지정

Server Port : 서버가 구동되었을 때 사용할 Port

 

특별한 경로가 없다면 Next

 

5. VisualSVN Server Manager

[Create New Repository] 서버에 폴더를 만들 수 있는 저장소

 

6. 서버에 만들 폴더 이름지정

그리고 next

 

7. 서버주소

서버주소가 만들어졌다.

 

8. SVN계정

 

계정을 만들어준다.

 

9. 권한부여

아까 생성한 계정을 클릭하고 권한을 부여하고

[Everyone]은 아무나 접근이 불가능하도록 No Access 해준다.

 

그 다음은 SubVersion을 설치하여 사용하면된다!

직업선택 (미완성 상태)

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

 

캐릭터 커스텀 아이징

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

 

 

문제점 : 빨간색 / 해결방법 : 파란색 / 느낀 점 : 녹색 

 

NullReferenceException: Object reference not set to an instance of an object

UnityEditor.Graphs.Edge.WakeUp () (at C:/buildslave/unity/build/Editor/Graphs/UnityEditor ~~~~

 

문제점NullReference가 뜨길래 비어있는 곳을 참조했나? 해서 하이라키상의 모든 오브젝트를 뒤졌는데 찾지 못했다.. 그래서 뭔가 해서 구글에 검색해보니 UnityEditor.Graphs.DLL에 있는 Unity 코드의 오류라고 한다. 오류 메시지의 C :는 Unity 개발자의 환경을 가리키며 컴퓨터가 아니라 DLL이 만들어졌기에. 이전 포럼 게시물 및 unityAnswers를 보면 전환이 없는 애니메이터 컨트롤러를 삭제하고 다시 만들 때 가장 자주 발생한다고 한다.

 

해결방법 : 유니티를 재 시작해.

 

느낀 점 : 내가 작성한 코드에서 오류가 날 때도 있지만 프로그램상이나 meta파일 등으로도 오류가 나타나는데 해결하기가 꽤 까다로울 것 같다. 코드 외적으로 신경 쓰며 작업이 필요할 듯하다. 

 

로비 씬

저장 데이터를 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으로 올림

퍼센트등 int가 아닌 float를 이용한 수치계산이 이루어질때 생각했던 값과 다른 결과가 나오는데 부동소수점 방식은 실수를 정확히 표현할 수가 없다.

0.1을 10번더했으니 다행히 a는 1.0이라고 생각하면 안된다. 실수는 무한히 많은데 이 실수를 표현하기 위해서는 값으로 표현하기 떄문이다. 그래서 위 처럼 == 같음으로 비교하면 안되는것이다.

Epsilon을 사전적 의미를 검색 해 보니 수학에서는 매우 작은 수를 의미하는 기호로 자주 쓰인다고 한다.

C#에서 제공하는 Collections List와 LinkedList를 찾아 보게되었다. 사실 List는 사용하기가 편해서 워낙 많이 쓰이는 구조중 하나이다. List보다는 LinkedList를 좀 더 알기 위해 찾아봤다.

List

Add해서 데이터를 넣으면 입력한 중복이 가능하며, 순서대로 들어가게된다. Remove로는 해당 데이터를 삭제가 가능하다.

List.AddRange

AddRange를 통해 한꺼번에 입력이 가능하다. 다른 int형 리스트를 넣을 수 있다는 말

 

LinkedList

이중연결리스트형태를 가지고 있다. 리스트와 다르게 앞뒤 레퍼런스를 가지고 있으며, 앞(AddFirst), 뒤(AddLast)에 추가 할 수가 있다. 

물론 단순 1~4를 출력 하고싶으면 AddAfter( node , 3 ) value(3)값을 넣어도된다. 

노드 접근

다음 노드(node.Next.value) 이전 노드 (node.Previous.value)

이런식으로 특정 노드로 부 앞뒤로 데이터로 접근이 가능하다.

 

코드 분석 중에 모르는 것이 나와서 정리해두기 위해 포스팅했다.

Destroy

오브젝트(Component,Asset)를 삭제시켜주는 함수다. 가비지가 많이 생성시켜서 반복적으로 불리는 경우(몬스터 등)에서는 사용하지 않고

특정 시간을 주어서 삭제 시간을 정할 수도 있다. Destroy (obj : Object, t : float = 0.0F) 실제 객체 파괴는 항상 현재 Update 루프가 끝나기 전까지 지연되며 렌더링이 되기 전에 파괴된다고 한다.

DestroyImmediate

Destroy 이와 같은데 지연시간을 줄 수가 없다. 큰 차이점은 Update루프가 끝난 후가 아닌 바로 삭제(동일한 프레)된다는 점과 편집기 코드를 작성할 때 사용하고 게임 코드에서는 Destroy를 이용하라고 한다.  주의점으로는 영구적으로 파괴할 수 있다는데..) 

 

언제 DestroyImmediate를 사용해야 하는지는 조금 더 알아봐야겠다.

 

 

https://docs.unity3d.com/ScriptReference/Object.DestroyImmediate.html

딱히 카테고리를 찾기어려워서 개발하다가 생각난 부분이기에 이쪽에다가 쓴다. ExtensionMethod라는 스태틱 클래스를 만드는게 여러모로 편리하다고 생각했다.  일단 사용정의는 데이터를 확장시켜사용하는? 밑에 코드사진을 보면 이해가 될 것 같다.

ExtensionMethod은 어떻게 활용?

활용하기에 가장 먼저 떠오르는 것은 Table데이터들이다.

ExtensionMethod.class

저장된 테이블의 데이터를 키값으로 호출하기 위한 메서드이다.

클릭하는 히어로의 데이터를 받기위해 만들었다.

 

호출방법

PropertySelect.class

호출하려는 히어로의 넘버를 통해 원하는 데이터를 불러온 후 그데이터를 알맞게 사용한다.

UI_PropertySelect.class

 

직업별 버프상점

저번에 등급별로 공격력을 업그레이드하는 버프상점에 이어서 직업별로도 업그레이드 할 수 있도록 했다. 버튼을 만들고 그 버튼이 어떤 버튼(어떤 직업인지)을 나타내고있는지 알면 인게임매니저가 맵의 존재하는 캐릭터를 검사하여 해당하는 직업의 히어로들을 업그레이드하면 된다.

 

 

기타 마무리_암막처리

NGUI들은 UI가 뎁스로 관리되기 때문에 현재 활성화하려는 팝업말고 뒤에 있는 UI들이 클릭 될 수 있다. 그렇기에 활성화 팝업의 가장 낮은 뎁스 빈 sprite이미지의 collider를 깔 다른 UI가 클릭이 불가능하도록 처리했다.

기타 마무리_소울풀링

몬스터가 죽었을 때 몬스터가 가져다주는 수치와 영혼이미지가 보여지는데 이것도 풀링으로 만들어서 여러이미지가 동시에 보여지도록 풀링으로 만들었다.

고블린은 10soul

 

데이터를 저장하기 위함을 위해 로그인 기능을 넣었다.

구글 스프레드시트를 이용했다. 설문지를 이용해서 데이터를 저장하는 방법이다. 설문지와 구글 스프레드시트 연동하는 방법은 블로그에 이미 포스팅했기 때문에 생략.. 일단 로그인이 어떤 식으로 구현이 됐냐면

게임을 시작하면 게임 관련 테이블을 받게 되는데 로그인 아이디, 패스워드 관련 데이터도 받도록 했다.  

sID와 sPass는 유저가 입력하는 아이디와 패스워드가 되고, nID는 데이터를 불러올 회원의 고유 넘버 값이 된다. nID를 통해 회원의 게임 데이터들을 불러오는 것이다. 데이터는 대충 재화(골드, 보석), 스테이지 클리어 여부 및 점수, 아이템수, 직업별 업그레이드 상태이다. 

일단 입력한 아이디와 패스워드가 같을 경우 그 IDData가 가지고 있는 데이터들을 입력하게 했다. (예외처리가 아직 많이 없다) 

더 까다로운 부분이 새로 가입하는 경우인데 지금 생각나는 체크해야하는 조건들을 나열해보면

1. 가입하려는 아이디 중복 여부

2. 가입이 됐을 때 고유 넘버 nID부여 가입된 순으로 배열하는 것이 좋아 보이기에(이건 두 가지로 나뉜다. 가입된 아이디가 아예 없을 경우와 가입된 아이디의 총개수의 +1로 값을 준다)

ID : 0 / PW : 0 으로 가입이되어 있음

가입이되면 해당하는 초기 데이터셋팅값을 받도록하고, 로그인이 되면 저장되어있던 데이터들을 받도록 처리했다.

랜덤으로 아이템이 받는 콘텐츠를 넣었다. 클릭하면 아이템 둘 중 하나 나오는 거다. 

박스를 클릭하면 생성되는 박스를 점점키워서 커지는 효과를 냈다. 추가적으로 별 모양 sprite를 통해 반짝거리는 데코를 넣고 당연히 인벤토리 추가되는 아이템의 개수 증가와 비어있는 아이템은 sprite를 비워주도록 처리했다.

인게임에서 히어로를 클릭하면 그 히어로의 해당하는 조합표가 보이는데 조합재료가 2성일 경우 그 재료의 조합목록들을 한번 더 보여주도록 했다.

2성 어쎄신은 3성의 어벤져의 조합재료이다. 어쎄신 버튼위의 마우스를 올리면 어쎄신은 도적2개로 조합되는것을 보여준다.

메지션 조합

조합가능 상태와 조합목록들을 알고있기에 그 해당하는 히어로의 이미지를 입혀주고 미니조합창의 위치와 active상태를 true로 바꿔준다.

(+기존게임에는 없지만 추가적 컨텐츠)

킹덤러쉬게임을 살짝 빌려서 로비에서 구매한 아이템을 인게임에서 사용할 수 있도록 했다.

 아이템은 2가지, 첫 번째 모래시계는 일정범위 몬스터의 이동을 일정시간 멈추도록 하고, 두 번째는 범위적으로 몬스터의 데미지를 입히는 아이템들이다.

일시정지 아이템

범위공격 아이템

 

스테이지 연결

스테이지에는 웨이브 몬스터 종류, 몬스터의 개수 정도만 정보를 가지고 있기로 했다. 그래서 WaveTable을 만들었다. 스테이지의 아이디로 각 웨이브의 데이터를 받아오도록 하면 될 것 같다.

StageTable

 

WaveTable

nWaveInfo를 가지고 Wave의 nID와 비교하여 데이터들을 가져오도록

결과창

마지막위에브의 몬스터를 잡으면 나타나는 팝업창이다. 스테이지를 클리어한 시간으로 score를 계산해서 별 1~3개를 표시하도록 했다.

스테이지 선택창에서는 획득한 별의 개수로 표시해주도록 했다.

 

+ Recent posts