IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]unity 5.3 中新增加的 Attribute

    u010019717发表于 2015-11-26 09:24:37
    love 0

    孙广东  2015.11.24

    1、PreserveAttribute


             PreserveAttribute 可 从删除的类、 方法、 字段或属性的字节代码中 剥离出来 。

             当你创建一个build 时,Unity 会尽量从您的项目中去掉不用的代码。这是最大限度的得到最小生成 。然而,有时你想要一些代码来不被删除,即使它看起来好像没有什么用 。如果你使用反射 来调用方法 或 实例化某个类 的对象。您可以使用[Preserve] 特性应用于 类、 方法、 字段和属性。除了使用 PreserveAttribute,你也可以使用 link.xml 文件的传统方法  来告诉链接器不删除的东西。PreserveAttribute 只在 IL2CPP 平台上运行。Link.xml 文件的工作于 Mono  和 IL2CPP 平台。


    using UnityEngine;
    using System.Collections;
    using System.Reflection;
    using UnityEngine.Scripting;
    
    public class NewBehaviourScript : MonoBehaviour {
    	void Start () {
    	   ReflectionExample.InvokeBoinkByReflection();
    	}
    }
    
    public class ReflectionExample
    {
    	 static public void InvokeBoinkByReflection()
    	 {
    	 	typeof(ReflectionExample).GetMethod("Boink", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null,null);
    	 }
    
    	 // No other code directly references the Boink method, so when when stripping is enabled,
       // it will be removed unless the [Preserve] attribute is applied.
    	 [Preserve]
    	 static void Boink()
    	 {
    	 	Debug.Log("Boink");
    	 }
    }

             对于不想倚赖 UnityEngine.dll 的第三方库,它也是可以定义自己的 PreserveAttribute。代码会尊重这一点,并会考虑任何属性具有确切名称 "PreserveAtribute" 应用不删除的东西上,无论该 命名空间或程序集的 属性。


    2、为类提供一个自定义的文档的URL。

    [HelpURL("http://example.com/docs/MyComponent.html")]
    public class MyComponent
    {
       
    }
    

    3、允许当Unity游戏 从用户加载运行时     运行时 类方法 被初始化 。

         场景已被加载 (即 Awake 方法已被调用),将 调用 标记 [RuntimeInitializeOnLoadMethod] 的方法。注: 标记 [RuntimeInitializeOnLoadMethod] 的方法的执行顺序是不能保证的。

    using UnityEngine;
    
    class MyClass
    {
        [RuntimeInitializeOnLoadMethod]
        static void OnRuntimeMethodLoad ()
        {
            Debug.Log("After scene is loaded and game is running");
        }
    
        [RuntimeInitializeOnLoadMethod]
        static void OnSecondRuntimeMethodLoad ()
        {
            Debug.Log("SecondMethod After scene is loaded and game is running.");
        }
    }
    


    4、

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







    
    


沪ICP备19023445号-2号
友情链接