【问题标题】:Move a particular sprite to a target position after clicking the button in unity 4.6在统一 4.6 中单击按钮后将特定精灵移动到目标位置
【发布时间】:2015-02-26 20:23:43
【问题描述】:

我刚刚开始团结。我有 4 个图像(精灵)在一个网格中对齐。

只要我触摸到特定的巧克力,它的质地就会发生变化[我为此编写了一个代码]。屏幕上有一个按钮。按下按钮后,我只想移动那些质地已经改变的巧克力。 我知道下面的移动代码,但我不知道如何在这里使用它。

void Update () {
        float step=speed*Time.deltaTime;
        transform.position=Vector3.MoveTowards(transform.position,target.position,step);
    }

我只是不知道要移动纹理已更改的特定精灵。谢谢

【问题讨论】:

    标签: unity3d


    【解决方案1】:

    您想在一段时间内还是立即移动精灵?

    如果超过一段时间,我建议您使用 Lerp。您可以在时间范围内的两个 Vector.3 之间进行 Lerp。更干净,曾经学习过一个非常有用的功能。

    以下代码示例:

    http://docs.unity3d.com/ScriptReference/Vector3.Lerp.html

    http://www.blueraja.com/blog/404/how-to-use-unity-3ds-linear-interpolation-vector3-lerp-correctly

    但是,如果您想立即移动它。这可以使用内置的 localPosition 属性轻松完成,您可以在对象内部或外部设置这些属性。

    在单击时将更改后的精灵Bool moved 属性(创建此属性)设置为 true(如果您使用的是 Unity 4.6 UI 画布,请查看可用于在画布元素中注册鼠标活动的 IClick 接口),然后当您按下按钮,循环遍历包含所有按钮纹理对象的处理程序文件中的 list 并移动那些已移动属性设置为 true 的对象。

    foreach(GameObject chocolate in chocolateList)
    {
        if (chocolate.moved == true)
        {
            gameObject.transform.localPosition.x = Insert your new x position.
            gameObject.transform.localPosition.y = Insert your new y position.
        }
    }
    

    不过,请务必澄清您的意图,以便我提供进一步帮助。

    编辑 1:

    我强烈建议您将您的精灵作为画布中的对象,以获得绝对的工作清晰度。这很有意义,因为您的画布可以更好地处理这些类型的事情。使用Image 并将您的图像分配给精灵对象(您的巧克力块),定义它的宽度和高度并为其添加一个名为“ChocolatePiece”的脚本,在此脚本中创建两个公共变量bool movedint ID,什么都没有此脚本需要 else 。将此新对象保存为您的新预制件。

    一旦您在附加到画布中的空游戏对象的处理程序脚本中完成此操作,请创建游戏对象列表:

    List<GameObject> chocolatePieces = new List<GameObject>();
    

    您需要在处理程序脚本的顶部定义 GameObject chocolatePiece 并在您的 inspector 中附加我们之前定义的预制件。然后在Start() 中,循环你想要多少巧克力块的大小,对于你的例子,让我们使用 4。实例化你之前定义为游戏对象的 4 个预制件,并为每个预制件定义它们的属性,如下所示:

    示例变量:

    int x = -200;
    int y = 200;
    int amountToMoveInX = 200;
    int amountToMoveInY = 100;
    

    实例化代码示例:

    GameObject newPiece = (GameObject)Instantiate(chocolatePiece);
    
    chocolatePieces.Add(newPiece);
    
    newPiece.GetComponent<ChocolatePiece>().ID = i;
    newPiece.transform.SetParent(gameObject.transform, false);
    newPiece.name = ("ChocolatePiece" + i);
    newPiece.GetComponent<RectTransform>().localPosition = new Vector3(x, y, 0);
    

    从这一点开始,为下一个循环计数添加您的位置(x by amountToMoveInX 和 y by amountToMoveInY);

    (对于 transform.position,循环的每个计数都会在默认 x 和默认 y 值(最有可能的第一块位置)上添加一个量)

    现在,因为您将所有游戏对象都放在了一个列表中,并且它们的属性已正确设置,所以您可以通过处理程序脚本访问这些游戏对象。

    【讨论】:

    • 非常感谢您写下答案。实际上,所有四种巧克力都是相互复制的。所以他们有相同的名字。我不知道如何在 breakButton 脚本中获取纹理已更改的那些巧克力的参考。
    • 与预制件一样重复?顺便说一句,您是否使用画布来执行此操作?
    • 是的,就像在预制件中一样。不,我没有为这些图像使用画布,我使用的是 2D 精灵。对于按钮,我使用的是画布。
    • 让我知道你的进展,这应该涵盖整个过程^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2014-10-09
    相关资源
    最近更新 更多