如何让Unity 2D RTS单元选择工作



我正在制作一款2d RTS风格的游戏,在该游戏中,您可以通过点击和拖动选择框来选择游戏中的单位。当一个单元在这个选择框内并且放开鼠标左键时;选择";列表及其动画将从空闲动画更改为选定的空闲动画。再次绘制选择框后,选定列表中的所有单位都将被删除,并且它们的动画将设置回空闲位置,然后新选择框中的所有单元都将添加到列表中,并设置为选定的空闲动画。问题是,如果新选定框中的这些单元中的任何一个先前已选定,则它们将切换到空闲动画并停留在那里,而不是转到选定动画。我在没有动画的情况下测试了它,它工作了,当再次选择时,它将保持为选定的精灵,而不是切换到空闲的精灵并保持在那里。我是C#的新手,所以这很可能是一个非常简单的问题。

感谢

这是代码:

ControllableUnits ControlUnitSelected;

public List<ControllableUnits> selectedControllableUnits;

private Vector3 mousePosition;
public void Awake()
{
selectedControllableUnits = new List<ControllableUnits>();
selectionAreaTransform.gameObject.SetActive(false);
ControlUnitSelected = this.gameObject.GetComponent<ControllableUnits>();
}
public void Update()
{
//Transforming Selection Area
if (Input.GetMouseButton(0))
{
Vector3 currentMousePosition = UnitControlClass.GetMouseWorldPosition();
Vector3 lowerLeft = new Vector3(
Mathf.Min(mousePosition.x, currentMousePosition.x),
Mathf.Min(mousePosition.y, currentMousePosition.y)
);
Vector3 upperRight = new Vector3(
Mathf.Max(mousePosition.x, currentMousePosition.x),
Mathf.Max(mousePosition.y, currentMousePosition.y)
);
selectionAreaTransform.position = lowerLeft;
selectionAreaTransform.localScale = upperRight - lowerLeft;
}

if (Input.GetMouseButtonDown(0))
{
mousePosition = UnitControlClass.GetMouseWorldPosition();

selectionAreaTransform.gameObject.SetActive(true);
}
//Creating the selection process
if (Input.GetMouseButtonUp(0))
{
Collider2D[] collider2DArray = Physics2D.OverlapAreaAll(mousePosition, UnitControlClass.GetMouseWorldPosition());
foreach (ControllableUnits control in selectedControllableUnits)
{
//if(ControlUnitSelected != null)

control.animPeasant.Play("Peasant_Idle");
control.isSelected = false;


}
selectedControllableUnits.Clear();
foreach (Collider2D collider2D in collider2DArray)
{
ControllableUnits controllableUnit = collider2D.GetComponent<ControllableUnits>();
if (controllableUnit != null)
{
controllableUnit.animPeasant.Play("Peasant_Idle_Selected");
controllableUnit.isSelected = true;
selectedControllableUnits.Add(controllableUnit);
}
}
selectionAreaTransform.gameObject.SetActive(false);
}




}

我想问题是当你多次调用Play时,Unity试图合并这些动画,最终导致随机状态。

它可以通过给出确切的播放时间来解决。

controllableUnit.animPeasant.Play("Peasant_Idle_Selected", 0, 0f);

最新更新