public void onInputEnd() { TileActor selected = selectedTile; //clear state at top selectedTile = null; if (selected != null) { selected.restoreHighlight(); Vector2 diff = getpointerPosInBoardSpace() - (Vector2)selected.transform.localPosition; float angle = Mathf.Repeat(Vector2.SignedAngle(myTransform.right, diff) + 360.0f, 360.0f); Dir userDir = Match3.Utils.getSwipeDirection(diff, currentData.swipeDelta, angle); int otherRow = selected.tileModel.row, otherCol = selected.tileModel.col; switch (userDir) { case Dir.Up: ++otherRow; break; case Dir.Down: --otherRow; break; case Dir.Left: --otherCol; break; case Dir.Right: ++otherCol; break; case Dir.NoDir: return; } if (otherCol < 0 || otherCol >= currentData.numCols || otherRow < 0 || otherRow >= currentData.numRows) { return; } TileModel other = boardModel.getTileModelAt(otherRow, otherCol); if (other == null || !boardModel.canSwap(selected.tileModel, other)) { return; } Assert.IsNotNull(other.AttachedTileActor); TileActor otherActor = other.AttachedTileActor; //controller work,update model,disable view //model work boardModel.swapTiles(selected.tileModel, other); //view work userInput.enabled = false; StartCoroutine(_tileMovmentAndStabilization(selected, otherActor, currentData.tileMovementTime, onStabilizatonOver)); } }