Unity Attributes 自帶特性

powerx_yc發表於2017-10-13

AddComponentMenu

AddComponentMenu屬性允許您將指令碼放置在“元件”選單中的任何位置,而不僅僅是“元件 - >指令碼”選單。
您可以使用它來更好地組織“元件”選單,這樣可以在新增指令碼時改進工作流程。重要提示:您需要重新啟動。

  • componentOrder 元件選單中的元件順序(低於頂部)。
  • AddComponentMenu 在“元件”選單中新增一個專案。
using UnityEngine;

[AddComponentMenu("Transform/Follow Transform")]
public class FollowTransform : MonoBehaviour
{
}

效果如下

7643202-c73201285b29e944.gif

AssemblyIsEditorAssembly

裝配級屬性。具有此屬性的程式集中的任何類將被視為編輯器類。
建構函式
AssemblyIsEditorAssembly

ContextMenu

ContextMenu屬性允許您向上下文選單新增命令。在所附指令碼的督察中。當使用者選擇上下文選單時,將執行該功能。這對於自動從指令碼設定場景資料是最有用的。該功能必須是非靜態的。

using UnityEngine;

public class ContextTesting : MonoBehaviour
{
    /// Add a context menu named "Do Something" in the inspector
    /// of the attached script.
    [ContextMenu("Do Something")]
    void DoSomething()
    {
        Debug.Log("Perform operation");
    }
}
  • ContextMenu 將功能新增到元件的上下文選單。

效果如下

7643202-db32c8bd5ba83407.gif

ContextMenuItemAttribute

使用此屬性將上下文選單新增到呼叫命名方法的欄位。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    [ContextMenuItem("Reset", "ResetBiography")]
    [Multiline(8)]
    public string playerBiography = "";
    void ResetBiography()
    {
        playerBiography = "";
    }
}

效果如下

7643202-e92afd36d1668f69.gif

CreateAssetMenu

fileName
新建立的此類例項使用的預設檔名。(建立檔案必須以 .asset 結尾)
menuName
此型別顯示的名稱顯示在“資產/建立”選單中。
order
選單項在資產/建立選單中的位置。

using UnityEngine;

[CreateAssetMenu(fileName = "自定義資源.asset", menuName = "選單/子項0")]
public class CreateAsset : ScriptableObject
{
    public string Name = "自定義資源";

    public Vector3[] Pos = new Vector3[10];
}

效果如下

7643202-f5e7278ebe4335f9.gif

DelayedAttribute

用於在指令碼中使float,int或string變數的屬性被延遲。

當使用此屬性時,float,int或text欄位將不會返回一個新的值,直到使用者按下enter或焦點離開該欄位。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DelayedAttributeExample : MonoBehaviour
{
    [DelayedAttribute()]
    public string content;

}

效果如下

7643202-8779ff9f78aa5807.gif

DisallowMultipleComponent

防止將相同型別(或子型別)的MonoBehaviour多次新增到GameObject。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[DisallowMultipleComponent]
public class Disallow : MonoBehaviour
{

}

效果如下

7643202-85409f78d9e21711.gif

ExecuteInEditMode

使指令碼的所有例項在編輯模式下執行。

預設情況下,MonoBehaviours只能在播放模式下執行。
通過新增此屬性,MonoBehaviour的任何例項將在編輯器不處於播放模式時執行其回撥函式。

這些功能不會像播放模式一樣被呼叫。

更新僅在場景中的某些內容更改時才呼叫。當遊戲檢視接收到一個事件時,OnGUI被呼叫。OnRenderObject和其他渲染回撥函式在場景檢視或遊戲檢視的每次重繪時都被呼叫。
另請參見:runInEditMode

using UnityEngine;

[ExecuteInEditMode]
public class PrintAwake : MonoBehaviour
{
    void Awake()
    {
        Debug.Log("Editor causes this Awake");
    }

    void Update()
    {
        Debug.Log("Editor causes this Update");
    }
}

效果如下

7643202-bee5ec60ca4f5382.gif

GUITargetAttribute

控制對應的OnGUI在那個Display上顯示

using UnityEngine;
public class ExampleClass1 : MonoBehaviour
{
    // Label will appear on display 0 and 1 only
    [GUITarget(0, 1)]
    void OnGUI()
    {
        GUI.Label(new Rect(10, 10, 300, 100), "Visible on TV and Wii U GamePad only");
    }
}

效果如下

7643202-5bd5f48d748b97a8.gif

HeaderAttribute

在Inspector 中顯示屬性對應屬性的註釋
使用此
PropertyAttribute在檢查器中的某些欄位上方新增標題。
標題是使用DecoratorDrawer完成的。

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    [Header("生命 Settings")]
    public int health = 0;
    public int maxHealth = 100;
    [Header("防禦 Settings")]
    public int shield = 0;
    public int maxShield = 0;
}

效果如下

7643202-937ab6ae9432ab8e.png

HelpURLAttribute

幫助圖示對應跳轉的URL(注意此類需要繼承MonoBehaviour,不繼承在2017測試跳轉地址無效)

using UnityEngine;
using UnityEditor;

[HelpURL("http://www.jianshu.com/u/84e03bc5c4a6")]
public class MyComponent:MonoBehaviour
{
}

效果如下

7643202-50529f4495fdb2bb.gif

HideInInspector

隱藏在Inspector皮膚中顯示的Public屬性

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    [HideInInspector]
    public int Hide = 0;

    [Header("生命 Settings")]
    public int health = 0;
    public int maxHealth = 100;
    [Header("防禦 Settings")]
    public int shield = 0;
    public int maxShield = 0;
}

效果如下

7643202-3edea463d2c7b5b3.gif

ImageEffectAllowedInSceneView

具有此屬性的任何影象效果可以渲染到場景檢視相機中。
如果您希望將影象效果應用於場景檢視相機,則會新增此屬性。效果將應用於相同的位置,並且具有與相機效果相同的值。(5.4開始新加的特性,目前不知道怎麼用)

MultilineAttribute

用於使字串值的屬性顯示在多行文字區域中。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Example1 : MonoBehaviour
{
    [MultilineAttribute(10)]
    public string str = "";

}

效果如下

7643202-99b07d5601febdc7.png

PreferBinarySerialization

這對於包含大量資料的自定義資產型別很有用。始終保持儲存為二進位制可以提高讀/寫效能,並在磁碟上生成更緊湊的表示。(說白了就是一二進位制形式儲存提高效能)

using UnityEngine;


[CreateAssetMenu]
[PreferBinarySerialization]
public class CustomData : ScriptableObject
{
    public float[] lotsOfFloatData = new[] { 1f, 2f, 3f };
    public byte[] lotsOfByteData = new byte[] { 4, 5, 6 };
}

PropertyAttribute

派生自定義屬性屬性的基類。
使用它來建立指令碼變數的自定義屬性。

自定義屬性可以與自定義的
[PropertyDrawer(https://docs.unity3d.com/2017.2/Documentation/ScriptReference/PropertyDrawer.html)類掛鉤,以控制如何在Inspector中顯示具有該屬性的指令碼變數。
另請參見:PropertyDrawer類。

RangeAttribute

用於在指令碼中建立一個float或int變數的屬性被限制在一個特定的範圍內。
當使用此屬性時,float或int將在Inspector中顯示為滑塊,而不是預設數字欄位

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Example1 : MonoBehaviour
{
    [RangeAttribute(0,1000f)]
    public int speed;
}

效果如下

7643202-1b9fdd77ceeb77c9.gif

RequireComponent

RequireComponent屬性自動將所需元件新增為依賴關係。
當您將一個使用RequireComponent的指令碼新增到GameObject時,所需的元件將自動新增到GameObject中。這有助於避免安裝錯誤。例如,指令碼可能需要將Rigidbody總是新增到同一個GameObject中。使用RequireComponent這將自動完成,因此您永遠不會得到設定錯誤。請注意,RequireComponent僅在元件新增到GameObject的時刻檢查缺少的依賴關係。GameObject缺少新依賴關係的元件的現有例項將不會自動新增這些依賴關係。(自動新增指定組建,有元件的不新增,沒有的新增)

using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class PlayerScript : MonoBehaviour
{
    Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        rb.AddForce(Vector3.up);
    }
}

效果如下

7643202-74744c3d514d1373.gif

RuntimeInitializeOnLoadMethodAttribute

允許執行時類方法在執行時載入遊戲時被初始化,而不需要使用者的操作。
標記[RuntimeInitializeOnLoadMethod]的方法在遊戲載入後被呼叫。這是在Awake方法被呼叫之後。
注意:[RuntimeInitializeOnLoadMethod]不保證標記的方法的執行順序。呼叫的方法需靜態

場景載入前呼叫

[RuntimeInitializeOnLoadMethodAttribute(RuntimeInitializeLoadType.BeforeSceneLoad)]

場景載入後呼叫

[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
// Create a non-MonoBehaviour class which displays
// messages when a game is loaded.
using UnityEngine;

class MyClass
{
    [RuntimeInitializeOnLoadMethod]
    static void OnRuntimeMethodLoad()
    {
        Debug.Log("場景載入和遊戲執行後");
    }

    [RuntimeInitializeOnLoadMethod]
    static void OnSecondRuntimeMethodLoad()
    {
        Debug.Log("SecondMethod場景載入和遊戲執行後");
    }
}

效果如下

7643202-e5d0e5b74e9e81d9.gif

SelectionBaseAttribute

將此屬性新增到指令碼類以將其GameObject標記為用於場景檢視挑選的選擇基礎物件。
在Unity Scene View中,單擊選擇物件時,Unity將嘗試找出最適合您選擇的物件。如果單擊作為預製體一部分的物件,則選擇預製根的根,因為預製根被視為選擇庫。您也可以使其他物件也被視為選擇庫。您需要使用SelectionBase屬性建立一個指令碼類,然後您需要將該指令碼新增到GameObject中。

using UnityEngine;

[SelectionBase]
public class PlayerScript : MonoBehaviour
{

}

效果如下

7643202-8cff2dff9336d795.gif

SerializeField

在Inspector可以看到標記為private的屬性

using UnityEngine;

public class SomePerson : MonoBehaviour
{
    //This field gets serialized because it is public.
    public string firstName = "John";

    //This field does not get serialized because it is private.
    private int age = 40;

    //This field gets serialized even though it is private
    //because it has the SerializeField attribute applied.
    [SerializeField]
    private bool hasHealthPotion = true;

    void Start()
    {
        if (hasHealthPotion)
            Debug.Log("Person's first name: " + firstName + " Person's age: " + age);
    }
}

效果如下

7643202-4167e2a2b0f6535f.gif

SharedBetweenAnimatorsAttribute

SharedBetweenAnimatorsAttribute是一個屬性,指定該StateMachineBehaviour應僅例項化一次,並在所有Animator例項之間共享。
此屬性減少每個控制器例項的記憶體佔用。

程式設計師可以選擇哪個StateMachineBehaviour可以使用此屬性。
請注意,如果您的StateMachineBehaviour更改一些成員變數,它將影響使用它的所有其他Animator例項。
另請參見:StateMachineBehaviour類。

using UnityEngine;

[SharedBetweenAnimators]
public class AttackBehaviour : StateMachineBehaviour
{
    public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("OnStateEnter");
    }
}

SpaceAttribute

使用此
PropertyAttribute在檢查器中新增一些間距。
間距使用DecoratorDrawer完成。

using UnityEngine;
using System.Collections;

public class ExampleClass2 : MonoBehaviour
{
    public int health = 0;
    public int maxHealth = 100;
  [Space(10)]
    public int shield = 0;
    public int maxShield = 0;
}

效果如下

7643202-911a0f880e97f184.gif

TextAreaAttribute

使用高度靈活和可滾動的文字區域編輯字串的屬性。
您可以指定TextArea的最小和最大行,並且欄位將根據文字的大小進行擴充套件。如果文字大於可用區域,則會顯示一個滾動條。

using UnityEngine;

public class TextAreaExample : MonoBehaviour
{
    [TextArea()]
    public string MyTextArea;
}

效果如下

7643202-cf354193d16fc64e.gif

TooltipAttribute

在“檢查器”視窗中指定一個欄位的工具提示。

using UnityEngine;
using System.Collections;

public class ExampleClass3 : MonoBehaviour
{
    [Tooltip("Health 值 從 0 到 100.")]
    public int health = 0;
}

效果如下

7643202-4ac524f2e6fabce3.gif

UnityAPICompatibilityVersionAttribute

宣告一個程式集與特定的Unity API相容(API明智)。由內部工具使用,以避免處理程式集,以確定程式集是否可能使用舊的Unity API。
(目前沒弄明白怎麼用)

相關文章