✅ 기능
유니티의 Application.persistentDataPath와 같은 예약 폴더에 파일을 저장하는것도 좋지만, 사용자가 직접 원하는 위치(바탕화면이나 특정 USB 드라이브 등..)에 저장하는것도 좋지 않을까? 하는 생각에 파일 브라우저를 이용하여 경로롤 직접 찾아 사용할 수 있도록 찾아보고 적합한 에셋을 찾고 이를 응용해보았습니다.
⭐️ 해당 에셋은 파일 익스프로러(다이어그램)을 보여주고, 경로를 얻어주도록 한다. 데이터를 저장하기위한 직렬화 등의 행위는 구현해야 합니다.
✅ 응용 에셋
Unity Simple File Browser 이라는 에셋을 이용하여 유니티 앱의 런타임에서 파일 익스프로러를 열고, 경로를 획득할 수 있도록 하였습니다. 경로를 찾아주는것이며, 파일을 직렬화 및 역직렬화 하는것은 직접 구현해야합니다.
✅ 흐름도
✅ 사용 예시
✅ 구현
파일 브라우저(익스프로러)를 열고, 사용하는것은 패키지 도큐먼트에 나와있어 크게 어렵지 않다.
⭐️ 설정 데이터를 저장하기 위해서는 Json Format으로 변환하는 스크립트를 작성하는것이 더욱 중요하다.
using UnityEngine;
using System.Collections;
using System.IO;
using SimpleFileBrowser;
using System;
public class FileBrowserRuntime : MonoBehaviour
{
private InstanceManager mInstanceManager; //오브젝트를 인스턴스 하는 매니저
private GameManager mGameManager; //오브젝트를 인스턴스 하는 매니저
private void Start()
{
mInstanceManager = FindObjectOfType<InstanceManager>();
mGameManager = FindObjectOfType<GameManager>();
}
/// <summary>
/// 아이템 셋(씬에서 사용하는 오브젝트의 설정) 데이터를 읽도록 하는 함수
/// </summary>
public void OpenItemSetFile()
{
FileBrowser
.SetFilters(true, new FileBrowser
.Filter("Files", ".json")
, new FileBrowser.Filter("Text Files", ".json"));
FileBrowser.AddQuickLink("Users", "C:\\Users", null);
// Coroutine
StartCoroutine(ShowLoadDialogCoroutine());
}
/// <summary>
/// 아이템 셋에 대한 파일을 읽고, 이를 해석하도록 하는 함수
/// </summary>
/// <returns></returns>
IEnumerator ShowLoadDialogCoroutine()
{
yield return FileBrowser.WaitForLoadDialog(FileBrowser.PickMode.FilesAndFolders, true, null, null, "Load Files and Folders", "Load");
if (FileBrowser.Success)
{
byte[] bytes = FileBrowserHelpers.ReadBytesFromFile(FileBrowser.Result[0]);
string str = System.Text.Encoding.UTF8.GetString(bytes);
mInstanceManager.ApplyJsonData(str);
}
}
/// <summary>
/// 이미지 파일을 읽는 함수
/// </summary>
public void OpenImageFile()
{
FileBrowser
.SetFilters(true, new FileBrowser
.Filter("Files", ".jpg", ".png")
, new FileBrowser.Filter("Text Files", ".txt", ".pdf"));
FileBrowser.AddQuickLink("Users", "C:\\Users", null);
// Coroutine
StartCoroutine(CorOpenImageFile());
}
/// <summary>
/// 이미지 파일 데이터를 읽고, 이것을 유니티에 적용할 Texture2D로 만들어 적용하는 함수
/// </summary>
/// <returns></returns>
IEnumerator CorOpenImageFile()
{
yield return FileBrowser.WaitForLoadDialog(FileBrowser.PickMode.FilesAndFolders, true, null, null, "Load Files and Folders", "Load");
if (FileBrowser.Success)
{
var rawData = System.IO.File.ReadAllBytes(FileBrowser.Result[0]);
Texture2D tex = new Texture2D(2, 2); // Create an empty Texture; size doesn't matter (she said)
tex.LoadImage(rawData);
mGameManager.ChangePlaneTexture(tex);
}
}
/// <summary>
/// 아이템 셋을 json형식으로 저장하도록 하는 함수
/// </summary>
/// <param name="text">직렬화 된 스트림</param>
public void SaveItemSet(string text)
{
string initialPath = "C:\\Users\\[YourPath]";
string initialFilename = "SaveData_" + DateTime.Now.ToString(("MM_dd_HH_mm_ss")) + ".json";
FileBrowser.ShowSaveDialog(null, null, FileBrowser.PickMode.Files, false, initialPath, initialFilename, "Save As", "Save");
StartCoroutine(ShowSaveDialogCoroutine(text, initialPath, initialFilename));
}
/// <summary>
/// 아이템 셋을 저장하는 코루틴
/// </summary>
/// <param name="text"></param>
/// <param name="initialPath"></param>
/// <param name="initialFilename"></param>
/// <returns></returns>
IEnumerator ShowSaveDialogCoroutine(string text, string initialPath = null, string initialFilename = null)
{
yield return FileBrowser.WaitForSaveDialog(FileBrowser.PickMode.FilesAndFolders, false, initialPath, initialFilename, "Save Files and Folders", "Save");
if (FileBrowser.Success)
{
string path = FileBrowser.Result[0];
File.WriteAllText(path, text);
}
}
}
|
cs |
public void OpenItemSetFile()
- 파일을 읽도록 파일브라우저를 열고, 선택한 파일의 경로를 리턴하도록 하는 함수.
- 함수 명은 원하는대로 작성이 가능하며, 함수 내부에 들어가는 스크립트 내용은 도큐먼트에 나온대로 사용 의도에 맞게 작성한다.
- StartCoroutine(ShowLoadDialogCoroutine()); 에서 아래의 코루틴 함수를 호출한다.
IEnumerator ShowLoadDialogCoroutine()
- 호출되면, 파일브라우저를 열어 경로를 획득한다.
- 경로를 획득하면 개발자가 의도한대로 스크립트를 작성하여 해당 파일을 읽어 사용하도록 한다.
- ⭐️ mInstanceManager.ApplyJsonData(str); 에서 str(읽은 파일의 문자열)을 넣어 작동하도록 한다.
public void ApplyJsonData(string jsonData)
{
List<InstanceDataSet> dataList = JsonConvert.DeserializeObject<List<InstanceDataSet>>(jsonData);
foreach (InstanceDataSet data in dataList)
{
InstanceUIController ctrl = AddNewInstanceUI();
ctrl.InitFromJson(data);
}
}
|
cs |
public void ApplyJsonData(string jsonData)
- 파일을 읽어, 해당 문자열을 ApplyJsonData로 불러온다. 이 함수에서 읽은 문자열의 내용대로 적용하도록 만든 함수이다.
- 아래는 ctrl.InitFromJson(data); 에 호출되는 함수 내용이다.
//ctrl.InitFromJson(data); 에서 호출되는 함수 내용
//프리뷰 생성
CurrentObjectType = dataSet.ObjectType;
CurrentMeshType = dataSet.MeshType;
InstancePreviewObj();
//개수 설정
mSpawnCountInputField.text = dataSet.Count.ToString();
INPUTFIELD_ModifyInstanceCount();
//오브젝트 인스턴스
BTN_InstanceThis();
//색상
mColorPicker.color = dataSet.BaseColor;
mColorPicker.HDRIntensity = dataSet.HDRIntensity;
mColorPicker.HDRInputField.text = HDRIntensity.ToString();
UI_ColorChanged();
//텍스쳐
TextureIndex = dataSet.TextureIndex;
BTN_TextureApplies(TextureIndex);
//스케일
mScaleSldier.value = dataSet.Scale;
SLIDER_ModifySacle();
//노멀
mNormalStrengthSlider.value = dataSet.NormalStrngth;
SLIDER_ModifyNormalStrength();
- 해당 프로그램에서 개발자가 의도한대로 파일을 읽고, 적용하도록 읽은 데이터를 이용한다.
'unity game modules' 카테고리의 다른 글
[유니티] 편리하게 소리를 담당하는 사운드 매니저 구현 (0) | 2022.11.21 |
---|---|
[유니티] NavMesh를 응용하여 '내비게이션(경로 시각화)' 만들기 (0) | 2022.10.22 |
[유니티] 지정한 위치에 직선 형태로 여러 발을 소환하여 공격하기 (0) | 2022.09.26 |
[유니티] 낙하 감지(Fall Detection) 및 낙하 연출 (0) | 2022.09.01 |
[유니티] 자연스러운 점프(JumpLoop) (0) | 2022.08.27 |