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