20210426のC#に関する記事は10件です。

【C#】画像をグレースケールに変換する

はじめに 以前に画像の差分を得るプログラムを作成しましたが、今回は既存のカラー画像をグレースケールに変換するコードを作ってみました。 作成したコード 今回は「0~255で表されるR/G/Bの値の平均値を使って画像をグレースケールにする」という最も単純な方法(というよりも独自の方法?)にしました。 カラーをグレースケールに変換するには本来複雑な計算式が必要なのですが、今回は便宜的にR/G/Bの平均値を用いました。 何となくグレーになっていればOK...ということにしておきました。 GrayConverter.cs using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CSharpStudy.Image { /// <summary> /// 画像をグレースケールに変換するクラス。 /// </summary> public class GrayConverter { /// <summary> /// 指定した画像をグレースケールに変換する。 /// </summary> /// <param name="bmpPath">変換する画像のファイルパス。</param> /// <param name="path">グレースケール画像の保存先となるファイルパス。</param> public void ToGrayScale(string bmpPath, string path = @".\gray_image.png") { // 画像を比較する際に「大きい方の画像」のサイズに合わせて比較する。 Bitmap bmp = new Bitmap(bmpPath); int width = bmp.Width; int height = bmp.Height; Bitmap grayBmp = new Bitmap(width, height); // グレースケールの画像。 // 全ピクセルを1つずつグレースケールに変換する。 for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { try { // NTSC規格などに準拠せず、RGB値の平均値をグレースケールに変える。 // https://dobon.net/vb/dotnet/graphics/grayscale.html Color pixelColor = bmp.GetPixel(i, j); byte grayScale = Convert.ToByte((pixelColor.R + pixelColor.G + pixelColor.B) / 3); // RGBだけでなく、アルファ値もセットする。 Color grayColor = Color.FromArgb(pixelColor.A, grayScale, grayScale, grayScale); grayBmp.SetPixel(i, j, grayColor); } catch { System.Console.Error.WriteLine("(" + i + "," + j + ")ピクセルでエラーが発生しました。"); } } } grayBmp.Save(path, ImageFormat.Png); return; } } } 実行用のテストコード GrayConverterTest.cs using System; using System.Text; using System.Collections.Generic; using Microsoft.VisualStudio.TestTools.UnitTesting; using CSharpStudy.Image; namespace CSharpStudyTest { /// <summary> /// GrayConverterクラスのテストコード /// </summary> [TestClass] public class GrayConverterTest { private const string BITMAP1_PATH = @"C:\Users\NKOJIMA\source\repos\CSharpStudy\CSharpStudy\Image\cat1.png"; private const string GRAY_IMG_PATH = @"C:\Users\NKOJIMA\source\repos\CSharpStudy\CSharpStudy\Image\gray_image.png"; [TestMethod] public void TestMethod1() { GrayConverter gConverter = new GrayConverter(); gConverter.ToGrayScale(BITMAP1_PATH, GRAY_IMG_PATH); } } } 処理結果 入力画像を一応グレースケールで出力させることには成功しました。 処理に使った画像 処理結果の画像 参考URL 【C#】2つの画像の差分を得る(Bitmap) 画像をグレースケールに変換して表示する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C# Selenium ボタン名でクリック

1.ボタン名でクリック CssSelectorを使用すると、forループ等をせずにエレメントを見つけられます。 <input type="submit" value="登録" /> C#.cs driver.FindElement(By.CssSelector("input[value='登録']")).Click() または driver.FindElement(By.CssSelector("input[value='登録']")).Submit()
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Selenium ボタン名でクリック

1.ボタン名でクリック CssSelectorを使用すると、forループ等をせずにエレメントを見つけられます。 HTML.html <input type="submit" value="登録" /> C#.cs driver.FindElement(By.CssSelector("input[value='登録']")).Click(); または driver.FindElement(By.CssSelector("input[value='登録']")).Submit(); Java.java driver.findElement(By.cssSelector("input[value='登録']")).click(); または driver.findElement(By.cssSelector("input[value='登録']")).submit(); Python.py driver.find_element_by_css_selector("input[value='登録']").click() または driver.find_element_by_css_selector("input[value='登録']").submit()
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Selenium ボタンの表示文字列でクリック

1.ボタン名(ボタンの表示文字列)でクリック CssSelectorを使用すると、forループ等をせずに表示文字列等でエレメントを見つけられます。 HTML.html <input type="submit" value="登録" /> C#.cs driver.FindElement(By.CssSelector("input[value='登録']")).Click(); または driver.FindElement(By.CssSelector("input[value='登録']")).Submit(); Java.java driver.findElement(By.cssSelector("input[value='登録']")).click(); または driver.findElement(By.cssSelector("input[value='登録']")).submit(); Python.py driver.find_element_by_css_selector("input[value='登録']").click() または driver.find_element_by_css_selector("input[value='登録']").submit() 記述方法は異なりますが、XPathで同じことができます。 C#.cs driver.FindElement(By.XPath("//input[@value='登録']")).Click(); または driver.FindElement(By.XPath("//input[@value='登録']")).Submit(); Java.java driver.findElement(By.xpath("//input[@value='登録']")).click(); または driver.findElement(By.xpath("//input[@value='登録']")).submit(); Python.py driver.find_element_by_xpath("//input[@value='登録']").click() または driver.find_element_by_xpath("//input[@value='登録']").submit() XPathの参考:Seleniumで要素を選択する方法まとめ - Qiita
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C#でスクレイピングしてみた

お題目 これまでVBAでスクレイピングしていたが、ただいま勉強しているC#でもスクレイピングできるということで、サクッとやってみた。 その備忘録になります。 0. まずディレクトリ作成 mkdir testScraping cd testScraping 1. 次にプロジェクトを作成、AngleSharpのNugetをセッティング dotnet new console dotnet add package AngleSharp --version 1.0.0-alpha-827 2. 次に言語のバージョンをプレビューを追記 (正直、理由は分かってません、涙) この行追加、の1行を追記してください testScraping.csproj <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net5.0</TargetFramework> <LangVersion>preview</LangVersion> <!-- この行追加 --> </PropertyGroup> <ItemGroup> <PackageReference Include="AngleSharp" Version="1.0.0-alpha-827" /> </ItemGroup> </Project> 3. ソースコード記入 次はもう下記のソースコードをProgram.csにまるまるコピペで大丈夫です Program.cs using System; using AngleSharp; using AngleSharp.Html.Parser; using System.Net; using System.Threading.Tasks; // 参照サイト // https://qiita.com/okazuki/items/a4eb94f608bbc26c6a5f // https://usefuledge.com/csharp-webscraping-anglesharp.html var urlstring = "https://www.yahoo.co.jp/"; WebClient wc = new WebClient(); try { string htmldocs = wc.DownloadString(urlstring); // Console.WriteLine(htmldocs); var config = Configuration.Default; var context = BrowsingContext.New(config); var document = await context.OpenAsync(req => req.Content(htmldocs)); // Console.WriteLine(document.Title); // foreach (var item in document.QuerySelectorAll("h1.thumb")) foreach (var item in document.QuerySelectorAll("section#tabpanelTopics1 li")) { Console.WriteLine(item.TextContent.Trim()); } } catch (System.Exception) { throw; } 4. 結果 そのスクレイピングの結果が 現時点のYahooが です。 簡単ですね。 タグを構造的に指定したい場合は半角スペースで仕切れば大丈夫みたいです。document.QuerySelectorAll("section#tabpanelTopics1 li") がそうですね。 もう少し複雑なスクレイピングにもトライしたいと思います。 〜おわり〜
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【C#】文字列の全角文字を半角文字に変換

ソースコード FullWidthToHalfWidthConverter.cs using System.Collections.Generic; using System.Linq; using System.Text; public class FullWidthToHalfWidthConverter { private Encoding encoding = Encoding.GetEncoding("Shift_JIS"); private Dictionary<char, char> FullWidthToHalfWidthDictionary = new Dictionary<char, char> { { 'ー','-'}, { '「','['}, { '」',']'}, { '、',','}, { '。','.'}, { '・','/'}, }; private const int FullWidthHalfWidthDifference = 65248; private const int StartFullWidthCharSetByte = 65281; private const int EndFullWidthCharSetByte = 65374; public string Convert(string text) { string output = ""; foreach (int c in text) { if (StartFullWidthCharSetByte <= c && c <= EndFullWidthCharSetByte) { output += (char)(c - FullWidthHalfWidthDifference ); continue; } if (FullWidthToHalfWidthDictionary.Keys.Any(k => (int)k == c)) { output += FullWidthToHalfWidthDictionary[(char)c]; continue; } output += (char)c; } return output; } public bool IsHalfWidth(string text) { return text.Length == encoding.GetByteCount(text); } } 説明 半角英数字は文字コードの差を使用して変換、キーボードの日本語記号はDictionaryで変換しています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ゲームパッド入力変換用ブリッジ

Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Text.Json; using Microsoft.Web.WebView2.WinForms; //thx //https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-input //https://qiita.com/kob58im/items/5a9d909377272d74eefd //https://www.it-swarm-ja.com/ja/c%23/user32dll%e3%81%aesendinput%e3%82%92%e4%bb%8b%e3%81%97%e3%81%a6%e3%82%ad%e3%83%bc%e3%82%92%e9%80%81%e4%bf%a1%e3%81%99%e3%82%8b/1068919389/ namespace Gamepad { public class InputStructures { [DllImport("user32.dll", SetLastError = true)] public extern static int SendInput(int length, ref InputEvent events, int size); [DllImport("user32.dll", EntryPoint = "MapVirtualKeyA")] public extern static int MapVirtualKey(int wCode, int wMapType); public const int MOUSEEVENTF_MOVE = 0x01; public const int MOUSEEVENTF_LEFTDOWN = 0x02; public const int MOUSEEVENTF_LEFTUP = 0x04; public const int MOUSEEVENTF_RIGHTDOWN = 0x08; public const int MOUSEEVENTF_RIGHTUP = 0x10; public const int MOUSEEVENTF_MIDDLEDOWN = 0x20; public const int MOUSEEVENTF_MIDDLEUP = 0x40; public const int KEYEVENTF_KEYUP = 0x02; public const int MAPVK_VK_TO_VSC = 0; [StructLayout(LayoutKind.Sequential)] public struct InputEvent{ public int Type; public InputUnion Data; } [StructLayout(LayoutKind.Explicit)] public struct InputUnion{ [FieldOffset(0)] public MouseInput Mouse; [FieldOffset(0)] public KeyboardInput Keyboard; } [StructLayout(LayoutKind.Sequential)] public struct MouseInput{ public int X; public int Y; public int MouseData; public int Flags; public int Time; public IntPtr ExtraInfo; } [StructLayout(LayoutKind.Sequential)] public struct KeyboardInput{ public short VirtualKey; public short ScanCode; public int Flags; public int Time; public IntPtr ExtraInfo; } } [ComVisible(true)] public class Bridge : InputStructures { public class ControllerEvent{ public string type { get; set; } public string key { get; set; } public int button { get; set; } public float x { get; set; } public float y { get; set; } } public void dispatch(string s){ var e = JsonSerializer.Deserialize<ControllerEvent>(s); switch(e.type){ case "mousemove": SendMouseMove(e); break; case "mousedown": SendMouse(e); break; case "mouseup": SendMouse(e); break; case "keydown": SendKeyboard(e); break; case "keyup": SendKeyboard(e); break; } } static readonly Dictionary<string,object> flag = new Dictionary<string,object>(){ {"keydown", 0}, {"keyup", KEYEVENTF_KEYUP}, {"mousemove", MOUSEEVENTF_MOVE}, {"mousedown", new []{ MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_MIDDLEDOWN, MOUSEEVENTF_RIGHTDOWN, }}, {"mouseup", new []{ MOUSEEVENTF_LEFTUP, MOUSEEVENTF_MIDDLEUP, MOUSEEVENTF_RIGHTUP, }} }; static void SendMouseMove(ControllerEvent e){ var v = new InputEvent(){Type = 0}; v.Data.Mouse = new MouseInput(){ Flags = (int)flag[e.type], X = (int)Math.Round(e.x), Y = (int)Math.Round(e.y), }; SendInput(1, ref v, Marshal.SizeOf(v)); } static void SendMouse(ControllerEvent e){ var v = new InputEvent(){Type = 0}; v.Data.Mouse = new MouseInput(){ Flags = (int)(flag[e.type] as int[])[e.button] }; SendInput(1, ref v, Marshal.SizeOf(v)); } static void SendKeyboard(ControllerEvent e){ if (Keys.TryParse(e.key, out Keys k)){ var v = new InputEvent(){Type = 1}; v.Data.Keyboard = new KeyboardInput(){ VirtualKey = (short)k, ScanCode = (short)MapVirtualKey((int)k,MAPVK_VK_TO_VSC), Flags = (int)flag[e.type], }; SendInput(1, ref v, Marshal.SizeOf(v)); } } } public class Browser : Form { public Browser(string html){ ClientSize = new System.Drawing.Size(600,400); Text = "Gamepad"; var v = new WebView2(){ Source = new Uri(GetPath()+"\\"+html), Size = ClientSize, }; v.NavigationCompleted += (s,e) => v.CoreWebView2.AddHostObjectToScript("bridge",new Bridge()); SizeChanged += (s,e) => v.Size = ClientSize; Controls.Add(v); } private static string GetPath(){ var p = System.Diagnostics.Process.GetCurrentProcess(); return System.IO.Path.GetDirectoryName(p.MainModule.FileName); } } static class Program { [STAThread] static void Main() { Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Browser("Gamepad.html")); } } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ゲームパッド・ブリッジ

Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Text.Json; using Microsoft.Web.WebView2.WinForms; //thx //https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-input //https://qiita.com/kob58im/items/5a9d909377272d74eefd //https://www.it-swarm-ja.com/ja/c%23/user32dll%e3%81%aesendinput%e3%82%92%e4%bb%8b%e3%81%97%e3%81%a6%e3%82%ad%e3%83%bc%e3%82%92%e9%80%81%e4%bf%a1%e3%81%99%e3%82%8b/1068919389/ namespace Gamepad { public class InputStructures { [DllImport("user32.dll", SetLastError = true)] public extern static int SendInput(int length, ref InputEvent events, int size); [DllImport("user32.dll", EntryPoint = "MapVirtualKeyA")] public extern static int MapVirtualKey(int wCode, int wMapType); public const int MOUSEEVENTF_MOVE = 0x01; public const int MOUSEEVENTF_LEFTDOWN = 0x02; public const int MOUSEEVENTF_LEFTUP = 0x04; public const int MOUSEEVENTF_RIGHTDOWN = 0x08; public const int MOUSEEVENTF_RIGHTUP = 0x10; public const int MOUSEEVENTF_MIDDLEDOWN = 0x20; public const int MOUSEEVENTF_MIDDLEUP = 0x40; public const int KEYEVENTF_KEYUP = 0x02; public const int MAPVK_VK_TO_VSC = 0; [StructLayout(LayoutKind.Sequential)] public struct InputEvent{ public int Type; public InputUnion Data; } [StructLayout(LayoutKind.Explicit)] public struct InputUnion{ [FieldOffset(0)] public MouseInput Mouse; [FieldOffset(0)] public KeyboardInput Keyboard; } [StructLayout(LayoutKind.Sequential)] public struct MouseInput{ public int X; public int Y; public int MouseData; public int Flags; public int Time; public IntPtr ExtraInfo; } [StructLayout(LayoutKind.Sequential)] public struct KeyboardInput{ public short VirtualKey; public short ScanCode; public int Flags; public int Time; public IntPtr ExtraInfo; } } [ComVisible(true)] public class Bridge : InputStructures { public class ControllerEvent{ public string type { get; set; } public string key { get; set; } public int button { get; set; } public float x { get; set; } public float y { get; set; } } public void dispatch(string s){ var e = JsonSerializer.Deserialize<ControllerEvent>(s); switch(e.type){ case "mousemove": SendMouseMove(e); break; case "mousedown": SendMouse(e); break; case "mouseup": SendMouse(e); break; case "keydown": SendKeyboard(e); break; case "keyup": SendKeyboard(e); break; } } static readonly Dictionary<string,object> flag = new Dictionary<string,object>(){ {"keydown", 0}, {"keyup", KEYEVENTF_KEYUP}, {"mousemove", MOUSEEVENTF_MOVE}, {"mousedown", new []{ MOUSEEVENTF_LEFTDOWN, MOUSEEVENTF_MIDDLEDOWN, MOUSEEVENTF_RIGHTDOWN, }}, {"mouseup", new []{ MOUSEEVENTF_LEFTUP, MOUSEEVENTF_MIDDLEUP, MOUSEEVENTF_RIGHTUP, }} }; static void SendMouseMove(ControllerEvent e){ var v = new InputEvent(){Type = 0}; v.Data.Mouse = new MouseInput(){ Flags = (int)flag[e.type], X = (int)Math.Round(e.x), Y = (int)Math.Round(e.y), }; SendInput(1, ref v, Marshal.SizeOf(v)); } static void SendMouse(ControllerEvent e){ var v = new InputEvent(){Type = 0}; v.Data.Mouse = new MouseInput(){ Flags = (int)(flag[e.type] as int[])[e.button] }; SendInput(1, ref v, Marshal.SizeOf(v)); } static void SendKeyboard(ControllerEvent e){ if (Keys.TryParse(e.key, out Keys k)){ var v = new InputEvent(){Type = 1}; v.Data.Keyboard = new KeyboardInput(){ VirtualKey = (short)k, ScanCode = (short)MapVirtualKey((int)k,MAPVK_VK_TO_VSC), Flags = (int)flag[e.type], }; SendInput(1, ref v, Marshal.SizeOf(v)); } } } public class Browser : Form { public Browser(string html){ ClientSize = new System.Drawing.Size(600,400); Text = "Gamepad"; var v = new WebView2(){ Source = new Uri(GetPath()+"\\"+html), Size = ClientSize, }; v.NavigationCompleted += (s,e) => v.CoreWebView2.AddHostObjectToScript("bridge",new Bridge()); SizeChanged += (s,e) => v.Size = ClientSize; Controls.Add(v); } private static string GetPath(){ var p = System.Diagnostics.Process.GetCurrentProcess(); return System.IO.Path.GetDirectoryName(p.MainModule.FileName); } } static class Program { [STAThread] static void Main() { Application.SetHighDpiMode(HighDpiMode.SystemAware); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Browser("Gamepad.html")); } } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【C#、Unity】簡単にプリプロセッサをつかってみよう

プリプロセッサというものをご存じだろうか。 #regionなんかは、変数を綺麗にまとめられる、ということで知っている人もいるかもしれないが、簡単に言うとそういった#~と始まる物たちのことだ。 環境:Visual Studio 2019、Unity 2020 きっかけ たまたまC# の本を眺めてた際に、#if、#elseなんて文字を見つけた。 ・・・ifじゃないのん?#ってなんやねん!! ってことで調べてみたところ、記事が少なかったように感じたので、同じく疑問に思った人も使えるようにと思い書いてみた。 プリプロセッサとは では、プリプロセッサとは何か。 プリプロセッサと調べてみると、以下のような説明が出てきたが、正直小難しくて何言ってるかわからん!!ってなる人は、コンパイルよりも前に行われる、コードのデバッグや可読性が向上する程度に覚えておいてもらえればいいと思う。 条件付きコンパイルや、VS.NETでの表示領域の制御などを処理するプリプロセッサ。 ... プリプロセッサは、ソース・コードをコンパイルする前に、前処理を行う機能である。 これにより、ソース・コードでは表現しがたい多くの便利な機能が実現されている。 例えば、テストやデバッグ時には便利な、条件付きコンパイルなどが利用できる https://www.atmarkit.co.jp/ait/articles/0301/08/news002.html で、結局どんなことが出来るのか。 要はデバッグ時のコードはこっち、本番ではこっちのコードを使う~っといったようにコードを状況によって使い分けることが出来るのだ。 #define #defineはシンボルを定義する。 まあ、シンボルってなんぞや。定義?って感じだと思うが、簡単に言ってしまえばプリプロセッサで使う用の変数みたいなものという認識でいいと思う。 これ自体に意味はなく、後で使う#ifや#elseなんかと組み合わせて使う。 #defineを使うときは以下のように書く。 //このように先頭に定義する。 #define Test1 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //ーーーーー 略 ーーーーーー usingよりも上、つまりコードの一番上で定義しなくちゃいけないのが注意。 ※以降、定義した物をシンボルと記述しています(上のコードだとTest1のこと)。 #undef シンボルをソースコード上で無効にする。 これも#define同様、コードの先頭で定義しなければいけない。 #undefを使うときは以下のように書く。 //このように先頭に定義する。 #undef Test1 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; //ーーーーー 略 ーーーーーー #ifシリーズ これは通常のif文と同じだ。 シンボルの有無によってコンパイルする部分を指定することが出来る。 #if、#elif、#else、#endifの4つがあり、それぞれ以下のような内容になっている。 #if・・・通常のif文と同じくシンボルがあるか確認する。||や&&も使える。 #elif・・・else ifと同じ。ifが違った場合にさらに条件分岐したい場合に使う。 #else・・・通常のelseと同じ。ifの条件が違った場合に入る。 #endif・・・if文がここまでですよーという宣言。これが無ければエラーになる。 例 #define TEST #define AA #define BB using UnityEngine; public class Test : MonoBehaviour { void Start() { #if TEST//TESTがあるかどうか //ここに入る #elif GG//else ifと同じ //ここには入らない。 #else//elseと同じ //ここには入らない。 #endif//if文がここまでという宣言。 } } #region 最初でも少し触れたが、#regionを使用すると、コードの領域分けが出来る。 領域分けってなんぞや?って人のために簡単に説明すると、メソッドなんかを閉じたり開いたりできる-を自分で好きな位置に作れるということだ。 (説明下手ですみません・・・) 使い方は簡単で、#regionで開始位置を指定して、#endregionで終了する。 例 #region int a; int b; int c; #endregion int d; int e; //↓ //こんな感じに閉じることが出来る。 #region int d; int e; Conditional属性 Conditional属性は、メソッドをコンパイルするかどうかを指定することが出来る。 簡単に言ってしまうと、処理は#ifで分けてたのに対して、メソッドはConditional属性を書くだけで実行するかどうか指定できる。 又、Conditional属性を使用する際には、以下のような条件がある。 ・using System.Diagnostics;が存在する。 ・戻り値がvoidであること ・オーバーライドしていないこと。 例 #define TEST //必要 using System.Diagnostics; public class Test { [Conditional("TEST")] void TES() { //TESTが存在する際に実行される処理 } //戻り値がvoidじゃない為、エラーになる [Conditional("TEST")] int TESInt() { } } 最後に(Unityでの使用) 以上がだいたいのC#におけるプリプロセッサだ。 プリプロセッサはデバッグなどにおいては、非常に使い勝手がいいので徐々に開発にも取り入れていきたい。 又、実はUnityにはあらかじめ幾つかのシンボルが定義されており、buildやeditorでのコードのコンパイル分けなどが出来るようになっている。 Unityのシンボル一覧 https://docs.unity3d.com/ja/2018.4/Manual/PlatformDependentCompilation.html 以下参考にさせていただいたサイト様 https://programming.pc-note.net/csharp/preprocess.html
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】アスペクト比維持してUIのimageをCanvasにフィットさせる

1 「Canvasにフィットさせる」とは? imageのUIを、元の画像のアスペクト比そのまま、はみ出ないようにピッタリに、というイメージ。 Rect Transformを弄ってもできることはできるのだが、それだとimageがCanvasめいっぱい覆う感じになってしまうので、もう少し端に寄ってもらう方法とかないかな、と考えた次第。 2 スクリプトですべて解決 色々とインスペクター弄るの面倒なので、アタッチして実行したら即完成するスクリプトを作った。 より詳細な使い方、応用的な活用方法などは、こちらの記事にまとめてます。 ImageSizeManager.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class ImageSizeManager : MonoBehaviour { private float scaleRate; // Start is called before the first frame update void Start() { this.GetComponent().preserveAspect = true; this.GetComponent().SetNativeSize(); Vector2 CanvasSize = transform.root.GetComponent().sizeDelta; Vector2 ThisImageSize = this.GetComponent().sizeDelta; if(CanvasSize.x<CanvasSize.y) { scaleRate = CanvasSize.x / ThisImageSize.x; } else { scaleRate = CanvasSize.y / ThisImageSize.y; } this.GetComponent<RectTransform>().localScale = new Vector3(scaleRate, scaleRate, 1); } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む