. Net Framework에서 사용되던 라이브러리이다. Generic 기능이 도입되기 이전에 사용되었으며 Collections의 클래스들은 모든 요소를 object 타입으로 처리하여 요소를 다룰 때에 형변환을 필요로 한다.
대표적의로 ArrayList, Hashtable, sortedList, Stack, Queue 등이 있다.
Generic
Collections의 클래스들은 형변환이 필요하기 때문에 잘못된 타입을 사용할 경우 에러가 발생하게 된다.
이 문제를 해결하기 위해서 안정성을 제공하는 새로운 클래스들이 Generic 네임스페이스로 추가되었다.
대표적으로 List, Dictionary, Queue <T>, Stack <T> 등이 있다.
Collections
Generic
ArrayList
List<T>
Hashtable
Dictionary<TKey, TValue>
Queue
Queue<T>
Stack
Stack<T>
Compare
옛날부터 작성된 코드인 경우에는 Collections 라이브러리를 사용하기 위해서 해당 네임스페이스를 선언해 주는 경우가 많다. 거기다 새로 추가된 Generic도 사용하기 위해서 두 라이브러리를 모두 선언하는 경우가 많은데 공식 문서에 따르면 Collections에서 사용하는 클래스들은 Generic에 안정성이 추가된 대체할 수 있는 클래스들이 있기 때문에 되도록이면 Generic만 사용하기를 권장한다.
대표적으로 ArrayList와 List<T>를 비교해 본다.
using System;
using System.Collections;
using System.Collections.Generic;
class Program
{
static void Main()
{
// ArrayList
ArrayList arrayList = new ArrayList();
// 요소 추가
arrayList.Add("Hello");
arrayList.Add(30);
arrayList.Add(true);
// 요소 접근
string str = (string)arrayList[0];
int num = (int)arrayList[1];
bool flag = (bool)arrayList[2];
Console.WriteLine(str); // 출력: Hello
Console.WriteLine(num); // 출력: 30
Console.WriteLine(flag); // 출력: True
// List<T>
List<object> list = new List<object>();
// 요소 추가
list.Add("Hello");
list.Add(30);
list.Add(true);
// 요소 접근
string str = list[0];
int num = list[1];
bool flag = list[2];
Console.WriteLine(str); // 출력: Hello
Console.WriteLine(num); // 출력: 30
Console.WriteLine(flag); // 출력: True
}
}
arrayList와 list 변수 모두 가변 배열로 요소를 추가하고 인덱스로 접근하여 값을 사용하고 있다.
하지만 사용법에서 차이가 발생한다.
ArrayList는 Add 메서드를 사용하여 요소를 추가하고 접근할 때에는 형변환을 수행해야 한다. 모든 요소를 object 타입으로 처리하므로 요소를 사용하기 전에 타입을 캐스팅해야 한다.
하지만 List 요소의 타입은 컴파일 시점에 검사 되기 때문에 추가한 요소에 접근할 때 형변환이 따로 필요하지 않다.
즉 Generic을 사용하게 되면 타입의 안정성이 보장되고 컴파일러가 타입을 검사를 수행하기 때문에 타입으로 인해 발생하는 문제를 사전에 발견할 수 있으며 형변환 코드를 작성할 필요가 없기 때문에 코드가 간결해진다.
객체를 정의하는 템플릿이며 객체의 상태를 나타내는 필드와 동작을 나타내는 메서드를 포함한다.
즉 클래스는 객체를 표현하기 위한 설계도로 볼 수 있다.
public class MyClass
{
// field, 멤버 변수
public int id;
public string name;
public int age;
// method, 멤버 함수
public void Introduc()
{
string introduce = "My age : " + agem + "\nMy name : " + name;
Cosole.WriteLine(introduce);
}
}
MyClass라는 객체에는 id, name, age 멤버변수와 Introduce 메서드를 포함하고 있다.
Instance
클래스의 인스턴스로 실제로 메모리에 할당된 데이터이다. 객체는 클래스에서 정의된 필드와 메서드를 사용할 수 있으며 개별적인 상태를 유지한다.
클래스 간의 계층 구조를 형성하여 코드의 재사용성과 구조화를 실현한다. 기존 클래스를 기반으로 새로운 클래스를 정의하고 확장할 수 있는데 ㅅ상속을 통해 부모 클래스의 멤버를 자식 클래스에서 사용하는 것이 가능하다.
public class Parent
{
public int id;
public string name;
public void MethodParent()
{
Console.Log(id, name);
}
}
public class Child
{
public void MethodChild()
{
id = 10;
name = "bak";
MethodParent();
}
}
재사용할 코드는 부모 클래스로 만들어서 자식 클래스에서 상속하여 그대로 사용할 수 있다.
Polymophism
다형성은 같은 이름의 메서드나 속성을 다른 방식으로 구현하는 개념이다. 다형성은 상속과 관련이 깊으며 부모 클래스의 타입으로 자식 클래스의 객체를 참조하면 다형성을 활용할 수 있다.
public class Parent
{
public virtual void MethodParent()
{
Console.WriteLine("Call Parent Method");
}
}
public class Child
{
public override void MethodParent()
{
Console.WriteLine("Call Parent Method From Child");
}
}
다형성의 대표적인 예는 부모 클래스의 메서드를 자식에서 오버라이딩하는 경우가 있다.
Encapsulation
객체의 상태와 동작을 외부로부터 감추는것을 뜻한다. 클래스는 필드와 메서드를 적절한 접근 제한자로 제어하여 캡슐화를 구현할 수 있다. 이는 객체의 내부 구현을 보호하며 외부에서는 필요한 기능만 사용할 수 있도록 한다.
public class MyClass
{
private string name;
private int age;
public void SetName(string name)
{
this.name = name;
}
public string GetName()
{
return name;
}
public void SetAge(int age)
{
this.age = age;
}
public int GetAge()
{
return age;
}
}
public class Program
{
public static void Main(string[] args)
{
MyClass myClass = new MyClass();
myClass.SetName("Bak");
myClass.SetAge(30);
Console.WriteLine("Name : " + myClass.GetName());
Console.WriteLine("Age : " + myClass.GetAge());
}
}
클래스에서 접근을 허용할 부분을 public 불필요한 부분은 private로 접근 제한자를 두어 필요한 부분만 제어할 수 있도록 한다.
Abstract
복잡한 시스템을 단순화하고 핵심적인 요소만을 추출하여 모델링하는 과정을 말한다. 추상화는 클래스의 공통적인 특징을 추출하여 부모 클래스나 인터페이스로 정의할 수 있다.
public class Person
{
public int age;
public string name;
public int countryCode;
public virtual void Eat() {}
public virtual void Sleep() {}
public virtual void Work() {}
}
public class Student : Person
{
public override void Work()
{
Console.WirteLine("Studying");
}
}
public class Teacher : Person
{
public override void Work()
{
Console.WriteLine("Teaching");
}
}
추상화는 클래스를 만들 때 필요한 기본 개념으로 재사용, 다형성 등을 고려하여 최대한 구체적이지 않으면서 공통적인 부분을 부모 클래스로 만들 때 필요하다.
오디오 시스템을 구성하는 데 사용되는 설정으로 모든 Audio 컴포넌트에 영향을 미치는 전역적인 설정을 제공한다.
Unity Project Settings - Audio
Global Volume
오디오 시스템의 볼륨을 전역으로 적용한다.
Audio - Global Volume
볼륨의 초기값에 곱해주는 수로 AudioListner.volume과 동일하다.
Volume Rolloff Scale
볼륨이 감쇠되는 정도를 전역으로 조절한다.
Audio Volume Rolloff Scale
단 Logarithmic Volume Curves 인 경우에만 적용된다.
Logarithmic Volume Curves는 로그 함수 곡선형태로 사운드가 감쇠되는 경우에만 적용되는데 이 사운드는 Audio Source 컴포넌트의 속성값 중에 3D Sound Settings의 Volume Rolloff에서 선택할 수 있는 옵션이다.
( 기본으로 Logarithmic Rolloff 설정 )
값은 기본적으로 1로 되어있는데 이 값이 현실에 가장 가까운 수치이다.
Doppler Factor
소리에 도플러 효과(Doppler Effect)를 적용시키기 위한 수치이다.
Audio Doppler Factor
원하는 도플러 효과를 얻기 위해서 해당 수치를 조절할 수 있다.
Doppler Effect
도플러 효과란 파동의 진동수가 왜곡되는 현상이다. 음원(소리의 근원지)가 움직이면서 파원이 다가오고 있을 때 정지한 관찰자에게는 파동의 파장이 실제보다 짧게 느껴지고 다시 멀어지게 되면 파장이 실제보다 길게 느껴지는 것이다.
예를 들어 멀리서부터 소방차가 사이렌을 켜고 달려오고 있다. 이때 멀리서부터 나에게 가까워지는 동안에는 사이렌의 소리가 점점 높아지는 것처럼 들리다가 내 옆을 지나쳐 멀어질 때는 낮아지는 것처럼 느껴진다. 하지만 이는 상대적인 효과로 관찰자만 느끼는 현상이고 소방차에 탑승한 사람에게는 일정한 소리로 들린다.
유니티의 프로젝트 세팅에서 Doppler Factor 수치는 기본적으로 1이다. 이 수치는 소리의 움직임이 실제 도플러 효과와 거의 동일하게 시뮬레이션되며 값이 0에 가까워질수록 도플러 효과가 감소하고 값이 높아질수록 강조된다.
Default Speaker Mode
프로젝트의 오디오 출력을 설정할 수 있는 옵션이다. 유니티 엔진에서 오디오가 재생될 때 사용되는 스피커의 타입을 지정할 수 있다.
Audio - Default Speaker Mode
옵션의 종류는 다음과 같다.
Default Speaker Mode - Option
Mono
채널 개수가 1개이다.
오디오를 단일 스피커에서 재생한다. 오디오 소스는 좌우 채널이 결합된 단일 스피커로 재생된다.
주로 모노 오디오 효과나 음성 등 단일 채널 오디오를 재생하는 데 사용된다.
Stereo
채널 개수가 2개이다.
좌우 스피커에서 각각의 채널이 재생된다. 대부분의 오디오에서 사용되는 일반적인 스테레오 효과를 재생할 때 사용되며 기본으로 선택된 설정이다.
Quad
채널 개수가 4개이다.
전후좌우 4개의 스피커에 각각의 채널이 재생되며 3D 오디오 효과를 표현할 수 있다.
Surround
채널 개수는 5개이다.
전면 좌우, 중앙, 후면 좌우 5개의 스피커를 사용한다. 더 입체적인 공간 음향 효과를 재생할 수 있다.
Surround 5.1/7.1
채널 개수는 5개 이상이다.
전면 좌우, 중앙, 후면 좌우 + 서브 우퍼 채널을 통해 사운드가 재생된다.
Prologic DTS(Digital Theater System)
채널 개수는 2개이다.
스피커는 스테레오로 출력되지만 데이터는 Prologic/Prologic2 디코더에서 인식하고 5.1 채널 스피커로 분리되도록 인코딩 된다.
System Sample Rate
출력되는 샘플 레이트를 설정한다. 해당 수치를 조절하면 오디오 주파수의 표현 범위를 조정할 수 있다. 0으로 설정하면 시스템의 샘플 레이트를 사용하고 0 이외의 값을 설정하면 입력한 값을 샘플 레이트로 사용하게 된다. iOS나 Android와 같은 특정 플랫폼에서 샘플 레이트를 변경할 수 있는 경우에만 해당한다.
Sample Rate
샘플의 빈도수 즉, 1초당 추출되는 샘플의 개수를 뜻한다. 샘플 레이트의 수치가 높을수록 정확한 음원을 저장할 수 있지만 그만큼 용량이 기하급수적으로 증가한다. 이에 따라 적당한 타협선인 44.1kHz의 샘플 레이트가 일반적으로 사용된다.
DSP Buffer Size
Digital Signal Processing 버퍼 크기
실시간으로 들어오는 오디오 데이터를 처리하고 재생하기 위해서 일시적으로 저장하는 공간의 크기를 설정한다.
Audio - DSP Buffer Size
해당 저장공간이 작으면 오디오 데이터가 빠르게 처리되지만 CPU 부하가 증가하고 지연 시간이 감소한다. 반면에 공간이 큰 경우에는 한 번에 더 많은 오디오 데이터가 처리되므로 CPU부하가 감소하고 지연 시간이 증가한다.
DSP Buffer Size
Default
유니티의 기본 DSP 버퍼 크기를 사용한다. 대부분의 경우 적절한 응답성과 지연 시간을 제공하는 안정적인 설정이다.
Bestlatency
지연 시간을 고려하여 성능을 절충한다. 더 낮은 지연 시간이 요구되는 실시간 애플리케이션에 적합하다. CPU 부하가 증가할 수 있고 낮은 CPU 성능에서는 문제가 발생할 수 있다.
Good latency
지연 시간과 CPU 성능의 균형을 유지한다. 일반적인 오디오 처리 요구 사항을 충족하는데 적합하다.
Best performance
CPU 성능을 유리하도록 지연시간을 맞춘다. 높은 오디오 처리 요구 사항이 있거나 더 많은 CPU 성능을 활용해야 하는 경우에 적합하며 지연 시간이 증가할 수 있다.
Max Virtual Voices
Audio - Max Virtual Voices
오디오 시스템이 관리할 수 있는 최대 사운드의 개수를 설정한다. Real Voices의 수보다 크게 설정되어야 하며 그렇지 않은 경우 콘솔에서 경고 메시지가 표시된다. 가장 큰 소리들 중에서 Max Real Voices 수만큼만 실제로 재생되고 나머지 소리들은 재생 위치만 업데이트된다.
Max Real Voices
Audio - Max Real Voices
게임에서 동시에 재생 가능한 실제 음성의 수를 설정한다. 매 프레임마다 가장 큰 음성이 선택된다.
Spatializer Plugin
Audio - Spactializer Plugin
공간화된 오디오 처리를 수행하기 위한 플러그인이다. 오디오를 공간적으로 위치시키고 음향 효과를 적용하여 3D 소리의 현실감을 높이는 데 사용된다.
일반적으로 게임 엔진이나 오디오 미들웨어에서 제공되며 다양한 기능과 설정을 제공한다. 오디오 원본의 위치, 방향, 거리 등을 고려하여 소리를 공간 내에서 정확하게 재생할 수 있으며 일반 스피커 시스템이나 헤드폰을 사용하는 경우, 소리가 사용자 주변에서 움직이거나 공간의 특정 위치에서 들리는 것처럼 느껴지게 된다.
유니티에서 제공되는 빌트인 디코더는 없으며 일부 VR 하드웨어 제조사의 경우 오디오 SDK에 유니티용 빌트인 디코더가 있다. 타깃 플랫폼 제조사의 문서를 통해 프로젝트에 적합한지 확인할 수 있다.
Ambisonic 오디오 클립을 임포트 하려면 임포트 한 파일의 Ambisonic 옵션을 체크해야 한다.
Import Ambisonic Audio Clip
Ambisonic 클립을 사용하기 위해서는 Audio Source 컴포넌트의 Spatialize 옵션을 비활성화해야 하고 해당 클립이 재생될 때 자동으로 프로젝트에서 선택된 플러그인을 통해서 디코딩된다.
Ambisonic
다중 마이크로폰 배열을 사용하여 소리의 공간 정보를 캡처하는 방법이다. 소리의 방향, 거리, 공간 위치 등을 캡처하여 공간적으로 정확한 사운드 재생을 가능하게 한다. 일반적으로 360도 환경 음향을 재현하거나 VR 및 3D 오디오 환경에서 사용된다. 다중 채널 포맷으로 저장되고 Ambisonic을 사용하면 각 채널을 특정 스피커에 매핑하지 않고 사운드필드가 더 전체적인 방법으로 표현된다.
Binaural
인간의 이중귀를 모방하여 소리를 전달하는 기술이다. 두 개의 이어폰 또는 헤드폰을 사용해서 소리를 개별적으로 각 귀에 전달함으로 공간적인 사운드 경험을 제공한다. 3D 오디오를 더욱 현실적이고 공간적으로 인지할 수 있도록 한다.
Disable Unity Audio
Disable Unity Audio
런타임에 출력 장치를 할당하지 않도록 설정한다. 내장된 오디오 시스템 이외의 다른 사운드 시스템을 사용하는 경우에 활성화하는 옵션이다.
Enable Output Suspension (editor only)
Enable Output Suspension
출력이 오랜 시간 동안 정지된 것이 감지되면 자동으로 오디오 출력을 일시 중단시킨다. 오디오 시스템을 중단하면 컴퓨터가 절전 모드로 전환되는 것을 방지하는 운영 체제의 기능이 비활성화되고 이를 통해 오랜 시간 동안 정지된 오디오 출력으로 인해 컴퓨터가 절전 모드로 전환되는 것을 방지할 수 있다. 주로 배터리 수명을 연장하거나 오디오가 정지된 상태에서 시스템의 에너지 소비를 최소화하기 위해 사용된다.
해당 설정은 기본적으로 활성화되어 있다.
Visualize Effects
컬링 되는 오브젝트의 Audio Source에서 Spatializer를 동적으로 비활성화하여 CPU를 절약한다.