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

问题描述 投票:50回答:11

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

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

android ios unity3d screen-resolution
11个回答
39
投票

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

1)第一种方法很容易实现,尽管很少看起来很好。您只需更改相机的纵横比即可与您设计的游戏相匹配。所以,如果你以4:3设计游戏,你会做这样的事情:

Camera.aspect = 4f/3f;

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

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

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

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

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

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


0
投票

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

  1. 检查设备的屏幕分辨率
  2. 为此设置目标分辨率
  3. 并设定目标纵横比(重要)

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


0
投票

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

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

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


4
投票

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

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

这将扩大/更小的一切以适应设备分辨率,而不具有针对不同分辨率设备的多个图像分辨率等。


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);
    }
}

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;
}

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


1
投票

我知道这是一个老话题,但人们可能仍然最终寻找答案。

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

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


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游戏,另一件需要考虑的事情是,有人可能会将计算机插入不同的屏幕或动态更改分辨率。考虑到这一点,可以根据需要重新运行上述方程式,这样玩家就不必退出游戏以便再次排队。


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;

}

0
投票

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

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

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

transform.localScale.x =

© www.soinside.com 2019 - 2024. All rights reserved.