Пример #1
0
    /// <summary>
    /// 互动
    /// </summary>
    public override void Interactive(GameObject user, Vector3Int worldPosition, BlockDirectionEnum direction)
    {
        //暂时解除控制
        ControlForPlayer controlForPlayer = GameControlHandler.Instance.manager.controlForPlayer;
        ControlForCamera controlForCamera = GameControlHandler.Instance.manager.controlForCamera;

        controlForPlayer.EnabledControl(false);
        controlForCamera.EnabledControl(false);

        CameraHandler.Instance.SetCameraAxis(-70, 0);
        //获取链接数据
        WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(worldPosition, out Block targetBlock, out BlockDirectionEnum targetDirection, out Chunk targetChunk);
        BlockBean    blockData     = targetChunk.GetBlockData(worldPosition - targetChunk.chunkData.positionForWorld);
        BlockMetaBed blockMetaData = GetLinkBaseBlockData <BlockMetaBed>(blockData.meta);

        //获取身体的旋转角度
        float angleY = direction == BlockDirectionEnum.UpForward
            ? 0 : direction == BlockDirectionEnum.UpBack
            ? 180 : direction == BlockDirectionEnum.UpLeft
            ? 90 : direction == BlockDirectionEnum.UpRight
            ? -90 : 0;
        //获取身体偏移位置
        float moveX = direction == BlockDirectionEnum.UpLeft
            ? 0.5f : direction == BlockDirectionEnum.UpRight
            ? -0.5f : 0;
        float moveZ = direction == BlockDirectionEnum.UpForward
            ? 0.5f : direction == BlockDirectionEnum.UpBack
            ? -0.5f : 0;

        Player player = GameHandler.Instance.manager.player;

        player.transform.position    = blockMetaData.GetBasePosition() + new Vector3(0.5f, 0.5f, 0.5f);
        player.transform.eulerAngles = new Vector3(0, 180, 0);
        player.character.transform.localEulerAngles = new Vector3(-90, angleY, 0);
        player.character.transform.localPosition    = new Vector3(moveX, 0, moveZ);
        //设置时间
        GameTimeHandler.Instance.SetGameTime(6, 0);

        Action callBackForFinish = () =>
        {
            //恢复控制
            controlForPlayer.EnabledControl(true);
            controlForCamera.EnabledControl(true);
            player.character.transform.localEulerAngles = new Vector3(0, 0, 0);
            player.character.transform.localPosition    = new Vector3(0, 0, 0);
        };

        GameTimeHandler.Instance.WaitExecuteSeconds(3, callBackForFinish);

        //保存位置
        UserDataBean userData = GameDataHandler.Instance.manager.GetUserData();

        userData.userPosition.SetWorldType(WorldCreateHandler.Instance.manager.worldType);
        userData.userPosition.SetPosition(player.transform.position);
        GameDataHandler.Instance.manager.SaveUserData(userData);
    }
Пример #2
0
    /// <summary>
    /// 检测已摄像头未起点的角色前方的方块
    /// </summary>
    /// <param name="hit"></param>
    /// <param name="targetBlockPosition"></param>
    /// <returns></returns>
    public bool RayToChunkBlock(out RaycastHit hit, out Vector3Int targetPosition)
    {
        hit            = new RaycastHit();
        targetPosition = Vector3Int.zero;

        //获取摄像头到角色的距离
        Vector3          cameraPosition   = CameraHandler.Instance.manager.mainCamera.transform.position;
        ControlForCamera controlForCamera = GameControlHandler.Instance.manager.controlForCamera;
        float            disMax;
        float            disRayBlock = 4;

        if (controlForCamera.cameraDistance <= 0)
        {
            disMax = Vector3.Distance(cameraPosition, player.objFirstLook.transform.position);
        }
        else
        {
            disMax = Vector3.Distance(cameraPosition, player.objThirdLook.transform.position);
        }

        //发射射线检测
        RayUtil.RayAllToScreenPointForScreenCenter(disMax + disRayBlock, 1 << LayerInfo.ChunkTrigger | 1 << LayerInfo.ChunkCollider, out RaycastHit[] arrayHit);
        //如果没有发生碰撞
        if (arrayHit == null || arrayHit.Length == 0)
        {
            return(false);
        }
        bool  hasHitData = false;
        float disTemp    = float.MaxValue;

        for (int i = 0; i < arrayHit.Length; i++)
        {
            RaycastHit itemHit = arrayHit[i];
            float      disHit  = Vector3.Distance(itemHit.point, cameraPosition);
            //如果发射点到碰撞点的距离 小于 发射点到角色的距离 那说明在背后发生了碰撞 则不处理
            if (disHit <= disMax)
            {
                continue;
            }
            else
            {
                //选取前方最近的点
                if (disHit < disTemp)
                {
                    disTemp    = disHit;
                    hit        = itemHit;
                    hasHitData = true;
                }
            }
        }
        GetHitPositionAndDirection(hit, out targetPosition, out Vector3Int closePosition, out BlockDirectionEnum direction);
        return(hasHitData);
    }
Пример #3
0
    /// <summary>
    /// 角色旋转
    /// </summary>
    /// <param name="targetPosition"></param>
    public void RotateCharacter(Vector2 moveOffset, float rotateSpeed)
    {
        Camera           mainCamera       = CameraHandler.Instance.manager.mainCamera;
        ControlForCamera controlForCamera = GameControlHandler.Instance.manager.controlForCamera;

        //如果是第一人称
        if (controlForCamera.cameraDistance <= 0)
        {
            Vector3 rotateAngles = new Vector3(0, mainCamera.transform.rotation.eulerAngles.y, 0);
            //朝摄像头方向移动
            characterController.transform.eulerAngles = rotateAngles;
        }
        else
        {
            if (moveOffset == Vector2.zero)
            {
                return;
            }
            Vector3 rotateAngles = new Vector3(0, mainCamera.transform.rotation.eulerAngles.y, 0);
            //前进后退的旋转
            if (moveOffset.y > 0)
            {
                //左右移动的旋转
                if (moveOffset.x > 0)
                {
                    rotateAngles.y += 45;
                }
                else if (moveOffset.x < 0)
                {
                    rotateAngles.y += -45;
                }
                else
                {
                    rotateAngles.y += 0;
                }
            }
            else if (moveOffset.y < 0)
            {
                //左右移动的旋转
                if (moveOffset.x > 0)
                {
                    rotateAngles.y += 135;
                }
                else if (moveOffset.x < 0)
                {
                    rotateAngles.y += -135;
                }
                else
                {
                    rotateAngles.y += 180;
                }
            }
            else
            {
                //左右移动的旋转
                if (moveOffset.x > 0)
                {
                    rotateAngles.y += 90;
                }
                else if (moveOffset.x < 0)
                {
                    rotateAngles.y += -90;
                }
            }
            Quaternion rotate = Quaternion.Euler(rotateAngles);
            //朝摄像头方向移动
            characterController.transform.rotation = Quaternion.Slerp(transform.rotation, rotate, rotateSpeed * Time.unscaledDeltaTime);
        }
    }