基于移动设备屏幕缩放统一游戏屏幕

时间:2019-09-16 14:50:49

标签: c# unity3d game-development

我的游戏采用2D横向格式,我想根据移动设备屏幕缩放游戏屏幕尺寸。我尝试了不同的代码,但无济于事。这是我尝试的第一个脚本

[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]

public class MatchWidth : MonoBehaviour 
{
    public float sceneWidth = 25;

    Camera _camera;
    void Start() 
    {
        _camera = GetComponent<Camera>();
    }

    void Update() 
    {
        float unitsPerPixel = sceneWidth / Screen.width;

        float desiredHalfHeight = 0.5f * unitsPerPixel * Screen.height;

        camera.orthographicSize = desiredHalfHeight;
    }
}

和我尝试过的其他脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ChangeScreenSizeBasedonDevice : MonoBehaviour
{
    // Use this for initialization
    public float screenHeight = 1920f;
    public float screenWidth = 1080f;
    public float targetAspect = 9f / 16f;
    public float orthographicSize;
    private Camera mainCamera;


    void Start()
    {

        mainCamera = Camera.main;
        orthographicSize = mainCamera.orthographicSize;

        float orthoWidth = orthographicSize / screenHeight * screenWidth;
        orthoWidth = orthoWidth / (targetAspect / mainCamera.aspect);
        Camera.main.orthographicSize = (orthoWidth / Screen.width * Screen.height);
    }
}

第一个在高度上存在问题,它的顶部和底部都有空间,第二个则放大太多。有人可以指出我哪里出错了,或者谁拥有更好的代码。我将两个脚本都放在了主摄像机上

更新 我也尝试过Saif在此链接https://gamedev.stackexchange.com/questions/79546/how-do-you-handle-aspect-ratio-differences-with-unity-2d中说,但结果仍然与脚本1相同。这是图片:

enter image description here

我需要删除顶部或底部的空间或边距

更新2

使用此解决利润问题

void Start()
{
    float screenWidth = GameManager.Instance.getScreenWidth();
    float screenHeight = GameManager.Instance.getScreenHeight();

    if (gameObject.name == "Cube")
    {
        transform.localScale = new Vector3(screenWidth / 4, screenHeight, -1);
        transform.position = new Vector3(transform.position.x, 0, transform.position.z);
    }
}

附加到游戏对象上以适合屏幕

1 个答案:

答案 0 :(得分:0)

您的相机的投影可能是正交的。我会给你一个简单的解决方案。

using UnityEngine;

public class ScreenManager : MonoBehaviour
{
    static public ScreenManager SM { get; set; }

    private void Awake()
    {
        SM = this;
    }

    public float getScreenHeight()
    {
        return Camera.main.orthographicSize * 2.0f;

    }
    public float getScreenWidth()
    {
        return getScreenHeight() * Screen.width / Screen.height;
    }

}

将此脚本放入游戏对象后,您可以在任何地方调用这两个函数。

Example

例如;

让我们说一个游戏对象要是屏幕高度的一半,并放置在屏幕的左中角。 (然后将其宽度设置为4 /屏幕宽度大小)

public GameObject AnObject;



 void Start()
    {
      AnObject.transform.localScale = new Vector2(ScreenManager.SM.getScreenWidth()/4,
 ScreenManager.SM.getScreenHeight() / 2);

     AnObject.transform.position = new vector2(-ScreenManager.SM.getScreenWidth()/2,0);
    }

注意:如果要使缩放完美工作,则必须在导入设置中正确设置每单位图像像素。例如,如果图像为1024x1024,则要将该图像的每像素像素设置为1024。

Example2