亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Unity教程之-Unity Attribute的使用總結

2019-11-06 10:03:28
字體:
來源:轉載
供稿:網友

舉兩個例子,在變量上使用[SerializeFiled]屬性,可以強制讓變量進行序列化,可以在Unity的Editor上進行賦值。在Class上使用[RequireComponent]屬性,就會在Class的GameObject上自動追加所需的Component。

以下是Unity官網文檔中找到的所有Attribute,下面將按照順序,逐個對這些Attribute進行說明和小的測試。部分例子使用了Unity官方的示例。

UnityEngine

AddComponentMenu

可以在UnityEditor的Component的Menu中增加自定義的項目。菜單可以設置多級,使用斜線/分隔即可。在Hierarchy中選中GameObject的時候,點擊該菜單項,就可以在GameObject上追加該Component。例如如下代碼可以完成下圖的效果。

123[AddComponentMenu("TestMenu/TestComponet")]public class TestMenu : MonoBehaviour {}

f:id:lvmingbei:20150406160818p:plain

AssemblyIsEditorAssembly

匯編級屬性,使用該屬性的Class會被認為是EditorClass。具體用法不明。

ContextMenu

可以在Inspector的ContextMenu中增加選項。例如,如下代碼的效果

123456publicclassTestMenu:MonoBehaviour{    [ContextMenu("Do Something")]    voidDoSomething(){        Debug.Log("Perform Operation");    }}

f:id:lvmingbei:20150406162538p:plain

ContextMenuItemAttribute

這個屬性是Unity4.5之后提供的新功能,可以在Inspector上面對變量追加一個右鍵菜單,并執行指定的函數。例子:

1234567public class Sample : MonoBehaviour {    [ContextMenuItem("Reset", "ResetName")]    public string name = "Default";    void ResetName() {        name = "Default";    }}

f:id:lvmingbei:20150406164234g:plain

DisallowMultipleComponent

對一個MonoBehaviour的子類使用這個屬性,那么在同一個GameObject上面,最多只能添加一個該Class的實例。嘗試添加多個的時候,會出現下面的提示。f:id:lvmingbei:20150406165035p:plain

ExecuteInEditMode

默認狀態下,MonoBehavior中的Start,Update,OnGUI等方法,需要在Play的狀態下才會被執行。這個屬性讓Class在Editor模式(非Play模式)下也能執行。但是與Play模式也有一些區別。例如:Update方法只在Scene編輯器中有物體產生變化時,才會被調用。OnGUI方法只在GameView接收到事件時,才會被調用。

HeaderAttribute

這個屬性可以在Inspector中變量的上面增加Header。例子:

123456789publicclassExampleClass:MonoBehaviour{    [Header("生命值")]    publicintCurrentHP=0;    publicintMaxHP=100;     [Header("魔法值")]    publicintCurrentMP=0;    publicintMaxMP=0;}

f:id:lvmingbei:20150406171544p:plain

HideInInspector

在變量上使用這個屬性,可以讓public的變量在Inspector上隱藏,也就是無法在Editor中進行編輯。

ImageEffectOpaque

在OnRenderImage上使用,可以讓渲染順序在非透明物體之后,透明物體之前。例子

123[ImageEffectOpaque]void OnRenderImage (RenderTexture source, RenderTexture destination){}
ImageEffectTransformsToLDR

渲染從從HDR變為LDR 具體使用方法不明。

MultilineAttribute

在string類型上使用,可以在Editor上輸入多行文字。

1234publicclassTestString:MonoBehaviour{    [MultilineAttribute]    publicstringmText;}

f:id:lvmingbei:20150406183813p:plain

NotConvertedAttribute

在變量上使用,可以指定該變量在build的時候,不要轉換為目標平臺的類型。

NotFlashValidatedAttribute

在變量上使用,在Flash平臺build的時候,對該變量不進行類型檢查。Unity5.0中已經移除了這個屬性。

NotRenamedAttribute

禁止對變量和方法進行重命名。Unity5.0中已經移除了這個屬性。

PRopertyAttribute
RangeAttribute

在int或者float類型上使用,限制輸入值的范圍

1234public class TestRange : MonoBehaviour{    [Range(0, 100)] public int HP;}
RequireComponent

在Class上使用,添加對另一個Component的依賴。當該Class被添加到一個GameObject上的時候,如果這個GameObject不含有依賴的Component,會自動添加該Component。且該Componet不可被移除。

例子

1234[RequireComponent(typeof(Rigidbody))]publicclassTestRequireComponet:MonoBehaviour{ }

f:id:lvmingbei:20150406191049g:plain如果嘗試移除被依賴的Component,會有如下提示f:id:lvmingbei:20150406191137p:plain

RPC

在方法上添加該屬性,可以網絡通信中對該方法進行RPC調用。

123[RPC]void RemoteMethod(){}
RuntimeInitializeOnLoadMethodAttribute

此屬性僅在Unity5上可用。在游戲啟動時,會自動調用添加了該屬性的方法。

12345678classMyClass{    [RuntimeInitializeOnLoadMethod]    staticvoidOnRuntimeMethodLoad()    {        Debug.Log("Game loaded and is running");    }}
SelectionBaseAttribute

當一個GameObject含有使用了該屬性的Component的時候,在SceneView中選擇該GameObject,Hierarchy上面會自動選中該GameObject的Parent。

SerializeField

在變量上使用該屬性,可以強制該變量進行序列化。即可以在Editor上對變量的值進行編輯,即使變量是private的也可以。在UI開發中經??梢姷綄rivate的組件進行強制序列化的用法。例子

1234567public class TestSerializeField : MonoBehaviour {    [SerializeField]    private string name;     [SerializeField]    private Button _button;}

f:id:lvmingbei:20150406194030p:plain

SharedBetweenAnimatorsAttribute

用于StateMachineBehaviour上,不同的Animator將共享這一個StateMachineBehaviour的實例,可以減少內存占用。

SpaceAttribute

使用該屬性可以在Inspector上增加一些空位。 例子:

1234567publicclassTestSpaceAttributeByLvmingbei:MonoBehaviour{    publicintnospace1=0;    publicintnospace2=0;    [Space(10)]    publicintspace=0;    publicintnospace3=0;}

f:id:lvmingbei:20150407121446p:plain

TextAreaAttribute

該屬性可以把string在Inspector上的編輯區變成一個TextArea。例子:

1234public class TestTextAreaAttributeByLvmingbei : MonoBehaviour {    [TextArea]    public string mText;}

f:id:lvmingbei:20150407121811p:plain

TooltipAttribute

這個屬性可以為變量上生成一條tip,當鼠標指針移動到Inspector上時候顯示。

1234publicclassTestTooltipAttributeByLvmingbei:MonoBehaviour{    [Tooltip("This year is 2015!")]    publicintyear=0;}

f:id:lvmingbei:20150407122412p:plain

UnityAPICompatibilityVersionAttribute

用來聲明API的版本兼容性

UnityEngine.Serialization

FormerlySerializedAsAttribute

該屬性可以令變量以另外的名稱進行序列化,并且在變量自身修改名稱的時候,不會丟失之前的序列化的值。例子:

1234567891011using UnityEngine;using UnityEngine.Serialization;public class MyClass : MonoBehaviour {    [FormerlySerializedAs("myValue")]    private string m_MyValue;    public string myValue    {        get { return m_MyValue; }        set { m_MyValue = value; }    }}

UnityEngine.Editor

該package為Editor開發專用

CallbackOrderAttribute

定義Callback的順序

CanEditMultipleObjects

Editor同時編輯多個Component的功能

CustomEditor

聲明一個Class為自定義Editor的Class

CustomPreviewAttribute

將一個class標記為指定類型的自定義預覽Unity4.5以后提供的新功能例子:

12345678910111213[CustomPreview(typeof(GameObject))]publicclassMyPreview:ObjectPreview{    publicoverrideboolHaspreviewGUI()    {        returntrue;    }     publicoverridevoidOnPreviewGUI(Rectr,GUIStylebackground)    {        GUI.Label(r,target.name+" is being previewed");    }}
CustomPropertyDrawer

標記自定義PropertyDrawer時候使用。當自己創建一個PropertyDrawer或者DecoratorDrawer的時候,使用該屬性來標記。 TODO: 如何創建屬于自己的Attribute

DrawGizmo

可以在Scene視圖中顯示自定義的Gizmo下面的例子,是在Scene視圖中,當掛有MyScript的GameObject被選中,且距離相機距離超過10的時候,便顯示自定義的Gizmo。Gizmo的圖片需要放入Assets/Gizmo目錄中。例子:

123456789101112131415161718using UnityEngine;using UnityEditor; public class MyScript : MonoBehaviour {    } public class MyScriptGizmoDrawer {        [DrawGizmo (GizmoType.Selected | GizmoType.Active)]    static void DrawGizmoForMyScript (MyScript scr, GizmoType gizmoType) {        Vector3 position = scr.transform.position;                if(Vector3.Distance(position, Camera.current.transform.position) > 10f)            Gizmos.DrawIcon (position, "300px-Gizmo.png");    }    }

f:id:lvmingbei:20150410162651p:plain

InitializeOnLoadAttribute

在Class上使用,可以在Unity啟動的時候,運行Editor腳本。需要該Class擁有靜態的構造函數。做一個創建一個空的gameobject的例子。例子:

1234567891011121314151617usingUnityEditor;usingUnityEngine; [InitializeOnLoad]classMyClass{    staticMyClass()    {        Editorapplication.update+=Update;        Debug.Log("Up and running");    }        staticvoidUpdate()    {        Debug.Log("Updating");    }}
InitializeOnLoadMethodAttribute

在Method上使用,是InitializeOnLoad的Method版本。Method必須是static的。

MenuItem

在方法上使用,可以在Editor中創建一個菜單項,點擊后執行該方法,可以利用該屬性做很多擴展功能。 需要方法為static。例子:

1234567891011using UnityEngine;using UnityEditor;using System.Collections; public class TestMenuItem : MonoBehaviour {     [MenuItem ("MyMenu/Create GameObject")]    public static void CreateGameObject() {        new GameObject("lvmingbei's GameObject");    }}

f:id:lvmingbei:20150412204353g:plain

PreferenceItem

使用該屬性可以定制Unity的Preference界面。在這里就使用官方的例子:

12345678910111213141516171819202122232425262728usingUnityEngine;usingUnityEditor;usingSystem.Collections; publicclassOurPreferences{    // Have we loaded the prefs yet    privatestaticboolprefsLoaded=false;        // The Preferences    publicstaticboolboolPreference=false;        // Add preferences section named "My Preferences" to the Preferences Window    [PreferenceItem("My Preferences")]    publicstaticvoidPreferencesGUI(){        // Load the preferences        if(!prefsLoaded){            boolPreference=EditorPrefs.GetBool("BoolPreferenceKey",false);            prefsLoaded=true;        }                // Preferences GUI        boolPreference=EditorGUILayout.Toggle("Bool Preference",boolPreference);                // Save the preferences        if(GUI.changed)            EditorPrefs.SetBool("BoolPreferenceKey",boolPreference);    }}

f:id:lvmingbei:20150412210832p:plain

UnityEditor.Callbacks

這個package中是三個Callback的屬性,都需要方法為static的。

OnOpenAssetAttribute

在打開一個Asset后被調用。例子:

1234567891011121314151617181920using UnityEngine;using UnityEditor;using UnityEditor.Callbacks;    public class MyAssetHandler {     [OnOpenAssetAttribute(1)]    public static bool step1(int instanceID, int line) {        string name = EditorUtility.InstanceIDToObject(instanceID).name;        Debug.Log("Open Asset step: 1 ("+name+")");        return false; // we did not handle the open    }     // step2 has an attribute with index 2, so will be called after step1    [OnOpenAssetAttribute(2)]    public static bool step2(int instanceID, int line) {        Debug.Log("Open Asset step: 2 ("+instanceID+")");        return false; // we did not handle the open    }}
PostProcessBuildAttribute

該屬性是在build完成后,被調用的callback。同時具有多個的時候,可以指定先后順序。例子:

12345678910usingUnityEngine;usingUnityEditor;usingUnityEditor.Callbacks;    publicclassMyBuildPostprocessor{    [PostProcessBuildAttribute(1)]    publicstaticvoidOnPostprocessBuild(BuildTargettarget,stringpathToBuiltProject){        Debug.Log(pathToBuiltProject);        }}
PostProcessSceneAttribute

使用該屬性的函數,在scene被build之前,會被調用。具體使用方法和PostProcessBuildAttribute類似。

好了本篇unity3d教程到此結束,下篇我 們再會!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久之久亚州精品露出| 国产成人亚洲综合91精品| 日韩免费不卡av| 亚洲天堂av综合网| 亚洲人成电影网站色xx| 亚洲国产日韩欧美在线99| 伊人久久久久久久久久久久久| 亚洲欧美第一页| 成人网欧美在线视频| 欧美性猛xxx| 精品一区二区三区四区在线| 欧美在线视频免费| 7777精品视频| 欧美电影在线免费观看网站| 欧美激情影音先锋| 国产精品免费视频xxxx| 久久久久久久久国产精品| 欧洲精品毛片网站| 伊人亚洲福利一区二区三区| 亚洲视频777| 亚洲人成亚洲人成在线观看| 日韩中文字幕av| 97av在线播放| 尤物九九久久国产精品的特点| 亚洲精品国产精品国产自| 成人网页在线免费观看| 亚洲精品999| 国产一区二中文字幕在线看| 欧美在线免费视频| 精品日本美女福利在线观看| 国产午夜精品全部视频播放| 久久精品亚洲国产| 国产噜噜噜噜噜久久久久久久久| 亚洲成人久久网| 精品久久久久久亚洲精品| 亚洲精品99久久久久中文字幕| 97香蕉久久超级碰碰高清版| 岛国av一区二区| 国产精品视频不卡| 91精品久久久久久久久久久久久| 最近中文字幕日韩精品| 欧美精品18videos性欧| 成人国产精品一区| 日韩免费在线视频| 国产精品久久久| 日韩av免费在线观看| 欧美激情二区三区| 综合网中文字幕| 精品久久久久久中文字幕一区奶水| 亚洲欧美国产日韩天堂区| 亚洲自拍偷拍网址| 久久久亚洲精品视频| 国产日韩中文字幕在线| 国产精品久久久久久久久久小说| 欧美视频专区一二在线观看| 欧美中在线观看| 亚洲国产成人精品久久久国产成人一区| 最近免费中文字幕视频2019| 久久久久久综合网天天| 欧美疯狂xxxx大交乱88av| 中文字幕日韩av电影| 亚洲aⅴ日韩av电影在线观看| 日韩h在线观看| 亚洲人成网站777色婷婷| 久久高清视频免费| 岛国av在线不卡| 欧美精品一区在线播放| 俺去了亚洲欧美日韩| 欧美人与性动交| 中文字幕日韩av电影| 日韩在线观看你懂的| 国内精品伊人久久| 日韩美女av在线免费观看| 91精品国产高清久久久久久久久| 欧美视频专区一二在线观看| 青青草国产精品一区二区| 欧美激情a∨在线视频播放| 日韩电影中文字幕在线| 中文字幕亚洲综合久久筱田步美| 国产一区二区色| 欧美成人精品激情在线观看| 国产精品流白浆视频| 日韩欧美在线观看| 亚洲成人av片在线观看| 91夜夜未满十八勿入爽爽影院| 最近2019中文字幕第三页视频| 国产精品免费一区二区三区都可以| 国产精品免费在线免费| 欧美美最猛性xxxxxx| 精品国产美女在线| 精品福利在线视频| 免费成人高清视频| 青青草精品毛片| 国产在线不卡精品| 欧美在线观看日本一区| 精品国产成人在线| 亚洲黄页网在线观看| 国产精品免费一区豆花| 国产成人jvid在线播放| 亚洲国产欧美一区二区三区久久| 人人做人人澡人人爽欧美| 久久久久久久香蕉网| 国产亚洲一区二区在线| 欧美大片免费观看在线观看网站推荐| www.美女亚洲精品| 亚洲综合视频1区| 国产精品99久久久久久久久久久久| 国产精品999| 国产精品久久久久久久一区探花| 国产精品一区二区三| 欧美激情亚洲一区| 精品国偷自产在线视频| 久久精品国产2020观看福利| 亚洲欧美国产制服动漫| 亚洲第一国产精品| 精品亚洲一区二区三区在线播放| 91精品久久久久久久久久久久久| 国产+人+亚洲| 国产mv免费观看入口亚洲| 欧美成人午夜免费视在线看片| 欧美激情女人20p| 欧美一乱一性一交一视频| 亚洲国产精品yw在线观看| 亚洲人成毛片在线播放| 亚洲第一色在线| 91中文在线视频| 亚洲精品久久7777777| 日韩精品在线观| 国产精品都在这里| 日韩在线观看免费全| 亚洲国产中文字幕久久网| 久久精品国产成人| 亚洲国产91色在线| 日韩高清中文字幕| 国产一区二区日韩| 午夜精品久久久99热福利| 成人高h视频在线| 久久久久久网址| 一本大道久久加勒比香蕉| 亚洲综合在线中文字幕| 国产国产精品人在线视| 亚洲影院色在线观看免费| 亚洲精品视频免费| 欧美裸体视频网站| 91精品免费久久久久久久久| 136fldh精品导航福利| 久久天天躁夜夜躁狠狠躁2022| 亚洲成色777777在线观看影院| 亚洲激情在线观看| 国产做受69高潮| 国产精品电影在线观看| 狠狠色狠狠色综合日日小说| 91成人免费观看网站| 久久在线视频在线| 97人洗澡人人免费公开视频碰碰碰| 久久乐国产精品| 久久乐国产精品| 成人亚洲欧美一区二区三区| 国产精品美女久久| 亚洲一区久久久| 欧美精品日韩www.p站| 91在线精品播放| 国产一区二区三区丝袜| 亚洲aⅴ男人的天堂在线观看|