【问题标题】:Unity UI RectTransform position does not make sense to meUnity UI RectTransform 位置对我来说没有意义
【发布时间】:2015-05-07 12:01:20
【问题描述】:

所以,我在统一中使用 C# 来使用 Unity UI 放置一些对象,并且我有一个对象在脚本中的位置与其在场景中的位置不同。我在函数中有以下代码:

using UnityEngine;
using System.Collections;

public class SeedChecker : MonoBehaviour {

    Vector3 lockedPos;
    RectTransform tran;

    // Use this for initialization
    void Awake () {
        tran = GetComponent<RectTransform>();
    }

    public void LockPos(Vector3 pos) {
        tran.localPosition = pos;
        lockedPos = pos;
        print (tran.localPosition);
    }

}

例如,这段代码打印出它的 x 位置是 -60——这是我正在寻找的正确数字——屏幕中间左侧 60 像素。但是,当我在检查器和场景中查看时,x 位置是 0——并且对象正好位于屏幕中间。这导致了一个相当令人沮丧的情况,我也有talked about here。这很令人沮丧,因为它说它得到了正确的位置,但是当我将这个正确的位置分配给对象时,它会转到我认为不正确的位置。这是对 RectTransforms 中局部位置如何工作的误解吗?我的对象是几个对象的子对象,但所有对象都归零到屏幕的中心,并且比例值为“1”。

【问题讨论】:

  • 这个代码工作正常,我试了一下,我得到了我发送的 Lockpos。你用锚连接了画布吗?

标签: c# user-interface unity3d transform


【解决方案1】:

据我所知,您应该使用anchoredPosition。有关可能的属性,请参阅文档: http://docs.unity3d.com/ScriptReference/RectTransform.html

我尽量远离继承的,因为如果您不完全了解 RectTransform 的工作原理,它们会产生意想不到的结果。

【讨论】:

  • 我发现了问题!我正在使用锚定位置,但仍然有问题。不过好主意!
【解决方案2】:

解决了!事实证明,我的 RectTransform 表现得很奇怪,因为我将它们存储在我编写的一个类中,以保持它们的组织性,称为 EventRow。事件行甚至没有从 MonoBehavior 继承,但是将 RectTransforms 存储在该对象内的 System.Collections.Generic 列表中会导致它们的位置异常。因此,当我开始将它们存储为其他 Rect 变换的子对象时,而不是在我的 EventRow 类中跟踪它们,它工作得很好!奇怪,不是吗?你见过这样的事情吗?我的 EventRow 类的最初目的是让我拥有一个事件列表列表——一个事件网格。我的猜测是 RectTransform 不喜欢成为这种列表的列表,并且它以某种方式关心它是否在集合中。算了!

【讨论】:

    猜你喜欢
    • 2017-10-26
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多