Unity 2021.2で強化されたインスペクターの数式機能や、複数要素選択時の線形配置機能について

# はじめに

Unity 2021.2で、インスペクターの機能が強化されました。多くの数式機能が利用できるようになりました。また、複数要素選択時に線形配置機能やランダム配置、インデックスを用いた配置を利用できるようになりました。

Unityステーション 「[Unityをもっと使いやすく！Unityカイゼン委員会！](https://www.youtube.com/watch?v=uhxZQ9jY1GU)」の本編や告知ツイートでも紹介されていましたね。

https://twitter.com/unity_japan/status/1442760999153537030

[リリースノート](https://unity3d.com/jp/unity/whats-new/2021.2.0)はこちら。

>Editor: Inspector number fields support more math expressions now: functions (sqrt, sin, cos, tan, floor, ceil, round), distribution over multi-selection (L, R) and can refer to current value to change it across multi-selection (+=3, *=2).

さて、Unity Stationでも言及されていましたが、どうやら[ソースコード](https://github.com/Unity-Technologies/UnityCsReference/blob/2021.2/Editor/Mono/Utils/ExpressionEvaluator.cs)を読むとリリースノートや公式ドキュメントにない機能が存在するようです。

この投稿では、Unity Stationで言及されていた機能を、該当のソースコードに触れながらテキストとしてまとめます。

※「Unityをもっと使いやすく！Unityカイゼン委員会！」の動画の該当部分は、[15分あたり](https://youtu.be/uhxZQ9jY1GU?t=900)から！


# 一様分布機能とランダム分布機能

次のGIFは、複数のCubeを選択中インスペクターにL(-5, 5)と入力すると、各Cubeのx座標が「-5.0f, -2.5f, 0.0f, 2.5f, 5.0f」と配置される様子を示しています。

![liner.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/11908ea6-7e52-17fc-728d-69ff8fc791c5.gif)


このように、Unity 2021.2から、複数のゲームオブジェクトを選択中にインスペクターに「L(a, b)」と入力すると、aからbまで線形に均等な値をとるような機能が追加されました。ソースコードに、[ここ](https://github.com/Unity-Technologies/UnityCsReference/blob/2021.2/Editor/Mono/Utils/ExpressionEvaluator.cs#L16)にコメントがあります。

また似た機能として、「R(a, b)」と入力すると、aからbまでのランダムな値を設定できる機能が追加されました。ソースコードには、[ここ](https://github.com/Unity-Technologies/UnityCsReference/blob/2021.2/Editor/Mono/Utils/ExpressionEvaluator.cs#L17)コメントがあります。

# 数式機能

ソースコードの[ここ](https://github.com/Unity-Technologies/UnityCsReference/blob/2021.2/Editor/Mono/Utils/ExpressionEvaluator.cs#L479-L483)によると、「pi」と入力すると、円周率として扱われるようです。

ソースコードの[ここ](https://github.com/Unity-Technologies/UnityCsReference/blob/2021.2/Editor/Mono/Utils/ExpressionEvaluator.cs#L94-L113)や[ここ](https://github.com/Unity-Technologies/UnityCsReference/blob/2021.2/Editor/Mono/Utils/ExpressionEvaluator.cs#L438-L451)を読む限り、次の数式機能がサポートれているようです。


* -で単項演算子の-
* +で二項演算子+
* -で二項演算子-
* *で二項演算子*
* /で二項演算子/
* %で二項演算子%
* ^でMathf.Pow
* sqrtでMathf.Sqrt
* floorでMathf.Floor
* ceilでMathf.Ceiling
* roundでMathf.Round
* cosでMathf.Cos
* sinでMathf.Sin

また、複数選択時に次の演算子をインスペクターに入力すると、すでに入力済みの値に対して、処理した結果で上書き可能です。

* +=
* -=
* *=
* /=

# インデックス機能

複数オブジェクト選択中に「#」を押すとそのオブジェクトの選択中のインデックスを利用できます。

これと一様分布と三角関数を使えば、こんなこともできます。12個のオブジェクトを選択中に、次の式をx・yにぞれぞれ入力し、円形にオブジェクトを配置します。

xに「10*sin(#/12*2*pi)」
yに「10*cos(#/12*2*pi)」

![circle.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/525594b6-eb2d-6fbe-dd28-d057c076d64a.gif)

ソースコードは[ここ](https://github.com/Unity-Technologies/UnityCsReference/blob/2021.2/Editor/Mono/Utils/ExpressionEvaluator.cs#L208)辺りだと思います。

# 変数機能

次はxが-10から10まで一様に並んだcubeです。変数機能を使って、

xに「v*1.5」

と入力し、既に入力された値に対して一様な処理（ここでは、x座標を1.5倍）をかけています。

![variable.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4125/61b90a31-992a-66b7-83b1-f2febf69272e.gif)

ソースコードは[ここ](https://github.com/Unity-Technologies/UnityCsReference/blob/2021.2/Editor/Mono/Utils/ExpressionEvaluator.cs#L353-L360)辺りだと思います。

# まとめ

複数のオブジェクトの座標を、まとめていい感じにしたいときに、活躍しそうですね！

（Unityさん、ここら辺もドキュメント化してもらえると、嬉しいです（小声））