Gün 14: Birlikdən istifadə edərək bir tətbiq daxilində ekran görüntülərini necə çəkmək olar. - AR üçün dərsliklər

Bu yazıda hər hansı bir AR tətbiqi üçün Ekran görüntüsü qabiliyyətinin yaradılmasına baxacağıq. Əslində bu, qeyri-layihələr və tətbiqlər üzərində də işləyəcəkdir.

Hamımızın xüsusiyyət istəyi var idi və ya ekranın görüntülərini çəkmək üçün os qısa yollarından istifadə edən istifadəçilər əvəzinə tətbiqetməmizdə ekran görüntüsü almaq və onları birbaşa bölüşmək istəyirik. Bu təcrübəni başqaları ilə birbaşa bölüşmək üçün AR tətbiqetmələrində xüsusilə vacib olur.

Beləliklə, bu gün bir düymənin hərəkəti ilə ekran görüntülərini çəkə biləcək və ya öz dərslərinizdəki metodları çağıra biləcəyiniz Birlik daxilində hər hansı bir Gameobject-a əlavə edilə bilən bir yazı yazacağıq.

Başlamaq

Bu çarpaz platforma uyğun bir skript olacaq və Android, iOS və hətta masaüstü layihələrdə işləyəcək.

Ön şərtlər

  1. Birlik 2019.2.18f1.
  2. C # proqramlaşdırma və anlayış.

İcra

Keçirəcəyimiz yanaşma ixtiyari qətnamə ilə yüksək qətnamə ekran görüntülərini alacaq. Bir Texture2D yaratmaq üçün hər şeyi təqdim edən Unity MainCamera-dan istifadə edəcəyik. Daha sonra Texture2D .png-ə çevriləcək və yerli disk anbarında saxlanacaq.

Jpeg, jpg, xam və ppm kimi bir çox fayl formatını dəstəkləyəcəyik. Bunlar redaktorun özündən konfiqurasiya edilə bilər. Ayrıca serial görüntülərini çəkib onları birləşdirərək video yaratmaq üçün ppm formatından istifadə edə bilərsiniz.

ScreenCapture Dərsi

Əvvəlcə elan edilmiş dəyişənlər.

// Ekran görüntülərinizin qətnaməsini ictimai int ələ keçirməkWidth = 1920; ictimai int ələHeight = 1080; // xam, jpg, png və ya ppm (sadə xam format) ilə açıq format Format {RAW, JPG, PNG, PPM}; ictimai Format formatı = Format.JPG; // çıxışı yazmaq üçün qovluq (verilişə yol verilmir) xüsusi sətir çıxışıFolder; // screenshot xüsusi Rect rect üçün lazım olan özəl dəyişənlər; özəl RenderTexture renderTexture; özəl Texture2D screenShot;

Ekran görüntüsünü ələ keçirmək istədiyiniz hər hansı bir qətnamə təyin edə bilərsinizHeight və Width dəyişənləri ilə.

Diskə yazarkən həmin formata saxlamaq üçün redaktordan təyin edilmiş formatı istifadə edəcəyik.

Çıxış qovluğu tətbiqin quraşdırıldığı yerin PersistentDataPath qovluğu altında yaradılacaqdır. Bu hardware arasında dəyişəcəkdir.

Sonra, mövcud olmadığı təqdirdə yeni qovluq yaradaraq çıxış qovluğunuzu işə salaq. Başlat () metodunda edirik. Ekran görüntülərinin harada saxlanıldığını görə bilmək üçün çıxış yerini debug konsoluna yazdıracaq. Hər platforma yer qovluqlarını tapmaq üçün buradakı API-ə də baxa bilərsiniz.

// Kataloqun özəl boşluğunu başlamaq () {outputFolder = Application.persistentDataPath + "/ Ekran görüntüləri /"; əgər (! Directory.Exists (outputFolder)) {Directory.CreateDirectory (outputFolder); Debug.Log ("Saxla Yol Olacaq:" + çıxışFolder); }}

Sonrakı, yeni bir unikal fayl adını yaratmaq üçün köməkçi metodu.

şəxsi sətir CreateFileName (int genişliyi, int hündürlüyü) {// ekran görüntüsünə əlavə etmək üçün vaxt damğası = TarixTime.Now.ToString ("yyyyMMddTHHmmss"); // unikal sənəd üçün eni, boyu və zaman işarəsi var filename = string.Format ("{0} / screen_ {1} x {2} _ {3}. {4}", çıxışFolder, en, boy, zamanın işarəsi, format.ToString (). ToLower ()); // filename qayıt filename; }

Nəhayət, ilkin metod. Layihənizdə MainCamera etiketi ilə Kamera quraşdırılmasına əmin olun. Yoxsa, ayrıca Kamera obyektində də keçə bilərsiniz.

Şəxsi boşluq CaptureScreenshot () {isProcessing = true; // ekran görüntüsü obyektləri yaradır, əgər (renderTexture == null) {// rekt = yeni Rect (0, 0, elektWidth, captHeight) şəklində göstərilmək üçün ekran görüntüsünü yaradır; renderTexture = yeni RenderTexture (ələ keçirmə genişliyi, ələ keçirməHeight, 24); screenShot = yeni Texture2D (ələ keçirmə genişliyi, ələ keçirmə hündürlüyü, TextureFormat.RGB24, saxta); } // əsas kameranı əldə edin və nəticəsini Kamera kamerası = Camera.Main yuxarıda yaradılmış ekran görüntüsünə daxil edin. camera.targetTexture = renderTexture; kamera.Render (); // göstəriş toxumasını aktiv olaraq qeyd edin və cari piksel məlumatlarını Texture2D RenderTexture.active = renderTexture daxilində oxuyun; screenShot.ReadPixels (düz, 0, 0); // toxumaları yenidən qurun və görüntü toxumasını Kameradan çıxarın, çünki ekran məlumatlarını oxuyuram.targetTexture = null; RenderTexture.active = null; // filename sətirimizi almaq filename = CreateFileName ((int) rect.width, (int) rect.height); // göstərilən şəkil formatı üçün fayl başlığı / məlumat baytını almaq byte [] fileHeader = null; bayt [] fileData = null; // Format və ona əsaslanan kod qoyun, əgər (format == Format.RAW) {fileData = screenShot.GetRawTextureData (); } else if (format == Format.PNG) {fileData = screenShot.EncodeToPNG (); } else if (format == Format.JPG) {fileData = screenShot.EncodeToJPG (); } başqa // ppm faylları üçün {// bir fayl başlığı yaradın - ppm sənədləri string headerStr = string.Format ("P6 \ n {0} {1} \ n255 \ n", rect.width, rect.height); fileHeader = System.Text.Encoding.ASCII.GetBytes (headerStr); fileData = screenShot.GetRawTextureData (); } // əsas sistemdən qənaət yükləmək üçün yeni bir sistem yaradın yeni System.Threading.Thread (() => {var file = System.IO.File.Create (filename); if (fileHeader! = null) {sənəd. Yazın (fileHeader, 0, fileHeader.Length);} file.Write (fileData, 0, fileData.Length); file.Close (); Debug.Log (string.Format ("Ekran görüntüsü saxlandı {0}, ölçüsü {1}) ", filename, fileData.Length)); isProcessing = yalan;}). Start (); // Təmizləmə Destroy (renderTexture); renderTexture = null; screenShot = null; }

Daha sonra bu üsulu yeni TakeScreenshot () metodu ilə ifşa edirik.

ictimai boşluq TakeScreenShot () {əgər (! isProcessing) {CaptureScreenshot (); } başqa {Debug.Log ("Hal hazırda işlənir"); }}

Hal hazırda bir ekran görüntüsünü emal ediriksə, başqa birini götürmürük. Bu üsul birbaşa bir düymədən və ya başqa bir skript vasitəsilə çağırıla bilər.

Bu belədir!

Bu skripti saxla və səhnədəki hər hansı bir Gameobject-ə əlavə edin və konfiqurasiya edin.

Zəhmət olmasa suallarınız və ya düşüncələrinizlə aşağıda şərh verin və mən ASAP-a cavab verəcəm.

Əvvəlcə https://tutorialsforar.com saytında 1 mart 2020 tarixində yayımlandı.