各种设备上的屏幕尺寸/比率灾难

本文关键字:比率 屏幕 | 更新日期: 2023-09-27 18:36:01

我从一两个月前就开始用Unity3D制作游戏了。我已经为Android制作了我的第一个游戏,它在我的手机(三星Galaxy S6)和模拟器(Genymotion与不同的虚拟设备)上运行良好,但是当我在我父亲的手机上尝试它时(Nexus 5,Xperia Z1和Z3)我意识到它工作不好。

游戏是一款2D汽车交通赛车游戏,所以你必须躲避生成者在X轴的随机位置上创建的所有汽车。我对Unity3d了解不多,所以我不能更好地解释它,对不起... :(

问题是,在我的手机上,敌方汽车从

上到下正确生成,但在我父亲的手机上,敌方汽车从场景中间到底部生成。另一个问题是,当你把车向右或向左移动时,它看起来像是对角线切割的。

这是敌人生成器的代码:

public class SpawnerEnemigos : MonoBehaviour {
public GameObject[] cochesEnemigos;
int cocheEnemigoID;
public float maxPos = 2f;
public float delayTimer = 0.5f;
private float timer;
// Use this for initialization
void Start () {
    timer = delayTimer;
}
// Update is called once per frame
void Update () {
    timer -= Time.deltaTime;
    if (timer <= 0) {
        Vector2 enemigoRandomPos = new Vector2 (Random.Range(-maxPos, maxPos), transform.position.y);
        cocheEnemigoID = Random.Range(0,7);
        Instantiate (cochesEnemigos[cocheEnemigoID], enemigoRandomPos, transform.rotation);
        timer = delayTimer;
    }
}

}

各种设备上的屏幕尺寸/比率灾难

问题是,在我的手机上,敌方汽车从

上到下正确生成,但在我父亲的手机上,敌方汽车从屏幕中间到底部生成。

正如 Joe 所提到的,这可能是由于视口差异造成的。拥有不同纵横比的设备,汽车的生成点可能会根据屏幕而变化。

以下是有关如何使用视口计算对象将在世界中生成的位置的文档:Camera.ViewportToWorldPoint

// This is the part that we will be replacing.
Vector2 enemigoRandomPos = new Vector2 (Random.Range(-maxPos, maxPos), transform.position.y);

以下是我根据您提供的代码进行操作的方法:

// Set the offset of the X axis first. This should be fairly similar for most devices,
// if you find issues with it apply the same logic as the Y axis.
var x = Random.Range(-maxPos, maxPos);
// Here is where the magic happens, ViewportToWorldPoint converts a number between 0 and 1 to
// an in-world number based on what the camera sees. In this specific situation I am telling it: to use 0f, 1f
// which roughly translates to "At the top of the screen, on the left corner". Then storing the Y value of the call.
var y = Camera.main.ViewportToWorldPoint(new Vector2(0f, 1f)).y;
// Now that we have the x and y values, we can simply create the enemigoRandomPos based on them.
var enemigoRandomPos = new Vector2(x, y);

您当然可以删除我的所有评论并内联整个内容:

var enemigoRandomPos = new Vector2(Random.Range(-maxPos, maxPos), Camera.main.ViewportToWorldPoint(new Vector2(0f, 1f)).y);

要记住的几件事:

  • Camera.main 可能没有定义,您需要找到相机的实例(这超出了这个问题的范围,所以我会让你谷歌一下,如果你有问题让我知道,我很乐意提供更多信息)
  • X位置在某些纵横比下可能会变得奇怪,所以我建议您考虑也使用视口计算
  • 将这些
  • 值(Y 和相机)存储在 Start 方法上,并且仅在纵横比更改或相机更改时才更改它们会更有效。这将对旧设备上的性能有所帮助。更多的家庭作业研究。:)
  • 在对此类问题进行故障排除时,使用显示问题的静态精灵(即不移动的事物)可能会有所帮助。我会在各个角落+屏幕中央生成大约9个精灵,以查看汽车将从哪里生成,作为调试过程中的视觉辅助。
  • 此外,在
  • 提出本质上是图形性质的问题时提供屏幕截图可以在人们试图为您提供反馈时有很大帮助,请考虑在下次添加一些:D

另一个问题是,当你把车向右或向左移动时,它看起来像是对角线切割的。

基于此描述,听起来像是汽车精灵和背景精灵的三角形的某种剪切问题。我建议根据相机的位置来回移动背景,以避免上述剪切。