我正試圖將 Ui 物件的螢屏空間位置轉換為我所稱的 "顯示幕空間"。
據我所知,在 Unity 中,螢屏空間是相對于應用程式的視窗而言的。也就是說,即使應用程式不是全屏,并在您的顯示幕上移動,0,0仍將是應用程式視窗的左下方。
我需要將這些螢屏空間值之一轉換為用戶顯示幕中的實際位置。當考慮到用戶可能擁有多個顯示幕時,這一點尤其重要。
盡管如此,我并沒有找到任何可以完成這一任務的方法。
我希望能夠找到一個與平臺無關的解決方案,但如果它必須僅適用于 Windows,我也可以讓它發揮作用。
如果您在這方面有任何幫助,我們將不勝感激
。謝謝你
uj5u.com熱心網友回復:
首先,對不起,我剛剛回來,能夠打出一個答案。
根據我的發現,這個解決方案在編輯器中不起作用,并且在帶視網膜顯示幕的Mac上產生奇怪的結果。在編輯器中,Screen和Display的空間看起來是完全一樣的。可能有一個解決方案來解決這個問題,但我沒有研究具體細節。至于Mac,不管什么原因,輸出的內部解析度總是實際解析度的一半。我不確定這是否只是Unity的視網膜顯示錯誤,還是Mac的一般錯誤。我在Windows電腦和帶視網膜顯示幕的Mac上都測驗并運行了這個測驗腳本。我還沒有在任何移動平臺上測驗它。
我不知道你想通過你希望找到的值實作什么,所以我設定了一個演示場景來顯示這些值,而不是使用它們。
這里是演示腳本:
using UnityEngine;
using System.Collections.Generic;
public class TestScript : MonoBehaviour
{
[SerializeField] private RectTransform rect = null;
[SerializeField] private List< Text> text = new List<Text> ();
[SerializeField] private Canvas parentCanvas = null;
[SerializeField] private Camera mainCam = null;
private void Start()
{
//確定我們的UI物件的畫布模式。
if (parentCanvas == null)
parentCanvas = GetComponentInParent<Canvas>()。
//只有在相機空間畫布的情況下才需要一個相機。
if (parentCanvas.renderMode == RenderMode.ScreenSpaceCamera && mainCam == null)
mainCam = Camera.main;
//產生初始資料點。
GenerateData()。
}
// <summary>/span>
// Onclick of our button to test generating data when the object moves
// </summary>
public void GenerateData()
{
//如果畫布是覆寫的,錨定的位置是相對于螢屏空間的--如果不是,它將需要根據我們的相機轉換為螢屏空間。
Vector3 screenPos = parentCanvas.renderMode == RenderMode.ScreenSpaceCamera ? mainCam.WorldToScreenPoint(transform.position) : rect.transform.position。
//我們的物件相對于螢屏的位置。
text[0].text = "螢屏位置。" screenPos;
//我們螢屏的尺寸(當前正在渲染我們的游戲的視窗)。
text[1].text = "螢屏尺寸。" Screen.width " " Screen.height;
//找到我們的寬度/高度相對于螢屏空間尺寸的標準化。
float x = Mathf.Clamp01(screenPos.x / Screen.width)。
float y = Mathf.Clamp01(screenPos.y / Screen.height)。
//我們規范化的螢屏位置。
text[2].text = "normalized Screen Pos: " x " " y;
//抓取主渲染器的尺寸--我們的游戲在當前顯示幕上進行渲染。
#if UNITY_STANDALONE_OSX
text[3].text = "顯示尺寸。" (Display.main.systemWidth * 2f) " " (Display.main.systemHeight * 2f) 。
//現在找到我們的UI物件的坐標,從螢屏空間的標準化坐標轉錄到我們的顯示幕/解析度坐標。
text[4].text = "顯示相對位置。" (Display.main.systemWidth * x * 2f) " " (Display.main.systemHeight * y * 2f)。
#else
text[3].text = "顯示尺寸。" Display.main.systemWidth " " Display.main.systemHeight。
//現在找到我們的UI物件的坐標,從螢屏空間的標準化坐標轉錄到我們的顯示幕/解析度坐標。
text[4].text = "顯示相對位置。" (Display.main.systemWidth * x) " " (Display.main.systemHeight * y) 。
#endif。
}
// <summary>
// 只是為了除錯 - 可以洗掉。
// </summary>
private void Update()
{
if (Input.GetKey(KeyCode.A))
{
rect.anchoredPosition = new Vector2(-10f, 0f) 。
}
if (Input.GetKey(KeyCode.W))
{
rect.anchoredPosition = new Vector2(0f, 10f) 。
}
if (Input.GetKey(KeyCode.S))
{
rect.anchoredPosition = new Vector2(0f, -10f) 。
}
if (Input.GetKey(KeyCode.D))
{
rect.anchoredPosition = new Vector2(10f, 0f) 。
}
}
我考慮了父畫布是Overlay還是Camera模式,并在OSX構建中加入了一個檢查,以調整為適當的螢屏尺寸。
這是一張在OSX上構建的gif圖。我將視窗設定為1680x1050,而我的電腦當前的解析度為2880x1800。我也曾在Windows上測驗過,但沒有記錄下來,因為這個例子看起來幾乎是一樣的。

如果你有更多關于實作的問題,或者在其他我沒有測驗的平臺上有問題,請告訴我。
編輯:我剛剛意識到你想要相對于顯示幕空間的螢屏空間坐標。我將在稍后更正該片段 - 現在正在開會。
編輯2:在多看了幾眼之后,如果不將視窗置于中心位置或獲得獨立視窗的位置,就不容易獲得準確的坐標。我相信在沒有 dll 的情況下,沒有一個簡單的方法來獲得這些資訊,所以這里有一個
注意:雖然Unity螢屏空間在正常顯示像素中是0,0在左下方,但0,0實際上是相當左上方。所以你可能需要反轉這些。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/329082.html
標籤:
