241206

lililllilillll·2024년 12월 6일

개발 일지

목록 보기
12/350

✅ 오늘 한 일


  • Udemy Unity 강의 수강


📝 배운 것들


🏷️ TextMeshPro와 TextMeshProUGUI의 차이점

특징TextMeshProTextMeshProUGUI
렌더링 환경3D 공간 (World Space)UI 공간 (Canvas)
사용 목적3D 오브젝트 텍스트 (월드 내에서 사용)UI 텍스트 (UI 요소로 사용)
렌더링 방식Mesh Renderer를 사용해 텍스트를 렌더링Canvas Renderer를 사용해 UI 요소로 렌더링
적용 위치씬의 3D 공간에 배치 (예: 게임 오브젝트 위)UI 캔버스 위에 배치 (UI 패널, 버튼 등)
Anchor 및 AlignmentTransform 및 월드 좌표를 사용하여 배치RectTransform을 사용해 UI 좌표로 배치
성능3D 공간에서 고성능 텍스트 렌더링Canvas 시스템에 최적화된 텍스트 렌더링
UI 지원 여부UI 요소로 사용하기 어렵고 부자연스러움UI 시스템에 완전히 통합

언제 어떤 것을 사용해야 할까?

TextMeshPro:

  • 3D 공간에서 텍스트를 표시해야 할 때.
  • 게임 오브젝트와 상호작용하거나, UI 시스템과 무관하게 동작할 텍스트가 필요할 때.
    예: 월드 공간 이름표, 환경 오브젝트 위 텍스트.

TextMeshProUGUI:

  • UI 시스템에서 텍스트를 표시해야 할 때.
  • 캔버스 기반 인터페이스의 일부로 텍스트를 배치해야 할 때.
    예: 버튼 텍스트, HUD, 메뉴.

🏷️ static

static 변수는 특정 클래스에 속하며, 해당 클래스의 모든 인스턴스(객체)에서 공유됩니다.
static 변수는 메모리에 한 번만 할당되며, 프로그램이 실행되는 동안 유지됩니다.
이는 Unity에서 씬이 바뀌거나 오브젝트가 여러 개 생성되더라도 변하지 않습니다(재할당하지 않는 한).



🎮 Udemy Unity 강의 수강


https://www.udemy.com/course/best-c-unity-2d/

기초적 튜토리얼들을 따라가니 배우는 건 있지만 시간 대비 공부량과 동기 부여가 떨어진다.
아는 부분들 다 스킵하면서 모르는 것만 확인하기. 지금 이런거 붙잡고 있을 단계가 아니다.

스노우 보더

파티클 이펙터 트리거

ParticleSystem finishEffect;

finishEffect.Play(); // 실행시키기

Play on Awake 끄는거 잊지 말기
z좌표 안 되돌려놓으면 안 보인다

파티클이 안 따라오게 하고 싶으면 Simulation Space를 World로 바꾸기

모먼트 튜닝

Cinemachine Virtual Camera에서 Lens Orth Size를 바꾸면 보이는 크기 바뀜
캐릭터가 살짝 떨린다면 rigidbody에서 Interpolate를 Interpolate로 변경

FindObjectOfType 사용하기

surfaceEffector2D = FindObjectOfType<SurfaceEffector2D>();

FindObjectOfType은 씬에 딱 하나만 있는 걸 찾을 때 편리 (오브젝트 많으면 그거 다 순회하면서 찾느라 비효율적)
여러 개 있으면 원하는 대로 동작 안 함 (그때는 FindObjectsOfType 써야됨)

컴포넌트와 Type의 차이?

컴포넌트도 Type의 일종이다.
클래스를 만들 때 타입도 만들게 된다.

코드 드래그 > Ctrl+. > Extract method

짜잔

존재하지 않는 메소드 이름 쓰기 > Ctrl+. > Generate method

throw new NotImplementedException(); 이건 아직 아무것도 안 적었다는거 알려주려고 있는거

OnCollisionExit2D 사용하기

var mainModule = trailEffect.main; // 원본 데이터를 참조하는 핸들 가져오기
mainModule.loop = true; // 핸들로 수정 -> 원본 ParticleSystem에 반영

https://discussions.unity.com/t/why-does-this-code-works-particlesystem-mainmodule-altering/908984/2

왜 따로 선언했다가 그걸 수정해야하지?
나와 비슷한 의문을 가진 사람이 있었다.
이하는 gpt의 설명.

Unity의 ParticleSystem.MainModule과 같은 구조체는 값 타입 구조체이긴 하지만, 핸들러로 동작하도록 설계되어 있습니다.

Q: 그러면 왜 구조체를 사용하나요?
Unity는 성능과 데이터 안정성을 위해 구조체를 사용합니다.

  • 구조체는 복사가 기본 동작이라 원래는 값 타입으로 작동합니다.
  • 하지만 Unity는 "값 타입" 구조체를 특별히 설계하여, 실제로는 원본 데이터를 안전하게 수정할 수 있도록 만들었습니다.

Q: trailEffect.main.loop = true;는 왜 안 되나요?
이 방식은 불가능한 이유는 trailEffect.main 자체가 구조체이고, 직접 수정할 수 없기 때문입니다.
main 자체를 수정하려면 먼저 핸들러를 가져와야 합니다.


퀴즈 마스터

UI 캔버스

Anchor Preset에서 Shift 누르면 피봇도 바뀌고, Alt 누르면 위치도 바뀐다
하늘색 방향색 있는 것들 클릭하면 늘어나기도 한다 (이전 크기를 기준으로 변형됨)

텍스트 메시 프로

Vertex Color 아래에 있는 Color Gradient 체크하면 gradient 효과
Underlay는 그림자

버튼 레이아웃

Button 컴포넌트에서 Transition > None 바꿔주면 코드로 다룰 때 간단
Source Image를 바꿔버려서 버튼 디자인

버튼 > Image 컴포넌트 > Image Type > Sliced로 바꾸면 테두리 없다고 경고 뜸
해당 스프라이트의 Sprite Editor에서 안 쪽으로 당겨주자

버튼 레이아웃 그룹 만들기 위해
빈 오브젝트 생성 > Vertical Layout Group 컴포넌트 추가 > 버튼들을 자식으로 넣어주기

크기 꽉 차게 하기 위해 Control Child Size 체크

스크립터블 오브젝트

Scriptable Object란?

  • 데이터 보관함에 불과하다
  • 스크립트 바깥에서 데이터를 보관한다
  • 한곳에 데이터를 저장해서 메모리를 줄이는데 도움을 준다
  • 게임 오브젝트들에 붙일 필요 없다
  • 가볍고 편리하다
  • 데이터 일관성을 위한 템플릿으로써 기능한다
[CreateAssetMenu(menuName = "Quiz Question", fileName = "New Question")]
public class QuestionSO : ScriptableObject
{

}

스크립트 만들고 Create > Quiz Question 추가하면 뭔가가 생긴다.

[TextArea(2, 6)]
    [SerializeField] string question = "Enter new question text here";

클래스 안에 이거 넣어주면

등장

게터 메서드

    [SerializeField] string question = "Enter new question text here";

    public string GetQuestion()
    {
        return question;
    }

캡슐화된 데이터 꺼내오는 메서드

타이머 연결하기

SerializeField 걸어놓은 변수들 위에 종류별로
[Header("Answers")] 이런거 써 놓으면 Inspector에서 보기 편하다

타일바니아

Collider2D.IsTouchingLayers와 LayerMask.GetMaks("layer")로 점프 가능 여부 판단 가능
Cinemachine Virtual Camera > Extensions > Add Extension > CinemachineConfiner를 사용하면 카메라가 특정 영역에서만 움직이게 할 수 있다
Cinemachine State-Driven Camera를 사용하면 걸을 때와 뛸 때의 화면을 다르게 연출할 수 있다
Tilemap에 Bouncing Tilemap 만든 후에 Bounciness가 높은 Physics Material 2D를 연결하면 점프대 만들 수 있다. Friction 0으로 만들면 벽에 달라붙는 현상도 없앨 수 있음

레이저 디펜더

코루틴 사용법: 접근자랑 반환 형식 지우고 IEnumerator 써준 후에 yield return new 조건; 써주고 StartCoroutine(코루틴이름);
싱글톤 패턴 쓸 때 이미 1개 있으면 Destroy()해버릴 때 SetActive()까지 해주면 좋다. 희박한 확률이지만 파괴되기 전에 접근할 수도 있기 때문.



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

0개의 댓글