Assets/Materials/UI/tileTowerVSMat.mat | ●●●●● patch | view | raw | blame | history | |
Assets/Resources/UI/Final/FinalPanel.prefab | ●●●●● patch | view | raw | blame | history | |
Assets/Scenes/ParticleExporter.unity | ●●●●● patch | view | raw | blame | history | |
Assets/Scenes/ParticleExporter.unity.meta | ●●●●● patch | view | raw | blame | history | |
Assets/Scripts/Guide/TestButton.cs | ●●●●● patch | view | raw | blame | history | |
Assets/Scripts/UI/FinalPanel/FinalPanel.cs | ●●●●● patch | view | raw | blame | history | |
Assets/Scripts/UI/FinalPanel/FinalPanelItem.cs | ●●●●● patch | view | raw | blame | history | |
Assets/Scripts/UI/ParticleExporter.cs | ●●●●● patch | view | raw | blame | history | |
Assets/Scripts/UI/ParticleExporter.cs.meta | ●●●●● patch | view | raw | blame | history |
Assets/Materials/UI/tileTowerVSMat.mat
@@ -40,7 +40,7 @@ m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _MainTex: m_Texture: {fileID: 2800000, guid: 8c9a3d26120e78f40aa4ef9ed23d573c, type: 3} m_Texture: {fileID: 2800000, guid: 93f40a01d57fbff418fc0b54b6ab7d9f, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - _MetallicGlossMap: Assets/Resources/UI/Final/FinalPanel.prefab
@@ -322,11 +322,11 @@ - {fileID: 1988947377937968563} - {fileID: 5748941952564637225} - {fileID: 5646961902762380150} - {fileID: 8431080647543519056} - {fileID: 197643528144310344} - {fileID: 7878479991277281519} - {fileID: 8441617594771339911} - {fileID: 1844543117816446403} - {fileID: 4943816522755542425} - {fileID: 1818325968707775638} - {fileID: 8661324587580357946} - {fileID: 3492065258373943105} @@ -721,10 +721,10 @@ m_GameObject: {fileID: 4084473540632843494} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 0.7, y: 0.7, z: 0.7} m_Children: [] m_Father: {fileID: 5825945650563712391} m_RootOrder: 6 m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -752,8 +752,8 @@ m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_Color: {r: 1, g: 1, b: 1, a: 0} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: @@ -796,10 +796,10 @@ m_GameObject: {fileID: 4282407097951878964} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 0.7, y: 0.7, z: 0.7} m_Children: [] m_Father: {fileID: 5825945650563712391} m_RootOrder: 4 m_RootOrder: 5 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -827,8 +827,8 @@ m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_Color: {r: 1, g: 1, b: 1, a: 0} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: @@ -963,42 +963,6 @@ m_OnClick: m_PersistentCalls: m_Calls: [] --- !u!1 &5006132482673416349 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 4943816522755542425} m_Layer: 5 m_Name: Images m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 --- !u!224 &4943816522755542425 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5006132482673416349} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: - {fileID: 6820271757256221080} m_Father: {fileID: 5825945650563712391} m_RootOrder: 7 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 1080, y: 1920} m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &5531562892244897489 GameObject: m_ObjectHideFlags: 0 @@ -1026,10 +990,10 @@ m_GameObject: {fileID: 5531562892244897489} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 0.7, y: 0.7, z: 0.7} m_Children: [] m_Father: {fileID: 5825945650563712391} m_RootOrder: 5 m_RootOrder: 6 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -1057,14 +1021,89 @@ m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 1 m_Color: {r: 1, g: 1, b: 1, a: 0} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] m_Sprite: {fileID: 21300000, guid: 76501f6336934c041b4779119b8f5b0b, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 --- !u!1 &5922831300634792229 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 8431080647543519056} - component: {fileID: 2273689066512732421} - component: {fileID: 3452761259539067976} m_Layer: 5 m_Name: ImageLight m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 --- !u!224 &8431080647543519056 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5922831300634792229} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 0.7, y: 0.7, z: 0.7} m_Children: [] m_Father: {fileID: 5825945650563712391} m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} m_AnchoredPosition: {x: -10.82, y: 652.4} m_SizeDelta: {x: 630, y: 639} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &2273689066512732421 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5922831300634792229} m_CullTransparentMesh: 0 --- !u!114 &3452761259539067976 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 5922831300634792229} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 0} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] m_Sprite: {fileID: 21300000, guid: e141d7387174e084e85efe1ca42cabea, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -1165,7 +1204,7 @@ - component: {fileID: 8505110228154102131} - component: {fileID: 1059051821504230421} m_Layer: 5 m_Name: Image (1) m_Name: ImageDark2 m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -1219,81 +1258,6 @@ m_PersistentCalls: m_Calls: [] m_Sprite: {fileID: 21300000, guid: e956ec24a18e6674b8987899c8901174, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 m_FillMethod: 4 m_FillAmount: 1 m_FillClockwise: 1 m_FillOrigin: 0 m_UseSpriteMesh: 0 m_PixelsPerUnitMultiplier: 1 --- !u!1 &6819379700565871762 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - component: {fileID: 6820271757256221080} - component: {fileID: 7379375126885271383} - component: {fileID: 7195267702074735128} m_Layer: 5 m_Name: Image m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 --- !u!224 &6820271757256221080 RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6819379700565871762} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_Children: [] m_Father: {fileID: 4943816522755542425} m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1} m_AnchoredPosition: {x: -7, y: -361} m_SizeDelta: {x: 630, y: 639} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &7379375126885271383 CanvasRenderer: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6819379700565871762} m_CullTransparentMesh: 0 --- !u!114 &7195267702074735128 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 6819379700565871762} m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 m_OnCullStateChanged: m_PersistentCalls: m_Calls: [] m_Sprite: {fileID: 21300000, guid: 15eac5a2040d3d1418acd61aa92a8e8f, type: 3} m_Type: 0 m_PreserveAspect: 0 m_FillCenter: 1 @@ -1590,7 +1554,7 @@ - component: {fileID: 7265106792194721657} - component: {fileID: 2994887600340966553} m_Layer: 5 m_Name: Image m_Name: ImageDark m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -1680,10 +1644,10 @@ m_GameObject: {fileID: 8519968415981260941} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 0.7, y: 0.5, z: 0.5} m_Children: [] m_Father: {fileID: 5825945650563712391} m_RootOrder: 3 m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 1} m_AnchorMax: {x: 0.5, y: 1} @@ -1711,7 +1675,7 @@ m_Name: m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 1, g: 1, b: 1, a: 1} m_Color: {r: 1, g: 1, b: 1, a: 0} m_RaycastTarget: 0 m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} m_Maskable: 1 Assets/Scenes/ParticleExporter.unity
New file Diff too large Assets/Scenes/ParticleExporter.unity.meta
New file @@ -0,0 +1,7 @@ fileFormatVersion: 2 guid: 0f1932404b17a2c43ab6496e21cc630a DefaultImporter: externalObjects: {} userData: assetBundleName: assetBundleVariant: Assets/Scripts/Guide/TestButton.cs
@@ -1,4 +1,5 @@ using System.Collections; using System; using System.Collections; using UnityEngine; using UnityEngine.UI; using KTGMGemClient; @@ -9,16 +10,26 @@ void Start() { transform.Find("TowerBuyBtn").GetComponent<Button>().onClick.AddListener(OnClickTowerBuyBtn); // transform.Find("TowerBuyBtn").GetComponent<Button>().onClick.AddListener(OnClickTowerBuyBtn); transform.Find("GuidePanel/Image_TowerPos2").GetComponent<Button>().onClick.AddListener(GetOneTowerPos); // transform.Find("GuidePanel/Image_TowerPos2").GetComponent<Button>().onClick.AddListener(GetOneTowerPos); int guide = PlayerPrefs.GetInt("GemBattleGuide"); // int guide = PlayerPrefs.GetInt("GemBattleGuide"); // string s="<color=red>范围伤害</color>"; // t.text=s; // Debug.Log(s.Length); TestFinalPanel(); } void TestFinalPanel() { GameObject go = Instantiate(Resources.Load<GameObject>("UI/Final/FinalPanel"), transform); FinalPanel panelUI = go.GetComponent<FinalPanel>(); panelUI.SetData("成绩 25关 3波", 789220); panelUI.SetPlayEffectAC(null); } private void OnEnable() { @@ -135,7 +146,8 @@ } private void GuideFinish(){ private void GuideFinish() { Debug.Log("新手引导流程结束"); } Assets/Scripts/UI/FinalPanel/FinalPanel.cs
@@ -80,32 +80,65 @@ waveText = transform.Find("Text_Wave").GetComponent<Text>(); scoreText = transform.Find("Text_Score").GetComponent<Text>(); scoreText.text = ""; waveText.text = ""; waveText.gameObject.SetActive(false); scoreText.gameObject.SetActive(false); image_NewRecord = transform.Find("Image_NewRecord").gameObject; image_NewRecord.SetActive(false); LoadLargeData(hScore); Transform ts = transform.Find("Images"); Sequence agentTweenSeq = DOTween.Sequence(); //先出现 Image tsTiele = transform.Find("Image_Tiele").GetComponent<Image>(); agentTweenSeq.Append(tsTiele.transform.DOScale(Vector3.one, 0.2f));//变化图片大小 agentTweenSeq.Join(tsTiele.DOFade(1, 0.3f)); agentTweenSeq.Append(ts.DOScale(Vector3.one, 0.2f));//变化图片大小 Image Image1 = transform.Find("Image1").GetComponent<Image>(); agentTweenSeq.Append(Image1.transform.DOScale(Vector3.one, 0.2f));//变化图片大小 agentTweenSeq.Join(Image1.DOFade(1, 0.2f)); agentTweenSeq.Join(waveText.DOText(waveInfo, 0.2f)); agentTweenSeq.Append(ts.DOScale(new Vector3(1.7f, 1.7f, 1.7f), 0.2f));//变化图片大小 agentTweenSeq.Append(ts.DOScale(Vector3.one, 0.2f));//变化图片大小 agentTweenSeq.Append(ts.DOScale(new Vector3(1.2f, 1.2f, 1.2f), 0.2f));//变化图片大小 agentTweenSeq.Append(ts.DOScale(Vector3.one, 0.2f));//变化图片大小 Image Image2 = transform.Find("Image2").GetComponent<Image>(); agentTweenSeq.Append(Image2.transform.DOScale(Vector3.one, 0.2f));//变化图片大小 agentTweenSeq.Join(Image2.DOFade(1, 0.2f)); agentTweenSeq.AppendCallback(StartLoadLargeData); agentTweenSeq.Append(DOTween.To(delegate (float value) Image Image3 = transform.Find("Image3").GetComponent<Image>(); agentTweenSeq.Append(Image3.transform.DOScale(Vector3.one, 0.2f));//变化图片大小 agentTweenSeq.Join(Image3.DOFade(1, 0.2f)); agentTweenSeq.Join(DOTween.To(delegate (float value) { var temp = Math.Floor(value); scoreText.text = temp + ""; }, 0, myScore, 1.0f)); tsLight = transform.Find("ImageLight"); Image ImageLight = tsLight.GetComponent<Image>(); agentTweenSeq.Join(ImageLight.transform.DOScale(Vector3.one, 0.2f));//变化图片大小 agentTweenSeq.Join(ImageLight.DOFade(1, 0.2f).OnComplete(RotateLight)); //agentTweenSeq.AppendCallback(RotateLight); agentTweenSeq.AppendCallback(TextDoTweenFinish); agentTweenSeq.Append(waveText.DOText(waveInfo, 0.2f)); } bool isRotate = false; float offect = 0; /// <summary> /// LateUpdate is called every frame, if the Behaviour is enabled. /// It is called after all Update functions have been called. /// </summary> void LateUpdate() { if (isRotate) { offect += Time.deltaTime; tsLight.localRotation = Quaternion.Euler(0, 0, offect * 30); } } /// <summary> @@ -114,7 +147,6 @@ protected void StartLoadLargeData() { scoreText.gameObject.SetActive(true); LoadLargeData(hScore); StartCoroutine(PlayerItemDoTween()); } @@ -124,16 +156,12 @@ /// <returns></returns> IEnumerator PlayerItemDoTween() { yield return 1f; //yield return 1f; // FinalPanelItem[] allItems = transform.Find("Scroller/Container").GetComponentsInChildren<FinalPanelItem>(); // for (int i = 0; i < allItems.Length; i++) // { // allItems[i].SetPos(); // } for (int i = 0; i < 8; i++) { allItemLis[i].SetPos(); } yield return new WaitForEndOfFrame(); scrollerCanvasGroup.alpha = 1; @@ -145,7 +173,7 @@ for (int i = 0; i < 8; i++) { allItemLis[i].PlayDoTween(0.1f); yield return new WaitForSeconds(0.1f); yield return new WaitForSeconds(0.07f); } image_HScore.SetActive(true); @@ -169,6 +197,18 @@ } closeBtn.interactable = true; } Transform tsLight; /// <summary> /// 光出现后开始旋转 /// </summary> protected void RotateLight() { isRotate = true; offect = 0; //Transform ImageLight = transform.Find("ImageLight"); //ImageLight.DORotate(new Vector3(0, 180, 0), 1.0f).SetLoops(-1,LoopType.Incremental); } List<FinalPanelItem> allItemLis;//新生成的排行榜 @@ -219,6 +259,12 @@ { allItemLis[i].SetData(_data[i]); } for (int i = 0; i < 8; i++) { allItemLis[i].SetPos(); } } #region EnhancedScroller Handlers Assets/Scripts/UI/FinalPanel/FinalPanelItem.cs
@@ -37,7 +37,8 @@ public void PlayDoTween(float duration) { Sequence agentTweenSeq = DOTween.Sequence(); agentTweenSeq.Append(backGround.rectTransform.DOAnchorPosX(0, duration)); //Sequence agentTweenSeq = DOTween.Sequence(); //agentTweenSeq.Join(backGround.rectTransform.DOAnchorPosX(0, duration)); backGround.rectTransform.DOAnchorPosX(0, duration); } } Assets/Scripts/UI/ParticleExporter.cs
New file @@ -0,0 +1,197 @@ using UnityEngine; using UnityEditor; using System; using System.IO; using System.Collections; using System.Collections.Generic; /// <summary> /// 粒子特效截屏导出脚本,挂在粒子特效身上,按Q键开始截屏 /// </summary> public class ParticleExporter : MonoBehaviour { // Default folder name where you want the animations to be output public string folder = "PNG_Animations"; // Framerate at which you want to play the animation public int frameRate = 25; // export frame rate 导出帧率,设置Time.captureFramerate会忽略真实时间,直接使用此帧率 public float frameCount = 100; // export frame count 导出帧的数目,100帧则相当于导出5秒钟的光效时间。由于导出每一帧的时间很长,所以导出时间会远远长于直观的光效播放时间 public int screenWidth = 960; // not use 暂时没用,希望可以直接设置屏幕的大小(即光效画布的大小) public int screenHeight = 640; public Vector3 cameraPosition = Vector3.zero; public Vector3 cameraRotation = Vector3.zero; private string realFolder = ""; // real folder where the output files will be private float originaltimescaleTime; // track the original time scale so we can freeze the animation between frames private float currentTime = 0; private bool over = false; private int currentIndex = 0; private Camera exportCamera; // camera for export 导出光效的摄像机,使用RenderTexture private ParticleSystem particleSystem; public void Start() { particleSystem = GetComponent<ParticleSystem>(); // set frame rate Time.captureFramerate = frameRate; // Create a folder that doesn't exist yet. Append number if necessary. realFolder = Path.Combine(folder, name);//该路径在Asset同级目录下 // Create the folder if (!Directory.Exists(realFolder)) { Debug.Log(realFolder); Directory.CreateDirectory(realFolder); } originaltimescaleTime = Time.timeScale; GameObject goCamera = Camera.main.gameObject; if (cameraPosition != Vector3.zero) { goCamera.transform.position = cameraPosition; } if (cameraRotation != Vector3.zero) { goCamera.transform.rotation = Quaternion.Euler(cameraRotation); } GameObject go = Instantiate(goCamera) as GameObject; exportCamera = go.GetComponent<Camera>(); currentTime = 0; } bool startCapture = false; void Update() { if (Input.GetKeyDown(KeyCode.Q)) { startCapture = !startCapture; particleSystem.Play(); } if (startCapture) { currentTime += Time.deltaTime; if (!over && currentIndex >= frameCount) { over = true; Cleanup(); Debug.Log("Finish"); return; } // 每帧截屏 StartCoroutine(CaptureFrame()); } } void Cleanup() { DestroyImmediate(exportCamera); DestroyImmediate(gameObject); } IEnumerator CaptureFrame() { // Stop time Time.timeScale = 0; // Yield to next frame and then start the rendering // this is important, otherwise will have error yield return new WaitForEndOfFrame(); string filename = String.Format("{0}/{1:D04}.png", realFolder, ++currentIndex); Debug.Log(filename); int width = Screen.width; int height = Screen.height; //Initialize and render textures RenderTexture blackCamRenderTexture = new RenderTexture(width, height, 24, RenderTextureFormat.ARGB32); RenderTexture whiteCamRenderTexture = new RenderTexture(width, height, 24, RenderTextureFormat.ARGB32); exportCamera.targetTexture = blackCamRenderTexture; exportCamera.backgroundColor = Color.black; exportCamera.Render(); RenderTexture.active = blackCamRenderTexture; Texture2D texb = GetTex2D(); //Now do it for Alpha Camera exportCamera.targetTexture = whiteCamRenderTexture; exportCamera.backgroundColor = Color.white; exportCamera.Render(); RenderTexture.active = whiteCamRenderTexture; Texture2D texw = GetTex2D(); // If we have both textures then create final output texture if (texw && texb) { Texture2D outputtex = new Texture2D(width, height, TextureFormat.ARGB32, false); // we need to check alpha ourselves,because particle use additive shader // Create Alpha from the difference between black and white camera renders for (int y = 0; y < outputtex.height; ++y) { // each row for (int x = 0; x < outputtex.width; ++x) { // each column float alpha; alpha = texw.GetPixel(x, y).r - texb.GetPixel(x, y).r; alpha = 1.0f - alpha; Color color; if (alpha == 0) { color = Color.clear; } else { color = texb.GetPixel(x, y); } color.a = alpha; outputtex.SetPixel(x, y, color); } } // Encode the resulting output texture to a byte array then write to the file byte[] pngShot = outputtex.EncodeToPNG(); File.WriteAllBytes(filename, pngShot); // cleanup, otherwise will memory leak pngShot = null; RenderTexture.active = null; DestroyImmediate(outputtex); outputtex = null; DestroyImmediate(blackCamRenderTexture); blackCamRenderTexture = null; DestroyImmediate(whiteCamRenderTexture); whiteCamRenderTexture = null; DestroyImmediate(texb); texb = null; DestroyImmediate(texw); texb = null; System.GC.Collect(); // Reset the time scale, then move on to the next frame. Time.timeScale = originaltimescaleTime; } } // Get the texture from the screen, render all or only half of the camera private Texture2D GetTex2D() { // Create a texture the size of the screen, RGB24 format int width = Screen.width; int height = Screen.height; Texture2D tex = new Texture2D(width, height, TextureFormat.ARGB32, false); // Read screen contents into the texture tex.ReadPixels(new Rect(0, 0, width, height), 0, 0); tex.Apply(); return tex; } } Assets/Scripts/UI/ParticleExporter.cs.meta
New file @@ -0,0 +1,11 @@ fileFormatVersion: 2 guid: 019c0db277350f140baefc07e96df07f MonoImporter: externalObjects: {} serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: