VioletaBabel

46. 데이터 세이브 로드, HP바, EXP바 본문

BCA/6. Unity RPG 따라하기
46. 데이터 세이브 로드, HP바, EXP바
Beabletoet 2018. 6. 21. 11:29

구글 스프레드시트를 이용해 데이터를 만들자.

실시간으로 받아오는 것은 느리므로, 만들어서 파일을 넣는게 낫다.

물론 엑셀이 있으면 그냥 엑셀 쓰는게 제일 편함.



GameData.cs에 class로 playerdata를 만들어 현재 hp, 최대 hp, 현재 mp, 최대 mp, atk, def를 담는다.

그리고 leveldata라는 클래스를 만들어 level, atk, def, hp, mp, exp를 담는다.


그리고 Dictionary<int, leveldata> 형 변수를 하나 만든다.


그 후 defaultData()라는 변수를 만들어 그 안에서 leveldata를 하나 new 시켜 레벨업 될 때마다 변하는 데이터를 규칙적으로 넣어 Dictionary에 담는다.


===


save(), load()함수를 만든 후 에셋 스토어에서 Json을 다운받자.



load() 함수를 먼저 작성해보자.


우선은 level 데이터만 저장할 예정.

저장될 데이터는 level, exp, hp, mp. 한 번 죽으면 끝나게 할 계획.


Load에서는 레벨과 경험치를 먼저 뽑아온 후, (레벨 - 1)의 leveldata를 dictionary에서 뽑아온다.

그리고 atk, def, maxHP, nowHP, maxMP, nowMP를 불러옴.



다음은 save() 함수.


세이브 데이터에는 level, exp, hp, mp를 저장.


이제 세이브 버튼을 눌렀을 때 게임이 저장되게 하자.


===


GameData.cs에서 

public Vector2 WorldToCanvas(Canvas canvas, Vector3 worldPos, Camera cam)

{ //Monobehavier를 상속받은 애가 아니기 때문에 다 받아서 써야 함.

var viewportPosition = cam.WorldToViewportPoint(worldPos);

        var canvasRect = canvas.GetComponent<RectTransform>();

        return new Vector2((viewportPosition.x * canvasRect.sizeDelta.x), (viewportPosition.y * canvasRect.sizeDelta.y));

}//3D 좌표를 화면 좌표로 바꿔줌.


이 함수를 이용해 머리 위에 HP바를 띄워준다.



===

데미지 입는 함수를 만들어 HP바 깎이는 것을 확인한다.


그리고 몹에게도 HP바를 주었다.


HP바는 재활용을 하는데, 캐릭터의 정보만 가지고 HP 계산을 했기에 어떤 애들이든 재활용 되도록 코드를 짠다.


===


옵션 캔버스 만든 아이에 저장 버튼을 추가하자.

그 캔버스에 기존의 Option.cs 컴포넌트를 지우고, 새로 만든 GameOption.cs에 그 코드를 복사 후 컴포넌트로 넣는다.


그리고 세이브 버튼을 GameObject로 받아오자.

그 버튼에서 Button을 겟컴포넌트한 후, onclick.addlistener를 이용하자.


===


GameCanvas.cs를 만들고 새로 만든 캔버스에 넣는다.


그리고 그 start()에서 세이브 버튼을 GameObject로 받아오자.

그 버튼에서 Button을 겟컴포넌트한 후, onclick.addlistener를 이용하여 save 함수를 실행시킨다.


그러면 현 상황 저장.



===

이제 레벨 업을 위해 경험치 축적을 하자.

Mob.cs에 exp 항목을 넣고 죽을 때 플레이어에게 exp를 줄 수 있게 GameData에서 addExp(int gainExp)라는 함수로 만들자.

거기서 경험치를 더하고, 경험치 요구량을 넘어서면 레벨 업이 되게 한다.



===

현재 경험치를 볼 수 있게 하자.

Modern UI의 Progress bar의 Prefab에서 쓸만한 걸 꺼낸다.

그리고 Update에서 경험치 쌓이는 걸 볼 수 있게 하자.


===

레벨 업 시 EXP 바를 초기화하자.

이것도 그냥 하면 될 듯.


===

아까 위에서

var canvasRect = canvas.GetComponent<RectTransform>();

        return new Vector2((viewportPosition.x * canvasRect.sizeDelta.x), (viewportPosition.y * canvasRect.sizeDelta.y));


했던 이런 방식을 이용하면 캔버스의 해상도도 상대좌표로 맞춰 넣을 수 있다.


UiPositionCanvas라는 함수를 만들고 해상도 바뀔 때마다 OnGUI가 불리므로 거기서 그 함수를 시행해준다.



'BCA > 6. Unity RPG 따라하기' 카테고리의 다른 글

49. 마스크 & 상점 만들기 (1)  (0) 2018.06.26
48. NPC와의 대화창 만들기  (0) 2018.06.22
45. 몬스터 공격, 해의 순환  (0) 2018.06.20
44. 몹 움직이기  (0) 2018.06.19
43. 몹 패기  (0) 2018.06.18
Comments