【Unity】Mathfの切り上げ、切り捨て、偶数丸め。使い分けが大事よね
切り上げ、切り捨て、偶数丸めをしたい時にはMathfのCeil、Floor、Roundを使うと便利。使い方も難しくないので、RPGのダメージ計算とかでガンガン使えると思います。Roundは四捨五入じゃないので若干戸惑うかも。
あなたのゲームをいち早く完成させるための研究所
切り上げ、切り捨て、偶数丸めをしたい時にはMathfのCeil、Floor、Roundを使うと便利。使い方も難しくないので、RPGのダメージ計算とかでガンガン使えると思います。Roundは四捨五入じゃないので若干戸惑うかも。
[DisallowMultipleComponent]のAttributeを使うことで、同一のゲームオブジェクトに、同じスクリプトまたはコンポーネントを複数アタッチできないようにします。1行追加するだけで実現できるので、Manager系のクラスには付けておくと安心かも。
アタッチしてないコンポーネントをスクリプトから操作しちゃうこと、よくありませんか? うっかりGetComponentしてエラーを出しちゃう……そんな時には、RequireComponentのAttributeを付けておくのがオススメ! スクリプトをアタッチするときにコンポーネントも一緒にアタッチしてくれるので、うっかりさんも安心です(通販風)
ゲームで欠かせない要素といえばランダム要素。それを実現する乱数について学んでいます。ここでは乱数って何? という話から、乱数の性能を測る指標や、乱数生成法の紹介を行なっています。
Unityのマニュアルには『ランダムなゲームプレイ要素の追加』のトピックがあります。乱数の考え方の基本を押さえるのにとても良い出発点だったので、このブログでも実例を交えてサンプルコードを用意。今回はランダムな空間座標を取得してオブジェクトを配置するサンプルです。
最近は乱数を使って遊び呆けているのですが、今回はトランプの山札をプレイヤーに配るためのサンプルを作りました。Unityのマニュアルに載っているサンプルコードを出発点にトランプゲームっぽくチューニングを行なっています。
UnityのRandomクラスを使って、トランプをシャッフルするサンプルを作ります。Unityのマニュアルには『ランダムなゲームプレイ要素の追加』として乱数を使ったランダム要素の扱いが載っているので、これを出発点にすると取っ掛かりやすいかも。
連続確率変数で重み付きのランダムな値を取得する際、AnimationCurveを使うと便利です。AnimationCurveにはいくつかのプリセットがあるので、それらを使って確率分布曲線を描いてみる実験をしています。慣れたらオリジナルのカーブを作ってみるのもあり。
AnimationCurveを使って、連続的な確率変数に重み付けをします。Unityのマニュアルを出発点に、10000回ランダムな値を取得し、その確率分布曲線を出してみます。視覚的に重み付けができるのが一番のメリットかも。
異なる発生確率を持った事象を選択するのはかなり頻繁に行われることで、ランダム性が重視されるゲームではほぼ必須と言っても過言ではありません。ここでは敵を倒した時にドロップするアイテムの抽選を例に、Unityのサンプルコードをアレンジして遊んでいます。
UnityのRandomクラスって、結構確率論に沿ってるんですね。自分で手を動かして確認してみると実感します。この記事ではサイコロを振って1から6までの数字が全部出るまでの試行回数をシミュレーションし、期待値や最小値などが理論値どどの程度一致するかを確認しています。
UnityのRandomクラスを使って、サイコロを振るケースを考えます。サイコロを10回投げたときに全ての目が揃っているかどうか確認することとし、少ない試行回数でどれくらいの人数が「偏り」を感じるのか実験します。
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初心者でもゲームが作れるようになっています。