Unity 3d 脚本特性


Unity 3d 脚本特性

Collected by miccall (内容均来自于网络)
  • 不定时更新

Attribute解释

  • 官方解释(原文略)(翻译也略,反正看不懂 还是我自己总结吧)

  • Attribute是一个类 用户可以使用他做很多事,你可以在运行前 调用脚本做一些处理 也可以运行时执行相应的模块 ,等等很多 。

常用的特性

[SerializeField] 私有变量标识序列化

  • 因为unity仅仅序列化公有域。如果作为附加你也想要Unity去序列化你的一个私有域,你可以添加SerializeField(序列化域)属性给这个域。

  • 序列化的值被存储到场景和预制体。因为值存储在meta元数据中,在Inspector检查器中就可以设置值了

        //C# example
        using UnityEngine;

        public class SomePerson : MonoBehaviour {
            //这个领域被序列化的,因为它是public的
            public string name = "John";

            //这个领域不被序列化的,因为它是private的。
            private int age = 40;

            //这个领域被序列化,即使它是 private
            //因为它有SerializeField属性
            [SerializeField]
            private bool hasHealthPotion = true;

            void Update () {

            }
        }

[RequireComponent]

  • 可以允许自动添加需要的组件作为一个附属

  • 当你添加的一个用了RequireComponent组件的脚本,需要的组件将会自动被添加到game object(游戏物体)。这个可以有效的避免组装错误。举个例子一个脚本可能需要刚体总是被添加在相同的game object(游戏物体)上。用RequireComponent属性的话,这个过程将被自动完成,因此你可以永远不会犯组装错误。

  • [RequireComponent(typeof( Component_name))]

        [RequireComponent (typeof (Rigidbody))]
        class PlayerScript : MonoBehaviour {
            void FixedUpdate() {
                rigidbody.AddForce(Vector3.up);
            }
        } 
        //当你挂载这个脚本的时候 ,会把Rigidbody一起挂载

[Range(0, 5)]

  • 属性用来制造一个浮点数或int变量在脚本中被限制到一个特定的范围内。当使用这个属性时,浮动或int将显示为一个滑块的滑动条

[Tooltip]

  • 当用Tooltip属性的变量 会在 Inspector 界面,当你鼠标悬停在当前变量名的时候 显示备注的文字

  • 在以下脚本添加一个提示。这提供给用户的信息关于健康变量值的范围。提供的建议范围是TooltipAttribute字符串

        public class ExampleClass : MonoBehaviour {
            [Tooltip("Health value between 0 and 100.")]
            public int health = 0;
        }

[Space]

        public class ExampleClass : MonoBehaviour {
            [Header("Health Settings")]
            public int health = 0;
            public int maxHealth = 100;
            [Header("Shield Settings")]
            public int shield = 0;
            public int maxShield = 0;
        }

[Multiline]

[TextArea]

[HideInInspector]

[NonSerializable]

[FormerlySerializedAs]

[DisallowMultipleComponent]

[ContextMenu]

  • 允许你去添加命令给上下文菜单

  • 在附加脚本的inspector(检视面板)。当用户选择环境菜单时,这个方法将会被执行

  • 这是非常有用的对于自动设置场景数据通过脚本。方法必须是非静态的

        class ContextTesting : MonoBehaviour {
            /// Add a context menu named "Do Something" in the inspector
            /// of the attached script.
            ///添加一个环境菜单名叫"Do Something"在添加了脚本的inspector(检视面板)
            [ContextMenu ("Do Something")]
            void DoSomething () {
                Debug.Log ("Perform operation");
            }
        }

[MonoPInvokeCallback]

[DLLImport]


简单而实用的小代码

找到脚本 删除脚本

        if(gameObject.GetComponent<MouseDrag>())
        {
            Destroy(gameObject.GetComponent<MouseDrag>());
        }

生成Perfabs

        public GameObject Perfabs;

        Object prefab = PrefabUtility.CreateEmptyPrefab("Assets/预制体.prefab");  
                PrefabUtility.ReplacePrefab(Perfabs,prefab,ReplacePrefabOptions.ConnectToPrefab);

查找Tag

         GameObject[] GG= GameObject.FindGameObjectsWithTag("Tag");

添加脚本

        if(!gameObject.GetComponent<添加脚本名字>())
        {
            gameObject.AddComponent<添加脚本名字>();
        }

提高IOS的fps上限

提示:ios默认的fps上限是30,在第一个界面任何物体加上

        void Awake()
        {
            Application.targetFrameRate = 60;
        }

在场景切换时必要保存的对象

        MyObject = FindMyObjectInScene();
        if (MyObjet == null)
        {
           MyObject = SpawnMyObject();
        }

为Invoke, StartCoroutine and Instantiate 定义安全调用方法

提示:定义一个委托任务(delegate Task),用它来定义需要调用的方法,而不要使用字符串属性方法名称。

        public void Invoke(Task task, float time)
        {
           Invoke(task.Method.Name, time);
        }

使用扩展来让代码书写更便捷

        public static class CSTransform 
        {
          public static void SetX(this Transform transform, float x)
          {
            Vector3 newPosition =
              new Vector3(x, transform.position.y, transform.position.z);

            transform.position = newPosition;
          }
          ...
        }

修改shader

        GetComponent<Renderer>().material.SetFloat("_WaveScale", 0.5f);

调整相机效果脚本

        Cam.GetComponent<UnityStandardAssets.ImageEffects.DepthOfFieldDeprecated>().focalZDistance = focalDistance;

文件操作

颜色渐变

线性插值

激活与关闭对象或脚本