12/28 본캠프 #5

guno park·2023년 12월 28일
0

본캠프

목록 보기
5/77

4주차 미니프로젝트를 마치며

피드백들 중 기억할것

리소스 파일명이 한글일 때 간혹 버그가 나는 일이 있으니, 가능하다면 영문으로 바꿔주는게 좋다.

회고

이번 프로젝트를 진행하면서 전체적으로는 어려운게 없었으나, 국소적으로 막히는 부분들이 있었는데, 이 부분들은 나중에도 유용하게 써먹을 수 있을 법한 것들이라 이번 기회에 자세히 배울 수 있어서 좋았다. 거기다가 우리 조는 한 목표를 다 같이 구현해보고 발표하는 시간으로 스터디 형식으로 진행해서 다양한 코드를 보면서, 사용하면 가독성이 높아지며, 다양한 기능을 제공하는 문법들을 배울 수 있었다. 거기다 Git사용법도 배울 수 있어서 부트캠프의 시작으로는 최고의 시작이였다.
팀원분들 다 성격 좋고 참여도 열심히 하셔서 나도 부담없이 참여할 수 있었던 것도 좋았다.

오늘의 공부

SerializeField

(출처 : 오늘의키워드, 노는게제일좋아)
용어 설명을 하고, 키워드 분석을 해보자

SerializeField 는 스크립트에서 private 필드를 직렬화하기 위해 사용합니다.

직렬화 : 개체의 상태를 나중에 저장, 전송 또는 재구성할 수 있는 형식으로 변환하는 프로세스 > 코드 밖에서도 만질 수 있게함 > Inspector에서 보이는 방식

사용방법

public class Example : MonoBehaviour
{
    [SerializeField]
    private int myPrivateField;
}

사용 이유

1.private 필드의 직렬화를 원할 때
다른 스크립트에서는 못 사용하게 하고, 직렬화를 통해 유니티 인스펙터에서 값 입력 가능
2.직렬화를 커스터마이징하고 싶을 때
[Range] 애트리뷰트(attribute)를 사용하여 직렬화된 필드에 할당할 수 있는 값을 제한하거나
[Tooltip] 을 사용하여 인스펙터에서 필드를 선택할 때 설명을 제공할 수 있습니다.
3.코드를 더 쉽게 업데이트하기 위해
직렬화된 private 필드가 있고 필드의 이름이나 타입을 변경해야 하는 경우 직렬화된 데이터도 업데이트해야 합니다.
이 때, 직렬화된 데이터가 많은 경우 시간이 오래 걸릴 수 있습니다.
하지만 [SerializeField] 를 이용함으로써 우리는 직렬화된 데이터가 변경된 필드를 따라가도록 할 수 있습니다.

Range & tooltip

출처: 개발자의 개발 블로그:티스토리

[Range(0,12)]
public int Size = 12;


이렇게 슬라이더로 값을 변경할 수 있게된다.이렇게 하면, 최소값과 최대값을 제한해놓을 수 있기때문에 유용하다.만약, 소숫점까지 하고 싶다면,

[Range(0.0f,12.0f)]
public float Size = 12.0f

Tooltip

[Tooltip("이것은 넘버1이다.")]
public GameObject number01;


이렇게 주석처럼 사용할 수 있다.

유니티에서 필드란?

(출처 : DueCare)
변수는 지역변수/ 멤버변수 두개로 나뉘고
멤버변수 = Class내에 선언되는 변수로 클래스변수와 인스턴스변수로 나뉨
(우리가 보통 변수라고 부르는 것)
클래스 변수는 static으로 선언하며 인스턴스를 생성하지 않아도 사용가능
인스턴스 변수는 new를 통하여 인스턴스를 생성해야 사용가능
(출처2의 사진 참조할것)
지역변수 = Method내에서 선언되고 존재하는 변수
Method밖에서 사용할 수 없음.

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            MakeInt();
            Console.WriteLine(a);
        }
        static int MakeInt()
        {
            int a = 10;
            return a;
        }
    }
}

여기서 a는 Method 내에서 존재하기 때문에 Method가 종료됨과 동시에 메모리에서 소멸한다.

멤버변수 관리법

(출처 : 치킨주괴게임공방)
1. 접근범위는 최대한 좁게
외부에서 접근할 일 없는 건 private, 자식 클래스가 사용할 거면 protected, 아니면 public.
2.public 필드는 되도록이면 Property로

외부에서 접근 가능한 필드는 항상 값이 변경될 가능성이 열려있으므로 이것을 통제할 수단이 필요하다.

그래서 되도록이면 Property로 선언해서 setter의 접근 범위를 지정해 준다.

// 외부에서 접근 가능하지만 수정은 불가능.
public Health { get; private set; }
  1. 유니티 인스펙터에 노출시키고 싶을 경우 [SerializeField]
    인스펙터에 노출시키고 싶은데 외부에서 접근할 필요는 없어서 굳이 public으로 선언하고 싶지 않을 때가 많다.
    그럴 땐 private으로 하고 [SerializeField] 어트리뷰트를 붙여준다.
    이러면 인스펙터에 노출되는 것과 그렇지 않은 것들을 명확하게 구분할 수 있는 장점도 있다.
[SerializeField]
private GameObject _prefab;
[SerializeField]
private float _speed;
  1. 값이 변하지 않을 경우 readonly

readonly 키워드는 해당 필드를 '선언시, 또는 생성자에서 한 번 초기화된 후에는 수정이 불가능' 하게 만든다.

그렇기 때문에 값이 변하지 않는 필드마다 readonly를 붙여주면 문법적으로도 신뢰성이 높아지고

값이 변하지 않는다는 것을 명시할 수 있어서 좋다.

// 리스트의 내용물들은 변하지만 리스트 인스턴스 자체는 변하지 않는다.
public readonly List mobs = new List();

Header("# Notice")

(출처 : 개발자의개발블로그)

간단하게 인스펙터창에서 제목 만들기다.

[Header("This is Header Text")]    
public float smoothTime = 0.1f;


이것을 통해 관련있는 필드들을 그룹화 할 수 있다.

0개의 댓글