小玩意兒
Gizmos 用於在場景檢視中繪製形狀。你可以使用這些形狀來繪製有關 GameObjects 的額外資訊,例如它們具有的截頭體或檢測範圍。
以下是有關如何執行此操作的兩個示例
例一
此示例使用 OnDrawGizmos 和 OnDrawGizmosSelected (magic)方法。
public class GizmoExample : MonoBehaviour {
public float GetDetectionRadius() {
return 12.5f;
}
public float GetFOV() {
return 25f;
}
public float GetMaxRange() {
return 6.5f;
}
public float GetMinRange() {
return 0;
}
public float GetAspect() {
return 2.5f;
}
public void OnDrawGizmos() {
var gizmoMatrix = Gizmos.matrix;
var gizmoColor = Gizmos.color;
Gizmos.matrix = Matrix4x4.TRS( transform.position, transform.rotation, transform.lossyScale );
Gizmos.color = Color.red;
Gizmos.DrawFrustum( Vector3.zero, GetFOV(), GetMaxRange(), GetMinRange(), GetAspect() );
Gizmos.matrix = gizmoMatrix;
Gizmos.color = gizmoColor;
}
public void OnDrawGizmosSelected() {
Handles.DrawWireDisc( transform.position, Vector3.up, GetDetectionRadius() );
}
}
在這個例子中,我們有兩種繪製小玩意的方法,一種在物件處於活動狀態時繪製(OnDrawGizmos),另一種用於在層次結構中選擇物件時(OnDrawGizmosSelected)。
public void OnDrawGizmos() {
var gizmoMatrix = Gizmos.matrix;
var gizmoColor = Gizmos.color;
Gizmos.matrix = Matrix4x4.TRS( transform.position, transform.rotation, transform.lossyScale );
Gizmos.color = Color.red;
Gizmos.DrawFrustum( Vector3.zero, GetFOV(), GetMaxRange(), GetMinRange(), GetAspect() );
Gizmos.matrix = gizmoMatrix;
Gizmos.color = gizmoColor;
}
首先,我們儲存 Gizmo 矩陣和顏色,因為我們將要更改它並希望在完成後將其還原為不影響任何其他 Gizmo 繪圖。
接下來我們想繪製我們的物件所具有的平截頭體,但是,我們需要更改 Gizmos 的矩陣,使其與位置,旋轉和比例相匹配。我們還將 Gizmos 的顏色設定為紅色以強調平截頭體。完成後,我們可以呼叫 Gizmos.DrawFrustum 在場景檢視中繪製平截頭體。
當我們完成繪製我們想要繪製的內容時,我們重置了 Gizmos 的矩陣和顏色。
public void OnDrawGizmosSelected() {
Handles.DrawWireDisc( transform.position, Vector3.up, GetDetectionRadius() );
}
我們還想在選擇 GameObject 時繪製檢測範圍。這是通過 Handles 類完成的,因為 Gizmos 類沒有任何光碟方法。
使用這種形式的繪製小控制元件結果到下面顯示的輸出。
例二
此示例使用 DrawGizmo 屬性。
public class GizmoDrawerExample {
[DrawGizmo( GizmoType.Selected | GizmoType.NonSelected, typeof( GizmoExample ) )]
public static void DrawGizmo( GizmoExample obj, GizmoType type ) {
var gizmoMatrix = Gizmos.matrix;
var gizmoColor = Gizmos.color;
Gizmos.matrix = Matrix4x4.TRS( obj.transform.position, obj.transform.rotation, obj.transform.lossyScale );
Gizmos.color = Color.red;
Gizmos.DrawFrustum( Vector3.zero, obj.GetFOV(), obj.GetMaxRange(), obj.GetMinRange(), obj.GetAspect() );
Gizmos.matrix = gizmoMatrix;
Gizmos.color = gizmoColor;
if ( ( type & GizmoType.Selected ) == GizmoType.Selected ) {
Handles.DrawWireDisc( obj.transform.position, Vector3.up, obj.GetDetectionRadius() );
}
}
}
這種方式允許你從指令碼中分離 Gizmo 呼叫。除了兩件事之外,其中大多數使用與其他示例相同的程式碼。
[DrawGizmo( GizmoType.Selected | GizmoType.NonSelected, typeof( GizmoExample ) )]
public static void DrawGizmo( GizmoExample obj, GizmoType type ) {
你需要使用 DrawGizmo 屬性,該屬性將列舉 GizmoType 作為第一個引數,將 Type 作為第二個引數。Type 應該是你要用於繪製 Gizmo 的型別。
繪製 Gizmo 的方法需要是靜態的,公共的或非公共的,並且可以根據需要進行命名。第一個引數是型別,它應該與作為屬性中第二個引數傳遞的型別匹配,第二個引數是列舉 GizmoType,它描述物件的當前狀態。
if ( ( type & GizmoType.Selected ) == GizmoType.Selected ) {
Handles.DrawWireDisc( obj.transform.position, Vector3.up, obj.GetDetectionRadius() );
}
另一個區別是,為了檢查物件的 GizmoType 是什麼,你需要對引數和所需型別進行 AND 檢查。