VioletaBabel

41. 시작화면, 설정 본문

BCA/6. Unity RPG 따라하기
41. 시작화면, 설정
Beabletoet 2018. 6. 14. 16:25

Sprite로 로고를 화면에 띄우고 스크립트(Logo.cs)를 하나 붙인다.

Logo.cs에서는 DoTween을 이용한다.

로고의 SpriteRenderer를 Getcomponent하고

나타났다 사라지게 DoFade를 Sequence로 준다.

이 때 시퀀스가 다 끝난 순간을 알기 위해 


Sequence sq = DoTween.Sequence()

.AppendInterval(1.0f)

.Append(할 일들 쭉 .Append로 넣어줌)

.AppendCallback(() =>

{

시퀀스 끝나면 불릴 함수

});

sq.Play();


===


Canvas를 World Space로 만든 후 Button을 단다(게임시작, 종료)


그 다음 Canvas의 active를 꺼두고 Logo.cs에 그 canvas를 public한 GameObject로 받는다.

그리고 두 버튼 역시 public한 Gameobject로 받는다.

그 후 Callback 함수에 위 canvas의 active를 true해준다.


메뉴의 배경화면을 하나 집어넣는다. active는 false.

Logo.cs에서 그 배경화면도 Public으로 받는다.

그를 이용해 배경화면도 로고 애니메이션이 끝나면 Callback함수에서 fade로 나타나게 한다.


===


다음은 버튼 처리.

Button을 받아온다.

그리고 Callback함수 뒷부분에

Button이름.onClick.AddListener(()=>

{

//그 버튼 눌렀을 때 실행되는 코드

});

를 넣어준다. 여기에 넣었을 때 장점은, 버튼이 페이드인되거나 안보이는 상황에도 눌리는 걸 방지함.


===


옵션은 재활용이 가능하니 Prefab으로 만든다.

옵션용 Canvas를 만들고 그 안에 Scrollbar를 하나 넣어준다.

텍스트박스를 두 개 만들어 하나는 글씨, 하나는 그림자를 넣어준다. (BGM)


---

영탁형님의 질문. Text.text에 코딩으로 글씨 표현에 관해.


아래 코드는 질문에 대한 답변과는 약간은 다르지만 완전히 코딩으로만 글씨 표출에 관한 것.

리치 텍스트는 에디터 GUI 시스템에서는 기본적으로 비활성화되어 있지만 사용자 지정으로 아래와 같이 명시적 활성화 가능.


GUIStyle style = new GUIStyle ();

style.richText = true;

GUILayout.Label("<size=30>Some <color=yellow>RICH</color> text</size>",style);


//위 코드 출처는 유니티 매뉴얼의 Rich Text(서식 있는 텍스트) 부분이다.

// https://docs.unity3d.com/kr/530/Manual/StyledText.html


Text t = GetComponent<Text>(); 

t.supportRichText = true; // 이걸 하면 이제 html태그를 쓸 수 있다.

t.text = "<color=red><b>나랏말싸미듕귁에달아</b></color>";

---


그리고 이미지 퀄리티 설정을 위한 Dropdown을 하나 넣어주고 닫기용 Button도 넣어준다.

Option.cs를 만들고 옵션용 Canvas에 넣은 후 public으로 닫기버튼, BGM스크롤바, 이미지퀄리티드롭박스를 다 받아온다.

Start()에서 버튼게임오브젝트 내의 버튼을 getcomponent한 후 종료버튼에 onClick.Addlistener로 Destroy를 넣어준다.(옵션은 눌렀을 때만 나올 것이고 프리팹으로 만들거기때문에 Destroy하는게 이득)

scrollbar도 getcomponent로 받아온다. 



===


BGM.cs를 만든 후 메인카메라에 붙인다. 카메라에 오디오소스를 넣고 bgm clip을 넣는다.

그리고 BGM.cs의 start()에서 public으로 Gameobject에 옵션캔버스를 받는다.(Option.cs를 가지고 있음)

Audiosource도 받아온다.

그리고 그 안의 Option을 Getcomponent하고 그 Option의 Scrollbar의 Scrollbar 컴포넌트를 option.GetcomponentinChildren으로 받아와 전역 변수로 저장한다.

업데이트에서 Scrollbar의 값과 볼륨 값을 일치시킨다.


===


Dropdown에도 OnValueChanged()가 있다.

Option.cs에서 OnQuality라는 함수에 int value 인수를 넣고 if-else if-else if로 qualitySettings.SetQualityLevel(세팅값)를 해준다.


===


옵션 캔버스에 토글을 넣는다. 이건 BGM을 아예 켰다 껐다 하게 해주는 아이로 하자.

토글을 Option.cs에 Public으로 받는다.

BGM.cs에서 bgmOnOff(bool value)함수를 만든다.

그 안에서는 if로 조건을 검사해 비지엠을 켜고 끈다.


그리고 Option.cs에서도 똑같이 BgmOnOff(bool value)라는 함수를 만들되, 거기선 BGM.cs의 BgmOnOff함수를 실행시켜준다.

Toggle을 받아온 아이를 Toggle이름.isOn (토글이 체크인지 아닌지 불 저장) 식으로 이용해 BgmOnOff에 토글의 체크 유무를 인수로 보내면 된다.



===


옵션을 받아올 때 에러가 나고 작동이 안되는 상황 발생.

옵션에서 직접 카메라를 찾아오게 해야 함.

Option.cs에서 카메라의 BGM.cs에게 옵션을 보내준다.

그러기 위헤 BGM.cs에 setOption 함수를 만들고, 옵션을 받아오게 한다.

그 후 Option.cs에서 Start()함수에 BGM.cs의 setOption을 불러 this를 보내준다.



===

Json .Net for Unity를 에셋 스토어에서 받는다.

그 다음 Option.cs의 start()에서 json을 이용해 저장을 한다.

교수님은 옵션 창을 닫는 버튼에 onClick.Addlistener를 이용하셨다.

그리고 내가 안 써본 것 중 Path.Combine을 이용.


string saveFilePath = Application.dataPath;

string savePath = Path.Combine(saveFilePath, "Option.json");

File.WriteAllText(savePath,root.ToString());

식으로 결합시킬 수 있음.


===

Option.cs에서 LoadOption()을 만들어 거기서 json을 불러온다.


그리고 GameData.cs라는 애를 만든다.

걔는 static으로 게임 데이터를 저장할 것임.


private GameData(){} // 생성자가 private이라 외부에서는 new를 못 함.

private static GameData _gameData = null;

public static GameData gameData

{

get

{

if(_gameData == null)

_gameData = new gameData;

return _gameData;

}

}


해준다.

그리고 그리고 이제 저장될 값들을 Gamequality, BgmVolume, BgmOn 등의 변수를 public으로 만들어 저장한다.


GameData.cs에서도 LoadOption()을 만들어 json으로 불러온다.

그리고 Start()에서 LoadOption()을 호출한다.

옵션창을 누를 때마다 Instantiate하면 어디서 옵션창을 불러도 Json을 이용해 저장된 값이 뜰 것임.


===


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

46. 데이터 세이브 로드, HP바, EXP바  (0) 2018.06.21
45. 몬스터 공격, 해의 순환  (0) 2018.06.20
44. 몹 움직이기  (0) 2018.06.19
43. 몹 패기  (0) 2018.06.18
42. 시야 가리는 벽 반투명  (3) 2018.06.15
Comments