【Unity】少ない試行回数で乱数が偏っているように感じる件を調査
UnityのRandomクラスを使って、サイコロを振るケースを考えます。サイコロを10回投げたときに全ての目が揃っているかどうか確認することとし、少ない試行回数でどれくらいの人数が「偏り」を感じるのか実験します。
UnityのRandomクラスを使って、サイコロを振るケースを考えます。サイコロを10回投げたときに全ての目が揃っているかどうか確認することとし、少ない試行回数でどれくらいの人数が「偏り」を感じるのか実験します。
ブログにソースコードをGistから引っ張って表示させているのですが、急に表示されなくなりました。Gistを見てみると赤いアラートが……。なんだこのメッセージ! と焦る気持ちもあると思うけど、冷静に対処すればOK。
UnityではRandomクラスを使って簡単に乱数を取得することができます。この記事では簡単な例として、サイコロを振る時にそれぞれの目が出るサンプルと、その発生確率の統計を行なっています。試行回数が多いと確率は収束しますが、少ない時には体感的に偏ってると感じることも。
衝突を表現するのに必要なコンポーネントであるColliderを扱っています。ここではカプセル型のColliderであるCapsule Colliderのパラメータについて紹介しています。細長くて丸いものを表現したり、擬似的に楕円を表現したりすることもできるので、工夫が光るColliderでもあります。
UnityではMathfの中に無限大(Infinity)が定義されています。この無限大が計算の上でどう扱われているのかを確認してみました。話を辿っていくとC#の言語仕様やら、IEEEの浮動小数点数の標準にまで行きついてしまったので、思いの外ボリュームが大きくなりました。
Unityではメンバ変数(フィールド)にRangeAttributeを指定しておくと、Inspectorウィンドウでスライダーを使って値を調整できるようになります。最大値と最小値を指定するため、Inspectorでの操作で変な値が入ることも少なくなり、スライダーの移動量で大体の値を掴むこともできます。
Unityでスクリプトを作成する際はクラスやフィールド、メソッドなどにAttirbuteを指定することができます。その中で、privateでもシリアライズする[SerializeField]と、publicであってもシリアライズさせない[System.NonSerialized]がありますが、どちらが優先されるのか確認を行なっています。
publicのフィールドや[SerializeField]をつけたフィールドはシリアライズの対象となり、Inspectorウィンドウに表示されるようになります。今回扱う[HideInInspector]を使うと、シリアライズの対象フィールドでもInspectorウィンドウで非表示にすることができます。
スクリプトを書く時に悩む、Inspectorに表示したいフィールドの公開方法。publicなら簡単だけど他のスクリプトからアクセスできちゃうし、[SerializeField]でInspectorに表示するのが無難かなーなんて思いつつ、2つの方法の使い分けを記載。
このブログで扱っている初心者向けチュートリアルの紹介です。全30回と、初心者向けにしては結構なボリュームですが、その分覚えておくと役に立つテクニックは満載。手順毎に画像を載せているので、記事に沿って手を動かせばUnity初心者でもゲームが作れるようになっています。
最近流行りのHTML5ゲームの流れに乗って、UnityでWebGL向けビルドを試してみました。スマホアプリを作成したプロジェクトでPCのブラウザ向けにビルドできるのは強み。ビルド自体も簡単なので、ぜひみんなに試してみてもらいたいところ。
複数バージョンのUnityがマシンの中にある際、後からプラットフォームサポートのモジュールを追加するときには注意が必要です。Windowsでは発生しにくい問題かと思いますが、MacでUnityを複数バージョン持っている人には確認してもらいたいところ。
複数のフォントファイルをインポートしたときに、スクリプトから動的に切り替えるサンプルを用意しました。セットするフィールドはpublicなフィールドなので、そこにフォントを指定してあげるだけのお手軽操作です。今回は時間経過でフォントが切り替わるようにしてみました。
Textコンポーネントで選択できるFont StyleのBoldですが、フォントによっては太字にならず、横に拡大されて表示されます。これはFont Styleがゲームの実行環境にインストールされているフォントを見にいっているため。実行環境に依存する設定なので、使用時は要注意。
Unityのデフォルトのフォントは日本語表示には向いていません。英字はともかく、漢字とひらがなの太さが合ってなかったりと、ゲームをリリースするにはきつい状態。なので、外部からフォントをインポートしてイケてるテキストを表示しましょ。
Unityのスクリプトファイル名って日本語にできるんですかね? という疑問を持ったので試してみました。変数名なども日本語にして動きを確認しているのでご覧あれ。日本語でコードを書くメリットについても触れています。
コンポーネントをアタッチする際、Inspectorの[Add Component]ボタンを使うと、文字列でコンポーネント名を検索することができます。その様子を紹介しているのと、分かる範囲で確認した検索の仕様(複数ワード検索など)についても記載。
作成したスクリプトはコンポーネントメニューからアタッチすることができますが、デフォルトだと『Scripts』の下にずらっと並びます。AddComponentMenuのAttributeをクラス名の前につけることで、コンポーネントメニュー内のパスを指定することができるため、これを試してみます。
UnityでRigidbodyのAddForceやAddTorqueを使う際に指定するForceModeについて、その4種類の動きを観察しています。モードによって1フレーム辺りのオブジェクトに加えられる力の大きさが異なるので、違いを覚えつつ使い分けができるといい感じ。
オブジェクトに物理的な運動をさせる際、摩擦や反発係数の設定も重要になります。ここでは物理特性マテリアルの摩擦に注目して、設定項目の説明と、摩擦に応じたオブジェクトの動きを確認する実験を行なっています。