コード例 #1
0
    //检查当前家具移动目标位置是否合法
    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);
    }
コード例 #2
0
    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);
                }
            }
        }
    }