1

我正在尝试移动一个 RectTransform,在单击 UI 对象时触发。当我在 Update、LateUpdate 或 Animation 中设置位置时,RectTransform 会按预期移动。当我尝试设置位置/锚定位置/等时。在 OnClick 回调中,什么都没有发生(当我查询它时变量没有改变)。

我有以下游戏板层次结构:

屏幕空间叠加模式中的画布(全尺寸)

  • 容器:RectTransform 对象
    • MoveObj:带有 RectTransforms 和画布渲染器的游戏对象

布局

容器矩形:

容器矩形

MoveObj 矩形:

移动对象矩形

我正在尝试将 MoveObjs 移动到根画布的中心,同时将容器保持为父级。我试过设置位置、localPosition、anchoredPosition,但它们什么也没做。设置该属性后,当我查询它时,值没有改变。

    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log($"{this.gameObject.name} - OnPointerClick - state:{this._state}");
        (transform as RectTransform).position = offsetMaxTarget; // :(
        (transform as RectTransform).localPosition = offsetMaxTarget; // :(
        (transform as RectTransform).offsetMin = offsetMinTarget; // :(
        (transform as RectTransform).offsetMax = offsetMaxTarget; // :(
        (transform as RectTransform).anchoredPosition = targetPosition; // :(
    }

SetInsetAndSizeFromParentEdge 确实改变了矩形的大小,但根本不移动位置。

(transform as RectTransform).SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, 450.0f, 150.0f);

MoveObj 是从预制件中实例化的:

GameObject newMoveObj = Instantiate(MoveObjPrefab, 
    new Vector3(Container.transform.position.x, Container.transform.position.y, 2), 
    Quaternion.identity, 
    Container.transform);
newMoveObj.transform.localPosition = new Vector3(0, 0, 2);

如果我使用 Animator,并为 anchoredPosition 和 position 属性设置动画,对象会完全按照我的意愿移动。

我在代码中设置的唯一生效的属性是,如果我设置了枢轴,它确实会移动。现在一切都很好,但是我发现的大多数信息都说移动位置至少应该做一些事情,而动画的成功让我认为这是正确的方法。在我发疯之前,为什么在事件处理程序中定位设置不正确,但在更新中有效?

4

1 回答 1

1

我找到了解决方案,虽然我不明白。

动画始终处于空闲状态,没有动作,因为我从未设置触发器。下一个状态确实有运动,改变了位置。我从动画图表中删除了所有状态,现在可以通过所有常规方式设置位置。

我很困惑为什么没有运动的状态仍然会将位置重置为其默认值,但是......继续前进,我猜。

于 2018-01-15T17:51:56.183 回答