如何使用不同的屏幕分辨率

时间:2014-01-26 20:55:27

标签: android ios unity3d screen-resolution

我正在使用Unity 4.3.3进行游戏。我正在为Android和iOS设备制作游戏。由于我对团结很新,我似乎找不到使用不同屏幕分辨率的方法。 我正在使用c#作为我的脚本。

我想让我的游戏全屏运行。我已经在iPad 2上进行了测试,它运行得很完美,但对于iPhone 4来说,两侧都是剪裁的,对于iPhone 5,它们的剪裁效果更好。解决办法是什么?我应该在播放器设置>下选择哪个选项? iOS>其他设置>目标解决方案?

11 个答案:

答案 0 :(得分:38)

unity更改其游戏相机以匹配其使用的屏幕宽高比的尺寸。显然这并不总是需要,所以有几种方法:

1)第一种方法很容易实现,尽管很少看起来很好。您只需更改相机的纵横比即可与您设计的游戏相匹配。因此,如果您以4:3设计游戏,则可以执行以下操作:

Camera.aspect = 4f/3f;

请记住,这会在不同的宽高比上扭曲游戏。

2)另一种方法稍微复杂一些,但结果看起来要好得多。如果您使用的是正交相机,请记住一件重要的事情是,无论使用何种屏幕分辨率,正交相机都会将高度保持在设定值并仅更改宽度。例如,使用尺寸为10的正交相机,高度将设置为2.考虑到这一点,您需要做的是补偿每个级别内最宽的相机(例如,具有更宽的背景)或动态更改相机的正交尺寸,直到其宽度与您创建的相符。

GUI组件更容易实现,只需将其位置设置为依赖于所需的屏幕分辨率即可。例如,如果您想要在右上角显示按钮,则只需将其位置设置为position = new Vector2(Screen.width - 50, 50);

编辑:既然你提到了你使用的设备,我做了一些查找,找到每个人使用的宽高比:Ipad2 = 4:3,Iphone4 = 3:2,Iphone5 = 16:9

既然你说它在Ipad2上看起来很完美,我猜你已经设计了你的游戏使用4:3的宽高比,所以你提到的“剪裁”只是你的正交相机已经扩大了。解决方案是使用我上面描述的两种方法之一。

您可以非常轻松地看到它在Unity编辑器中的每个设备上的外观。如果你进入游戏选项卡(在统一编辑器中按下播放时弹出的内容),你会看到它有一个设备名称,以及分辨率和宽高比。更改此项将让您了解在不同宽高比下的效果。

答案 1 :(得分:4)

您可能希望尝试使用Camera.ScreenWidth和Camera.ScreenHeight捕获设备分辨率。

然后做一些数学计算与你的分辨率的差异,并将其应用于父对象。

这将扩大/更小的所有内容以适应设备分辨率,而不会为不同的分辨率设备提供多种图像分辨率等。

答案 2 :(得分:2)

如果你的目标是获得前一个宽度:

[RequireComponent(typeof(Camera))]
public class ResizeCamera : MonoBehaviour 
{
    private float   DesignOrthographicSize;
    private float   DesignAspect;
    private float   DesignWidth;

    public  float   DesignAspectHeight;
    public  float   DesignAspectWidth;

    public void Awake()
    {
        this.DesignOrthographicSize = this.camera.orthographicSize;
        this.DesignAspect = this.DesignAspectHeight / this.DesignAspectWidth;
        this.DesignWidth = this.DesignOrthographicSize * this.DesignAspect;

        this.Resize();
    }

    public void Resize()
    {       
        float wantedSize = this.DesignWidth / this.camera.aspect;
        this.camera.orthographicSize = Mathf.Max(wantedSize, 
            this.DesignOrthographicSize);
    }
}

答案 3 :(得分:2)

您需要根据设备的宽高比更改摄像机视口。 假设你制作了720x1080的游戏

然后在脚本中你应该做

float xFactor = Screen.width / 720f;
float yFactor = Screen.height  / 1080f;

Camera.main.rect = new Rect(0,0,1,xFactor/yFactor);

另一种方式是,如果你正在制作长宽比为9:16的游戏,那么

在您的脚本中执行此操作,

public float targetRatio = 9f/16f; //The aspect ratio of your game
void Start()
{
    Camera cam = GetComponent<Camera>();
    cam.aspect = targetRatio;
}

答案 4 :(得分:1)

我解决这个问题最简单的方法就像史蒂文所指出的那样,迫使我的透视相机长宽比与我开发的相比。当然,如果我开发的纵横比与设备不同,这会使某些对象变形。对于UI对象,如果您使用内置,我会根据屏幕大小的百分比创建矩形

Rect(0.5 * Screen.width, 0.5 * Screen.height, 0.25 * Screen.width, 0.25 * Screen.height) 

这会将左上角置于屏幕的中心,并创建一个高度为1/4且屏幕宽度为1/4的矩形。我正在使用NGUI 2.7进行用户界面,到目前为止我还没有看到任何不同宽高比的问题,并且使用正交相机来渲染UI

答案 5 :(得分:1)

我知道这是一个旧帖子,但人们可能最终仍在寻找答案。

要将透视摄影机调整为不同的屏幕宽高比,其行为与Unity默认值不同,您需要一些三角函数。所有必要的信息都在这里:https://en.wikipedia.org/wiki/Angle_of_view

如果您想要一个简单的方法,这里有一个适用于所有相机类型的解决方案:http://u3d.as/oUX

答案 6 :(得分:1)

好的,这是个大问题。许多人提到强制纵横比,这是一个很好的解决方案。然而,对于许多游戏来说这是不合适的。对于许多游戏设计,您希望游戏感觉它是运行的设备/屏幕的原生,并且您希望使用每平方英寸的屏幕空间。要做到这一点,您必须为游戏中的每个系统构建和测试不同大小和形状的屏幕。对于为多个设备构建应用程序和网站,这是一个非常类似的问题。

屏幕尺寸

可以使用DPIresolution以编程方式检索屏幕尺寸,例如:

Resolution res = Screen.currentResolution;
float screenSquareInches = res.width * res.height / Screen.dpi;

对于通过相机查看的屏幕上的内容,只有一个变量需要缩放,这就是相机的大小(或游戏世界中将被挤到屏幕上的多少东西) 。您可以使用the field of view进行3D游戏或使用orthographic size进行2D游戏来控制相机的尺寸。只有测试才会说明哪种方程支持最广泛的屏幕尺寸,但这些方面的内容可以很好地发挥作用:

// this should be a tweakable number, so you can fine tune it to your needs. It represents the screen size at which the camera size should not be scaled at all
float expectedScreenArea = 20;
// this number should also be tweakable, which declares how much smaller/larger text can get depending on the screen size. Generally larger screens are viewed from farther away, so scaling should be slight
float cameraScalingRate = 0.25f;
// multiply this number by the default/base camera size you have picked, whether that's field of view or orthographic size
float cameraSizeMultiplier = 1 + (screenSquareInches / expectedScreenArea - 1) * cameraScalingRate;

好的,这应该可以让你在游戏世界的大部分扩展方面,但是UI元素,文本,HUD和屏幕控制等内容呢?好吧,对于像文本这样的元素,上面的等式应该可以很好地工作,尽管你可能想要一个不同的缩放率值。对于屏幕控制,您可能需要更完整的转换,例如操纵杆移动到平板电脑屏幕的底角而不是侧面居中,或者如果它不是触摸屏设备,则完全删除屏幕控制。这超出了这个问题的范围。

屏幕宽高比

屏幕的宽高比(宽度与高度相比)也很重要,需要自己处理。通常,最好的方法是冻结屏幕的垂直高度,以便随着屏幕变宽,屏幕上的元素不会缩放,但随着屏幕变高,屏幕上的元素按比例缩放到多高屏幕增长。这已经是相机的默认行为,但对于UI元素,您必须将其设置为相同。如果您使用带有canvas的新UI系统,这相对容易。在CanvasScalar组件上,a property控制元素的缩放方式,具体取决于宽高比。将其更改为匹配宽度或高度,并使其与高度匹配。

进一步考虑

支持不同的屏幕尺寸和形状,需要考虑的不仅仅是让一切都合适。你还需要确保你的游戏在不同的屏幕上运行良好。这包括微妙的事情,如不使玩家在小屏幕上感到幽闭恐惧症,以确保敌人无法向玩家射击,如果他们在屏幕外,以确保更新屏幕上保持元素的边界。 如果这是PC游戏,另一件需要考虑的事情是,有人可能会将计算机插入不同的屏幕或动态更改分辨率。考虑到这一点,可以根据需要重新运行上述方程式,这样玩家就不必退出游戏以使事情再次正确排列。

答案 7 :(得分:0)

如果您正在开发2D游戏,那就是您的相机处于正交视图中,只需执行以下代码并将其附加到您的游戏对象即可。它将使用屏幕分辨率缩放游戏对象(在本例中为精灵)。

void Resize()
{
    SpriteRenderer sr=GetComponent<SpriteRenderer>();
    if(sr==null) return;

    transform.localScale=new Vector3(1,1,1);

    float width=sr.sprite.bounds.size.x;
    float height=sr.sprite.bounds.size.y;


    float worldScreenHeight=Camera.main.orthographicSize*2f;
    float worldScreenWidth=worldScreenHeight/Screen.height*Screen.width;

    Vector3 xWidth = transform.localScale;
    xWidth.x=worldScreenWidth / width;
    transform.localScale=xWidth;

    Vector3 yHeight = transform.localScale;
    yHeight.y=worldScreenHeight / height;
    transform.localScale=yHeight;

}

答案 8 :(得分:0)

资产商店有关于此问题的免费资产......只需查看...

http://u3d.as/content/palash-bhowmick/fit-all-screen-size/9q9

如果更改了对象的形状,则删除以以下内容开头的行: -

transform.localScale.x =

答案 9 :(得分:0)

Unity Unity非常容易,因为Unity3D拥有自己的UI系统。对于3D Unity使用屏幕尺寸自动调整相机。 实际上UI出现问题,而且有点棘手。首先尝试确定哪些元素需要根据屏幕大小更改位置和大小。 例如,如果您的按钮恰好位于屏幕中央。然后根据屏幕不需要改变位置。它将保持在中心位置。

现在让我们看一下在屏幕一角有一个按钮的场景,就像我们在右上角或左上角看到暂停按钮一样。现在,您必须相应地将按钮固定在角落中。游戏运行的屏幕大小无关紧要,暂停按钮应该坚持到角落。

现在让我们再举一个菜单中有背景的案例。现在你将不得不为这个BG精灵应用拉伸。此BG将相应地拉伸和收缩,但其上的所有项目都将具有固定大小。 为此,建议将BG平放,以便相同的BG可以在16:10或4:3时具有良好的质量 (全部关于Unity Native UI)

答案 10 :(得分:0)

如果您别无选择您还可以做更多的工作,并为您的相机添加一个特殊的脚本:

  1. 检查设备的屏幕分辨率
  2. 设置
  3. 的目标分辨率
  4. 并设置(重要)
  5. 的目标宽高比

    您需要做的只是编写一个基本功能来检查屏幕分辨率(您想要的设备的宽度和高度),然后添加一些功能来设置正确的屏幕分辨率和宽高比!