//检查当前家具移动目标位置是否合法 public bool CheckTargetOffset(Vector2Int characterCoordinate, Vector2Int paraOffset) { bool res = true; // 1.先移除 for (int i = 0; i < occupyTiles.GetLength(0); i++) { MainWorldController.DeregisterFurnitureOnSingleTile(this, occupyTiles[i]); } // 检查主角是否可以移动 if (!MainWorldController.CheckTilePassable(characterCoordinate + paraOffset)) { res = false; } // 2.检查当前家具是否能够移动 for (int i = 0; i < occupyTiles.GetLength(0); i++) { if (!MainWorldController.CheckTileDisposable(occupyTiles[i] + paraOffset)) { res = false; } } // 3.恢复初始移除 for (int i = 0; i < occupyTiles.GetLength(0); i++) { MainWorldController.RegisterFurnitureOnSingleTile(this, occupyTiles[i]); } return(res); }
public void CharacterMoveUpdate(int moveOrientation) { if (isPushingOrPull) { // 如果正在推或者拉 if (characterOrientation == moveOrientation || characterOrientation == (moveOrientation + 2) % 4) { if (operatingFurnitureController.TryToMoveFurnitureOffset(currentCoordinate, orientationArray[moveOrientation])) { // 如果家具可以向上推动 //this.transform.position = this.transform.position + new Vector3( orientationArray[moveOrientation].x * 2.5f, 0.0f, orientationArray[moveOrientation].y * 2.5f ); isMoving = true; currentCoordinate += orientationArray[moveOrientation]; endPosition = mainWorldController.GetTilePosition(currentCoordinate); direction = Vector3.Normalize(endPosition - this.transform.position); if (characterOrientation == moveOrientation) { targetCoordinate = currentCoordinate + orientationArray[moveOrientation]; } else { targetCoordinate = currentCoordinate - orientationArray[moveOrientation]; } if (mainWorldController.CheckTileOperatable(targetCoordinate)) { operatableTarget.SetActive(true); operatableTarget.transform.position = mainWorldController.GetTilePosition(targetCoordinate); } else { operatableTarget.SetActive(false); } } } } else { if (characterOrientation != moveOrientation) { this.transform.rotation = Quaternion.Euler(0, moveOrientation * 90.0f, 0); characterOrientation = moveOrientation; targetCoordinate = currentCoordinate + orientationArray[moveOrientation]; if (mainWorldController.CheckTileOperatable(targetCoordinate)) { operatableTarget.SetActive(true); operatableTarget.transform.position = mainWorldController.GetTilePosition(targetCoordinate); } else { operatableTarget.SetActive(false); } } if (mainWorldController.CheckTilePassable(currentCoordinate + orientationArray[moveOrientation])) { //this.transform.position = this.transform.position + new Vector3(orientationArray[moveOrientation].x * 2.5f, 0.0f, orientationArray[moveOrientation].y * 2.5f); isMoving = true; currentCoordinate += orientationArray[moveOrientation]; endPosition = mainWorldController.GetTilePosition(currentCoordinate); direction = Vector3.Normalize(endPosition - this.transform.position); targetCoordinate += orientationArray[moveOrientation]; if (mainWorldController.CheckTileOperatable(targetCoordinate)) { operatableTarget.SetActive(true); operatableTarget.transform.position = mainWorldController.GetTilePosition(targetCoordinate); } else { operatableTarget.SetActive(false); } } } }