11

Unityで「LayerCollisionMatrix」が表示されるように、エディターで2次元配列を表示しようとしています。 ここに画像の説明を入力してください

チェックボックスの代わりに、intと完全なグリッド(三角形ではない)が必要ですが、これを行う方法がわからないようです...グリッドの作成は失敗しますが、カスタムエディターを取得できます。それで、Physics Managerのエディターのコードを見る方法はありますか(Layer Collision Matrixがそこにあります)、または誰かがこれを行うための良い方法を知っているかもしれませんか?

注:優先言語はc#ですが、どの言語でもかまいません。

ありがとう。

4

2 に答える 2

7

あなたが探しているものに関係するコードはかなり複雑なので、私がここで話していることを知るためにあなたに頼るつもりです。Unityのドキュメントはあなたの友達です。

  1. GUIArea特別なエディタツールがある場所を作成します。その中に、他のレンダリング関数を呼び出す関数呼び出しを配置し​​ます。ここでカプセル化を実行することをお勧めします。GUIを別の関数にカプセル化すると、その機能を(抽象化の範囲内で)複製し、画面上で物事をより簡単に移動できるようになります。

  2. 3つのアンカーポイントを設計します(Vector2)。これらはそれぞれ、行ラベル、列ラベル、およびデータフィールドの左上の座標を表す必要があります。回転(次のステップ)するとアンカーが変換されるため、列アンカーは行アンカーの真上(同じx値)にある必要があることに注意してください。

  3. GUIUtility.RotateAroundPivot()GUI変換行列を列アンカーポイントを中心に90°回転するために使用します。

  4. あなたのラベルのために長いGUI.Label(またはそれらのいくつか)を書いてください。それらを柱アンカーに固定します。上の画像によると、ラベル文字列は「Default \ nTransparentFX \ nIgnoreRaycast \ nWater」のようになり、\nで改行が作成されます。

  5. もう一度回転させ、元のマトリックスに-90°戻します。または、手順3の前にコピーGUI.matrixしてから、マトリックスのリセットを保証するために割り当て直すこともできます。前後に回転すると、浮動小数点やその他の不正確さのためにエラーが発生する可能性があります。

  6. 行のラベルを記述します。2ステップ前と同じ方法。行アンカーでそれらを固定します。

  7. これは難しい部分です。データフィールドを反復処理し、データ内の要素ごとに小さな要素または要素を作成EditorGUI.IntField()StringField()ます 。ObjectField()各要素には独自のアンカーが必要であり、それがデータフィールドアンカーと合計されます。データフィールドが正方形の2D配列の場合、アンカーの導出は簡単ですが、配列には空の要素も含まれます(上記の正確な機能が必要な場合)。メモリを節約したい場合は、トリッキーな計算を使用して要素インデックスを座標に変換する必要があります。頭のてっぺんからどうやってやるのかわからない。

私が何かを忘れていないことを願っています。UnityのGUIはb----です。コメントと私はあなたを助けるために最善を尽くします。

于 2013-01-08T22:44:52.687 に答える
0

Googleから来たばかりです...Unityエディターのソースコードはここから入手できます:https ://github.com/Unity-Technologies/UnityCsReference/blob/master/Editor/Mono/Inspector/PhysicsManagerInspector.cs

驚いたことに、計算された高さで使用しているので、スタイルとGUILayout.BeginScrollView互換性があり、テキストの回転に利用できます。コード全体(40行目から95行目)については考えませんが、チェックすることをお勧めします。EditorGUILayoutGUI.matrix

于 2021-10-03T14:21:09.887 に答える