大多数 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 调用包装在一个类中会将它们放入单个源文件中,并使调用易于查找和替换。您应该根据游戏中输入的逻辑含义来设计输入函数。这有助于将游戏代码的其余部分与特定平台使用的特定输入方法隔离开来。
例如,您可以修改上面的 Gears 函数,以便实际输入来自移动设备屏幕上的触摸。您可以使用整数来表示选定的齿轮,该齿轮适用于所有平台,但如果您将平台特定的 API 调用与代码的其余部分混合,则可能会出现问题。您还可以使用平台相关的编译将输入函数的不同实现组合在同一个源文件中,并避免手动交换。
Input.GetMouseButtonXXX 函数旨在对移动设备具有明显的解释。屏幕将简单的触摸报告为左键单击,Input.mousePosition 属性给出触摸的位置,只要手指触摸屏幕即可。具有简单鼠标交互的游戏通常可以在台式机和移动平台之间透明地工作。
转换通常比这复杂得多。例如,台式机游戏可以使用多个鼠标按钮,而移动游戏可以同时检测屏幕上的多个触摸。为了帮助管理这一点,您可以使用逻辑值表示输入,然后由游戏代码的其余部分使用。
例如,您可能用台式机上的 +/- 键击替换移动设备上的捏合手势来缩放;输入函数可以返回一个浮点值,该值指定缩放因子。同样,在移动设备上使用两指轻敲来替换台式机上的右键单击可能是可能的。但是,如果输入设备的属性是游戏的组成部分,那么可能无法在不同的平台上对其进行重新建模。这意味着您可能无法移植游戏,或者您需要对输入或游戏玩法进行大量修改。
这些输入源自手持设备的移动性,因此在台式机上可能没有任何有意义的等效项。但是,某些用例只是镜像标准游戏控件,并且可以轻松移植。例如,赛车游戏可能会实现来自移动设备倾斜的转向控制(由加速度计确定)。在这种情况下,输入 API 调用通常很容易更改,因此您可以将加速度计输入替换为键击。
但是,可能需要重新校准输入或更改游戏难度以适应不同的输入方法。倾斜设备比按下按键慢且费力,这使得更难集中在显示屏上。这可能会使游戏在移动设备上更难掌握,因此可能适当地放慢游戏速度或每个关卡允许更多时间。这需要设计游戏代码来调整这些因素。
与台式机相比,移动设备的存储空间、内存和 CPU 能力更低,因此游戏可能难以移植,仅仅是因为它的性能在低功耗硬件上不可接受。如果您正在挑战台式机硬件的极限,那么该游戏可能不适合移植到移动平台。
视频、音频和纹理可能会占用大量存储空间。如果您想移植游戏,则需要有效地管理存储空间。存储空间(通常也对应于下载时间)在台式机上通常不是问题,但在移动设备上可能有限。移动应用商店通常会对提交产品的最大尺寸设置限制。在游戏开发过程中可能需要进行一些规划来解决这些问题。
例如,您可能需要为移动设备提供资产的缩减版本以节省空间。另一种可能性是,游戏可能需要设计为按需下载大型资产,而不是作为应用程序初始下载的一部分。
Unity 自动处理从“已死”对象中恢复未使用的内存,并且在台式机上通常不会被注意到。但是,移动设备上的内存和 CPU 能力较低意味着垃圾回收可能更频繁,从而影响性能并导致游戏玩法出现意外暂停。即使游戏在可用内存中运行,也可能需要优化代码以避免垃圾回收暂停。
有关更多信息,请参阅内存管理页面。
在台式机上运行良好的游戏在移动设备上可能会遇到帧速率低的问题,因为移动 CPU 难以处理游戏的复杂性。当项目移植到移动平台时,请注意代码效率。