小玩意兒

Gizmos 用於在場景檢視中繪製形狀。你可以使用這些形狀來繪製有關 GameObjects 的額外資訊,例如它們具有的截頭體或檢測範圍。

以下是有關如何執行此操作的兩個示例

例一

此示例使用 OnDrawGizmosOnDrawGizmosSelected (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 檢查。

結果

未選中的

StackOverflow 文件

StackOverflow 文件