20200514のC#に関する記事は2件です。

Unity C#はEXE化すれば標準入力を受け取れる

タイトルの通りです。動機とか実行例を載せておきます。

動機

Windows環境のUnityでプロセス間通信(IPC)する!

NamedPipeServerStreamが使えない1んだが!!!!どうせAnonymousPipeServerStreamも使えないんだろ?TCPやUDPは違う。何か実装できそうな(面白い)方法はないか・・・・・・・・・・・・・・・・標準入力いけるか?

環境

  • Windows 10
  • Unity 2018.4.9f1

コード・ビルド・テスト

  • Assets\Scripts\StdinReader.cs を作成
Assets\Scripts\StdinReader.cs
using UnityEngine;
using System;
using System.Threading.Tasks;

public class StdinReader : MonoBehaviour
{
    void Start()
    {
        Task.Run(() =>
        {
            string line;
            Debug.LogError("WhileStart");
            while ((line = Console.ReadLine()) != null)
            {
                Debug.LogError("GetLine:" + line);
            }
            Debug.LogError("WhileEnd");
        });
    }
}
  • Main Cameraにコンポーネントを追加
  • [File]→[Build Settings...]の Development Build を☑して Build、適当にフォルダを作成して選択

コメント 2020-05-13 114434.png

  • UnityStdinTest.exeが生成できていることを確認
  • Powershellから起動
echo "first line `n second line `n" | .\UnityStdinTest.exe

コメント 2020-05-14 134220.png

コメント 2020-05-14 134604.png

  • WSLの実行結果も持ってこれます

コメント 2020-05-14 135209.png

参考

感想

出来た時は爆笑した。基本的には参考の2番目のように子プロセスを作って標準出力を読み込めばいいと思う。


  1. C#をdll化すれば使えなくもない(sh-akira/UnityNamedPipe: 名前付きパイプでUnityを外部アプリからコントロールLachee/unity-named-pipes: A native named pipe wrapper for Unity3D)。Unity内のC#ではないと思ったので採用は見送った。 

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

音ゲーマーのためのゼロから始めるC#講座:第二回まとめ

腕毛の人です。前回の課題をやってたら就寝4時でした…

今回も駆け足で復習していきましょう!

さて、まずは前回の課題からです。
課題:音ゲーのゲーム画面に必要な値を表現してみる

        static void Main(string[] args)

より下の行から、こんなプロブラムを書いてみました。

        {
            string songName = "REJECTION";
            string artist = "GAT";
            string gene = "OTOGE CORE";
            int bpm = 370;
            int level = 19;
            double hiSpeed = 3.5;
            string optionH = "hidden";
            string optionS = "sudden";
            string playerName = "UDG";
            string rank = "S";
            int score = 999990;
            double gauge = 99;
            int clearLine = 70;
            string percent = "%";


            Console.WriteLine("1st STAGE");
            Console.WriteLine("TUNE: {0}", songName);
            Console.WriteLine("ARTIST: {0}", artist);
            Console.WriteLine("GENE:{0}", gene);
            Console.WriteLine("BPM: {0}", bpm);
            Console.WriteLine("LEVEL: {0}", level);
            Console.WriteLine("Hi-speed: {0}", hiSpeed);
            Console.WriteLine("OPTION: {0} / {1}", optionH, optionS);
            Console.WriteLine("RESULT");
            Console.WriteLine("Player: {0}", playerName);
            Console.WriteLine("RANK: {0}", rank);
            Console.WriteLine("Score: {0}", score);
            Console.WriteLine("GAUGE: {0:D3} {1} / {2:D3} {1} ", gauge, percent, clearLine);
        }
    }
}

※前回、

            Console.ReadKey();

を入力しないといけないと書きましたが、Macでは必要ないことが判明。便利…
コンソールに表示されたのはこちら!
スクリーンショット 2020-05-13 17.35.46.png
何気に8.5.5(build 7)にバージョン更新してますねえ

DDRのボス曲をパロってみました。考え方としてはヨシ!

本日のテーマ:変数をいじくりまわす

今回の目標はこちらです

  • 目標
    • 変数をいじってみる
    • コメントの書き方を知る
    • bool型とfloat型を知る

お?新しい型がどんどん出てきますね。なんかプログラマーっぽい?
でも使うのは次回以降でした。

値を変えてみる

新しいプロジェクトファイルを作成し、名前をMySecondProjectと命名。
講師曰く、実験用のプロジェクトにはMy~と名付けるそうです。
Testと書いて痛い目にあったとかなんとか…

スコアの計算を実行していきます。
まず以下の内容を書きましょう。

            int score = 0;
            int maxScore = 1000000;
            Console.WriteLine("score {0}", score);
            Console.WriteLine("Maxscore {0}", maxScore);

スコアがゼロの状態です。ここに+ 200してみましょう

            score = score + 200;
            Console.WriteLine("score {0}", score);
            Console.WriteLine("Maxscore {0}", maxScore);

全て新しく書く行です。
score = score + 200;と書くことで実際に200点足されて表示されるんですね。
スクリーンショット 2020-05-12 11.17.11.png
無事に実行されました!

更に+200していきますが、今度はこう書いてみましょう。

    score +=  200;
    Console.WriteLine("score {0}", score);
    Console.WriteLine("Maxscore {0}", maxScore);

score = score + 200;

score += 200;
と短くなりました。=の前に+を置くだけで同じく足し算を実行してくれるそうです。
スクリーンショット 2020-05-12 11.19.15.png
scoreが400になりましたね!

さて、ここまでスコアの加算を200と書いてきましたが
そもそも曲によって値が違ってきますよね?(100だったり1000だったり)
ということで次は変数を使って計算してみます。

例えばスコアに加算されるのが990なら

            int perfectscore = 990;

これを書いてください。
perfectという単語もやや語弊を生みそうですね。
他にもjustScoreやcoolScore等、他の変数と間違えないような名前を付けてください。

では、先ほどやったスコアの加算を変数で実行してみましょう。

            score += perfectScore;
            Console.WriteLine("score {0}", score);
            Console.WriteLine("Maxscore {0}", maxScore);

スクリーンショット 2020-05-12 11.21.33.png
無事に足し算してくれましたね!

ではでは、今度は総ノーツ数を決めてその1ノーツごとの得点を計算してみましょう。
ノーツ数を573とし、満点をノーツ数で割ります。

            int notesNum = 573;

を追加し、更に

            int perfectScore = maxScore / notesNum;

これはperfectScoreの行を書き直してください。
÷ は / で表します。maxScore ÷ notesNumという意味になります。

そんで、score += perfectScore; 〜を実行するだけです。
スクリーンショット 2020-05-12 11.24.58.png
無事に計算してくれまし…た?

実はこのままでは少数の計算をしてくれないのです。
int型とint型の計算では、答えも整数になってしまいます。そこで…
そうです、doubleを使いましょう。

            double score = 0;

            double perfectScore = (double)maxScore / notesNum;

2つの行を書き換えましょう。この時、割り算の前にも(double)と書く必要があります。
maxScoreもnotesNumもint型なので、このままでは整数しか出してくれません。
そこで(double)をmaxScoreの前につけることで
一時的に double型で計算するらしい…
これをキャストと言います。
これで少数の計算までバッチリやってくれますね。

そして11回計算してみた結果がこちらです。(見返したらなんか中途半端だった)
スクリーンショット 2020-05-12 11.32.51.png
ちなみにコンソール上で小数点を隠すには{0:F0}という風に書くそうです!
右の0は小数点の桁数に対応してて、小数点第n位を表すことができます。
これから先、多用しますねこれは。

さて、ここまで数字の値を合わせてきましたが
実は文字列も合わせることができます
次からは 3rd STAGE という表示ができるように頑張ります。

ステージの表示、イメージとしては
"{0}rd STAGE", stage
みたいな感じでステージ数をint型で表したいのですが
これはできないらしいです。なんでかは割愛された…
(1"st",2"nd",3"rd"のように
後ろの文字列まで変化するからですね。教えてもらいました。
これにはif文が必要で、次の講座からできるようになります!
)

そこで、こういうものを書きます。

            string stageName = stage.ToString() + "rd Stage";

実はstring型でも足し算が可能で、例えば
"3" + "rd STAGE"
というような感じです。でもステージ数はint stage = n で表したい…
そこで
変数.Tostring()
という風に書きます。これでint型がstring型に変換されて計算が可能に。

なんやかんやあって、書いたのがこちらです!

        {
            double score = 0;
            int maxScore = 1000000;
            int notesNum = 573;
            double perfectScore = (double)maxScore / notesNum;
            string songName = "SABER KING";
            string artistName = "Taguchi";

            int stage = 3;
            string stageName = stage.ToString() + "rd Stage";


            Console.WriteLine("{0}", stageName);

            Console.WriteLine("{0} / {1}", songName, artistName);
            Console.WriteLine("score {0}", score);
            Console.WriteLine("Maxscore {0}", maxScore);

            score = score + perfectScore;
            Console.WriteLine("score {0} / {1}", score, maxScore);

            score += perfectScore;
            Console.WriteLine("score {0} / {1}", score, maxScore);            
        }
    }
    }

そして実行
スクリーンショット 2020-05-12 11.48.11.png
(何気にスコアと理論値を1行にまとめてます)
3rd STAGE がちゃんと表示されました!

✅変数をいじってみる
なんか色々できた!ヨシ!

表示と処理を分ける

プログラム上ではコメントが書けるということを(ざっくり)教わりました。
こんな感じ

    //改行までがコメント扱いされます
    /*この間がコメント
   *←必要ないけどわかりやすいように書いてることが多い
     *この行で終わり*/
    ///VisualStudio限定、でも使わないでください

使わないでと言われたら使いたくなる(

実務のコメントでは例えば
//表示部

//処理部

//宣言部
のようにプログラムの内容をわかりやすくしているそうです。
パッと見どこに何書いてるなんてわからないですもんねえ。

✅コメントの書き方を知る
いずれあることないこと書くと思うのでヨシ!

色々な値の替え方

講座の最後にはbool型float型について学びました。

  • bool型

簡単にいうとYesかNoかを表してくれる型ですね。
= の後に true/false のどちらかを入れます。
例えばステージクリアやオプション等の表示が変わる際に使います。

            bool isCleard = false;
            bool hidden = true;
            bool sudden = true;

…表示の仕方は次回!

  • float型

ほぼdoubleと一緒 ?らしい。
Unityではこれもよく使うんですね。
書き方も少し違って

            float hiSpeed = 1.5f

最後にfをつけるんですね。
floatの方が軽く、doubleの方が精度が良いです。と、教わりました。

後々めんどそう…

✅bool型とfloat型を知る
新しいこと覚えるの楽しいのでヨシ! ✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

課題

ポップンを想定し、10万点満点でノーツ数3の曲を全てCOOLで取ったとして

  • 0コンボ, 1コンボ, 2コンボ, 3コンボの時のscore
  • またそのrate(~%)

を表示してみよう

レートの計算をするにはまず

int rate = 0;
double rate = (double)score / (double)maxScore; 

この2行を書いて

rate = (double)score / (double)maxScore * 100;

この計算をconsole.WriteLineの上に書いていきましょう!

ちなみに右の * 100 は x100 のことで掛け算を表しています。これが分からなくてうんうん唸ってました?

講座の開催場所はこちら?
Discord:https://discord.gg/8arnHu6
Twitter:@stereonoah

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