使用Camera.WorldToScreenPoint

时间:2015-04-26 23:29:35

标签: unity3d

我有Canvas。 我使用以下代码在场景中的3D对象上方创建了一些Text元素:

Vector3 screenPos = Camera.main.WorldToScreenPoint(this.dices[x, z].transform.position);
screenPos.x -= 25;
screenPos.y += 10;
newScoreItem.GetComponent<RectTransform>().anchoredPosition = screenPos;

在Android上,我的UI元素很小,所以我将周围的Canvas` UI缩放模式设置为&#34;缩放屏幕大小&#34;。

问题是我用上面代码确定的位置与缩放画布的位置不匹配。我的Text元素已缩放,但位置完全错误。

我该如何解决这个问题?

正确定位(在Mac上):

enter image description here

使用Scale with screen size(在Android上)错误定位(在screne的某处):

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以设置一个背景。

将所有内容设置为背景。

// Use this for initialization
void Start()
{
 resizeSprite();
}

void resizeSprite()
{
 SpriteRenderer bgSprite = GetComponent<SpriteRenderer>();
 float screenHeight = Camera.main.orthographicSize * 2;
 float screenWidth = screenHeight / Screen.height * Screen.width;
 transform.localScale = new Vector3(screenWidth / bgSprite.sprite.bounds.size.x,   screenHeight / bgSprite.sprite.bounds.size.y, 1);
}

改变了一切大小以设计分辨率的头像。

答案 1 :(得分:1)

首先检查文本“newScoreItem”的Anchor Min / Max:屏幕上的点0,0位于左下角,因此Anchors Min / Max应为0(左下角)。

第二 - 重要的是你是如何设置屏幕匹配模式的。 如果设置为匹配宽度或高度,则可以使用以下脚本:

    float refWidth = 800f; // reference resolution - width - set in Canvas Scaler 
    float refHeight = 480f; // reference resolution - height - set in Canvas Scaler
    bool matchWidth = true; //true if screen match mode is set to match the width, 
                    //false if is set to match the height
    Vector3 screenPos = Camera.main.WorldToScreenPoint(this.dices[x,y].transform.position);
    if (matchWidth) {
        screenPos.x *= refWidth / Screen.width;
        screenPos.y *= refWidth / Screen.width;
    } else {
        screenPos.x *= refHeight / Screen.height;
        screenPos.y *= refHeight / Screen.height;
    }
    screenPos.x -= 25f;
    screenPos.y += 10f;
    newScoreItem.GetComponent<RectTransform>().anchoredPosition = screenPos;

它对我有用,虽然可能有更容易的方法。