공부/Unity

24.03.14

월러비 2024. 3. 14. 21:35

새로 생성한 스크립트

  • Debuff : 디버프 오브젝트 생성
  • Healing : 힐링 오브젝트 생성
  • Love : Love aura 오브젝트 생성

KeyValuePair<int, string>

  • System.Collections.Generic의 속하는 ValueType을 상속하는 자료형이다.
    • 설정하거나 검색할 수 있는 키 / 값 쌍을 정의한다.
    • Add속성으로 값을 추가한다.
  • ob.key = 10; / ob.value = “item”
resourceList = new List< KeyValuePair<string, GameObject>>();

KeyValuePair 결과

Array와 List 차이

  • Array : 길이가 고정된 동일한 데이터 타입만 저장이 가능하고, 다차원 배열 입력이 가능하다.
    • 동적으로 크기 할당이 불가능하다.
    • 연속된 메모리 공간으로 메모리 관리가 용이하다.
  • List : 배열크기가 고정되지 않고 같은 타입끼리만 저장가능하다.
    • Add, Remove 메서드를 통해서 크기를 자유롭게 늘리고, 줄일 수 있다.
    • 키값이 존재하지 않기에 검색이 유용하지 않다.
    • 다음 데이터의 주소값을 가지고 있기에 불필요한 메모리가 추가로 사용되어 메모리 측면에서 비효율적이다.
  • 데이터의 크기가 정해져 있다 : 배열 사용
  • 데이터의 크기가 정해지지 않았다 : 리스트 사용

Resources (동적)

  • Resouces 폴더 안에 필요한 데이터가 있을때 해당 데이터의 타입과 경로를 이용하여 데이터를 가져온다.
    • TextAsset, Texture2D, Sprite, AudioClip, GameObject 등 필요한 파일들을 가져온다.
  • Resource.Load로 데이터를 부른다. ⇒ Assets폴더 밑에 Resources라는 폴더에 넣어야 사용이 가능하다.
  • 저음부터 몬스터를 전부뽑으면 메모리가 부족해지니 필요할때 뽑아나오는 동적으로 사용한다.
foreach (string name in prefabNameList)
{
    GameObject obj = Resources.Load<GameObject>(name); //리소스에 있는 name이라는 이름의 게임 오브젝트를 저장

    KeyValuePair<string, GameObject> pair = new KeyValuePair<string, GameObject>(name, obj);
    resourceList.Add(pair);
}

 

제네릭 제약조건

  • 제네릭 정의의 where절은 제네릭 형식, 메서드, 대리자 또는 로컬 함수의 형식 매개 변수에 대한 인수로 사용되는 형식에 대한 제약 조건을 지정한다.
    • 제약 조건은 인터페이스, 기본 클래스를 지정하거나 제네릭 형식을 참조, 값(struct) 또는 관리되지 않는 형식(byte, short, int, long, float, double, bool 등)으로 요구할 수 있다.
    • default 제약 조건을 사용하면 파생 클래스에 제약 조건을 사용하지 않거나 명시적 인터페이스 구현 없이 파생 클래스에서 메서드를 재정의하도록 지정할 수 있다.

T : struct 형식 인수는 형식을 포함하는 null허용이 아닌 값 형식이어야한다.

T : class 형식 인수는 참조 형식이어야 한다. 모든 클래스, 인터페이스, 대리자 또는 배열 형식에도 적용된다.
T : new() 형식 인수에 매개 변수가 없는 public 생성자가 있어야한다. 다른 제약 조건과 함께 사용할 경우 new() 제약 조건을 마지막에 지정해야 한다. unmanaged 제약 조건과 결합할 수 없다.
T : unmanaged 형식 인수는 null허용이 아닌 비관리형 형식이어야 한다.
T : notnull 형식 인수는 null허용이 아닌 형식이어야 한다.
T : <기본 클래스 이름> 형식 인수가 지정된 기본 클래스이거나 지정된 기본 클래스에서 파생되어야 한다.
T : <기본 인터페이스 이름> 형식 인수가 지정된 인터페이스이거나 지정된 인터페이스를 구현해야 한다. 여러 인터페이스 제약 조건을 지정할 수 있다. 제약 인터페이스가 제네릭일 수 있다.
T : default 이 제약 조건은 메서드를 재정의하거나 명시적 인터페이스 구현을 제공할 때 비제한 형식 매개 변수를 지정해야 할 경우 모호성을 해결한다.
default 제약 조건은 class 또는 struct 제약 조건이 없는 기본 메서드를 의미한다.  
private void AddItem<T>(int index) where T : Item, new() {  }

GetComponentsInChildren

  • 자식 객체들에게서 지정한 컴포넌트를 모두 추출한다.
  • 데이터가 여러 개라서 배열 형태로 추출한다.
  • 참고로 부모객체인 자신의 컴포넌트까지 포함해서 추출된다.
  • 저기서 Component 라면 지정한 컴포넌트 하나만 추출한다. ⇒ 자식이 여러개라면 가장 상위에 있는 자식 객체의 컴포넌트를 추출한다.
//value는 버프니 버프의 컴포넌트를 가져올건데 그중, 자식들의 파티클 시스템을 가져와라 
// 괄호안에 true쓰면 자식의 자식까지 컴포넌트를 가져오게 된다.
ParticleSystem[] systems = pair.Value.GetComponentsInChildren<ParticleSystem>(); 

함수 호출 체인

  • 메서드들을 체인으로 엮듯이 호출되는 프로그래밍 패턴이다.
  • 객체지향 프로그래밍에서 여러 함수를 호출하는 일반적인 방식이다.
    • 함수안에 필요한 값을 주는 함수가 먼저 실행되고, 그 함수 안에 또 함수를 처리하는 또다른 함수가 있고, 하나씩 진행되면서 하나씩 함수가 처리되면서 여러 기능이 실행되는 절차를 의미한다.
  • 간단하게, 메서드가 연속적으로 호출되는 것을 의미한다.

가변형 배열 삭제에서 나타나는 문제

  • list.RemoveAt(i); 를 하게되면 해당 자라기 빠지는건 좋은데 뒤에 남아있는 데이터가 삭제된 자리를 채우게되어서 코드가 이상하게 된다.
    1. 삭제된 자리의 값을 처리하는 코드가 있다면 땡겨진 값이 처리가 되버린다.
    2. 그 다음 값을 처리해야하는데 이미 땡겨져버려 한칸을 건너뛰어버린다.
    3. 최대값을 list.count;를 놓았다면 리스트 크기가 줄어들어 처리해야할 순서 자체가 없어져버렸다.
  • 해결 방법
    • 하향식 순서로 처리한다.
    • 제거한 조건문 끝에 continue;를 작성한다.
for (int i = itemList.Count - 1; i >= 0; i--)
{
    Item item = itemList[i];

    if (item.UpdateTime())
    {
        itemList.RemoveAt(i);
    }
}

 

private void OnDrawGizmos()

  • 기즈모 (Gizmo) : 게임 오브젝트와 연관된 그래픽스다.
    • Move, Scale, Rotate를 누르면 오브젝트에 나타나는 그래픽이 ‘기즈모’다.
    • 카메라 아이콘과 범위, 광원조명 또한 기즈모 중 하나다.
  • OnDrawGizmo는 런타임 시 실행되는 기즈모를 그릴 수 있는 함수다.
    • 씬에서 자신이 넣는 오브젝트의 위치나 범위를 시각적으로 보고 체크할 때 사용한다.
private void OnDrawGizmos()
{
    if(itemList == null)
    {
        return;
    }

    Gizmos.color = Color.green;

    foreach(Item item in itemList)
    {//클래스하고 .으로 나오는것들은 전부 static이다.
        Gizmos.DrawWireSphere(item.Position, 0.25f);
    }
}

이번에 쓴 디자인 패턴

  • 팩토리 : 공장에서 찍어낸 것 처럼 객체를 만들어 사용한다.
    • 그 중에서도 어떤 아이템이 나올 지 모르니 공통점이 있는 아이템은 따로 틀만 만든다음 찍어내자 ⇒ 추상 팩토리
      • 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 패턴이다.
    • 객체를 만들어 반환하는 함수를 (생성자 대신) 제공하여 초기화 과정을 외부에서 보지 못하게 숨기고 반환 타입을 제어하는 방법이다.
  • 커멘드 패턴 : 특정 상태에서 특정한 입력을 받으면 실행하는 기능을 만들자 - use면 use, 휘두르면 휘두르기 처럼 하나로 묶어서 만든다.
    • 요청을 객체의 형태로 캡슐화하여 사용자가 보낸 요청을 나중에 이용할 수 있도록 매서드 이름, 매개변수 등 요청에 필요한 정보를 저장 또는 로깅, 취소할 수 있게 하는 패턴이다.
      • 즉, 요청에 대한 모든 정보가 포함된 독립실행형 객체로 변환하는 행동 디자인 패턴이다.
    • 1번 누르면 버프 나가고, 2번 누르면 디버프 나가는거
    • 하나로 묶어서 만들기 때문에 커멘드 패턴은 ‘추상’으로 만든다. (가상도 쓰긴 한다.)
    • 가상 : 몸체가 있고 필요한 놈들만 구현해라
    • 추상 : 틀만 있고 새로운 몸을 만들어라

가상 / 추상

  • 추상 (abstract) : 지금 현재 상태에서 이 기능이 어떻게 사용될지 모르니까 판단이 되지 않기 때문에 이름을 강제해서, 그 이름으로 자기 행동을 구현하도록 해주는 것이다.
    • abstract 한정자로 사용하며, 클래스, 메서드, 속성, 인덱서 및 이벤트와 함께 사용된다.
    • abstract 클래스는 인스턴스화 되지 않고 다른 클래스의 기본 클래스로만 사용된다.
    • 추상으로 표시된 멤버함수 또는 프로퍼티는 파생된 비 추상 클래스에서 구현되어야한다.
  • 가상 (virtual) : 메서드, 속성, 인덱서 또는 이벤트 선언을 수정하고 파생 클래스에서 재정의하도록 허용하는 데 사용된다.
    • 예를 들어, virtual을 사용하는 메서드는 이를 상속하는 모든 클래스에서 재정의할 수 있다.
    • 재정의 하지 않아도 된다.

메테리얼

  • 컴퓨터 안에서 자기 색을 표현하기 위한 4가지 ⇒ Legacy : ADSE
    1. A (Ambient) : 주 조명의 색
      • 어딘가에 조명이 있고 그곳에서 빛을 받는다.
      • 똑같은 색을 똑같은 범위로 받는다.
    2. D (Diffuse) : 자기가 표현 될 색
      • 자기가 가진 텍스쳐 색
        • 음영색을 표현한다. (광원의 위치에 따라 그림자가 지는 음영)
    3. S (Specular) : 음영하고 다르게 빛을 비추면 일부분이 빛나는 강도를 나타낸다.) = shiness?
    4. E (Emissive) : 외곽선 조명
      • 오브젝트의 형태가 무너지지 않게 외곽선이 잘보이게 외곽선만 보여주는 조명을 다르게 한다.
      • 하나의 오브젝트라도 음영이 진 부분은 흰색으로 처리되고, 스펙큘러가 짙은곳은 검정 외곽선 조명으로 나타낸다.

PBR

  • PBR : 물리 기반 렌더링의 약어로, 모든 관원 조건에서 실제와 같은 결과를 얻을 수 있도록 해당 재질이 물리적으로 타당한 방시긍로 표면의 시각적 속성을 기술한다는 것을 의미한다.
  • Metalic : 금속성, 금속 재질의 느낌을 주는 속성이다. (0이면 금속 느낌이 안나게된다)
  • Smoothness (Roughress) : 거침 구현, 1일 수록 표면이 매끈매끈해진다.
  • 알베도 : 자기 텍스쳐 색
    • 색상은 1과 0으로 표현하고 1은 흰색, 0은 검정색이다.
    • 색상 곱하기는 점점 어두워지고, 색상 더하기는 점점 밝아진다.

'공부 > Unity' 카테고리의 다른 글

24.03.18  (5) 2024.03.18
24.03.15  (0) 2024.03.15
24.03.13  (0) 2024.03.13
24.03.12  (1) 2024.03.12
24.03.11  (0) 2024.03.11