2017-11-30Unityには様々な構造体があります。代表的なものは、Vector2Vector3Vector4QuaternionMatrix4x4RectBoundsなどです。2017.2からこれらうちのいくつかの構造体のint版が追加されました。(float版の対応する構造体なし)RectIntBoundsIntVector4Intは無いみたいですね。RangeIntに相当するfloat版はなく、int版のみのようです。Exprerimentalでは前から使えていました。2017.2でTilemapの正式導入と共に、これらの構造体もUnity正式版で使えるようになりました。大体の用途・機能はもともとあったfloat版から想像できると思いますので、機能的に面白かったものを2点、こぼれ話を数点紹介します。機能ピックアップ面白いものを2点ほど。生成系メソッドVector2からVector2Intを生成するメソッドがあります。Vector2Int.CeilToIntVector2Int.FloorToIntVector2Int.RoundToIntCeil、Floor、Roundという名前から想像できるかもしれませんが、それぞれの要素をCeilToInt、FloorToInt、RoundToIntしたものを生成します。0.4F)));同様に、Vector3からVector3Intを生成するメソッドもあります。BoundsIntにはallPositionsWithinというプロパティがあります。これを用いることで、それぞれの範囲の内部の座標を列挙することができます。Debug.Log(position);}これはTilemapで結構便利です。Previewの内から試して、フィードバックを送っていました。それにまつわるこぼれ話をいくつか。Previewでは、Vector3を引数にとるVector3Intのコンストラクタがありました。これは無いほうがいいコンストラクタ。その理由は、コンストラクタの挙動(どんなVector3Intが生成されるか)、あいまいで明示的なファクトリーメソッドとして定義したほうがいいから。一部の人は、Vector3のそれぞれの要素が切り捨てられたVector3Intが生成されると思う他の人は、Vector3のそれぞれの要素が四捨五入されたVector3Intが生成されると思う他の多くの人は、↑のどっちかわかんないからドキュメント参照したりするもしかしたら、ごく一部の人は、Vector3のそれぞれの要素が切り上げされたVector3Intが生成されると思うという具合でとりうる挙動が複数パターンあるから、それを使おうとする人が混乱する。コンストラクタを無くして、ファクトリメソッドを作ったほうがベター。これが、Vector3Int.CeilToIntVector3Int.RoundToIntVector3Int.FloorToIntこうなった。フォーラムで「こうしようぜー」って言ったら、「それいいね」って感じでコメントをもらったり、何より次のバージョンで反映された。Previwだけれども)破壊的な変更だから変更点ドキュメント書いてよー」ってフォーラムで言われていたみたい。マンハッタン距離が欲しいけどないVector2IntやVector3Intには、マンハッタン距離を計算するメソッドが欲しいと思うんですよ。インスタンスメソッドでもスタティックメソッドの両方。フォーラムで「追加しよーよ」って言ったけど、残念ながら追加されず。使うと思うんだけどなー。2017.2のかなりリリース直前のタイミングまで、RectIntのSetMinMaxメソッドにバグがあったみたい。呼ばれないメソッドだけど、内容的には明らかなバグ。Japanさんに報告したら、すぐに伝えてくれて修正されてよかった。Japanの担当者さん、ありがとうございます。いうか、あまり呼ばれなそうなメソッドだから中の人も使っていなかったのかも。したら、他にあるかも。なんか一部のメソッドやプロパティがないVector3Int、多分forwardとbackwardがないんですよ。format)がないんですよ。(Vector2とVector3Intにはある)多分、これら実装もれな気がします。2017.2から、int系の構造体が追加されました。Preview版には、しっかり報告したりフィードバックを行うことで、採用されたり改善されます。