20200116のC#に関する記事は4件です。

【unity】questで動くbloomを実装したい

スクリーンショット 2020-01-16 22.46.31.png


TL;DR

  • 上の写真のような、ぼかしのかかった(?)物体を作りたいです
  • ググると「postprocessing」という手法が出てくるのですが、クエストだと重くて使えません
  • FastMobileBloomという天才アセットを使ってみました

はじめに

  • 日本語の実装記事がなさそうだったので。
  • また、unityの基本的な操作は触れませんが、やること自体簡単だと思います
  • 2020/1/16の記事です。

やったこと

こちらからアセットをインポートします。
3692a6b0-cd09-4e4e-b94b-20fe0e8db35f.jpg
これですね。

FastMobileBloomの中身はこんな感じです。(2020年1月現在)

FastMobileBloom
┣ FastMobileBloom.cs
┣ FastMobileBloom.shader
┣ FastMobileBloom.mat
┣ readme
┗ testscene/
  ┣ Hotel/
  ┣ Hotel.unity
  ┣ Materials/
  ┗ Neon_light.fbx

Hotel.unityを開くとイメージがつかみやすいです。

...で、開けてみてびっくりです。
なんと、cameraオブジェクトの「add component」で「FastMobileBloom」を追加するだけでした
(postprocessingよりもかなり楽)
スクリーンショット 2020-01-16 22.48.12.png
↑こんな感じで追加すればいいだけです。

before
スクリーンショット 2020-01-16 22.47.59.png

after
スクリーンショット 2020-01-16 22.46.31.png

プロパティで変更できる
thresholdやintensityは、自分で値をいじってみるとわかりやすく変化するので、説明することがないです。

素晴らしいですね。(中身ない記事になりすぎて困惑している)

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

C#で一番短いトグルの書き方

Toggle.cs
    public void BtnAction()
    {
        flg = !flg;
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

F#とは「無血」で「人民の人民による人民のためのプログラム」の書ける「希少」で「高速」な言語です。

F#を知ってますか?

F#は.net系言語です。.netで有名なのはC#ですが、それを知るためには、C,C++,Java,VB,Pythonを知る必要があります。そのうち、手続き型(構造化プログラム)としてはC,VBが有名でオブジェクト指向はJavaやC++やPythonが有名です。また型付けの面ではC,C++,VBは比較的弱い型付け(明示的なキャストが不要)で,JavaやPythonは比較的強い型付けです(明示的なキャストが必要)。C#はオブジェクト指向で比較的強い型付けです。C#はC++という直接OSやハードウェアを操作できるという特性を捨て見やすいコードを作ったことによりC++の生ポインタによる血生臭さを捨てることができましたが、ポインタによる副作用の排除を捨てた(変更できる生の値を副作用という)ことにより生の値を操作することが多くなりました。C++はCよりも副作用の原因となる部分は少ないのでCより大規模開発が向いている(Cよりモジュールが小さいので副作用のない関数を定義しやすい/副作用の温床である#defineを使わなくていいtemplateやinline等,コンストラクタがあるので初期値の不定値という副作用ができづらい)ため最近では組み込み系でも多く使われています。

ex.cpp
#include<iostream>
using namespace std;

void sum (int* eroge,int* eroge2)
{
    (*eroge) +=  (*eroge2);
}

int main(void)
{
    int eroge = 5;
    int eroge2 = 3;
    sum(&eroge, &eroge2);
    cout << eroge; //8
    return NULL;
}

以上のsum関数には副作用はありません。少し回りくどい表現に見えますが(メリットは大きいです)...

さてF#です。

F#は関数型でとても強い型付けです。F#はそのような血生臭さや変数による副作用の最小化、C#の互換性.net固有の機能(LINQ等)が使える非常に魅力的な言語です。なおF#はとても型付けが強いですが型推論も強いという魅力があり、変数、関数の型は変わることが無い安心感と最適化のしやすさもまた魅力的です。コンパイラで実行するとC#(Javaと同じくらい高速)と同速とも言われるので、高速です。オフサイドルールや関数型の特性から、見やすくコーディングできます。以上の特性から、C++と比べて非常に大規模開発に向き(物にもよるが2000人以上/100万行以上だとF#以外難しいと思う)、今後の主流になると思うので取得して損はないです。あと身近な所ではVtuberの開発にF#が使われること多いといわれています(沢山のメディアを使うので.netを使って色々な所からコードを持ってこれるため/並列処理等複雑な処理がしやすいため)。なおオブジェクト指向もサポートされているのでそちらに慣れている人も入りやすいというメリットもあります。なおOCaml/Haskell/C#から影響を受けている言語なのでそれらの知識があるとなお良いです。

よく比較されるF#とScala

どちらもVM(仮想機械)言語(scalaはJVM,F#はdotnetのVM)ですができることが違います。
Web開発やCuiアプリ、業務系アプリケーション開発、国の情報インフラや構文解析等をする場合はscalaが向いています。
なおWindowsアプリ、画像解析、Ai、Vtuberやゲーム(2D、3D、4D全てできる。scalaでは2Dさえほとんど不可能な場合も多い)、大規模開発、VR、AR、MR、音楽を使ったアプリケーションを作る場合はF#が向いています。
GPUをあまり使わない処理はscalaが向いていてGPUをぶん回す処理はF#が向いている模様
なお組み込み/制御系に関いてはCとC++くらいしか選択肢がないので省略します。

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

Microsoftの「UI test with Selenium」にあるサンプルが動かない2

0.はじめに

以前(Microsoftの「UI test with Selenium」にあるサンプルが動かない)の続き。

1.調べたこと

以前の記事の最後にある、わからなかったことを調べた。
わからなかったことは、2点。

(1) コピってきたコードがよくわからない

executor.ExecuteScript("arguments[0].click();", element);

これの、arguments[0]ってのがイマイチよくわからない。
・・・・
このarguments[0]っていうのは、Javascriptの話だった。
引数のことを言っているらしい。なので、arguments[0]ってのは、elementのこと。
一応、簡単なテストをやってみた。

test.html
<html>
    <head>
        <title>テスト用HTML</title>
    </head>
    <body>
        <button type="button" onclick="alert('アラートメッセージ1')" id="test_element1">ボタン</button>
        <button type="button" onclick="alert('アラートメッセージ2')" id="test_element2">ボタン</button>
        <button type="button" onclick="alert('アラートメッセージ3')" id="test_element3">ボタン</button>
    </body>
</html>
ExecuteScriptTest
        [TestMethod]
        [TestCategory("Chrome")]
        public void ExecutorTest()
        {
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);
            //
            // ローカルのテスト用HTMLにアクセス
            //
            driver.Navigate().GoToUrl("file:///C:..(略).../test.html");
            //
            // ボタン1
            //
            IWebElement element1 = driver.FindElement(By.Id("test_element1"));
            IJavaScriptExecutor executor = (IJavaScriptExecutor)driver;
            //
            // ボタン2
            //
            IWebElement element2 = driver.FindElement(By.Id("test_element2"));
            IJavaScriptExecutor executor2 = (IJavaScriptExecutor)driver;
            //
            // ボタン1を選択
            //
            executor.ExecuteScript("arguments[0].click();", element1, element2);
            //
            // アラート内容の確認
            //
            var alert = driver.SwitchTo().Alert();
            Assert.IsTrue(alert.Text.Equals("アラートメッセージ1"), "Verified message of the alert");
            //
            // アラートを閉じる
            //
            alert.Accept();
            //
            // ボタン2をクリック
            //
            executor.ExecuteScript("arguments[1].click();", element1, element2);
            //
            // アラート内容の確認
            //
            alert = driver.SwitchTo().Alert();
            Assert.IsTrue(alert.Text.Equals("アラートメッセージ2"), "Verified message of the alert");
            //
            // アラートを閉じる
            //
            alert.Accept();
        }

ExecuteScriptの引数を2つにしたら、arguments[0]には1つ目に引数が、arguments[1]には2つめの引数が入るってことだね。

(2) デバッグじゃないと成功しない
予想通りwaitかけたらうまくいった。

        [TestMethod]
        [TestCategory("Chrome")]
        public void TheBingSearchTest()
        {
            //
            // Bingのページを表示
            //
            driver.Navigate().GoToUrl(appURL + "/");
            //
            // 検索窓に「Azure Pipelines」と入力
            //
            driver.FindElement(By.Id("sb_form_q")).SendKeys("Azure Pipelines");
            //
            // 検索をクリック
            //
            IWebElement element = driver.FindElement(By.Id("sb_form_go"));
            IJavaScriptExecutor executor = (IJavaScriptExecutor)driver;
            executor.ExecuteScript("arguments[0].click();", element);
            //
            // タイトルに「Azure Pipelines」が入っているページのうち、
            // 検索結果の先頭にあるものを選択
            //
            var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 30));
            var findElement = wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(
                            By.XPath("//ol[@id='b_results']/li/h2/a[contains(text(), 'Microsoft Azure')]")));
            findElement.Click();
            //
            // ページのタイトルに「Azure Pipelines」が含まれていたらテスト成功
            //
            Assert.IsTrue(driver.Title.Contains("Azure Pipelines"), "Verified title of the page");
        }

ここにたどり着くまでにいろいろ調べて、ちょっとはだけSeleniumに慣れた気がする。。。。
あとはデザインパターンとかいろいろ勉強して、Azure DevOpsとかに組み込むとこまでやりたいな・・・・

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