- 投稿日:2020-05-14T14:09:39+09:00
Unity C#はEXE化すれば標準入力を受け取れる
タイトルの通りです。動機とか実行例を載せておきます。
動機
Windows環境のUnityでプロセス間通信(IPC)する!
NamedPipeServerStream
が使えない1んだが!!!!どうせAnonymousPipeServerStream
も使えないんだろ?TCPやUDPは違う。何か実装できそうな(面白い)方法はないか・・・・・・・・・・・・・・・・標準入力いけるか?環境
- Windows 10
- Unity 2018.4.9f1
コード・ビルド・テスト
Assets\Scripts\StdinReader.cs
を作成Assets\Scripts\StdinReader.csusing 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
、適当にフォルダを作成して選択
UnityStdinTest.exe
が生成できていることを確認- Powershellから起動
echo "first line `n second line `n" | .\UnityStdinTest.exe
- WSLの実行結果も持ってこれます
参考
- unity3d - Fastest way to do local IPC between a Unity process and another C# process - Stack Overflow
- Unityで別プロセスを実行し、ログを受け取る
感想
出来た時は爆笑した。基本的には参考の2番目のように子プロセスを作って標準出力を読み込めばいいと思う。
C#をdll化すれば使えなくもない(sh-akira/UnityNamedPipe: 名前付きパイプでUnityを外部アプリからコントロール ・Lachee/unity-named-pipes: A native named pipe wrapper for Unity3D)。Unity内のC#ではないと思ったので採用は見送った。 ↩
- 投稿日:2020-05-14T01:56:10+09:00
音ゲーマーのためのゼロから始める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では必要ないことが判明。便利…
コンソールに表示されたのはこちら!
何気に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点足されて表示されるんですね。
無事に実行されました!更に+200していきますが、今度はこう書いてみましょう。
score += 200; Console.WriteLine("score {0}", score); Console.WriteLine("Maxscore {0}", maxScore);score = score + 200;
が
score += 200;
と短くなりました。=の前に+を置くだけで同じく足し算を実行してくれるそうです。
scoreが400になりましたね!さて、ここまでスコアの加算を200と書いてきましたが
そもそも曲によって値が違ってきますよね?(100だったり1000だったり)
ということで次は変数を使って計算してみます。例えばスコアに加算されるのが990なら
int perfectscore = 990;これを書いてください。
perfectという単語もやや語弊を生みそうですね。
他にもjustScoreやcoolScore等、他の変数と間違えないような名前を付けてください。では、先ほどやったスコアの加算を変数で実行してみましょう。
score += perfectScore; Console.WriteLine("score {0}", score); Console.WriteLine("Maxscore {0}", maxScore);ではでは、今度は総ノーツ数を決めてその1ノーツごとの得点を計算してみましょう。
ノーツ数を573とし、満点をノーツ数で割ります。int notesNum = 573;を追加し、更に
int perfectScore = maxScore / notesNum;これはperfectScoreの行を書き直してください。
÷ は / で表します。maxScore ÷ notesNumという意味になります。そんで、score += perfectScore; 〜を実行するだけです。
無事に計算してくれまし…た?実はこのままでは少数の計算をしてくれないのです。
int型とint型の計算では、答えも整数になってしまいます。そこで…
そうです、doubleを使いましょう。double score = 0; double perfectScore = (double)maxScore / notesNum;2つの行を書き換えましょう。この時、割り算の前にも(double)と書く必要があります。
maxScoreもnotesNumもint型なので、このままでは整数しか出してくれません。
そこで(double)をmaxScoreの前につけることで
一時的に double型で計算するらしい…
これをキャストと言います。
これで少数の計算までバッチリやってくれますね。そして11回計算してみた結果がこちらです。(見返したらなんか中途半端だった)
ちなみにコンソール上で小数点を隠すには{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); } } }そして実行
(何気にスコアと理論値を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