/// <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); }
/// <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); }
/// <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); } }