Maison  >  Article  >  développement back-end  >  Utilisez le script Unity pour personnaliser la résolution afin de prendre une capture d'écran haute définition de la caméra

Utilisez le script Unity pour personnaliser la résolution afin de prendre une capture d'écran haute définition de la caméra

php是最好的语言
php是最好的语言original
2018-07-27 11:22:178344parcourir

Lorsque je travaillais sur un projet récemment, j'avais besoin de prendre une capture d'écran haute définition dans le jeu, je l'ai étudiée et je l'ai écrite dans un script pour une utilisation future.
Le script peut personnaliser la résolution et utiliser l'appareil photo pour prendre des captures d'écran haute définition. Vous pouvez utiliser du code pour prendre des captures d'écran de manière dynamique, ou vous pouvez prendre des captures d'écran en mode édition.
Faites attention au rapport hauteur/largeur correct de la capture d'écran. Des problèmes peuvent survenir si le rapport hauteur/largeur est incorrect.

Effet de capture d'écran :

Utilisez le script Unity pour personnaliser la résolution afin de prendre une capture décran haute définition de la caméra

Utilisez le script Unity pour personnaliser la résolution afin de prendre une capture décran haute définition de la caméra

Utilisez le script Unity pour personnaliser la résolution afin de prendre une capture décran haute définition de la caméra

Script :
CameraCapture.cs

using UnityEngine;
using System.IO;

/// <summary>
/// 相机截图
/// <para>ZhangYu 2018-07-06</para>
/// </summary>
public class CameraCapture : MonoBehaviour {

    // 截图尺寸
    public enum CaptureSize {
        CameraSize,
        ScreenResolution,
        FixedSize
    }

    // 目标摄像机
    public Camera targetCamera;
    // 截图尺寸
    public CaptureSize captureSize = CaptureSize.CameraSize;
    // 像素尺寸
    public Vector2 pixelSize;
    // 保存路径
    public string savePath = "StreamingAssets/";
    // 文件名称
    public string fileName = "cameraCapture.png";

    #if UNITY_EDITOR
    private void Reset() {
        targetCamera = GetComponent<Camera>();
        pixelSize = new Vector2(Screen.currentResolution.width, Screen.currentResolution.height);
    }
    #endif

    /// <summary> 保存截图 </summary>
    /// <param name="camera">目标摄像机</param>
    public void saveCapture() {
        Vector2 size = pixelSize;
        if (captureSize == CaptureSize.CameraSize) {
            size = new Vector2(targetCamera.pixelWidth, targetCamera.pixelHeight);
        } else if (captureSize == CaptureSize.ScreenResolution) {
            size = new Vector2(Screen.currentResolution.width, Screen.currentResolution.height);
        }
        string path = Application.dataPath + "/" + savePath + fileName;
        saveTexture(path, capture(targetCamera, (int)size.x, (int)size.y));
    }

    /// <summary> 相机截图 </summary>
    /// <param name="camera">目标相机</param>
    public static Texture2D capture(Camera camera) {
        return capture(camera, Screen.width, Screen.height);
    }

    /// <summary> 相机截图 </summary>
    /// <param name="camera">目标相机</param>
    /// <param name="width">宽度</param>
    /// <param name="height">高度</param>
    public static Texture2D capture(Camera camera, int width, int height) {
        RenderTexture rt = new RenderTexture(width, height, 0);
        rt.depth = 24;
        rt.antiAliasing = 8;
        camera.targetTexture = rt;
        camera.RenderDontRestore();
        RenderTexture.active = rt;
        Texture2D texture = new Texture2D(width, height, TextureFormat.ARGB32, false, true);
        Rect rect = new Rect(0, 0, width, height);
        texture.ReadPixels(rect, 0, 0);
        texture.filterMode = FilterMode.Point;
        texture.Apply();
        camera.targetTexture = null;
        RenderTexture.active = null;
        Destroy(rt);
        return texture;
    }

    /// <summary> 保存贴图 </summary>
    /// <param name="path">保存路径</param>
    /// <param name="texture">Texture2D</param>
    public static void saveTexture(string path, Texture2D texture) {
        File.WriteAllBytes(path, texture.EncodeToPNG());
        #if UNITY_EDITOR
        Debug.Log("已保存截图到:" + path);
        #endif
    }

}

Éditeur de script :

CameraCaptureEditor.cs

using UnityEditor;
using UnityEngine;

/// <summary>
/// 相机截图 编辑器
/// <para>ZhangYu 2018-07-06</para>
/// </summary>
[CanEditMultipleObjects]
[CustomEditor(typeof(CameraCapture))]
public class CameraCaptureEditor : Editor {

    public override void OnInspectorGUI() {
        // 属性
        CameraCapture script = (CameraCapture)target;
        int selected = (int)script.captureSize;

        // 重绘GUI
        EditorGUI.BeginChangeCheck();
        drawProperty("targetCamera", "目标像机");
        string[] options = new string[] { "像机尺寸", "屏幕尺寸", "固定尺寸"};
        selected = EditorGUILayout.Popup("截图尺寸", selected, options, GUILayout.ExpandWidth(true));
        script.captureSize = (CameraCapture.CaptureSize)selected;
        if (script.captureSize == CameraCapture.CaptureSize.FixedSize) {
            drawProperty("pixelSize", "像素尺寸");
            EditorGUILayout.HelpBox("请保持正确的宽高比!\n否则截图区域可能出现错误。", MessageType.Info);
        }
        drawProperty("savePath", "保存路径");
        drawProperty("fileName", "文件名称");

        // 保存截图按钮
        bool isPress = GUILayout.Button("保存截图", GUILayout.ExpandWidth(true));
        if (isPress) script.saveCapture();
        if (EditorGUI.EndChangeCheck()) serializedObject.ApplyModifiedProperties();
    }

    private void drawProperty(string property, string label) {
        EditorGUILayout.PropertyField(serializedObject.FindProperty(property), new GUIContent(label), true);
    }

}

Article connexe :

Accès aux images de la caméra Vuforia Unity

Utilisation de Direct2D dans Unity

Vidéos associées :

Tutoriel de téléchargement d'images PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn