Unity 基于PDFViewer制作读取横板PDF,改为横向滑动读取并做自适应(可网络同步)

1、第一个读取PDF地址

 Unity 基于PDFViewer制作读取横板PDF,改为横向滑动读取并做自适应(可网络同步)_第1张图片

1、PDF_BG可以随意拉伸,匹配显示面板

2、PDFMask是PDF显示范围,根据高度自适应PDF_BG

3、子物体0、1、2是三张并排RawImage,用来轮播做无缝操作

 Unity 基于PDFViewer制作读取横板PDF,改为横向滑动读取并做自适应(可网络同步)_第2张图片

using DG.Tweening;
using Paroxe.PdfRenderer;
using Photon.Pun;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
using static Paroxe.PdfRenderer.PDFViewer;

[RequireComponent(typeof(PhotonView))]
public class PDFManager : MonoBehaviourPunCallbacks,IPunObservable
{

    PDFDocument pdfDocument;  //PDF
    [Header("PDF文件信息")]
    [Multiline]
    public string PDFPath = "";  //PDF路径
    public float MoveTime = 1;
    public int pdfWidth, pdfHeight;
    //PDFViewer pdfViewer;
    public int CurrentPage = 0; //当前页码
    public int TargetPage = 0; //要过去的页数

    [Header("三张轮播图的父物体")]
    public Transform rawImageParent; //父物体

    [Header("翻页按钮")]
    public Button PreviousPageBtn;  //上一页按钮
    public Button NextPageBtn; //下一页按钮

    //记录临时位置,用来做位移
    Vector3 rawFrontPos;
    Vector3 rawMiddlePos;
    Vector3 rawAfterPos;


    private void Awake()
    {
        //RawImage上显示pdf
        pdfDocument = new PDFDocument(PDFPath, "");
    }

    void Start()
    {

        CurrentPage = 0;
        TargetPage = 0;
        //设置默认第一页
        rawImageParent.transform.GetChild(0).GetComponent().texture = null;
        rawImageParent.transform.GetChild(1).GetComponent().texture = SetpdfPage(0);
        rawImageParent.transform.GetChild(2).GetComponent().texture = SetpdfPage(1);
        ScreenAdaptation();
        //赋予初始位置
        rawFrontPos = rawImageParent.GetChild(0).transform.position;
        rawMiddlePos = rawImageParent.GetChild(1).transform.position;
        rawAfterPos = rawImageParent.GetChild(2).transform.position;

        //上一页
        PreviousPageBtn.onClick.AddListener(PreviousPage);
        //下一页
        NextPageBtn.onClick.AddListener(NextPage);

        //pdfDocument.
        //pdfViewer.AdjustZoomToPageFitting(PageFittingType.WholePage, Vector2.one);
        pdfWidth = pdfDocument.GetPageWidth(0);
        pdfHeight = pdfDocument.GetPageHeight(0);
    }

    private void Update()
    {
        //当前页小于目标页说明需要向下一页运动
        if (CurrentPage < TargetPage) 
        {
            MoveToNextPage();
        }
        //当前页大于目标页说明需要向下一页运动
        if (CurrentPage > TargetPage) 
        {
            MoveToPreviousPage();
        }
        if (CurrentPage == TargetPage) return;
        CurrentPage = TargetPage; //翻页过去
    }

    //上一页
    public void PreviousPage()
    {
        if (CurrentPage == 0) return;
        TargetPage--;
    }
    //向上一页运动
    public void MoveToPreviousPage() 
    {
        rawImageParent.transform.GetChild(0).GetComponent().texture = SetpdfPage(CurrentPage - 1);
        rawImageParent.transform.GetChild(1).GetComponent().texture = SetpdfPage(CurrentPage);
        rawImageParent.transform.GetChild(2).GetComponent().texture = SetpdfPage(CurrentPage + 1);
        rawImageParent.transform.GetChild(0).transform.DOMoveX(rawMiddlePos.x, MoveTime);
        rawImageParent.transform.GetChild(1).transform.DOMoveX(rawAfterPos.x, MoveTime);
        rawImageParent.transform.GetChild(2).transform.position = rawFrontPos;
        rawImageParent.transform.GetChild(2).transform.SetAsFirstSibling();
        StartCoroutine(ProHibitButton());
    }
    //下一页
    public void NextPage() 
    {
        if (CurrentPage == pdfDocument.GetPageCount()-1) return;
        TargetPage++;
    }
    //向下一页运动过去
    public void MoveToNextPage() 
    {
        rawImageParent.transform.GetChild(1).GetComponent().texture = SetpdfPage(CurrentPage);
        rawImageParent.transform.GetChild(2).GetComponent().texture = SetpdfPage(CurrentPage + 1);
        rawImageParent.transform.GetChild(1).transform.DOMoveX(rawFrontPos.x, MoveTime);
        rawImageParent.transform.GetChild(2).transform.DOMoveX(rawMiddlePos.x, MoveTime);
        rawImageParent.transform.GetChild(0).transform.position = rawAfterPos;
        rawImageParent.transform.GetChild(0).transform.SetAsLastSibling();
        StartCoroutine(ProHibitButton());
    }


    //运行期间禁止重复点击按钮
    IEnumerator ProHibitButton()
    {
        PreviousPageBtn.interactable = false;
        NextPageBtn.interactable = false;
        yield return new WaitForSeconds(MoveTime);
        PreviousPageBtn.interactable = true;
        NextPageBtn.interactable = true;
    }


    //输入页数读出对应图片
    public Texture SetpdfPage(int setPage) 
    {

        Texture tex = pdfDocument.Renderer.RenderPageToTexture(pdfDocument.GetPage(setPage), pdfDocument.GetPageWidth(setPage), pdfDocument.GetPageHeight(setPage));
        return tex;
    }


    //屏幕自适应
    public void ScreenAdaptation() 
    {
        RectTransform rect_01 = rawImageParent.transform.GetChild(0).GetComponent();
        RectTransform rect_02 = rawImageParent.transform.GetChild(1).GetComponent();
        RectTransform rect_03 = rawImageParent.transform.GetChild(2).GetComponent();
        RectTransform rect_parent = rawImageParent.transform.GetComponent();

        
        rect_parent.sizeDelta = new Vector2(pdfDocument.GetPageWidth(0), pdfDocument.GetPageHeight(0));
        rect_01.sizeDelta =new Vector2(pdfDocument.GetPageWidth(0), pdfDocument.GetPageHeight(0));
        rect_02.sizeDelta =new Vector2(pdfDocument.GetPageWidth(0), pdfDocument.GetPageHeight(0));
        rect_03.sizeDelta =new Vector2(pdfDocument.GetPageWidth(0), pdfDocument.GetPageHeight(0));


        rect_02.anchoredPosition = new Vector2(rect_02.sizeDelta.x * 0.5f, -rect_02.sizeDelta.y * 0.5f);
        rect_01.anchoredPosition = new Vector2(rect_02.anchoredPosition.x - rect_02.sizeDelta.x, -rect_01.sizeDelta.y * 0.5f);
        rect_03.anchoredPosition = new Vector2(rect_02.anchoredPosition.x + rect_02.sizeDelta.x , -rect_03.sizeDelta.y * 0.5f);

        //缩放比例
        float ScaleProp;
        if (rect_parent.sizeDelta.y > rect_parent.transform.parent.GetComponent().sizeDelta.y)
        {
            //缩放比例
            ScaleProp = rect_parent.transform.parent.GetComponent().sizeDelta.y / rect_parent.sizeDelta.y;
            rect_parent.localScale = new Vector3(ScaleProp, ScaleProp, ScaleProp);
        }
        else 
        {
            //缩放比例
            ScaleProp = rect_parent.transform.parent.GetComponent().sizeDelta.y / rect_parent.sizeDelta.y;
            rect_parent.localScale = new Vector3(ScaleProp,ScaleProp,ScaleProp);
        }
    }

    //同步
    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.IsWriting)
        {
            stream.SendNext(TargetPage);
        }
        else 
        {
            TargetPage = (int)stream.ReceiveNext();
        }
    }
}

你可能感兴趣的:(pdf)