【Unity】確率の無情さを噛みしめる虚無ゲー「ラプラスのドア」を作ったよ
脱出ゲーム業界に風穴を開けるゲーム『Laplace's Doors ラプラスのドア』をリリースしました。確率の無情さと響きあうゲームです。ブラウザで遊べるので暇つぶしにどうぞ。
あなたのゲームをいち早く完成させるための研究所
脱出ゲーム業界に風穴を開けるゲーム『Laplace's Doors ラプラスのドア』をリリースしました。確率の無情さと響きあうゲームです。ブラウザで遊べるので暇つぶしにどうぞ。
ゲームで欠かせない要素といえばランダム要素。それを実現する乱数について学んでいます。ここでは乱数って何? という話から、乱数の性能を測る指標や、乱数生成法の紹介を行なっています。
Unityのマニュアルには『ランダムなゲームプレイ要素の追加』のトピックがあります。乱数の考え方の基本を押さえるのにとても良い出発点だったので、このブログでも実例を交えてサンプルコードを用意。今回はランダムな空間座標を取得してオブジェクトを配置するサンプルです。
最近は乱数を使って遊び呆けているのですが、今回はトランプの山札をプレイヤーに配るためのサンプルを作りました。Unityのマニュアルに載っているサンプルコードを出発点にトランプゲームっぽくチューニングを行なっています。
UnityのRandomクラスを使って、トランプをシャッフルするサンプルを作ります。Unityのマニュアルには『ランダムなゲームプレイ要素の追加』として乱数を使ったランダム要素の扱いが載っているので、これを出発点にすると取っ掛かりやすいかも。
連続確率変数で重み付きのランダムな値を取得する際、AnimationCurveを使うと便利です。AnimationCurveにはいくつかのプリセットがあるので、それらを使って確率分布曲線を描いてみる実験をしています。慣れたらオリジナルのカーブを作ってみるのもあり。
AnimationCurveを使って、連続的な確率変数に重み付けをします。Unityのマニュアルを出発点に、10000回ランダムな値を取得し、その確率分布曲線を出してみます。視覚的に重み付けができるのが一番のメリットかも。
異なる発生確率を持った事象を選択するのはかなり頻繁に行われることで、ランダム性が重視されるゲームではほぼ必須と言っても過言ではありません。ここでは敵を倒した時にドロップするアイテムの抽選を例に、Unityのサンプルコードをアレンジして遊んでいます。
UnityのRandomクラスって、結構確率論に沿ってるんですね。自分で手を動かして確認してみると実感します。この記事ではサイコロを振って1から6までの数字が全部出るまでの試行回数をシミュレーションし、期待値や最小値などが理論値どどの程度一致するかを確認しています。
UnityのRandomクラスを使って、サイコロを振るケースを考えます。サイコロを10回投げたときに全ての目が揃っているかどうか確認することとし、少ない試行回数でどれくらいの人数が「偏り」を感じるのか実験します。
UnityではRandomクラスを使って簡単に乱数を取得することができます。この記事では簡単な例として、サイコロを振る時にそれぞれの目が出るサンプルと、その発生確率の統計を行なっています。試行回数が多いと確率は収束しますが、少ない時には体感的に偏ってると感じることも。