20200604のC#に関する記事は6件です。

DOTweenでカーブさせる

DOTween便利

 1週間ほど前にDOTween使い始めました。便利ですねこれ。
 ただ、ちょっと探した感じ、オブジェクトを円周上でカーブさせる方法が見つかりませんでした。パスをうまいことやるとそれっぽいことができるようですが、勉強がてら拡張メソッドを書いてみました。

できたやつ

DOCurveAroundAndRotateの実行の様子。Cylinderを中心にCubeが回転している。
docurve.gif

public static class DoTweenExt
{
    //centerを中心、axisを軸として、degree(度)回転する
    public static TweenerCore<float, float, FloatOptions> DOCurveAround(this Transform transform, Vector3 axis, Vector3 center, float degree, float duration)
    {
        var from = Vector3.negativeInfinity;
        return DOTween.To(() => 0, (x) =>
            {
                if (float.IsNegativeInfinity(from.x)) from = transform.position;
                transform.position = Quaternion.AngleAxis(x, axis) * (from - center) + center;
            },
            degree,
            duration
        );
    }

    //オブジェクトそのものも回転させる
    public static TweenerCore<float, float, FloatOptions> DOCurveAroundAndRotate(this Transform transform, Vector3 axis, Vector3 center, float degree, float duration)
    {
        var from  = Vector3.negativeInfinity;
        var fromRot = Vector3.zero;
        return DOTween.To(() => 0, (x) =>
            {
                if (float.IsNegativeInfinity(from.x))
                {
                    from = transform.position;
                    fromRot = transform.localEulerAngles;
                }
                var q = Quaternion.AngleAxis(x, axis);
                transform.position = q * (from - center) + center;
                transform.localEulerAngles = fromRot + q.eulerAngles;
            },
            degree,
            duration
        );
    }

    //使い方
    //(x,y,z)=(2,0,0)を中心に3秒かけて90度回転させる。
    //transform.DOCurveAround(Vector3.up, new Vector3(2, 0, 0), 90, 3);
}

解説

 みんな大好き、Toメソッドを使います。Toの使い方ですが、

DOTween.To(() => Vector3.zero, (x) => transform.position = x, new Vector3(3, 0, 0), 1);

 (0,0,0)から(3,0,0)に1秒かけて移動します。

DOTween.To(() => 0, (x) => transform.position = new Vector3(x,0,0), 3, 1);

 上と意味は同じですが、変化する値があくまでもプリミティブなfloatになってます。このfloatを角度にして、角度からposition、localEulerAnglesを割り出します。

 それがCurveAroundAndRotateの

var q = Quaternion.AngleAxis(x, axis);
transform.position = q * (from - center) + center;
transform.localEulerAngles = fromRot + q.eulerAngles;

 この部分です。まずはQuaternionを出します。そのQuaternionと回転させたいVector3を掛ければ、(0,0,0)を中心に回転します。fromは開始位置ですが、あくまでもこの関数が走り始める時点での位置です。変数初期化時にtransform.positionを入れてしまうと、Sequenceで動かすときにおかしくなってしまいます。
 角度も同様で、関数が走り出す時点でのeulerAnglesをfromRotにとっておきます。で、fromRotとさっきのQuaternionのeulerAnglesとを足したものを放り込みます。

所感

 Quaternionってすげー

 ※ CurveAroundAndRotateでオブジェクトの向きがうまく変わらないバグがありましたので、修正しました。(2020/6/5)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【C#】 ファイルの内容を削除

自己紹介

こんにちは。tetraです。
最近C#の学習を始めました。C#歴3ヶ月目の新卒エンジニアです。
ファイルを削除ではなく、ファイルの内容を削除するのはどうすればいいのかわからず時間を無駄にしたので作成します。

ファイルの削除

最初はデリートを押すなんて考えていましたが、ファイルサイズを0にすれば内容のみを削除できると考えました。
早速書いていきます。

sample.cs
using System.IO;
class sample
{
    static void Main()
    {
        using (var fileStream = new FileStream("./sample.txt", FileMode.Open))
        {
            fileStream.SetLength(0);
        }
    }
}

いかがでしょうか?

いかがでしょうか。経験が浅いため至らぬところがまだまだあります。
もし間違い等に気がつきましたら、コメント又はtetraまでお知らせください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【C#】テキストファイルを任意の行を読み込む

自己紹介

こんにちは。tetraです。
最近C#の学習を始めました。C#歴3ヶ月目の新卒エンジニアです。
任意の行で表示したくてもテキストファイルを上から順に読む処理が出てムカついたので新しく作成します。

ファイル読み込み

さっそく書いていきます。
1行目を出力しています。

sample.cs
using System;
using System.IO;
using System.Linq;

class sample
{
    static void Main()
    {
        // skipのパラメーターをいじると任意の行を指定できる
        int n = 0;
        string line = File.ReadLines("./sample.txt").Skip(n).First();
        Console.WriteLine(line);
    }
}

いかがでしょうか?

いかがでしょうか。経験が浅いため至らぬところがまだまだあります。
もし間違い等に気がつきましたら、コメント又はtetraまでお知らせください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

WinAppDriverでテスト自動化:操作別テストコード

WinAppDriverを使って、WindowsアプリのUIテストを自動化する。
環境構築手順や各操作の記述方法を以下にまとめる。

環境

  • Windows 10(開発者モード有効)
  • Visual Studio 2019

インストール

  1. WinAppDriverのインストーラをダウンロードする。
    https://github.com/microsoft/WinAppDriver/releases
  2. WinAppDriverをインストールする。
  3. Windows 10の開発者モードを有効にする。
  4. WinAppDriver.exeを実行する。
    C:\Program Files (x86)\Windows Application Driver\WinAppDriver.exe

テストコード作成

  1. Visual Studioで単体テストプロジェクトを作成する。
  2. Nugetパッケージマネージャーで「Appium.WebDriver」をインストールする。
  3. テストコードを作成する。
    ※注意: Appiumのバージョンによって、書き方が異なる。ネット上のサンプルプログラムの多くは3系である。Nugetパッケージマネージャーでインストールされるのは4系であるので、4系の書き方をすること。

テスト自動化

作成したテストコード
https://github.com/ysk-hello/WinAppDriverSample

Setup

3系
var appCapabilities = new DesiredCapabilities();
appCapabilities.SetCapability("app", @"C:\Ysk\WinAppDriverTest\WinAppDriverTest\bin\Debug\WinAppDriverTest.exe");
_session = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), appCapabilities);
4系
var options = new AppiumOptions();
options.AddAdditionalCapability("app", @"C:\Ysk\WinAppDriverTest\WinAppDriverTest\bin\Debug\WinAppDriverTest.exe");
_session = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), options);

操作別

左クリック

panelを左クリックすると、背景色が黄色に変わる。
click.gif

4系
var panel = _session.FindElementByAccessibilityId("panel1");
var actions = new Actions(_session);
actions.Click(panel);       // panel1をクリック
actions.Perform();      // 実行するために必要

ダブルクリック

4系
var panel = _session.FindElementByAccessibilityId("panel1");
var actions = new Actions(_session);
actions.DoubleClick(panel);     // panel1をダブルクリック
actions.Perform();

右クリック

panelを右クリックしてコンテキストメニューを表示する。
contextmenu.gif

4系
var panel = _session.FindElementByAccessibilityId("panel1");
var actions = new Actions(_session);
actions.ContextClick(panel);    // panel1を右クリック
actions.Perform();

actions.Click(_session.FindElementByName("Clear"));
actions.Perform();      // コンテキストメニューのClearをクリック

マウス操作

panel上をクリックしながらマウスカーソルを移動する。
mouse.gif

4系
var panel = _session.FindElementByAccessibilityId("panel2");

for (int i = 0; i < 10; i++)
{
    var actions = new Actions(_session);
    actions.MoveToElement(panel, i * 10, i * 10);       // マウスカーソルを移動
    actions.Click();        // クリック
    actions.Perform();

    Thread.Sleep(3000);
}

キー操作

textBoxに文字列を入力する。
key.gif

4系
var textBox = _session.FindElementByAccessibilityId("textBox1");

var actions = new Actions(_session);
actions.MoveToElement(textBox);     // textBox1にマウスカーソルを移動
actions.SendKeys("test");       // キーボードで"test"を入力
actions.Perform();

Thread.Sleep(3000);

スクリーンショット

起動した画面、デスクトップ全体のスクリーンショットをとる。

4系
var form = _session.FindElementByAccessibilityId("Form1");

// 起動するまで待つ
Thread.Sleep(1000);

var shot = form.GetScreenshot();
shot.SaveAsFile("form.png", ScreenshotImageFormat.Png);     // スクリーンショットを保存

var options = new AppiumOptions();
options.AddAdditionalCapability("app", "Root");
var deskSession = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), options);

shot = deskSession.GetScreenshot();
shot.SaveAsFile("desktop.png", ScreenshotImageFormat.Png);     // デスクトップ全体のスクリーンショットを保存

その他

起動済みのアプリにアタッチ

起動済みの画面にアタッチする。

4系
var options = new AppiumOptions();
options.AddAdditionalCapability("app", "Root");
var deskSession = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), options);     // デスクトップセッション

var window = deskSession.FindElementByName("Form1");
var windowHandle = window.GetAttribute("NativeWindowHandle");
windowHandle = (int.Parse(windowHandle)).ToString("x"); // Convert to Hex

var winOptions = new AppiumOptions();
winOptions.AddAdditionalCapability("appTopLevelWindow", windowHandle);
var session = new WindowsDriver<WindowsElement>(new Uri("http://127.0.0.1:4723"), winOptions);      // Form1のセッション

var panel = session.FindElementByAccessibilityId("panel1");     // panel1

var actions = new Actions(session);
actions.Click(panel);       // panel1をクリック
actions.Perform();

Thread.Sleep(3000);

希望の操作を自動化するために

  • キー操作、マウス操作を使って実現できないか検討する。
    例: ウィンドウの最小化: Windowsキー + ↓キー (Keys.Meta + Keys.Down)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

コーディング規約チェッカーを運用してみた使用感 (C#(Unity) JavaScript(CocosCreator), PHP(FuelPHP))

はじめに

コーディング規約を自動的にチェックしてくれるコーディング規約チェッカーは、
複数人で開発する際の可読性向上や各人の書き方の癖を平準化できる便利なものです。

コードレビュー等で生産性のない指摘をし合わないよう、
チェックはシステムにやってもらうというのはとても合理的。

一方で、規約に縛られた書き方を窮屈に感じたりすることもあると思います。
そこで、各開発環境における規約チェッカーを使ってみた所感を書き残します。

C# (Visual Studio)

規約チェッカーであるStyleCopは、
・プロジェクトにNuGetパッケージとしてインストール
・Visual Studioの拡張機能としてインストール

という2種類の方法があります。
前者が適用できるならそちらのほうがベターなようです。

・プロジェクトにNuGetパッケージとしてインストール

NuGetでインストールするとプロジェクト内に管理される形となり、
自動でチェックが走るため扱いやすいです。

また、NuGetではStyleCopの後継であるStyleCop.Analyzersが使用できるため、
その点でもオススメできる方法です。

規約のカスタマイズはソリューションにファイルを追加することで可能です。
https://anderson02.com/cs/cs-rules/cs-rules19/

・Visual Studioの拡張機能としてインストール

拡張機能としてインストールした場合はVisualStuioの右クリックメニューから、
「Run StyleCop」を選択することでファイルのチェックを走らせることができます。

規約のルール設定は右クリックメニューの「StyleCop Settings」からGUIで行うことができ、
編集結果はXMLファイル「Settings.StyleCop」として保存されるため、
このファイルをGitで共有するなどすれば、
チームでカスタマイズされたルールを共有できます。

Unityでの利用

Unityのプロジェクトで利用する場合、NuGetによる導入はやや煩雑です。
https://t-tutiya.hatenablog.com/entry/2019/11/07/200330

拡張機能のほうはテキストファイルを検査するだけなので、
Unityプロジェクトであっても、通常のC#プロジェクトと同様の使い方ができます。

Unityの場合は、とりあえず拡張機能のほうを使うのが現状は無難かと思います。

JavaScript (Visual Studio Code)

C#と違ってフレームワーク等により様々な書き方の流儀が存在するJavaScriptにおいては、
チェッカーもいくつかあり、それを適用するIDEも選択肢が多いため、
今回はVisual Studio Code + ESLintという組み合わせを選択しました。

npmでESLintパッケージをプロジェクトにインストールし、
Visual Studio Codeの拡張機能としてのESLintをインストールする、という流れです。
https://qiita.com/yohei_nakamura/items/4cf4876b3e36a46f3750

設定は「.eslintrc.json」というファイルに記述します。
npmのパッケージ設定とルールファイルをGitで共有することでチーム内でルールが共通化できる点については、StyleCopとほぼ同じです。

チェッカー本体とIDEの連携機能を別々にインストールする必要がある、という点がStyleCopとは異なります。
上手く動作しないときの原因切り分けが少々厄介です。

Cocos Creatorでの利用

Cocos Creatorで利用する場合であっても、C#のようにプログラム側にプロジェクトの概念がないため(単なるJavaScriptファイル群)、
Webサービス等でJavaScriptを使用する場合と同じ使い方ができます。

ただし、Cocos Creatorの形式(クラス定義型とか)とルールがマッチしない部分もあるので、
必要に応じてルールをカスタマイズする等の対応は必要になります。

PHP (Visual Studio Code)

PHPの場合もJavaScriptのように、複数のポリシーとIDEの組み合わせが想定されます。
今回はPHPの標準っぽさがあるPSR-2を使ってみました。

導入等は他記事を参照してください。
https://mseeeen.msen.jp/php-codesniffer-with-vscode/

PHPの場合、使用するフレームワークそのものが規約のような縛りがあったりするので、
ルールを調整して運用する必要がありそうです。

FuelPHPでの利用

FuelPHPでも、フレームワークでクラスの書き方(スネークケースで書くなど)等が決まっているので、パスカルケースを使うようなルールになっているとそれだけで正しくかけないといった問題が発生します。

FuelPHP準拠のルールを使用するか、PSR-2のようなルールをベースにフレームワークに合わせてカスタマイズしていくか、

いずれにしろ運用に工夫が必要になります。

おわりに 複数言語の比較

複数言語を比較してみると、言語やチェッカーの特性などが見えてきます。

C#は.NET Frameworkの統一感があるため、規約チェッカーを導入する場合もあれこれ悩む必要が
少なかったです。

Unityで公式に使えるようになると、もっといいですね。

JavaScriptとPHPは言語仕様が緩いことに加え、フレームワーク毎にまったく違う書き方があり、またエディタのデファクトも決定打がないため、様々な選択肢を試行錯誤する必要がありました。

カッコで改行するかどうか、など、細かいところも差異がでてくるため、しっかりと統一したルールを策定し、共有し、運用することが重要だと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プログラミング言語毎のコーディング規約チェッカー使用感 (C#(Unity) JavaScript(CocosCreator), PHP(FuelPHP))

はじめに

コーディング規約を自動的にチェックしてくれるコーディング規約チェッカーは、
複数人で開発する際の可読性向上や各人の書き方の癖を平準化できる便利なものです。

コードレビュー等で生産性のない指摘をし合わないよう、
チェックはシステムにやってもらうというのはとても合理的。

一方で、規約に縛られた書き方を窮屈に感じたりすることもあると思います。
そこで、各開発環境における規約チェッカーを使ってみた所感を書き残します。

C# (Visual Studio)

規約チェッカーであるStyleCopは、
・プロジェクトにNuGetパッケージとしてインストール
・Visual Studioの拡張機能としてインストール

という2種類の方法があります。
前者が適用できるならそちらのほうがベターなようです。

・プロジェクトにNuGetパッケージとしてインストール

NuGetでインストールするとプロジェクト内に管理される形となり、
自動でチェックが走るため扱いやすいです。

また、NuGetではStyleCopの後継であるStyleCop.Analyzersが使用できるため、
その点でもオススメできる方法です。

規約のカスタマイズはソリューションにファイルを追加することで可能です。
https://anderson02.com/cs/cs-rules/cs-rules19/

・Visual Studioの拡張機能としてインストール

拡張機能としてインストールした場合はVisualStuioの右クリックメニューから、
「Run StyleCop」を選択することでファイルのチェックを走らせることができます。

規約のルール設定は右クリックメニューの「StyleCop Settings」からGUIで行うことができ、
編集結果はXMLファイル「Settings.StyleCop」として保存されるため、
このファイルをGitで共有するなどすれば、
チームでカスタマイズされたルールを共有できます。

Unityでの利用

Unityのプロジェクトで利用する場合、NuGetによる導入はやや煩雑です。
https://t-tutiya.hatenablog.com/entry/2019/11/07/200330

拡張機能のほうはテキストファイルを検査するだけなので、
Unityプロジェクトであっても、通常のC#プロジェクトと同様の使い方ができます。

Unityの場合は、とりあえず拡張機能のほうを使うのが現状は無難かと思います。

JavaScript (Visual Studio Code)

C#と違ってフレームワーク等により様々な書き方の流儀が存在するJavaScriptにおいては、
チェッカーもいくつかあり、それを適用するIDEも選択肢が多いため、
今回はVisual Studio Code + ESLintという組み合わせを選択しました。

npmでESLintパッケージをプロジェクトにインストールし、
Visual Studio Codeの拡張機能としてのESLintをインストールする、という流れです。
https://qiita.com/yohei_nakamura/items/4cf4876b3e36a46f3750

設定は「.eslintrc.json」というファイルに記述します。
npmのパッケージ設定とルールファイルをGitで共有することでチーム内でルールが共通化できる点については、StyleCopとほぼ同じです。

チェッカー本体とIDEの連携機能を別々にインストールする必要がある、という点がStyleCopとは異なります。
上手く動作しないときの原因切り分けが少々厄介です。

Cocos Creatorでの利用

Cocos Creatorで利用する場合であっても、C#のようにプログラム側にプロジェクトの概念がないため(単なるJavaScriptファイル群)、
Webサービス等でJavaScriptを使用する場合と同じ使い方ができます。

ただし、Cocos Creatorの形式(クラス定義型とか)とルールがマッチしない部分もあるので、
必要に応じてルールをカスタマイズする等の対応は必要になります。

PHP (Visual Studio Code)

PHPの場合もJavaScriptのように、複数のポリシーとIDEの組み合わせが想定されます。
今回はPHPの標準っぽさがあるPSR-2を使ってみました。

導入等は他記事を参照してください。
https://mseeeen.msen.jp/php-codesniffer-with-vscode/

PHPの場合、使用するフレームワークそのものが規約のような縛りがあったりするので、
ルールを調整して運用する必要がありそうです。

FuelPHPでの利用

FuelPHPでも、フレームワークでクラスの書き方(スネークケースで書くなど)等が決まっているので、パスカルケースを使うようなルールになっているとそれだけで正しくかけないといった問題が発生します。

FuelPHP準拠のルールを使用するか、PSR-2のようなルールをベースにフレームワークに合わせてカスタマイズしていくか、

いずれにしろ運用に工夫が必要になります。

おわりに 複数言語の比較

複数言語を比較してみると、言語やチェッカーの特性などが見えてきます。

C#は.NET Frameworkの統一感があるため、規約チェッカーを導入する場合もあれこれ悩む必要が
少なかったです。

Unityで公式に使えるようになると、もっといいですね。

JavaScriptとPHPは言語仕様が緩いことに加え、フレームワーク毎にまったく違う書き方があり、またエディタのデファクトも決定打がないため、様々な選択肢を試行錯誤する必要がありました。

カッコで改行するかどうか、など、細かいところも差異がでてくるため、しっかりと統一したルールを策定し、共有し、運用することが重要だと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む