일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- soundmanager
- LINQ
- c#
- UI
- 인터페이스
- 프로그래머스
- delegate
- 메서드
- 스파르타내일배움캠프
- 장애물달리기
- 효과음
- invokec#events
- script
- unity
- Generic
- 직렬화
- 스택
- skybox
- ObjectPool
- inputsystem
- 자료구조
- 유한상태머신
- 비선형자료구조
- 배열
- BGM
- 코루틴
- 람다식
- FSM
- 유니티
- InputManager
- Today
- Total
Unity 개발일지
[Unity] Json과 직렬화 실습하기 본문
[확인문제]
1. 아래와 같이 코드를 작성하고 오브젝트에 작성한 스크립트 컴포넌트를 추가했습니다.
public class SomeClass : MonoBehaviour
{
[SerializeField] private int intValue = 2;
private void Start()
{
Debug.Log(intValue);
}
}
인스펙터에서 intValue의 값을 3으로 변경하고, intValue 앞에 선언된 [SerializeField]를 제거헀습니다.
private int intValue = 2;
이 때 Debug.Log(intValue); 의 출력 결과는 어떻게 될까요?
Debug.Log(intValue);의 출력 결과는 2가된다. SerializeField를 제거하면, Unity는 인스펙터에서 설정된 값을 유지하지 않고, 스크립트에 정의된 초기값을 사용한다.
2. 이번에는 아래와 같이 코드를 작성하고 오브젝트에 작성한 스크립트 컴포넌트를 추가했습니다.
public class SomeClass : MonoBehaviour
{
public int intValue = 2;
private void Start()
{
Debug.Log(intValue);
}
}
인스펙터에서 intValue의 값을 3으로 변경하고, intValue 앞에 [HideInInspector]를 추가했습니다.
[HideInInspector] public int intValue = 2;
이 때 Debug.Log(intValue)의 출력 결과는 어떻게 될까요?
Debug.Log(intValue);의 출력 결과는 3이된다. HideInInspector는 인스펙터에서 해당 변수를 숨기지만, 설정된 값은 그대로 유지한다.
3. 1번과 2번의 결과가 다른 이유가 무엇인가요?
1번의 경우 SerializeField를 제거하면 인스펙터에서 설정한 값이 무시되고, 스크립트의 초기값이 사용된다. 반면 2번의 경우 HideInInspector는 변수 값을 숨기기만 하고 값 자체는 유지되기 때문에 인스펙터에서 설정한 값이 그대로 사용됩니다.
[설명문제]
1. CSV/JSON 등 데이터 저장 포맷에 대해 설명하고, 활용에 적절한 상황을 설명해주세요.
CSV (Comma-Separated Values)
데이터를 쉼표로 구분하여 저장하는 포맷으로, 주로 스프레드시트와 데이터베이스에서 사용된다.
테이블 형식의 데이터를 저장할 때 적합하다.
JSON (JavaScript Object Notation)
데이터를 구조화하여 저장하는 포맷으로, 가독성이 높고 다양한 프로그래밍 언어에서 쉽게 파싱할 수 있다.
웹 애플리케이션과 API 데이터 교환에 적합하다.
2. 특정 데이터를 JSON으로 활용하기 위해 해야하는 작업은 무엇인가요?
특정 데이터를 JSON으로 활용하려면 데이터 구조를 정의하고, 이를 JSON 포맷으로 직렬화(Serialization)하거나 역직렬화(Deserialization)하는 작업이 필요하다. 예를 들어, C#에서는 JsonUtility 또는 Newtonsoft.Json 라이브러리를 사용하여 객체를 JSON 문자열로 변환하거나, JSON 문자열을 객체로 변환할 수 있다.
3. Unity에서 필드를 직렬화하려면 어떻게 해야하는지 설명해주세요.
Unity에서 필드를 직렬화하려면 해당 필드에 [SerializeField] 속성을 추가하거나, 필드를 public으로 선언한다. 이렇게 하면 Unity 인스펙터에서 해당 필드를 편집할 수 있다.
[실습문제]
💡 [Dictionary 직렬화하기]
Item 코드와 Sprite를 Key와 Value로 가지는 Dictionary를 선언하고, 이를 Unity 인스펙터에서 다뤄봅시다.
Dictionary와 ISerializationCallbackReceiver 인터페이스를 상속받은 ItemSprite 클래스를 완성하여, 인스펙터에서 지정한 Key와 Sprite가 Dictionary에 반영되도록 코드를 완성해주세요.
using System;
using System.Collections.Generic;
using UnityEngine;
[Serializable]
public class ItemSprite : Dictionary<int, Sprite>, ISerializationCallbackReceiver
{
[Serializable]
public class KeyValue
{
public int Key;
public Sprite Value;
public KeyValue(int key, Sprite value)
{
Key = key;
Value = value;
}
}
[SerializeField]
private List<KeyValue> KeyValueList = new List<KeyValue>();
public void OnBeforeSerialize()
{
// TODO : Dictionary의 내용을 List로 복사하여 직렬화
}
public void OnAfterDeserialize()
{
// TODO : 역직렬화된 List의 내용을 Dictionary로 복사
}
}
public void OnBeforeSerialize()
{
// Dictionary의 내용을 List로 복사하여 직렬화
KeyValueList.Clear();
foreach (var kvd in this)
{
KeyValueList.Add(new KeyValue(kvd.Key, kvd.Value));
}
}
public void OnAfterDeserialize()
{
// 역직렬화된 List의 내용을 Dictionary로 복사
this.Clear();
foreach (var kvd in KeyValueList)
{
this[kvd.Key] = kvd.Value;
}
}
'Unity 개발' 카테고리의 다른 글
[Unity] 네트워크 이론 (0) | 2024.07.24 |
---|---|
[Unity] 멀티스레드(Thread) & GPU (1) | 2024.07.23 |
[Unity] 최적화 실습하기 (1) | 2024.07.17 |
[Unity] 코루틴(Coroutine) 실습하기 (수정필요) (1) | 2024.07.16 |
[Unity] MonoBehaviour와 Unity 생명주기 실습하기 (3) | 2024.07.16 |