/// <summary> /// 将方块撤回的移动信息存入operation中 /// </summary> void SaveMove(bool isChanged, string name, GameObject sourBoard, GameObject endBoard) { Operation operation = Operation.GetInstance(); MoveInf move = new MoveInf(); move.blockName = name; move.endBoard = endBoard; move.sourBoard = sourBoard; move.sourPos = transform.position; move.sourRoa = transform.eulerAngles; move.isChanged = isChanged; operation.AddMoveInf(move); }
public void ClickToUndo() { if (operations.Count > 0) { Operation operation = operations.Pop(); while (operation.operation.Count > 0) { MoveInf move = operation.operation.Pop(); UndoMove(move); } } MouseInf.GetInstance().isRelay = true; }
void UndoMove(MoveInf move) { GameObject block; if (move.isChanged) { GameObject preBlock = relayBoard.transform.Find(move.blockName).gameObject; Vector3 iniPos = preBlock.GetComponent <blockController>().initBlockPos; GameObject blockPrefabs = preBlock.GetComponent <blockController>().changeBlock; block = GameObject.Instantiate(blockPrefabs, iniPos, Quaternion.identity, preBlock.transform.parent); GameObject.Destroy(preBlock); block.GetComponent <blockController>().isChanged = false; string partten = @"\s.*"; MatchCollection match = Regex.Matches(preBlock.name, partten); string order = null; if (match.Count > 0) { order = match[0].ToString(); } block.name = blockPrefabs.name + order; } else { block = relayBoard.transform.Find(move.blockName).gameObject; } blockController controller = block.GetComponent <blockController>(); if (move.endBoard == manager.JigsawBoard) { manager.AddPointToList(block, manager.JigsawBoard); controller.isAtJigsawBoard = false; } else { controller.isAtJigsawBoard = true; } block.transform.position = move.sourPos; block.transform.eulerAngles = move.sourRoa; if (move.sourBoard == manager.JigsawBoard) { manager.DeletePointFromList(block, manager.JigsawBoard); controller.isAtJigsawBoard = true; } else { controller.isAtJigsawBoard = false; } }
void FixedUpdate() { if (isMouseLeftDown) { Ray ray = cam.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (pickupItem == null) { // 提取拼图 Physics.Raycast(ray, out hit, maxRayDistance, blockBoardMask | UILayerMask); if (hit.collider != null) { GameObject hitObject = hit.collider.gameObject.GetComponentInParent <blockController>().gameObject; pickupBlock(hitObject); pickupItem = hitObject; Operation.CreateNewInstance(); operation = Operation.GetInstance(); move = new MoveInf(); move.blockName = pickupItem.name; move.sourPos = pickupItem.transform.position; move.sourRoa = pickupItem.transform.eulerAngles; move.isChanged = false; Undo.instance.AddOperation(operation); // 如果在拼图面板,则需要恢复原来的点集 if (pickupItem.GetComponent <blockController>().isAtJigsawBoard) { AddPointToList(pickupItem, JigsawBoard); pickupItem.GetComponent <blockController>().isAtJigsawBoard = false; move.sourBoard = JigsawBoard; } else { move.sourBoard = pickupBoard; } } } else { // 放置拼图 Physics.Raycast(ray, out hit, maxRayDistance, jigsawBoardMask | pickupBoardMask | UILayerMask); if (hit.collider != null) { GameObject hitObject = hit.collider.gameObject; if (CanDrop(pickupItem, hitObject)) { dropBlock(pickupItem); pickupItem.transform.position = hitObject.transform.position + InWhichBoardArea(pickupItem.transform.position, hitObject.transform.position); if (hitObject.layer == LayerMask.NameToLayer("jigsawBoard")) { DeletePointFromList(pickupItem, hitObject); pickupItem.GetComponent <blockController>().isAtJigsawBoard = true; } mouse.isRelay = true; move.endBoard = hitObject; operation.AddMoveInf(move); pickupItem = null; } } //else //{ // dropBlock(pickupItem); // pickupItem.transform.position = pickupItem.GetComponent<blockController>().initBlockPos; // pickupItem = null; //} } isMouseLeftDown = false; } }
public void AddMoveInf(MoveInf move) { operation.Push(move); }