您想在一段时间内还是立即移动精灵?
如果超过一段时间,我建议您使用 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 moved 和int 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 值(最有可能的第一块位置)上添加一个量)
现在,因为您将所有游戏对象都放在了一个列表中,并且它们的属性已正确设置,所以您可以通过处理程序脚本访问这些游戏对象。