본문 바로가기

유니티(Video Player 이해, TV와 리모컨 실습, 고양이게임 마무리) _ 멋쟁이사자처럼 유니티 부트캠프 후기 19회차 추가학습

@salmu2025. 6. 12. 21:48
반응형

[수업내용]

1. Video Player :Material 방식 (3D 오브젝트에 영상 출력)

2. 카메라시야(Frustum)

3. TV와 리모컨 실습

4. 고양이게임 Outro Video 추가

 

 

1.1 영상 출력용 스크린 _ Quad

        • 2개의 삼각형(1 Polygon 면)으로 구성 → 가벼움(최적화에 유리)
        • UV 매핑이 영상 출력에 정확하게 대응됨 → 영상 비율 유지하기 편리
        • <-> 한 면만 존재하는 평면(Plane) → 뒤는 안 보임
        • <-> Cube 다른 면도 보임 (원치 않는 면에 영상 비침 가능
      •  

1.2 Video Player - Render Mode/  Material Override

: 3D 공간 안 ‘진짜처럼’ 보이게 하고 싶을 때 /3D 공간 내 오브젝트에 영상을 ‘직접’ 입히는 것

: 3D 환경과 조명/그림자 적용 - 다른 오브젝트와 자연스럽게 어울림

: Mesh Renderer와 머티리얼 그대로 활용 - 머티리얼 Shader에 따라 반사효과 추가 가능

 

-다른 render mode

Render Mode 설명 주 용도
Camera Near Plane 카메라의 Near Plane에 영상 출력 (2D 화면처럼 덮어씀) 풀스크린 영상 / 연출용
Camera Far Plane 카메라의 Far Plane에 영상 출력 (3D 오브젝트 뒤에 나옴) 뒤쪽 배경 영상
Render Texture Render Texture에 출력 → 다른 곳에 응용 가능 UI 요소 / TV 화면 등 다양하게 활용
Material Override 3D 오브젝트의 Material에 영상을 입힘 TV, 벽면, 월스크린 같은 3D 효과
API Only 코드로만 제어 (화면 출력 없음) 고급 사용자용, 커스텀 처리

 

1.2.1 Target Material Renderer

영상 입힐 오브젝트의 Mesh Renderer 드래그해서 넣기

→ 보통 오브젝트 자체에 Video Player가 붙어 있으면 자기 자신의 Mesh Renderer 넣으면 됨

 

 

*주의사항  : 머티리얼의 셰이더에서는_MainTex 속성 필요

  • 영상 출력 위치 = 머티리얼의 _MainTex 속성
  • 사용하는 Shader가 반드시 _MainTex 속성을 포함해야 영상이 정상 출력됨
  • 대부분 기본 Standard Shader, Unlit/Texture Shader_MainTex 사용

 

1.3 Render Mode/  Render Texture

: Canvas 안에서 배치하므로 UI처럼 다룸

: Render Texture 크기로 화질 조절 가능 & RawImage 위치/크기 조정으로 영상 위치 조절 가능

: 2D 인터페이스 안에 영상 보여주고 싶을 때
: 카메라, 조명 영향 X


<적용 순서>

ㄱ. Video Player 오브젝트 생성  =  영상을 재생하는 주체

Render Mode = Render Texture 설정

 

ㄴ. Render Texture 생성 = 영상을 담는 그릇 (텍스처 형태로 저장됨)

Target Texture에 연결

 

ㄷ. Canvas → RawImage 생성 =UI에 실제로 보여주는 역할 (Render Texture 표시)

RawImage → Texture에 Render Texture 연결


      • 하나의 Render Texture → 하나의 영상 → 하나의 RawImage 연결 구조
      • 여러 개의 영상 출력하고 싶다면?
               각각의 영상마다 Video Player 오브젝트 + Render Texture + RawImage 따로 만들어서 연결 

 

 

2. Frustum

:영상 보이게 하려면 → 오브젝트 위치 확인 → Frustum 안으로 배치

  • Near Plane: 카메라에 가장 가까운 경계
  • Far Plane: 카메라에 가장 먼 경계
  • 두 경계 사이렌더링 됨 (화면에 보임)
  • 밖에 있음렌더링 안 됨 (Culling 처리)

 

 

 

3.1 TV와 리모컨 구현

  • 3D gameobject로 TV 구현 (Videoplayer 컴포넌트 quad에 부착)
  • 리모컨 이미지 가져와 UI로 버튼 배치
  • 리모컨 이미지 버튼별 기능 설정 
// TVRemoteController

public GameObject videoScreen;

// 스크린의 On/OFF를 결정하는 변수
public bool isOn = false;

public void OnScreenPower() 
{
    // 방법 1: 상태 저장 변수 활용
    isOn = !isOn; // 현재 상태 반전 (켜져 있으면 끄고, 꺼져 있으면 켜고)
    videoScreen.SetActive(isOn);   // 상태에 따라 화면 활성화/비활성화
    
    // 방법 2 상태 저장 변수 없이 직접 반전
    // videoScreen.SetActive(!videoScreen.activeSelf);
}

 

ㄱ. 유니티 상에서 버튼에 기능 할당

 

 

 

 

 

ㄴ. 스크립트로 버튼 기능 할당 

 

 //TV Remote Controller 스크립트
    
 public class TVRemoteController : MonoBehaviour
{
    public GameObject videoScreen;
    public Button[] buttonUI;  // UI 버튼 배열
    private VideoPlayer videoPlayer;  // videoScreen에서 가져올 VideoPlayer 컴포넌트
    public VideoClip[] clips; // 재생할 영상 클립들 (배열)

    public int currClipIndex = 0; // 현재 영상 index
    public bool isMute = false;

    void Awake()
    { // videoScreen 오브젝트에서 VideoPlayer 컴포넌트를 받아옴
        videoPlayer = videoScreen.GetComponent<VideoPlayer>();
        
        // 초기 영상으로 clips 배열의 첫 번째 클립을 할당
        videoPlayer.clip = clips[0];
    }


    void Start()
    {
  	  // 각 버튼에 클릭 이벤트 함수 연결
        buttonUI[0].onClick.AddListener(OnScreenPower);
        buttonUI[1].onClick.AddListener(OnMute);
        buttonUI[2].onClick.AddListener(OnPrevChannel);
        buttonUI[3].onClick.AddListener(OnNextChannel);
    }

    // 전원 버튼 눌렀을 때 동작하는 함수
    public void OnScreenPower() 
    {
       // videoScreen의 활성화 상태를 반전시킴 (켜져 있으면 끄고, 꺼져 있으면 켬)
        videoScreen.SetActive(!videoScreen.activeSelf);

    }

    // 뮤트 버튼 눌렀을 때 동작하는 함수
    public void OnMute()
    {
        isMute = !isMute;
        videoPlayer.SetDirectAudioMute(0, isMute);
        // videoPlayer.SetDirectAudioMute(0, !videoPlayer.GetDirectAudioMute(0));
    }

    public void OnNextChannel()
    {
        currClipIndex++;
        if (currClipIndex > 2)
            currClipIndex = 0;
        
        videoPlayer.clip = clips[currClipIndex];
        videoPlayer.Play();
    }

    public void OnPrevChannel()
    {
        currClipIndex--;
        if (currClipIndex < 0)
            currClipIndex = 2;

        videoPlayer.clip = clips[currClipIndex];
        videoPlayer.Play();
    }
 }

videoPlayer.SetDirectAudioMute(0, isMute); 

  • videoPlayer : VideoPlayer 컴포넌트 인스턴스입니다.
  • SetDirectAudioMute(int trackIndex, bool mute)는 는 VideoPlayer의 특정 오디오 트랙을 음소거(Mute)하거나 해제하는 메서

 

videoPlayer.GetDirectAudioMute(0)

  •  현재 오디오 상태(음소거 여부)를 가져옴 (true면 음소거 중, false면 소리 나오는 중)
  • 0은 오디오 트랙(Audio Track) 인덱스 번호

 

  • 배열에 맞는 오브젝트 할당

 

 

 

4. 고양이게임 Outro Video 추가
**update 예정

 

 

 

지금까지 본 게임들이 어떻게 영상을 재생하고 버튼을 구현했는지 뭔가 실감이 났다. 유니티는 어떤걸 가져와야할지 정하고 체계적으로 틀을 만드는 과정이 중요하다는 느낌이 들었다.

반응형
salmu
@salmu :: SMU 각종 기록

목차