Unity - 如何在画布中停止移动的UI组件?

时间:2017-06-16 17:37:09

标签: c# user-interface unity3d canvas

我有六个面板,显示了播放器的当前效果。只有当玩家具有活动效果(已编码)时才会出现它们。我想给面板带来一些美学效果,它们应该从左侧看起来非常快,并且当它们强行进入画布时应该停止移动(不完全是,左侧的一些应该保持在外面,所以看起来好一点)。我已经对机芯进行了编码,但我不知道如何阻止面板移动。

//The effect bar system gets activated
effectbar.SetActive(true);

//The movement vector
Vector3 movePanel = new Vector3(100, 0, 0);

for (int i = 0; i < effectCount; i++)
{
    effectbar.gameObject.transform.GetChild(i).gameObject.SetActive(true);
    effectbar.gameObject.transform.GetChild(i).transform.Translate(movePanel * Time.deltaTime * 3f);
    activeCount++;
}

我应该创建一个空的UI组件并像墙一样使用它,或者使用计时器并在规定的时间后停止它,还是有更好的方法?谢谢你的转发。 Panels should move until they completed entering the screen (a bit of the left side should stay outside)

2 个答案:

答案 0 :(得分:0)

您可以使用Vector3.Lerp(start, end, time)功能。

以下是一个示例类:

public class MoveObjectTowards : MonoBehaviour
{
    public Transform TargetTransform;
    public float Speed;

    private void Update ()
    {
        if (!IsAtTarget())
        {
            MoveTowardsTarget();
        }
    }

    private void MoveTowardsTarget()
    {
        gameObject.transform.position = Vector3.Lerp(gameObject.transform.position, TargetTransform.position,
            Speed * Time.deltaTime);
    }

    private bool IsAtTarget()
    {
        return gameObject.transform.position == TargetTransform.position;
    }
}

你应该将它附加到你的effectBar gameObject并在检查器中设置valeus,之后它应该可以工作。你还必须创建一些作为“墙”的对象。并将其分配给public Transform TargetTransform

答案 1 :(得分:0)

所以我编写了以下代码:

<Route component={Home} exact path="/" />
<Route component={ChannelScreen} path="/channel/:channelId" />

发生以下情况:小组不会移动。我编码错了吗?

编辑:我想这是因为我没有使用float startTime = Time.time; float speed = 1f; float distanceDone = (Time.time - startTime) * speed; Vector3 panelStart = new Vector3(effectbar.gameObject.transform.GetChild(i).gameObject.transform.position.x, effectbar.gameObject.transform.GetChild(i).gameObject.transform.position.y); Vector3 panelMovement = new Vector3(effectbar.gameObject.transform.GetChild(i).gameObject.transform.position.x+140,effectbar.gameObject.transform.GetChild(i).gameObject.transform.position.y); Vector3 panelStop = new Vector3(panelMovement.x, effectbar.gameObject.transform.GetChild(i).gameObject.transform.position.y); effectbar.gameObject.transform.GetChild(i).gameObject.transform.position = Vector3.Lerp(panelStart, panelStop, distanceDone / Vector3.Distance(panelStart,panelMovement)); 代替Transform,对吗?