【Unity】Inspectorで数式を使ってオブジェクトの配置を効率化

Unity

はじめに

インスペクターで、Transformコンポーネントなどの値を変更するときに、数式を使えることはご存じでしょうか? 例えば以下のように入力して確定すると、X軸のPositionが「10」になります。

こんなふうにインスペクターでは、値を直接入力する以外にも、数式を使用して値を入力することが可能です。

今回はインスペクターで使用できる数式についてまとめていきます。

使用環境

今回記事で使用するバージョンなどは以下の通り。

・Unity 2022.3.31f
・URP

数式一覧

1.四則演算

まずは「+」や「-」といった四則演算タイプの数式から。

演算子説明
+加算
減算
*乗算
/除算
+=現在の値に対し加算
-=現在の値に対し減算
*=現在の値に対し乗算
/=現在の値に対し除算
%剰余(余り)
^累乗
sqrt(X)任意の値”X”の平方根

四則演算には「=」のあるものと無いものがあります。一見同じにみえますが、きちんと違いがあります。例えば以下の場合を考えます。

画像のCubeはX軸にたいし、ちょうど2ずつ間隔をあけて配置されています。この各CubeのPositionのXをさらに3増やしたいとき、Cubeを複数選択をしてPosition.xの欄に「+3」と入力し移動させようとすると、各CubeのPosition.xがすべて3になってしまいます。

↑上記のようにしても3つのCubeのPositionがすべて(3,0,0)になってしまう。

こんな複数のオブジェクトをまとめて移動させたいときなどに=付きの演算が役に立ちます。試しに先ほどの例で挙げた「+3」の部分を「+=3」に変更して入力確定してみましょう。すると、各CubeのPosition.xがそれぞれ「0,2,4」から「3,5,7」へと変わったはずです。

↑「+=3」で入力した場合。きちんと各Cubeの現在値から+3された値が反映されている。

このように、オブジェクトの現在の値に対し、四則演算を行いたい場合は=付きの方を使用しましょう。

2.端数処理

演算子説明
ceil(X)任意の値”X”の小数点以下切り上げ
floor(X)任意の値”X”の小数点以下切り捨て
round(X)浮動小数点形式で、任意の値”X”に
最も近い整数に丸める

round()は四捨五入のようなものなのですが、一部四捨五入とは異なる挙動をします。例えば「2.5」という数値を四捨五入して整数値にする場合、通常「3」となるのですが、round()の場合「2」が結果として返ってきます。

round()では、「○○.5」という数値を入力した場合、その値に最も近い偶数を返すようになっています(例:「2.5」 ⇒ 「2」,「3.5」 ⇒ 「4」)。四捨五入とは微妙に異なるので注意しましょう。

3.均等・ランダム・インデックス

ここで紹介する数式は、主に複数のオブジェクトを移動させたりする場合に使用します。

演算子説明
L(X,Y)選択したオブジェクト数に応じて、X~Yの範囲で均等に数値を割り振る
R(X,Y)選択したオブジェクト数に応じて、X~Yの範囲でランダムに数値を割り振る
#選択したオブジェクトのインデックス番号

均等・ランダム

例えば5つのオブジェクトをX軸に対し、-3~3の間で均等に並べる場合を考えます。5つのオブジェクトを複数選択し、Position.xに「L(-3,3)」と入力し確定させることで、定義した範囲に均等に並べることができます。

↑-3~3の範囲で均等に並んでいる

「L(-3,3)」の部分を「R(-3,3)」で入力した場合は、-3~3の間にランダムにオブジェクトが配置されます。
「R()」は入力の度、結果が変わります。思い通りの結果が得られない場合は、思い通りの結果が出るまで再度入力しましょう。

ちなみに余談ですが、単一オブジェクトに対し「L()」を使用すると、入力された二つの数値のちょうど中央の数値が結果として返ってきます。

「L()」や「R()」はオブジェクトの回転でも役立ちます。

↑缶のオブジェクトが均等に並んでいる写真

上の画像では缶となるオブジェクトが横一列に均等に並んでいます。しかし飲み口部分がすべて同一の方向に向いています。これをそれぞれランダムな方向に向かせたい場合、以下のようにすることで
それが実現できます。

上画像ではY軸に対し、0°~360°の間でランダムに回転させています。

↑飲み口がそれぞれランダムに向いている。

複数オブジェクトの配置や回転をする場合にすごく便利なので、是非とも使いこなしたい数式です。

インデックス

ここからは、#(インデックス)についてです。インデックス番号は、選択されたオブジェクトたちの中で、Hierarchyに追加された最新のオブジェクトから順に番号が割り振られます。一番最後に追加されたオブジェクトには「0」、そのひとつ前に追加したオブジェクトには「1」といった具合です。
※Hierarchyの上から順に割り振られているわけではありません。

確認のため、以下のオブジェクトを用意します。

↑X軸に対し間隔を2毎あけて並べた4つのオブジェクト

Cube ⇒ Sphere ⇒ Capsule ⇒ Cylinderの順でHierarchyに追加しています。この中ではCylinderが一番最後に追加されたオブジェクトということになります。

このオブジェクトたちをすべて選択した状態で、TransformコンポーネントのPosition.xに「#*2」と入力し確定すると、

上の画像のように順序が入れ替わりました。

これでオブジェクトにインデックス番号がどう割り振られているか理解できたかと思います。
なお、先ほど紹介した「L(X,Y)」もインデックス番号順にオブジェクトが並べられます。つまり、X側に、選択されたオブジェクトの中で一番最後に追加したオブジェクト、Y側に、一番最初に追加したオブジェクトが配置されます。

4.三角関数

演算子説明
sin()入力した値の正弦
cos()入力した値の余弦
tan()入力した値の正接
pi円周率π(3.14…)

三角関数は円形にオブジェクトを配置する際に便利です。

↑16個のSphereを円形に配置した例

上の画像のように配置するには、Position(0,0,0)にSphereをまず16個用意し、すべて複数選択したのち、

・Position.x ⇒「sin(#*pi*2/16)*10」
・Position.y ⇒「cos(#*pi*2/16)*10」

とそれぞれ入力し確定することで配置することができます。

三角関数の知識が必要なので、使いこなすのに少し苦労しますが、使いこなせれば円形の配置を効率よく行えるので頑張って習得したいところです。

おわりに

以上でインスペクターで使用できる数式について紹介してきました。筆者である私は、インスペクターで数式を使えることを知ったのは最近のことなので、まだすべてをうまく使いこなせるわけではないですが、間違いなく作業効率は上がると思うので、積極的に使用していきたいと思います。

コメント

タイトルとURLをコピーしました