我正在制作关于向对方发射物体的2D游戏 . 它几乎完成了 . 但是,当我在不同的设备上运行时,由于屏幕尺寸不同,某些游戏对象的偏移量会混乱 . 在Unity编辑器中,我使用的是自由纵横视图,并且我已经创建了我的游戏对象,因此在相机尺寸为80的情况下,它们都完美对齐 . 我认为这里的问题是屏幕分辨率会影响显示屏,因为我使用固定数量的Unity单元来定位我的游戏对象,所以当我在独立游戏上运行游戏时,它们显得非常奇怪 . 我写了一个像素完美的相机脚本,但它似乎没有帮助 . 相机是像素完美的,然而,为了补偿,相机尺寸变成非常小或非常大的东西 . 我只想在所有设备和屏幕分辨率上看到相同的外观 . 这里的一个主要问题是我希望我的GUI元素显示在玩家所在的位置旁边 . 我的剧本在这里 .

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class HoldTimeMultiplierPlayerFollowController : MonoBehaviour {

    public float textYOffset = 50f;

    public Text holdTimeMultiplierDisplay;

    void Update() {
        Vector3 position = Camera.main.WorldToScreenPoint(transform.position);
        holdTimeMultiplierDisplay.gameObject.transform.position = new Vector3(position.x, position.y + textYOffset, position.z);
    }

}

有人有任何想法吗?

顺便说一句,

我所有的艺术都是32x32 . 像素与单位之比始终为1比1.编辑器中的相机尺寸为81.92,当我使用686x269的自由宽高比时 . 在这些测量中,一切都完美显示 .

任何帮助表示赞赏 . 也许是一个脚本,或者关于如何实现它的建议?

其他脚本(如果您发现任何需要解决的问题或可以添加的改进,请告诉我):

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class PlayerMovementController : MonoBehaviour {

private int holdTimeMultiplier = 0;
public int maxHoldTimeMultiplier = 215;

public Text holdTimeMultiplierDisplayText;
private Rigidbody2D rbody;

void Awake() {
    rbody = GetComponent<Rigidbody2D>();

    if(rbody == null) {
        Debug.LogError ("No Rigidbody2D detected on player.");
    }
}

void Update() {
    Vector2 mousePosition = new Vector2(Camera.main.ScreenToWorldPoint(Input.mousePosition).x, 
                                        Camera.main.ScreenToWorldPoint(Input.mousePosition).y);
    Vector2 mouseDirectionFromPlayer = mousePosition - new Vector2(transform.position.x, transform.position.y);

    if(Input.GetMouseButton(0)) {
        if(holdTimeMultiplier < maxHoldTimeMultiplier) {
            holdTimeMultiplier ++;
        } else {
            holdTimeMultiplier = 0;
        }
    } else {
        if(holdTimeMultiplier != 0) {
            rbody.AddForce(mouseDirectionFromPlayer * holdTimeMultiplier * 200);
            holdTimeMultiplier = 0;
        }
    }
    holdTimeMultiplierDisplayText.text = holdTimeMultiplier.ToString();
}

}

...

using UnityEngine;
using System.Collections;

public class SpawnNewObject : MonoBehaviour {

public GameObject[] UseableObjects;

public Transform SpawnPoint;

void Update() {
    if(Input.GetKeyDown(KeyCode.N)) {
        var randomObject = Random.Range(0,UseableObjects.Length);
        GameObject UseableObject;
        UseableObject = Instantiate(UseableObjects[randomObject], SpawnPoint.position, SpawnPoint.rotation) as GameObject;
    }
}

}