[수업내용]
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 예정
지금까지 본 게임들이 어떻게 영상을 재생하고 버튼을 구현했는지 뭔가 실감이 났다. 유니티는 어떤걸 가져와야할지 정하고 체계적으로 틀을 만드는 과정이 중요하다는 느낌이 들었다.