yumeの日記: Unity学習 #2 1
Unity
2D UFO 3 of 9
ようやくコードをかけるぞ
・任意のC#scriptを新規作成することができる。
・任意のスクリプトを、GameObjectのコンポーネントとして指定できる
●Update()関数
・基本的な毎フレーム実行される関数。
・フレームがレンダリングする前に実行される
●FixedUpdate()関数
・こちらも毎フレーム実行されるが、Update()と違って物理演算直前に実行される
>実行順序が知りたいな。FixedUpdate > 物理演算 > Update() > 描画なんだろうか。その間にも色々ある気もする。
●いろんなメソッド
・Unity Documentationにクラスや関数がたっぷり書いてある
>全文日本語訳があるのかな、と思ったがそうでもないな。ほぼ英語だ。
・チュートリアルで使ってる開発環境には、Unity Documentationを検索する機能がある
>あー便利だなぁ。と思ったがVisual Studio 2019では無理かな?
>ん~、そもそもVisual Studio 2019を使う必要はなさそう(一個一個のcsファイルをいじるだけ)だから、Visual Studio CodeにUnityに使えそうな拡張を入れて、それでいじればいいかな?
>Debugger for Unity、Unity Code Snippets、Unity Toolsを入れてみた。ドキュメント検索はとりあえずできるし、Input.GetAxisを予測で打ってくれる。
>あ、いや待てよ? Visual Studio 2019をインストールするときに「Unity」ってのを見かけたな。調べてみる
microsoft曰く、
なんやかんや設定すると連携できるらしい。なんとなくやってみた。一旦これで進めてみよう。
・Rigidbody2D.AddForce
・引数に「Vector2」が必要。
・Vector2とは、二つの小数点数でできた変数(?)
>たしか、GLSLでVector2ってあったな。あれ、これC#にもあるってこと?
・あるコンポーネントが他のコンポーネントにアクセスしたいときは:
private Rigidbody2D rb2d;
void Start()
{
rb2d = GetComponent<Rigidbody2D>();
}
これはたぶん
・Rigidbody2Dクラスのインスタンスrb2dを作って、
・Start関数(最初に一度だけ実行する関数。コンストラクタというかMain関数的なやつか)で
・rb2d = GetComponent<Rigidbody2D>();で実際のコンポーネントをあてはめている……のかな。山括弧の中は多分型名を指定するところで……。
で、実際にrb2dにAddForceを実行させて、Unityで実行してみると、UFOが勝手に下に落ちてゆく。
・UnityのRigidbody2Dは重力変数を最初から持ってて、初期値が1に設定されている。
>0にすれば動く。実際Runすると動いた。
・このままだとめちゃくちゃ遅いので、public変数 speedを作る。
・public変数を作ると、Unity側のコンポーネント枠内にその変数が表示される(すごい)
といったところでこのレッスンはここまで。
Console Adventure
友人と話して「オルゴールの曲を作って入れてみよう」ということになったので、実際にmp3を鳴らしてみる。
色々調べたところ、大雑把に言えば:
・なんかDLLを追加しなきゃならん。
・DLLはwindows media playerのやつとか、NAudioとかあるらしい
・DLLの追加の仕方が、どこのブログを読んでも死ぬほど複雑で嫌になったけど、NuGetっていうやつでVisual Studio 2019の中で検索・追加ができる。これでいいのかな?
・NAudioは入れたけど……なんだかうまくいかない。エラーで調べてもかっちりそれだ!って感じのが無いなぁ。
・WMPならうまくいくが……埋め込んだリソースから再生する方法がないっぽい。え~~……。
・とりあえず実行ファイルにはmp3を同梱する形でいいか。単一exeですめばそれが最高だったけど……。
・soundtest機能と、テキスト命令文[audio fileName]はうまく動いたので、エンディング曲が実際に出来上がるのを待つ。
・あと音量がすごいので、音量調整機能を付けた。
Unityは未経験 (スコア:0)
外してる所も有るかも知れない。
イベント関数の実行順序
https://docs.unity3d.com/ja/current/Manual/ExecutionOrder.html [unity3d.com]
Update(), FixedUpdate()
Update()はフレーム描画前に実行されるが、FixedUpdate()はデフォでは0.02秒(秒間50回)ごとに実行される。
一定の周期だからFixed~って名前なのか?
描画がコマ落ちしてようが物理演算は等速で行う必要が有るって事だろうか。
厳密に0.02秒ごとに実行される訳ではなく、秒間50回のペースになるよう実行回数を調整しているっぽい。
描画が50FPSなら毎回 FixedUpdate() → 物理演算 → Update() → 描画
25FPSなら [FixedUpdate() → 物理演算]x2 → Update() → 描画
100FPSなら FixedUpdate() → 物理演算 → [Update() → 描画]x2
FPSが不安定だと [FixedUpdate() → 物理演算]x0~N → Update() → 描画
Vector2
数学では矢印で描いてたような二次元(平面)ベクトル。
UnityEngine.Vector2 だから、Unityが提供している型であってC#の物では無いね。
力の方向と強さを指定してAddForce()を呼ぶと、その力を反映して物理演算するから
その結果物体が動くって事かな?
private Rigidbody2D rb2d;
これは変数宣言だけでインスタンスは生成してないから、中身は空。
その後のGetComponent()で、どこか(どこ?)で生成されたインスタンスを取得してrb2dに設定してる。
GetComponent<Rigidbody2D>();
山括弧はジェネリック → https://ufcpp.net/study/csharp/sp2_generics.html [ufcpp.net]
とても便利。
埋め込んだリソースから再生
リソースをTEMPフォルダに出力して、そのファイルパスを指定と言う方法もあるが
後始末や複数ファイル再生時の問題も出てくるかな。
無駄にファイル書き込みをするのも気になる。
wavファイルなら System.Media.SoundPlayer とかも使えそうだが、音量調整無いな。