Unity 的大多数 API 和项目结构对于所有支持的平台都是相同的,在某些情况下,可以简单地重新构建项目以在不同设备上运行。但是,硬件和部署方法的根本区别意味着项目的某些部分需要进行更改才能在平台之间移植。本页列出一些常见的跨平台问题的详细信息以及解决这些问题的建议。
平台之间不同行为的最佳例子是硬件提供的输入方法。
Input.GetAxis 函数作为整合键盘和游戏手柄输入的方式,在桌面平台上非常方便。此功能不适用于依赖触摸屏输入的移动平台。标准桌面键盘输入仅适用于将键入的文本移植到移动设备。如果打算将来移植到其他平台,可以为输入代码添加一个抽象层。例如,如果要开发驾驶类游戏,那么您可以创建自己的输入类并将 Unity API 调用封装在您自己的函数中:
// 返回的值范围在 -1.0 ..+1.0 (== left .. right).
function Steering() {
return Input.GetAxis("Horizontal");
}
// 返回的值范围在 -1.0 ..+1.0 (== accel .. brake).
function Acceleration() {
return Input.GetAxis("Vertical");
}
var currentGear: int;
// 返回与所选齿轮对应的整数。
function Gears() {
if (Input.GetKeyDown("p"))
currentGear++;
else if (Input.GetKeyDown("l"))
currentGear--;
return currentGear;
}
将 API 调用封装在一个类中,从而将它们都集中在单个源文件中,因此易于定位和替换。您应该根据游戏中输入的逻辑含义来设计输入函数。这有助于将其余游戏代码与特定平台使用的特定输入方法隔离开来。
例如,您可以修改上面的 Gears 函数,以便实际输入来自移动设备屏幕上的触摸操作。可以使用整数表示所选设备的做法适用于所有平台,但将特定于平台的 API 调用与其余代码混合会产生问题。还可以使用平台相关的编译可以很方便地将输入函数的不同实现合并到同一源文件中,并避免手动交换。
Input.GetMouseButtonXXX__功能旨在在移动设备上有明显的解释。单次触摸屏幕报告为左键单击,只要手指触摸屏幕,__Input.mousePosition 属性就会给出触摸的位置。具有简单鼠标交互的游戏通常在桌面平台和移动平台之间的工作方式没有区别。
转换通常没有这么简单。例如,桌面游戏可以使用多个鼠标按钮,而手机游戏可以一次检测屏幕上的多次触摸。 为了帮助管理这一点,您可以使用逻辑值表示输入,然后由其余的游戏代码使用这些值。
例如,移动设备上实现缩放的捏合手势可以被桌面设备上的 +/- 键击操作取代;输入函数可以简单地返回一个指定缩放因子的浮点值。同样,可以在移动设备上使用双指点击操作来替代桌面设备上的右键单击操作。但是,如果输入设备的属性是游戏的组成部分,那么可能无法在不同的平台上重新构建它们。这可能意味着游戏无法移植,或者输入和/或游戏玩法需要进行大幅修改。
这些输入来自手持设备的移动特性,因此在桌面设备上可能没有任何有意义的等价方式。但是,一些用例只镜像标准游戏控制方式,可以很容易地移植。例如,驾驶类游戏可以通过移动设备的倾斜(由加速度计确定)实现转向控制。在这种情况下,输入 API 调用通常很容易更改,因此可以将加速计输入替换为键击操作。
但是,可能需要重新校准输入或甚至改变游戏的难度来适应不同的输入方法。倾斜设备比按键更慢并在总体上更加费劲,还可能导致更难以将注意力集中在显示屏上。这可能造成在移动设备上更难以掌控游戏,因此可能适合减慢游戏速度或为每个关卡提供更多时间。这就需要设计游戏代码来调整这些因素。
移动设备显然具有比桌面设备更少的存储、内存和 CPU 性能,因此游戏可能由于其性能在低功耗硬件上处于不可接受的水平而难以移植。如果在桌面设备上将硬件的性能发挥到极致,那么这样的游戏可能不适合移植到移动平台。
视频、音频和纹理会占用大量存储空间。如果您想移植游戏,您需要有效地管理存储。存储空间(通常也对应于下载时间)在桌面设备上通常不是问题,但在移动设备上会受到限制。移动平台应用商店通常会对提交的产品的最大大小施加限制。在游戏开发过程中,可能需要制定一些计划来解决这些问题。
例如,可能需要为移动设备提供资源的简化版本来节省空间。另一种可能性是可能需要设计游戏,从而实现大型资源的按需下载,而不是将其作为应用程序初始下载的一部分。
Unity 自动进行处理从“消亡”的对象回收未使用的内存 ,通常在桌面设备上不知不觉地发生。但是,移动设备上较低的内存和 CPU 性能意味着垃圾收集可能需要更加频繁,并且这些过程占用的时间可能会影响性能(导致游戏中出现不必要的暂停等)。即使游戏在可用内存中运行,仍可能需要优化代码来避免垃圾收集暂停。
For more information, see the memory management page.
在桌面设备上运行良好的游戏可能会因移动设备的帧率不佳而受到影响,因为移动 CPU 难以处理游戏的复杂性。当项目移植到移动平台时,需要特别注意代码效率。