/* http://www.cgsoso.com/forum-211-1.html CG搜搜 Unity3d 每日Unity3d插件免费更新 更有VIP资源! CGSOSO 主打游戏开发,影视设计等CG资源素材。 插件如若商用,请务必官网购买! daily assets update for try. U should buy the asset from home store if u use it in your project! */ using System.Collections.Generic; using System.Reflection; #if UNITY_EDITOR using UnityEditor; #endif using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; namespace Paroxe.PdfRenderer.Internal.Viewer { [ExecuteInEditMode] public class PDFViewerBuilder : UIBehaviour { #if UNITY_EDITOR public static void BuildPDFViewerWithin(GameObject root, PDFViewer prefabViewer) { if (root.transform.childCount > 0) { int c = root.transform.childCount; for (int i = 0; i < c; ++i) { Destroy(root.transform.GetChild(0).gameObject); } } PDFViewer viewer = root.GetComponent(); if (viewer == null) { viewer = root.AddComponent(); } if (prefabViewer != null) { CopyViewer(prefabViewer, viewer); } RectTransform rootTransform = root.GetComponent(); if (rootTransform == null) { rootTransform = root.AddComponent(); rootTransform.anchorMin = Vector2.zero; rootTransform.anchorMax = Vector2.one; rootTransform.offsetMin = Vector2.zero; rootTransform.offsetMax = Vector2.zero; } GameObject internalPrefab = (GameObject) AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath(AssetDatabase.FindAssets("PDFViewer_Internal")[0]), typeof (GameObject)); GameObject viewerInternal = (GameObject) Instantiate(internalPrefab); PrefabUtility.DisconnectPrefabInstance(viewerInternal); viewerInternal.GetComponent().m_PDFViewer = root.GetComponent(); viewer.m_Internal = viewerInternal.GetComponent(); viewerInternal.name = "_Internal"; RectTransform internalRectTransform = viewerInternal.transform as RectTransform; internalRectTransform.SetParent(viewer.transform); internalRectTransform.anchorMin = Vector2.zero; internalRectTransform.anchorMax = Vector2.one; internalRectTransform.offsetMin = Vector2.zero; internalRectTransform.offsetMax = Vector2.zero; Selection.activeGameObject = root; } public static string[] GetNewFeatures(GameObject root) { float version = float.Parse(root.GetComponent().m_Internal.m_Version); List newFeatures = new List(); if (version < 2.2f) { newFeatures.Add("Version 2.2 includes:"); newFeatures.Add(" -Bookmarks"); newFeatures.Add(" -Thumbnails"); newFeatures.Add(" -Links"); } if (version < 3.0f) { newFeatures.Add("Version 3.0 includes:"); newFeatures.Add(" -Search Panel"); } return newFeatures.ToArray(); } public static void UpdateToLatestVersion(GameObject root) { float version = float.Parse(root.GetComponent().m_Internal.m_Version); if (version < 2.2f) UpdateToVersion_22(root); if (version < 3.0f) UpdateToVersion_30(root); } public static void UpdateToVersion_22(GameObject root) { Transform internalTransform = null; int c = root.transform.childCount; for (int i = 0; i < c; ++i) { var obj = root.transform.GetChild(i); if (obj.name == "_Internal") { internalTransform = obj; } } if (internalTransform != null) { GameObject leftPanelPrefab = (GameObject)AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath(AssetDatabase.FindAssets("PDFViewer_Internal_LeftPanel")[0]), typeof(GameObject)); GameObject leftPanelInternal = (GameObject) Instantiate(leftPanelPrefab); PrefabUtility.DisconnectPrefabInstance(leftPanelInternal); PDFViewer pdfViewer = root.GetComponent(); internalTransform.GetComponent().m_PDFViewer = pdfViewer; pdfViewer.m_Internal.m_LeftPanel = leftPanelInternal.GetComponent(); leftPanelInternal.name = "_LeftPanel"; RectTransform internalRectTransform = leftPanelInternal.transform as RectTransform; internalRectTransform.SetParent(internalTransform); internalRectTransform.SetSiblingIndex(pdfViewer.m_Internal.m_Overlay.transform.GetSiblingIndex()); internalRectTransform.anchorMin = Vector2.zero; internalRectTransform.anchorMax = Vector2.up; internalRectTransform.offsetMin = new Vector2(0.0f, 0.0f); internalRectTransform.offsetMax = new Vector2(0.0f, 0.0f); internalRectTransform.pivot = Vector2.zero; internalRectTransform.sizeDelta = new Vector2(350.0f, -pdfViewer.m_Internal.m_TopPanel.sizeDelta.y + 1.0f); if (pdfViewer.m_Internal.m_PageSample.gameObject.GetComponent() == null) { PDFViewerPage pageSample = pdfViewer.m_Internal.m_PageSample.gameObject.AddComponent(); string[] assetPaths = AssetDatabase.FindAssets("HandLinkCursor"); string path = ""; foreach (string asset in assetPaths) { if (AssetDatabase.GUIDToAssetPath(asset).Contains("PDFRenderer")) path = AssetDatabase.GUIDToAssetPath(asset); } pageSample.m_HandCursor = (Texture2D) AssetDatabase.LoadAssetAtPath(path, typeof (Texture2D)); } pdfViewer.m_Internal.m_Viewport.GetComponent().inertia = true; pdfViewer.m_Internal.m_Viewport.GetComponent().decelerationRate = 0.025f; pdfViewer.m_Internal.m_Version = "2.2"; } } public static void UpdateToVersion_30(GameObject root) { PDFViewer pdfViewer = root.GetComponent(); Transform documentIcon = pdfViewer.m_Internal.m_TopPanel.Find("DocumentIcon"); if (documentIcon != null) DestroyImmediate(documentIcon.gameObject); GameObject searchPanelPrefab = (GameObject) AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath(AssetDatabase.FindAssets("PDFViewer_SearchPanel")[0]), typeof (GameObject)); GameObject searchPanel = (GameObject) Instantiate(searchPanelPrefab); PrefabUtility.DisconnectPrefabInstance(searchPanel); pdfViewer.m_Internal.m_SearchPanel = searchPanel.transform as RectTransform; pdfViewer.m_Internal.m_SearchPanel.SetParent(pdfViewer.m_Internal.transform); pdfViewer.m_Internal.m_SearchPanel.SetSiblingIndex(pdfViewer.m_Internal.m_Viewport.GetSiblingIndex() + 1); pdfViewer.m_Internal.m_SearchPanel.anchoredPosition = new Vector2(-234.0f, -59.0f); pdfViewer.m_Internal.m_SearchPanel.sizeDelta = new Vector2(400.0f, 150.0f); pdfViewer.m_Internal.m_SearchPanel.name = "_SearchPanel"; GameObject topPanelSearchPrefab = (GameObject) AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath(AssetDatabase.FindAssets("PDFViewer_TopPanel_Search")[0]), typeof (GameObject)); GameObject topPanelSearch = (GameObject) Instantiate(topPanelSearchPrefab); PrefabUtility.DisconnectPrefabInstance(topPanelSearch); topPanelSearch.transform.SetParent(pdfViewer.m_Internal.m_TopPanel); (topPanelSearch.transform as RectTransform).anchoredPosition = Vector2.zero; topPanelSearch.name = "_SearchButton"; pdfViewer.m_Internal.m_PageCountLabel.resizeTextForBestFit = true; pdfViewer.m_Internal.m_PageCountLabel.resizeTextMinSize = 10; pdfViewer.m_Internal.m_PageCountLabel.resizeTextMaxSize = 22; pdfViewer.m_Internal.m_Version = "3.0"; } private static void CopyViewer(PDFViewer prefabViewer, PDFViewer viewer) { BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Default | BindingFlags.DeclaredOnly; PropertyInfo[] pinfos = typeof (PDFViewer).GetProperties(flags); foreach (var pinfo in pinfos) { if (pinfo.CanWrite) { try { pinfo.SetValue(viewer, pinfo.GetValue(prefabViewer, null), null); } catch { } } } FieldInfo[] finfos = typeof (PDFViewer).GetFields(flags); foreach (var finfo in finfos) { finfo.SetValue(viewer, finfo.GetValue(prefabViewer)); } } protected override void Start() { GameObject pdfViewer = new GameObject("PDFViewer"); RectTransform rootTransform = pdfViewer.AddComponent(); rootTransform.SetParent(transform.parent); rootTransform.anchorMin = Vector2.zero; rootTransform.anchorMax = Vector2.one; rootTransform.offsetMin = Vector2.zero; rootTransform.offsetMax = Vector2.zero; BuildPDFViewerWithin(pdfViewer, GetComponent()); UpdateToLatestVersion(pdfViewer); DestroyImmediate(gameObject); } #endif } }