wangguan
2020-11-19 86c4b7bbc04d500851a9b03088d28a0a84f4a6ab
修改结算页面
增加一个粒子特效截图场景
4 files added
5 files modified
98108 ■■■■■ changed files
Assets/Materials/UI/tileTowerVSMat.mat 2 ●●● patch | view | raw | blame | history
Assets/Resources/UI/Final/FinalPanel.prefab 222 ●●●●● patch | view | raw | blame | history
Assets/Scenes/ParticleExporter.unity 97568 ●●●●● patch | view | raw | blame | history
Assets/Scenes/ParticleExporter.unity.meta 7 ●●●●● patch | view | raw | blame | history
Assets/Scripts/Guide/TestButton.cs 22 ●●●● patch | view | raw | blame | history
Assets/Scripts/UI/FinalPanel/FinalPanel.cs 74 ●●●● patch | view | raw | blame | history
Assets/Scripts/UI/FinalPanel/FinalPanelItem.cs 5 ●●●●● patch | view | raw | blame | history
Assets/Scripts/UI/ParticleExporter.cs 197 ●●●●● patch | view | raw | blame | history
Assets/Scripts/UI/ParticleExporter.cs.meta 11 ●●●●● 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: