用户工具

站点工具


侧边栏



Unity3D中文文档

script:unityengine:classes:waitforendofframe:waitforendofframe

WaitForEndOfFrame 等待帧结束

Namespace: UnityEngine

Inherits from: YieldInstruction

Description 描述

Waits until the end of the frame after all cameras and GUI is rendered, just before displaying the frame on screen.

等待直到所有的摄像机和GUI被渲染完成后,在该帧显示在屏幕之前。

You can use it to read the display into a texture, encode it as an image file (see Texture2D.ReadPixels and Texture2D.EncodeToPNG) and send it somewhere.

你可以使用它读取显示到纹理,编码它为一个图片文件(参见Texture2D.ReadPixels和Texture2D.EncodeToPNG)并且发送到任意地方。

JavaScript:

yield new WaitForEndOfFrame ();

C#:

using UnityEngine;
using System.Collections;
 
public class ExampleClass : MonoBehaviour {
    IEnumerator Example() {
        yield return new WaitForEndOfFrame();
    }
}

另一个例子:

JavaScript:

// Saves screenshot as PNG file.
import System.IO;
 
// Take a shot immediately
function Start() {
	UploadPNG();
}
 
function UploadPNG() {
	// We should only read the screen buffer after rendering is complete
	yield WaitForEndOfFrame();
 
	// Create a texture the size of the screen, RGB24 format
	var width = Screen.width;
	var height = Screen.height;
	var tex = new Texture2D( width, height, TextureFormat.RGB24, false );
	// Read screen contents into the texture
	tex.ReadPixels( Rect(0, 0, width, height), 0, 0 );
	tex.Apply();
 
	// Encode texture into PNG
	var bytes = tex.EncodeToPNG();
	Destroy( tex );
 
	// For testing purposes, also write to a file in the project folder
	// File.WriteAllBytes(Application.dataPath + "/../SavedScreen.png", bytes);
 
 
	// Create a Web Form
	var form = new WWWForm();
	form.AddField("frameCount", Time.frameCount.ToString());
	form.AddBinaryData("fileUpload",bytes);
 
	// Upload to a cgi script
	var w = WWW("http://localhost/cgi-bin/env.cgi?post", form);
	yield w;
	if (w.error != null)
		print(w.error);
	else
		print("Finished Uploading Screenshot");
}

C#:

using System.IO;
using UnityEngine;
using System.Collections;
 
public class ExampleClass : MonoBehaviour {
    void Start() {
        UploadPNG();
    }
    IEnumerator UploadPNG() {
        yield return new WaitForEndOfFrame();
        int width = Screen.width;
        int height = Screen.height;
        Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false);
        tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
        tex.Apply();
        byte[] bytes = tex.EncodeToPNG();
        Destroy(tex);
        WWWForm form = new WWWForm();
        form.AddField("frameCount", Time.frameCount.ToString());
        form.AddBinaryData("fileUpload", bytes);
        WWW w = new WWW("http://localhost/cgi-bin/env.cgi?post", form);
        yield return w;
        if (w.error != null)
            print(w.error);
        else
            print("Finished Uploading Screenshot");
    }
}
using UnityEngine;
using System.Collections;
 
public class ExampleClass : MonoBehaviour
{
    // A script that shows destination alpha channel in the game view.
 
    Material mat;
 
    void CreateMaterial ()
    {
        // Unity has a built-in shader that is useful for drawing
        // simple colored things. In this case, we just want to use
        // a blend mode that inverts destination colors.			
        var shader = Shader.Find ("Hidden/Internal-Colored");
        mat = new Material (shader);
        mat.hideFlags = HideFlags.HideAndDontSave;
        // Set blend mode to show destination alpha channel.
        mat.SetInt ("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.DstAlpha);
        mat.SetInt ("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
        // Turn off backface culling, depth writes, depth test.
        mat.SetInt ("_Cull", (int)UnityEngine.Rendering.CullMode.Off);
        mat.SetInt ("_ZWrite", 0);
        mat.SetInt ("_ZTest", (int)UnityEngine.Rendering.CompareFunction.Always);
    }
 
 
    public IEnumerator Start ()
    {
        CreateMaterial ();
        while (true)
        {
            // Wait until all rendering + UI is done.
            yield return new WaitForEndOfFrame ();
            // Draw a quad that shows alpha channel.
            GL.PushMatrix ();
            GL.LoadOrtho ();
            mat.SetPass (0);
            GL.Begin (GL.QUADS);
            GL.Vertex3 (0, 0, 0);
            GL.Vertex3 (1, 0, 0);
            GL.Vertex3 (1, 1, 0);
            GL.Vertex3 (0, 1, 0);
            GL.End ();
            GL.PopMatrix ();
        }
    }
 
}
script/unityengine/classes/waitforendofframe/waitforendofframe.txt · 最后更改: 2016/08/02 05:30 (外部编辑)