[Unity] 4. 버튼 이벤트 등록 & Scroll View

치치·2025년 2월 18일
0

Unity

목록 보기
5/27
post-thumbnail

버튼 이벤트 등록 OnClick()

  • 버튼 이벤트에서 함수는 함수의 주소를 등록하는 방식으로 동작한다

  • 버튼 컴포넌트는 이벤트가 발생했을 때, 실행할 함수의 참조(주소)를 대리자(delegate)에 등록하여 해당 함수를 호출한다

  • 즉, OnClick() 프로퍼티 자체가 '대리자' 인 것

  • 게임 오브젝트 자체를 OnClick()에 등록하면 그 오브젝트의 함수에 접근할 수 있는 인스턴스 참조를 등록함



버튼 내부에 들어있는 프로퍼티 OnClick()

  • OnClick() 이벤트는 버튼이 클릭될 때 실행되는 함수나 메서드를 연결할 수 있도록 하는 데 사용한다

  • 사용할 함수가 들어있는 스크립트가 할당된 게임 오브젝트를 OnClick()에 등록해야한다
    -> 즉, 함수를 가지고 있는 인스턴스를 의미함


Scroll View

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

Scroll View 계층구조

  • 채팅창은 가로로 움직이지 않고 세로만 스크롤이 가능하다 -> Vertical만 체크하자

Scroll View 프로퍼티

scroll View 컴포넌트 내부의 프로퍼티 중 HorizontalVertical이 있다

  • Content : Scroll View 계층에 있는 스크롤 될 UI요소 참조 -> 눌러보면 자식으로 들어있는 Content를 가리킴

  • Horizontal ✅ : 가로 스크롤 활성화

  • Vertical ✅ : 세로 스크롤 활성화

  • Movement Type : 스크롤 내부 콘텐츠들의 이동성
  1. Unrestricted : 이동에 제한이 없음 (콘텐츠 크기 내에서 자유롭게 이동)
  2. Elastic : 탄성이 있음
  3. Clamped : 스크롤바를 사용해서만 움직일 수 있다


Viewport 내부 Content

  • Content는 실제 스크롤 바 내부에 넣은 요소들이 들어가는 곳이다

  • 주로 ContentLayout Groupcontent size fitter를 넣어서 정렬한다

  • 스크롤 뷰를 생성하면 scrollbar가 작다
    -> Bottom갑을 0으로 초기화

  • Content의 자식으로 원하는 Ui를 넣어서 정렬하면 content 범위 내에서 스크롤로 확인할 수 있다


Render Mode 설정하기

채팅창은 다 만들었다. 이제 3d 오브젝트를 씬뷰에 배치하고, 해당 오브젝트 위에 Text가 뜨게 해볼것이다
-> 우리가 배운대로라면 Text는 UI쪽에 배치된다 (스크린스페이스)


  • Text를 3D 오브젝트 위에 표시되게 하려면 우선 기존에 UI를 작업하던 Canvas 외의 또다른 Canvas를 생성한다

  • 게임 오브젝트의 자식으로 Canvas를 만들고 렌더모드를 World Space로 잡는다.
    -> 이제 Text는 2D가 아닌 3D공간에 생성된다

  • 카메라는 기존의 메인카메라를 넣어준다

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


절대 좌표 / 상대 좌표

절대 좌표 (World Coordinates)

  • 월드 좌표계에서의 위치
    유니티 씬 내에서의 전체적인 좌표계를 기준으로 한다

상대 좌표 (Local Coordinates)

  • 부모 객체를 기준으로 한 로컬 좌표계에서의 위치
    -> 객체의 위치가 자신의 부모 객체의 위치와 회전을 기준으로 정의된다

즉, 부모의 위치,회전을 기준으로 정의되기 때문에, 실제 자식의 좌표값은 '부모 + 자식 실제값' 느낌

  • 부모의 자식으로 들어가면 부모의 회전축을 기준으로 잡혀있기 때문에, 자식이 원래 회전축(0)이 되려면 Anchors의 회전 값을 부모만큼 빼주면 된다

  • 부모의 회전축이 135이기 때문에, 자식의 회전축에 -135를 해주면 회전축0이 된다


Prefab

만든 캔버스를 Prefab으로 등록하자

Prefab 이란?

  • 프리팹 시스템이란, 게임 오브젝트와 그 구성 요소들을 미리 저장해두고 다양한 곳에서 재사용할 수 있게 해주는 기능이다

  • Prefab 설정은 간단하다. 내가 원하는 게임 오브젝트를 프리팹으로 만들려면, Hierarchy창에서 Project창으로 옮겨주면 된다

  • 프리팹은 원본의 역할을 하며, 그 자체가 "실제" 오브젝트가 아닌 참조할 수 있는 자산 이다

  • 객체를 생성하면 프리팹을 얕은 복사 형식으로 참조해서 생성한다
    -> 원본과 참조되있는 상태이기 때문에, 서로의 내용 변경에 영향을 미친다

Prefab에서의 변경사항

  • 원본 Prefab의 내용이 수정되면 씬창에 배치된 오브젝트들에게도 다 적용된다
  • 반대로 배치되어있는 Prefab의 파생 객체들의 내용이 변경되면 변경된 값을 원본에 적용시킬 수 있다

-> 가능한 이유: 얕은복사로 참조된 상태이기 때문에


Prefab의 참조 끊기

  • Unpack Completely 옵션을 사용하면, 해당 프리팹 인스턴스는 프리팹의 참조와 완전히 분리되며, 모든 프리팹 관련 정보(컴포넌트 설정, 계층 구조 등)가 완전히 해제

  • 완전히 독립적인 객체가 된다 (깊은복사됨)

  • Unpack -> 현재 프리팹 되어있는 애만 끊기 (달려있는 자식들은 x)

  • Unpack Completely > 프리팹의 자식까지 모두 독립적이게 원본에서 끊어짐

보통은 Completely 사용



외의 Prefab관련

  • Select Asset : 프리팹 찾기
    -> 해당 게임 오브젝트의 원본 프리팹의 위치를 찾는다
  • Select Root : 부모가 되는 프리팹 찾기
    -> 프리팹의 최상위(root) 오브젝트를 선택하는 기능이다
    -> 프리팹 내부의 하위 오브젝트를 선택했을때, 루트 오브젝트로 이동할 수 있는 기능
  • Open Asset in Context : 프리팹만의 별도 작업 공간


Text - TextMeshPro

  • 기존의 Text와는 다르게, 고급 텍스트 렌더링 시스템으로 많은 기능을 가지고 있다
    -> (애니메이션 효과, 폰트, 여러 언어 가능 등등)

  • 다운로드 필수

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



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


  • 텍스트에 Dialog 스크립트를 넣고, DialogManager 스크립트에서 해당 함수를 호출하여 사용한다
  • 스크립트에서 TextMeshProUGUI를 사용하려면 '네임 스페이스 TMPro' 선언 필수
    -> Text를 사용하려면 using UnityEngine.UI; 네임스페이스였다

Dialog 스크립트

  • 외부에서 함수를 호출해서 사용할 예정이기 때문에 접근지정자는 public
  • 함수를 호출한 뒤, 매개변수로 string값이 들어온다
    -> 이 값이 TextMeshPro 컴포넌트의 프로퍼티 text의 값을 변경한다


GetComponent<>

  • 해당 스크립트가 부착된 게임 오브젝트에 들어있는 컴포넌트를 가져오는 함수
  • 유니티 에디터 내부에서 직접 자기 자신을 할당해도 되지만 GetComponent가 더 효율적
  • 생명주기에서 배웠던 바로, 자기 자신의 컴포넌트를 가져오는 작업은 Awake() 에서 정의함


  • 런타임 시, 해당 오브젝트의 컴포넌트에 자기 자신의 TextMeshPro가 할당된다



채팅 매니저 단일체계원칙

  • 이렇게 DialogDialogManager를 각각의 스크립트로 짜서 분리되어 작업하면 단일체계원칙을 지킨다

단일체계원칙 (Single Responsibility Principle, SRP)

  • '한 클래스는 하나의 책임만 가져야 한다'는 규칙

  • ex) 채팅 시스템
    -> Dialog에서는 각각의 채팅 메세지를 표현, 채팅의 내용을 저장 (채팅관리)
    ->DialogManager 에서는 채팅 목록을 관리하거나, 채팅을 호출해서 생성



플라이웨이트(Flyweight) 패턴

  • 프리팹과 유사함
  • 많은 여러 객체들을 만들 때 모든 객체를 메모리에 유지하는 대신 객체들 간 동일한 부분을 공유하여 메모리 사용을 최소화하는 디자인 패턴
profile
뉴비 개발자

0개의 댓글