post-custom-banner

확인 문제

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);의 출력 결과는 어떻게 될까요?

내 답:
[SerializeField]는 Unity 인스펙터 창에서 비공개 필드의 값을 수정할 수 있게 해주는 속성입니다. 이 속성을 제거하면 더 이상 인스펙터 창에서는 필드를 수정할 수 없고, 원래 스크립트의 값인 2가 출력되게 됩니다.

모범 답:

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);의 출력 결과는 어떻게 될까요?

내 답:
[HideInInspector]는 Unity에서 해당 필드를 표시하지 않도록 하는 속성입니다. 이 때, public으로 기존에 변경했던 값인 3은 그대로 적용되어 3이 출력됩니다.

모범 답:

3. 1번과 2번의 결과가 다른 이유가 무엇인가요?

내 답:
1번은 Unity에서 직렬화를 못하도록 막았고, 2번은 직렬화가 가능하게 하되 보이지만 않게 했기 때문입니다.

모범 답:

실습 문제

1. CSV/JSON 등 데이터 저장 포맷에 대해 설명하고, 활용에 적절한 상황을 설명해주세요.

내 답:
CSV
• CSV는 각 데이터 필드가 쉼표로 구분되는 텍스트 파일 포맷입니다.
• 주로 표 형식의 데이터를 저장하고, 스프레드시트나 데이터베이스 소프트웨어 간에 데이터를 교환할 때 사용됩니다.
• 활용 상황: 간단한 표 형식의 데이터를 저장하고, 다양한 프로그램에서 쉽게 읽고 쓸 수 있어야 할 때 적합합니다. 예를 들어, 주소록, 간단한 재고 목록 등이 있습니다.

JSON
• JSON은 속성-값 쌍(또는 "키-값 쌍")으로 구성된 데이터 객체를 텍스트로 표현하는 경량의 데이터 교환 포맷입니다.
• JSON은 사람이 읽고 쓰기 쉽고, 기계가 파싱하고 생성하기 쉬운 구조를 가지고 있습니다.
• 활용 상황: 웹 애플리케이션과 서버 간의 데이터 교환, 모바일 애플리케이션의 설정 파일, 복잡한 데이터 구조를 가진 데이터의 저장 및 전송에 적합합니다. 예를 들어, 사용자 프로필, 설정, 게임 데이터 등이 있습니다.

모범 답:

2. 특정 데이터를 JSON으로 활용하기 위해 해야하는 작업은 무엇인가요?

내 답:
1. 데이터 구조 정의: JSON으로 변환하고자 하는 데이터의 구조를 정의합니다. 이는 클래스나 구조체로 표현될 수 있습니다.
2. 직렬화: 데이터 객체를 JSON 문자열로 변환하는 과정입니다. 다양한 프로그래밍 언어에서는 이를 위한 라이브러리를 제공합니다. 예를 들어, C#에서는 JsonConvert.SerializeObject() 메소드를 사용할 수 있습니다.
3. 역직렬화: JSON 문자열을 다시 데이터 객체로 변환하는 과정입니다. 이를 통해 JSON 데이터를 읽고 해당 데이터를 애플리케이션에서 사용할 수 있습니다.

모범 답:

3. Unity에서 필드를 직렬화하려면 어떻게 해야하는지 설명해주세요.

내 답:
1. [SerializeField] 속성 사용: 비공개 필드(private)임에도 불구하고, Unity 인스펙터에서 보이게 하고 싶을 때 사용합니다.
2. 공개 필드(public) 사용: 기본적으로, Unity는 모든 공개 필드를 직렬화하고 인스펙터에 표시합니다.
3. 직렬화 가능한 클래스 사용: System.Serializable 속성을 클래스에 추가하여, 해당 클래스의 인스턴스를 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로 복사
        
    }
}
확인코드

using UnityEngine;

public class ItemSpriteContainer : MonoBehaviour
{
public ItemSprite itemSprite = new ItemSprite();
}

profile
스터디 로그
post-custom-banner

0개의 댓글