#実現したいこと
デスクトップマスコットをUnityをベースに作成したい。
透過部分のマウスの挙動は下のウィンドウに反応するようにしたい。
実装はできたがRenderTextureからSystem.Drawing.Imageへの変換処理が重いためできるだけ軽くしたい。
またUnityベースのデスクトップマスコットで同じ挙動の他の方法があれば教えて頂けると幸いです。
#実装
FormCaller.csでTransParentForm.csを呼び、FormCaller.csのOnPostRenderで更新されたRenderTextureを一度Texture2Dに変換し、さらにEncodeToPNGで.pngに変換し、それをSystem.Drawing.ImageのBitmapに変換している。
Profilerを見るとEncodeToPNGが一番重い処理のようでできれば使いたくない。またTexture2Dへの変換でもReadPixelsを使っている。重いのでこれも使いたくない。
できればRenderTextureを一発でBitmapに変換したい。
以下にFormCaller.csとTransParentForm.csとProfilerのスクショを記載する。
cs
1using System.Drawing; 2using System.IO; 3using UnityEngine; 4public class FormCaller : MonoBehaviour 5{ 6 [SerializeField] Vector2 Size; 7 [SerializeField] RenderTexture renderTexture; 8 [SerializeField] Camera mainCam; 9 public System.Drawing.Bitmap Image2paint; 10 TransparentForm f; 11 void Start () 12 { 13 f = new TransparentForm (renderTexture, mainCam); 14 } 15 void OnPostRender () 16 { 17 Texture2D Tex2Paint = new Texture2D (renderTexture.width, renderTexture.height); 18 Tex2Paint.ReadPixels (new Rect (0, 0, renderTexture.width, renderTexture.height), 0, 0); 19 Tex2Paint.Apply (); 20 var img2Paint = new Bitmap (renderTexture.width, renderTexture.height); 21 MemoryStream memoryStream = new MemoryStream (); 22 var img = Tex2Paint.EncodeToPNG (); 23 memoryStream.Write (img, 0, img.Length); 24 25 Image2paint = new System.Drawing.Bitmap (memoryStream); 26 f.Image2paint = Image2paint; 27 } 28 void OnDisable () 29 { 30 f.Close (); 31 } 32}
cs
1using System.Collections; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Drawing; 5using System.IO; 6using System.Windows.Forms; 7using UnityEngine; 8 9public class TransparentForm : Form 10{ 11 RenderTexture tex; 12 public System.Drawing.Bitmap Image2paint; 13 Point mousePoint; 14 public TransparentForm (RenderTexture Rendertex, Camera main) 15 { 16 tex = Rendertex; 17 main.targetTexture = tex; 18 19 this.SetStyle (ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw, true); 20 this.SetBounds (0, 0, tex.width, tex.height); 21 22 this.BackColor = System.Drawing.Color.Black; 23 this.TransparencyKey = System.Drawing.Color.Black; 24 this.FormBorderStyle = FormBorderStyle.None; 25 this.TopMost = true; 26 27 this.MouseDown += new MouseEventHandler (Form1_MouseDown); 28 this.MouseMove += new MouseEventHandler (Form1_MouseMove); 29 30 this.Show (); 31 } 32 protected override void OnPaint (PaintEventArgs e) 33 { 34 base.OnPaint (e); 35 e.Graphics.DrawImage (Image2paint, 0, 0, tex.width, tex.height); 36 this.Invalidate (); 37 } 38 private void Form1_MouseDown (object sender, 39 System.Windows.Forms.MouseEventArgs e) 40 { 41 if ((e.Button & MouseButtons.Left)== MouseButtons.Left) 42 { 43 mousePoint = new Point (e.X, e.Y); 44 } 45 } 46 47 private void Form1_MouseMove (object sender, 48 System.Windows.Forms.MouseEventArgs e) 49 { 50 if ((e.Button & MouseButtons.Left)== MouseButtons.Left) 51 { 52 this.Left += e.X - mousePoint.X; 53 this.Top += e.Y - mousePoint.Y; 54 } 55 } 56}
#試したこと
EncodeToPNGをEncodeToJPGに変えてみたがノイズが発生するため不採用。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。