241213

lililllilillll·2024년 12월 12일

개발 일지

목록 보기
19/350

✅ 오늘 한 일


  • C# 교과서 읽기


📝 배운 것들


🏷️ 인스턴스 멤버와 static 멤버

인스턴스 멤버는 클래스 안에서는 자유롭게 사용할 수 있지만,
실제로 사용하려면 인스턴스를 만든 후에 접근해야 한다.

static을 붙인 것이 정적 멤버.
인스턴스 생성 없이 바로 사용 가능하다.

🏷️ Mesh Renderer와 Skinned Mesh Renderer 차이점

1. Mesh Renderer

  • 기본 역할: 정적(Static) 또는 변형되지 않는 3D 메시에 대한 렌더링을 처리.
  • 사용 예시: 건물, 바위, 가구 등 변형되지 않는 오브젝트.
  • 특징:
    • Transform 컴포넌트로 위치, 회전, 크기만 변경 가능.
    • 메시의 정점(Vertex)이나 형태가 바뀌지 않음.
    • 단순한 렌더링 파이프라인을 사용하며, 계산량이 적음.
    • 머티리얼 및 셰이더와 호환성이 높음.

2. Skinned Mesh Renderer

  • 기본 역할: 본(bone) 애니메이션에 따라 움직이는 3D 메시에 대한 렌더링을 처리.
  • 사용 예시: 캐릭터, 몬스터, 애니메이션이 적용된 메쉬.
  • 특징:
    • 본(Bone)과 스킨(메시) 시스템을 사용해 동적 변형을 처리.
    • 메시의 정점(Vertex)이 본 애니메이션에 따라 실시간으로 변형됨.
    • 복잡한 계산이 필요하며, GPU 연산을 많이 사용함.
    • 추가적인 데이터(본, 버텍스 웨이트 등)를 셰이더가 처리해야 하므로 셰이더 호환성 문제가 발생할 수 있음.

3. 주요 차이점

특징Mesh RendererSkinned Mesh Renderer
사용 목적정적인 오브젝트동적인 애니메이션 오브젝트
변형 가능성정점(Vertex) 고정본(Bone) 애니메이션으로 변형 가능
성능가벼움 (GPU 부하 적음)무거움 (실시간 연산 필요)
호환성대부분의 셰이더와 호환 가능본과 정점 변형을 처리하는 셰이더 필요
데이터 구조기본 메시본(Bones), 정점 가중치(Weights) 포함

4. 왜 ProPixelizer가 문제를 일으킬 수 있는가

  1. 본 데이터 처리 문제:

    • Skinned Mesh Renderer는 본(bone) 데이터를 사용하여 메시를 변형합니다.
    • ProPixelizer 셰이더가 이러한 본 데이터를 처리하도록 설계되지 않았다면, 텍스처를 올바르게 렌더링하지 못할 수 있습니다.
  2. 정점 변형과 셰이더:

    • Skinned Mesh Renderer의 정점(Vertex)은 프레임마다 본 애니메이션에 따라 실시간으로 변경됩니다.
    • ProPixelizer는 픽셀 단위의 처리를 기반으로 작동하므로, 정점 변형 데이터가 제대로 전달되지 않으면 단일 색상으로만 출력될 수 있습니다.
  3. 성능 최적화:

    • Skinned Mesh Renderer는 복잡한 계산이 필요한 반면, ProPixelizer는 단순한 메시를 대상으로 최적화된 셰이더일 가능성이 있습니다.
    • 이로 인해 Skinned Mesh Renderer의 데이터가 제대로 반영되지 않을 수 있습니다.


📖 C# 교과서


32 개체 만들기

클래스 : class 키워드로 생성한 것
개체 : 클래스를 new 키워드를 사용해서 새로운 이름으로 만든 것

class ObjectNote
{
    public class Counter
    {
        public void GetTodayVisitCount()
        {
            Console.WriteLine("오늘 1234명이 접속");
        }
    }
    class Object
    {
        static void Main()
        {
            Counter counter = new Counter();
            counter.GetTodayVisitCount();
        }
    }
}

32.3 인스턴스 메서드

인스턴스 메서드 : static 키워드가 붙지 않은 메서드. 호출하려면 클래스의 인스턴스를 생성하여 개체를 만들어야 한다.

public class MyMath
{
	public void Sum(int x, int y)
    {
    	int sum = x + y;
        Console.WriteLine($"합계 : {sum}");
    }
}

> MyMath myMath = new MyMath();
> myMath.Sum(3,5);
합계 : 8

32.4 익명 형식

익명 형식 : 클래스를 선언하지 않고 개체 만들기. 특정 클래스 없이 이름 하나로 여러 속성을 모아 관리할 때 유용하다. 익명 형식을 만들 때 각 데이터 형식은 자동으로 유추해서 만든다.

> var hong = new { Name = "백승수", Age = 21 };
> $"이름 : {hong.Name}, 나이 : {hong.Age}"
"이름 : 백승수, 나이 : 21"

32.5 정적 멤버와 인스턴스 멤버

static 키워드가 붙은 멤버(정적 멤버)에 접근할 땐 클래스이름.멤버이름; 형태로 접근하고,
안 붙은 멤버(인스턴스 멤버)에 접근할 땐 클래스의 인스턴스를 생성하고 생성된 개체 이름.멤버이름; 형태로 접근한다.

static이 붙으면 클래스 내의 여러 메서드에서 해당 클래스 변수를 공유해서 사용할 수 있다.

32.7 ToString() 메서드 오버라이드

using System;

class My { }

class Your
{
    public override string ToString()
    {
        return "새로운 반환 문자열 지정";
    }

    class ToStringMethod
    {
        static void Main()
        {
            My my = new My();
            Console.WriteLine(my);

            Your your = new Your();
            Console.WriteLine(your);
        }
    }
}

1. 클래스 선언

class My { }
  • My 클래스는 아무 멤버도 없는 단순한 클래스입니다.
  • ToString() 메서드를 재정의하지 않았기 때문에 기본 구현이 사용됩니다.

2. Your 클래스와 ToString() 재정의

class Your
{
    public override string ToString()
    {
        return "새로운 반환 문자열 지정";
    }
}
  • Your 클래스는 ToString() 메서드를 override하여 기본 동작을 변경했습니다.
  • 이제 Your 객체를 문자열로 변환하려고 하면, "새로운 반환 문자열 지정"이 출력됩니다.
  • Main() 메서드에서 두 개의 객체를 생성합니다:
    • My 클래스 객체: 기본 ToString() 구현을 사용.
    • Your 클래스 객체: ToString() 메서드를 재정의했으므로 재정의된 동작을 사용.
  • Console.WriteLine()은 객체를 문자열로 출력하려고 할 때 ToString() 메서드를 호출합니다.

32.8 클래스 배열

클래스의 인스턴스들도 배열에 넣을 수 있다.

32.9 var 키워드를 사용하여 클래스의 인스턴스 생성하기

자료형 var로 하면 선언부 줄일 수 있다.

33 네임스페이스

닷넷은 System, System.Linq, System.Generic 등 많은 네임스페이스를 제공한다.

33.1 네임스페이스

namespace 네임스페이스이름
{
	// 클래스 등의 정의가 들어옴
}

네임스페이스는 프로그램 규모가 커질 때 클래스 이름이 충돌하는 것을 방지하도록 클래스를 모아서 관리하는 개념이다.
네임스페이스를 달리하면 이름이 동일한 클래스를 하나의 프로젝트에서 사용할 수 있다.

namespace AllCar
{
	namespace MyCar {}
    namespace YourCar {}
}

네임스페이스는 중첩하여 사용할 수 있다.

using System;

namespace Foo
{
    public class Car
    {
        public void Go() => Console.WriteLine("[1] Foo 네임스페이스의 Car 호출");
    }
}

namespace Bar
{
    public class Car
    {
        public void Go() => Console.WriteLine("[2] Bar 네임스페이스의 Car 호출");
    }
}

class NamespaceNote
{
    static void Main()
    {
        Foo.Car fooCar = new Foo.Car();
        fooCar.Go();
        Bar.Car barCar = new Bar.Car();
        barCar.Go();
    }
}

사용 예제. 실제로 프로그램을 만들 땐 각 클래스를 다른 파일로 관리하는게 좋다.

33.3 using 지시문

네임스페이스 사용하려면 using으로 선언해놔야됨.

using System;
using MyNamespace;
using AllCar.MyCar; // 계층형 네임스페이스
using Fe = AllCar.Ferrari; // 별칭 붙이기

34 필드 만들기

34.1 필드

필드: 클래스 내에서 선언된 변수 또는 배열.

필드 초기화

클래스 내에 선언된 필드는 자동으로 해당 형식의 기본값으로 초기화된다.

  • 정수형(int, long, byte, short) : 0
  • 실수형(float, double) : 0.0
  • 불형 : false
  • 기타 참조형(reference type) : null

34.2 액세스 한정자

액세스 한정자의 종류

  • public : 모든 곳에서 접근 가능
  • private : 현재 클래스 내에서만 접근 가능
  • protected : 현재 클래스 또는 현재 클래스를 상속하는 자식 클래스에만 접근이 허가됨
  • internal : 현재 프로젝트의 모든 클래스에 접근이 허가됨
  • protected internal : 현재 어셈블리(DLL 파일) 또는 현재 어셈블리에서 파생된 모든 클래스에 접근이 허가됨


profile
너 정말 **핵심**을 찔렀어

0개의 댓글