OnClick()버튼 이벤트에서 함수는 함수의 주소를 등록하는 방식으로 동작한다
버튼 컴포넌트는 이벤트가 발생했을 때, 실행할 함수의 참조(주소)를 대리자(delegate)에 등록하여 해당 함수를 호출한다
즉, OnClick() 프로퍼티 자체가 '대리자' 인 것
게임 오브젝트 자체를 OnClick()에 등록하면 그 오브젝트의 함수에 접근할 수 있는 인스턴스 참조를 등록함

OnClick()OnClick() 이벤트는 버튼이 클릭될 때 실행되는 함수나 메서드를 연결할 수 있도록 하는 데 사용한다
사용할 함수가 들어있는 스크립트가 할당된 게임 오브젝트를 OnClick()에 등록해야한다
-> 즉, 함수를 가지고 있는 인스턴스를 의미함

Scroll View
Scroll View를 사용해서 채팅창을 만들어보자

Vertical만 체크하자scroll View 컴포넌트 내부의 프로퍼티 중 Horizontal과 Vertical이 있다
Content : Scroll View 계층에 있는 스크롤 될 UI요소 참조 -> 눌러보면 자식으로 들어있는 Content를 가리킴
Horizontal ✅ : 가로 스크롤 활성화
Vertical ✅ : 세로 스크롤 활성화

Movement Type : 스크롤 내부 콘텐츠들의 이동성Unrestricted : 이동에 제한이 없음 (콘텐츠 크기 내에서 자유롭게 이동)Elastic : 탄성이 있음 Clamped : 스크롤바를 사용해서만 움직일 수 있다
Viewport 내부 ContentContent는 실제 스크롤 바 내부에 넣은 요소들이 들어가는 곳이다
주로 Content에 Layout Group과 content size fitter를 넣어서 정렬한다
스크롤 뷰를 생성하면 scrollbar가 작다
-> Bottom갑을 0으로 초기화
Content의 자식으로 원하는 Ui를 넣어서 정렬하면 content 범위 내에서 스크롤로 확인할 수 있다

채팅창은 다 만들었다. 이제 3d 오브젝트를 씬뷰에 배치하고, 해당 오브젝트 위에 Text가 뜨게 해볼것이다
-> 우리가 배운대로라면 Text는 UI쪽에 배치된다 (스크린스페이스)
Text를 3D 오브젝트 위에 표시되게 하려면 우선 기존에 UI를 작업하던 Canvas 외의 또다른 Canvas를 생성한다
게임 오브젝트의 자식으로 Canvas를 만들고 렌더모드를 World Space로 잡는다.
-> 이제 Text는 2D가 아닌 3D공간에 생성된다
카메라는 기존의 메인카메라를 넣어준다

🔔 Tip! 캔버스의 scale을 잡을때 게임 오브젝트의 자식으로 넣는다면 작게 잡으면 좋음. 1/100 = 0.01로 하면 게임 오브젝트랑 크기가 적당하게 나옴


즉, 부모의 위치,회전을 기준으로 정의되기 때문에, 실제 자식의 좌표값은 '부모 + 자식 실제값' 느낌
부모의 자식으로 들어가면 부모의 회전축을 기준으로 잡혀있기 때문에, 자식이 원래 회전축(0)이 되려면 Anchors의 회전 값을 부모만큼 빼주면 된다
부모의 회전축이 135이기 때문에, 자식의 회전축에 -135를 해주면 회전축0이 된다

만든 캔버스를 Prefab으로 등록하자
Prefab 이란?프리팹 시스템이란, 게임 오브젝트와 그 구성 요소들을 미리 저장해두고 다양한 곳에서 재사용할 수 있게 해주는 기능이다
Prefab 설정은 간단하다. 내가 원하는 게임 오브젝트를 프리팹으로 만들려면, Hierarchy창에서 Project창으로 옮겨주면 된다
프리팹은 원본의 역할을 하며, 그 자체가 "실제" 오브젝트가 아닌 참조할 수 있는 자산 이다
객체를 생성하면 프리팹을 얕은 복사 형식으로 참조해서 생성한다
-> 원본과 참조되있는 상태이기 때문에, 서로의 내용 변경에 영향을 미친다

Prefab에서의 변경사항Prefab의 내용이 수정되면 씬창에 배치된 오브젝트들에게도 다 적용된다
Prefab의 파생 객체들의 내용이 변경되면 변경된 값을 원본에 적용시킬 수 있다-> 가능한 이유: 얕은복사로 참조된 상태이기 때문에

Prefab의 참조 끊기Unpack Completely 옵션을 사용하면, 해당 프리팹 인스턴스는 프리팹의 참조와 완전히 분리되며, 모든 프리팹 관련 정보(컴포넌트 설정, 계층 구조 등)가 완전히 해제
완전히 독립적인 객체가 된다 (깊은복사됨)
Unpack -> 현재 프리팹 되어있는 애만 끊기 (달려있는 자식들은 x)
Unpack Completely > 프리팹의 자식까지 모두 독립적이게 원본에서 끊어짐
보통은 Completely 사용

Select Asset : 프리팹 찾기
Select Root : 부모가 되는 프리팹 찾기root) 오브젝트를 선택하는 기능이다
Open Asset in Context : 프리팹만의 별도 작업 공간
Text - TextMeshPro기존의 Text와는 다르게, 고급 텍스트 렌더링 시스템으로 많은 기능을 가지고 있다
-> (애니메이션 효과, 폰트, 여러 언어 가능 등등)

다운로드 필수

TextMeshPro에서는 한글을 지원하지 않는다. 외부에서 추가적인 다운로드 필수
아래의 사진은 TextMeshPro의 프로퍼티

이 텍스트를 런타임(실행)중에 불러오자
위에서 만든 스크롤뷰 채팅창에 이 텍스트를 런타임중에 생성되게 해보자

TextMeshProUGUI를 사용하려면 '네임 스페이스 TMPro' 선언 필수Text를 사용하려면 using UnityEngine.UI; 네임스페이스였다
publicTextMeshPro 컴포넌트의 프로퍼티 text의 값을 변경한다
GetComponent가 더 효율적Awake() 에서 정의함
TextMeshPro가 할당된다
Dialog와 DialogManager를 각각의 스크립트로 짜서 분리되어 작업하면 단일체계원칙을 지킨다단일체계원칙 (Single Responsibility Principle, SRP)
'한 클래스는 하나의 책임만 가져야 한다'는 규칙
ex) 채팅 시스템
-> Dialog에서는 각각의 채팅 메세지를 표현, 채팅의 내용을 저장 (채팅관리)
->DialogManager 에서는 채팅 목록을 관리하거나, 채팅을 호출해서 생성
Flyweight) 패턴