내일배움캠프41일차

박나연·2025년 6월 5일

내배캠

목록 보기
41/69

유니티 심화 주차 강의 든는중 (1-6 ~ 1-12)

오늘의 키워드 : 쉐이더, PlayerInput, 애니메이터 등등 아이고많아

UTF-8 인코딩

이걸 41일차인 오늘 글을 쓴다고? 할 수 있지만... 개인과제는 혼자하니까 문제가 없었고 팀플때는 해결 했지만 글을 굳이 쓰지 않았었던 것 같다. 그리고 오늘 또 개인 공부하다가 그냥 갑자기 눈에 띄어서 해결법을 적어보려고 한다.

    1. 먼저 비주얼스튜디오를 켠다
    1. 맨 위에 도구(T) -> 옵션을 누른다.
    1. 위에서 다섯 번째에 있는 텍스트 편집기를 누르고 C#을 선택한다.
    1. 코드스타일을 클릭하면 설정에서 .editorconfig 파일 생성이라는 버튼이 있는데 클릭하면 프로젝트 폴더에 파일이 생성된다.
    1. .editorconfig파일을 열고 [*] charset = utf-8를 추가해준다.
  • 해결!!

쉐이더 바꾸는 법

  • Built-in
    • Unity가 기본 제공하는 렌더링 파이프라인.
    • 고정된(legacy) 구조라, 커스터마이징하려면 자체 렌더러 코드를 작성해야 한다.
    • 기본 Shader(예: Standard)와 Lighting 모델이 내장형으로 제공되며,
      프로젝트에 설정만으로 바로 사용할 수 있다.
  • URP(Universal Render Pipeline)
    • Unity에서 제공하는 스크립터블 렌더 파이프라인(SRP) 중 하나.
    • 모듈화 및 확장이 쉽고, 모바일·콘솔 등 다양한 플랫폼에 최적화된 렌더링 기법을 제공한다.
    • Shader Graph를 통해 누구나 노드 기반으로 커스텀 쉐이더를 생성할 수 있다.
    • 빌트인에 비해 성능 최적화비주얼 퀄리티 제어가 훨씬 세밀하다.

이제 핑크핑크한 Material을 바꿔보자. 근데 왜 핑크핑크 해질까?

  • 머티리얼이 핑크 색으로 보이는 건,
    적용된 쉐이더가 현재 프로젝트에 존재하지 않거나 호환되지 않을 때 발생한다.
  • 예를 들어, Built-in 프로젝트를 URP로 전환한 이후에도
    머티리얼이 여전히 Standard Shader를 가리키고 있으면,
    URP 프로젝트에는 Standard Shader가 포함되어 있지 않으므로 핑크로 표시된다.

그래서 URP로 전환하는 법은!

    1. Window -> Rendering -> RenderPipelineConverter
    1. Built-in to URP로 바꾸고 아래 목록 전부 체크하고 오른쪽 밑에 버튼 두개도 차례로 눌러주기
  • 해결!

그런데 반대로 지금이 Built-in환경인데 핑크로 보인다면 쉐이더를 Standard로 바꿔주자.


PlayerInput - csharp 처음 사용법

PlayerInput에서 Send Messages, Invoke Unity Events는 이미 다뤄보았다. 이번에는 Invoke C sharp Events를 사용해서 구현한다.

저렇게 설정을 바꾸고 InputActionAsset을 클릭해 Generate C# Class를 체크하고 Apply를 누른다. 그러면 C#스크립트가 하나 생성된다.

public class PlayerController : MonoBehaviour
{
    public PlayerInputs playerInputs { get; private set; }
    public PlayerInputs.PlayerActions playerActions { get; private set; }

    void Start()
    {
        playerInputs = new PlayerInputs();
        playerActions = playerInputs.Player;
    }

    private void OnEnable()
    {
        playerInputs.Enable();
    }
    private void OnDisable()
    {
        playerInputs.Disable();
    }
}

추후에 더 자세한 설명으로 찾아오겠다!


애니메이터 데이터 정수, 문자열 비교

[SerializeField] private string walkParameterName = "Walk";

// Hash 값으로 비교하기 위해 변환한 값을 저장할 변수들
public int WalkParameterHash { get; private set; }

    public void Initialize()
    {
    	//Hash 
       WalkParameterHash = Animator.StringToHash(walkParameterName);
       //문자열
       Animator animator = new Animator();
       animator.SetBool("Walk", true);
    }

문자열 비교와 정수 비교의 차이점은 뭘까?

animator.SetBool("Walk", true)같이 문자열을 직접 넣으면 내부적으로 매번 해시 테이블을 검색해 해당 파라미터를 찾게 된다. 런타임에 문자열을 비교/검색하므로 오버헤드가 있을 수 있다는 단점이 있다.
하지만 Animator.StringToHash(walkParameterName)로 미리 정수 해시를 계산해두면 애니메이터 내부에서는 정수 값을 인덱스로 바로 사용하기 때문에 문자열 검색 오버헤드가 사라진다. Update나 코루틴이 자주 호출되는 상황에서 효과적이다. 주의할 점으로는 해시 충돌 가능성은 낮지만, 애니메이터 파라미터 이름을 바꾸면 해시 값도 함께 갱신해야 한다.


애니메이터 - Create Sub-State Machine

애니메이터에서 마우스 오른쪽 클릭을 하고 Create Sub-State Machine을 선택하면 사용할 수 있다. 왜 이 기능을 사용할까?

  1. 시각적 분리 및 가독성 향상
  • 필요한 부분만 펼쳐서 보고 수정할 수 있으며, 같은 종류끼리 묶어 분류할 수 있어 깔끔해 보인다.
  1. 상위 전환 제어
  • Sub-State Machine과 상호작용하는 Transition은 서브 머신 전체에 대한 진입과 탈출을 제어할 수 있다.
  • 예를 들어 Any State -> Sub-State Machine(Ground)라고 쓴다면 Ground 서브 머신 내부의 Idle/Walk 상태로 진입하는 모든 흐름을 묶어서 관리할 수 있다.
  1. 데이터 흐름 집중화
  • 하위 상태를 모두 공통으로 사용하는 파라미터가 있다면 Sub-State Machine 바깥 -> 안쪽으로 한 번만 전달하면 되므로 매번 개별 State에 있는 Transiton을 수정할 필요가 없다.

마무리하며

오늘 강의를 많이 들으니까 정리할게 그만큼 많아져버렸다. 쓰는데만 한 시간인것 같은 느낌적인 느낌느낌. 그리고 내일은 현충일이라 쉬는날 일러스트코리아 보러가는데 신난다 귀여운애들 싹 쓸어와야징

0개의 댓글