Unity의 API 및 프로젝트 구조는 대부분 지원되는 모든 플랫폼과 동일하며, 프로젝트를 다른 기기에서 실행하도록 다시 빌드할 수 있는 경우도 있습니다. 하지만 하드웨어와 배포 방식의 근본적인 차이로 인해 프로젝트의 일부는 변경 없이 플랫폼 간에 이식되지 않을 수 있습니다. 이 페이지에는 몇 가지 일반적인 크로스 플랫폼 문제와 그 해결 방법에 대한 제안이 나와 있습니다.
플랫폼 간 다르게 동작하는 가장 좋은 예는 하드웨어에 의해 제공되는 입력 메서드입니다.
Input.GetAxis 함수는 데스크톱 플랫폼에서 키보드 및 조이패드 입력을 통합하는 데 편리합니다. 이 함수는 터치스크린 입력을 사용하는 모바일 플랫폼에 적합하지 않습니다. 표준 데스크톱 키보드 입력은 입력된 텍스트를 모바일 기기로 이식하는 데만 적합합니다. 향후 다른 플랫폼으로 이식할 계획이라면 입력 코드에 추상화 레이어를 추가하면 됩니다. 예를 들어, 주행 게임을 만드는 경우 자체 입력 클래스를 만들고 Unity API 호출을 자체 함수로 래핑할 수 있습니다.
// Returns values in the range -1.0 .. +1.0 (== left .. right).
function Steering() {
return Input.GetAxis("Horizontal");
}
// Returns values in the range -1.0 .. +1.0 (== accel .. brake).
function Acceleration() {
return Input.GetAxis("Vertical");
}
var currentGear: int;
// Returns an integer corresponding to the selected gear.
function Gears() {
if (Input.GetKeyDown("p"))
currentGear++;
else if (Input.GetKeyDown("l"))
currentGear--;
return currentGear;
}
클래스에 API 호출을 래핑하면 API 호출을 단일 소스 파일에 넣고 호출을 쉽게 찾고 교체할 수 있습니다. 게임 내 입력의 논리적 의미에 따라 입력 함수를 설계해야 합니다. 이렇게 하면 특정 플랫폼에서 사용되는 특정 입력 방식으로부터 나머지 게임 코드를 분리할 수 있습니다.
예를 들어 위의 Gears 함수를 수정하여 실제 입력이 모바일 기기 화면의 터치로 이루어지도록 할 수 있습니다. 정수를 사용하여 모든 플랫폼에서 선택한 기어 작동을 나타낼 수 있지만 플랫폼별 API 호출을 나머지 코드와 혼합하면 문제가 발생할 수 있습니다. 또한 플랫폼별 컴파일을 사용하여 동일한 소스 파일에서 입력 함수의 다양한 구현을 결합하고 수동 스왑을 방지할 수도 있습니다.
Input.GetMouseButtonXXX 함수는 모바일 기기에서 명확하게 해석되도록 설계되었습니다. 화면은 간단한 터치를 왼쪽 클릭으로 인식하며, Input.mousePosition 프로퍼티는 손가락이 화면을 터치하는 동안 터치의 위치를 알려 줍니다. 간단한 마우스 상호 작용이 포함된 게임은 데스크톱과 모바일 플랫폼 간에 투명하게 작동할 수 있는 경우가 많습니다.
전환은 이보다 훨씬 더 간단합니다. 예를 들어 데스크톱 게임에서는 두 개 이상의 마우스 버튼을 사용할 수 있고 모바일 게임에서는 화면의 여러 터치를 한 번에 감지할 수 있습니다. 이를 관리하기 위해 논리 값으로 입력을 표현한 후 나머지 게임 코드에서 사용할 수 있습니다.
예를 들어 모바일 기기에서 확대/축소하는 핀치 제스처를 데스크톱의 +/- 키로 대체할 수 있으며, 입력 함수는 확대/축소 배율을 나타내는 플로트 값을 반환할 수 있습니다. 마찬가지로 모바일에서 두 손가락 탭을 사용하여 데스크톱의 오른쪽 클릭을 대체할 수도 있습니다. 하지만 입력 기기의 프로퍼티가 게임의 필수 요소면 다른 플랫폼에서 다시 모델링할 수 없습니다. 이는 게임을 이식할 수 없거나 입력 또는 게임플레이를 광범위하게 수정해야 함을 의미할 수 있습니다.
이러한 입력은 핸드헬드 기기의 이동성에서 비롯된 것이므로 데스크톱에서는 의미가 없을 수 있습니다. 그러나 일부 사용 사례에서는 단순히 표준 게임 컨트롤을 미러링하며 쉽게 이식됩니다. 예를 들어, 주행 게임에서는 모바일 기기의 기울기(가속 센서에 의해 결정됨)에서 스티어링 컨트롤을 구현할 수 있습니다. 이러한 경우 입력 API 호출은 대개 변경하기 쉽기 때문에 가속 센서 입력을 키 누름으로 대체할 수 있습니다.
하지만 다른 입력 방식에 맞게 조정하기 위해 입력을 다시 보정하거나 게임 난이도를 다양화해야 할 수 있습니다. 기기를 기울이는 것은 키를 누르는 것보다 더 느리고 힘들기 때문에 디스플레이에 집중하기가 더 어렵습니다. 따라서 모바일 기기에서 게임을 마스터하기가 더 어려워질 수 있으므로 게임플레이 속도를 늦추거나 레벨당 시간을 늘리는 것이 좋습니다. 이 경우 이러한 요소를 조정하기 위해 게임 코드를 설계해야 합니다.
모바일 기기는 데스크톱 컴퓨터보다 사용 가능한 스토리지 및 메모리가 적고 CPU 성능이 낮으므로 저전력 하드웨어에서는 게임 성능을 수용하지 못해 게임을 이식하기 어려울 수 있습니다. 데스크톱 하드웨어의 한계를 초과하는 경우 해당 게임은 모바일 플랫폼으로 이식하는 데 적합하지 않을 수 있습니다.
동영상, 오디오, 텍스처는 많은 스토리지 공간을 사용할 수 있습니다. 게임을 이식하려면 스토리지를 효과적으로 관리해야 합니다. 일반적으로 데스크톱 컴퓨터에서는 스토리지 공간(다운로드 시간에 해당하는 경우도 많음)이 문제가 되지 않지만, 모바일 기기에서는 제한될 수 있습니다. 모바일 앱 스토어는 제출한 제품의 최대 크기에 제한을 두는 경우가 많습니다. 게임 개발 중에 이러한 문제를 해결하려면 일부 계획이 필요할 수 있습니다.
예를 들어 공간을 절약하기 위해 모바일에 대한 에셋의 축소 버전을 제공해야 할 수 있습니다. 또는 애플리케이션의 초기 다운로드 일부가 아닌 대규모 에셋을 필요에 따라 다운로드할 수 있도록 게임을 설계해야 할 수도 있습니다.
Unity는 ‘죽은’ 오브젝트에서 사용하지 않은 메모리를 자동으로 복구하며, 데스크톱 컴퓨터에서는 눈에 띄지 않은 경우가 많습니다. 하지만 모바일 기기의 메모리와 CPU 성능이 낮을수록 가비지 컬렉션이 더 자주 발생하여 성능에 영향을 미치고 게임플레이 중에 원치 않게 일시 중지가 발생할 수 있습니다. 게임이 사용 가능한 메모리에서 실행되더라도 가비지 컬렉션이 일시 중지되지 않도록 코드를 최적화해야 할 수 있습니다.
자세한 내용은 메모리 관리 페이지를 참조하십시오.
데스크톱 컴퓨터에서 잘 작동하는 게임도 모바일 CPU에서 게임 복잡도로 인해 처리가 힘들기 때문에 모바일 기기에서 프레임 속도가 저하되는 문제가 발생할 수 있습니다. 따라서 프로젝트를 모바일 플랫폼에 이식할 때 코드 효율성에 유의하십시오.