http://dong2008hong.blog.163.com/blog/static/4696882720140302323886/

  1. Unity3D脚本中文系列教程(二)
  2.  
  3. 示,属性不被序列化或显示在检视面板中。
  4. .避免使用构造函数
  5. 不要在构造函数中初始化任何变量,使用AwakeStart实现这个目的。即使是在编辑模式中Unity也自动调用构造函数,这通常发生在一个脚本被编译之后,因为需要调用构造函数来取向一个脚本的默认值。构造函数不仅会在无法预料的时刻被调用,它也会为预设或未激活的游戏物体调用。
  6. 单件模式使用构造函数可能会导致严重的后果,带来类似随机null引用异常。
  7. 因此如果你想实现,如,一个单件模式,不要使用构造函数,而是使用Awake。其实上,没有理由一定要在继续自MononBehaviour类的构造函数中写任何代码。
  8. 概览:最重要的类
  9. Javascript中可访问的全局函数或C#中的基类
  10. 移动/旋转物体
  11. 动画系统
  12. 刚体
  13. FPS或第二人称角色控制器
  14. 概览:性能优化
  15. .使用静态类型
  16. 在使用Javascript时最重要的优化是使用静态类型而不是动态类型,Unity使用一种叫做类型推理的技术来自自动转换Javascript为静态类型编码而不需要你做任何工作。
  17. var foo=;
  18. 在上面的例子里foo会自动被推断为一个整型值。因此,Unity可能使用大量的编译时间来优化。而不使用耗时的动态名称变量查找等。这就是为什么Unity比其他在JavaScript的实现平均快20倍的原因之一。
  19. 唯一的问题是,有时并非一切都可以做类型推断。Unity将会为这些变量重新使用动态类型。通过回到动态类型,编写JavaScript代码很简单。但是这也使得代码运行速度较慢。
  20. 让我们看一些例子:
  21. function Start ()
  22. {
  23. var foo = GetComponent(MyScript);
  24. foo.DoSomething();
  25. }
  26. 这里foo将是动态类型,因此调用DoSomething函数将使用较长时间,因为foo的类型是未知的,它必须找出它是否支持DoSomething函数,如果支持,
  27.  
  28. 调用它。
  29. function Start ()
  30. {
  31. var foo : MyScript = GetComponent(MyScript);
  32. foo.DoSomething();
  33. }
  34. 这里我们强制foo为指定类型,你将获得更好的性能。
  35. .使用#pragma strict
  36. 当然现在问题是,你通常没有意识到你在使用动态类型。#pragma strict解决了这个!简单的在脚本顶部添加#pragma strict。然后,
  37.  
  38. unity将在脚本中禁用动态类型,强制使用静态类型,如果一个类型未知。Unity将报告编译错误。那么在这种情况下foo将在编译时产生一个错误:
  39. #pragma strict
  40. function Start ()
  41. {
  42. var foo = GetComponent(MyScript);
  43. foo.DoSomething();
  44. }
  45. .缓存组件查找
  46. 另一个优化是组件缓存。不幸的是该优化需要一点编码,并且不一定是值得的,但是如
  47. 果你的脚本是真的用了很长时间了,你需要把最后一点表现出来,这是一个很好的优化。
  48. 当你访问一个组件通过GetComponent或访问变量,Unity会通过游戏对象找到正确的组件。这一次可以很容易地通过缓存保存在一个私有变量里引用该组件。
  49. 简单地把这个:
  50. function Update ()
  51. {
  52. transform.Translate(, , );
  53. }
  54. 变成:
  55. private var myTransform : Transform;
  56. function Awake ()
  57. {
  58. myTransform = transform;
  59. }
  60. function Update ()
  61. {
  62. myTransform.Translate(, , );
  63. }
  64. 后者的代码将运行快得多,因为Unity没有找到变换在每一帧游戏组件中的对象。这同样适用于脚本组件,在你使用GetComponent代替变换或者其它的东西。
  65. .使用内置数组
  66. 内置数组的速度非常快,所以请使用它们。
  67. 而整列或者数组类更容易使用,因为你可以很容易地添加元素,他们几乎没有相同的速度。内置数组有一个固定的尺寸,但大多数时候你事先知道了最大的大小在可以只填写了以后。关于内置数组最好的事情是,他们直接嵌入在一个结构紧凑的缓冲区的数据类型没有任何额外的类型信息或其他开销。因此,遍历是非常容易的,作为一切缓存在内存中的线性关系。
  68. private var positions : Vector3[];
  69. function Awake ()
  70. {
  71. positions = new Vector3[];
  72. for (var i=;i<;i++)
  73. positions[i] = Vector3.zero;
  74. }
  75. .如果你不需要就不要调用函数
  76. 最简单的和所有优化最好的是少工作量的执行。例如,当一个敌人很远最完美的时间就是敌人入睡时可以接受。直到玩家靠近时什么都没有做。这是种缓慢的处理方式的情况:
  77. function Update ()
  78. {
  79. // 早期进行如果玩家实在是太遥远。
  80. if (Vector3.Distance(transform.position, target.position) > )
  81. return;
  82. perform real work work...
  83. }
  84. 这不是一个好主意,因为Unity必须调用更新功能,而你正在执行工作的每一个帧。一个比较好的解决办法是禁用行为直到玩家靠近。有3种方法来做到这一点:
  85. .使用OnBecameVisibleOnBecameInvisible。这些回调都是绑到渲染系统的。只要任何相机可以看到物体,OnBecameVisible将被调用,当没有相机看到任何一个,OnBecameInvisible将被调用。这种方法在很多情况下非常有用,但通常在AI中并不是特别有用,因为只要你把相机离开他们敌人将不
  86. 可用。
  87. function OnBecameVisible () {
  88. enabled = true;
  89. }
  90. function OnBecameInvisible ()
  91. {
  92. enabled = false;
  93. }
  94. .使用触发器。一个简单的球形触发器会工作的非常好。一旦你离开这个影响球你将得到OnTriggerEnter/Exit调用。
  95. function OnTriggerEnter (c : Collider)
  96. {
  97. if (c.CompareTag("Player"))
  98. enabled = true;
  99. }
  100. function OnTriggerExit (c : Collider)
  101. {
  102. if (c.CompareTag("Player"))
  103. enabled = false;
  104. }
  105. .使用协同程序。Update调用的问题是它们每帧中都发生。很可能会只需要每5秒检检查一次到玩家的距离。这应该会节省大量的处理周期。
  106. 概览:脚本编译(高级)
  107. Unity编译所有的脚本为.NET dll文件,.dll将在运行时编译执行。
  108. 这允许脚本以惊人的速度执行。这比传统的javascript快约20倍。比原始的C++代码慢大约50%。在保存的时候,Unity将花费一点时间来编译所有脚本,如果Unity还在编译。你可以在Unity主窗口的右下角看到一个小的旋转进度图标。
  109. 脚本编译在4个步骤中执行:
  110. .所有在"Standard Assets", "Pro Standard Assets" "Plugins"的脚本被首先编译。
  111. 在这些文件夹之内的脚本不能直接访问这些文件夹之外脚本。
  112. 不能直接引用或它的 变量,但是可以使用GameObject.SentMessage与它们通信。
  113. .所有在"Standard Assets/Editor", "Pro Standard Assets/Editor" "Plugins/Editor"的脚本被首先编译。
  114. 如果你想使用UnityEditor命名空间你必须放置你的脚本在这些文件夹中,例如添加菜单项或自定义的向导,你都需要放置脚本到这些文件夹。
  115. 这些脚本可以访问前一组中的脚本。
  116. .然后所有在"Editor"中的脚本被编译。
  117. 如果你想使用UnityEditor命名空间你必须放置你的脚本在这些文件夹中。例如添加菜单单项或自定义的向导,你都需要放置脚本到这些文件夹。
  118. 这些脚本可以访问所有前面组中的脚本,然而它们不能访问后面组中的脚本。
  119. 这可能会是一个问题,当编写编辑器代码编辑那些在后面组中的脚本时。有两个解决方法:、移动其他脚本到"Plugins"文件夹 、利用JavaScript的动态类型,在javascript中你不需要知道类的类型。在使用GetComponent时你可以使用字符串而不是类型。你也可以使用SendMessage,它使用一个字符串。
  120. .所有其他的脚本被最后编译
  121. 所有那些没有在上面文件夹中的脚本被最后编译。
  122. 所有在这里编译的脚本可以访问第一个组中的所有脚本("Standard Assets""Pro
  123. Standard Assets" or "Plugins")。这允许你让不同的脚本语言互操作。例如,如果你想创建一个JavaScript。它使用一个C#脚本;放置C#脚本到"Standard Assets"文件夹并且JavaScript放置在"Standard Assets"文件夹之外。现在JavaScript可以直接引用c#脚本。
  124. 放置在第一个组中的脚本,将需要较长的编译时间,因为当他们被编译后,第三组需要被重新编译。因此如果你想减少编译时间,移动那些不常改变 的到第一组。经常改变的到第四组。

Unity3D脚本中文系列教程(三)的更多相关文章

  1. Unity3D脚本中文系列教程(四)

    http://dong2008hong.blog.163.com/blog/static/4696882720140302451146/ Unity3D脚本中文系列教程(三) 送到动画事件. ◆ va ...

  2. Unity3D脚本中文系列教程(十五)

    http://dong2008hong.blog.163.com/blog/static/4696882720140322449780/ Unity3D脚本中文系列教程(十四) ◆ LightRend ...

  3. Unity3D脚本中文系列教程(十四)

    http://dong2008hong.blog.163.com/blog/static/469688272014032134394/ WWWFrom 类Unity3D脚本中文系列教程(十三)辅助类. ...

  4. Unity3D脚本中文系列教程(十三)

    http://dong2008hong.blog.163.com/blog/static/469688272014032334486/ Unity3D脚本中文系列教程(十二) ◆ function G ...

  5. Unity3D脚本中文系列教程(九)

    Unity3D脚本中文系列教程(八) name 对象名称hideFlags 该物体是否被隐藏,保存在场景中或被用户修改继承的函数 GetInstanceID 返回该物体的实例id继承的类函数 oper ...

  6. Unity3D脚本中文系列教程(七)

    http://dong2008hong.blog.163.com/blog/static/4696882720140311445677/?suggestedreading&wumii Unit ...

  7. Unity3D脚本中文系列教程(五)

    http://dong2008hong.blog.163.com/blog/static/4696882720140302848544/?suggestedreading&wumii Unit ...

  8. Unity3D脚本中文系列教程(十六)

    Unity3D脚本中文系列教程(十五) ◆ function OnPostprocessAudio (clip:AudioClip):void 描述:◆  function OnPostprocess ...

  9. Unity3D脚本中文系列教程(十)

    http://dong2008hong.blog.163.com/blog/static/4696882720140312627682/?suggestedreading&wumii Unit ...

随机推荐

  1. Spring IoC容器的设计——BeanFactory应用场景

    1.BeanFactory提供的是最基本的IoC容器的功能,关于这些功能定义,我们可以在接口BeanFatory中看到. 2.BeanFactory接口定义了IoC容器最基本的容器的形式,并且提供了I ...

  2. 9款大气实用的HTML5/CSS3注册登录表单

    1.HTML5/CSS3仿Facebook登录表单 利用CSS3制作的登录表单的确很漂亮,我们在html5tricks网站上也分享过几款了,比如CSS3密码强度验证表单可以显示密码的强度,这款纯CSS ...

  3. 安装MySQL软件

    安装MySQL软件(绿色版) ① 解压软件包 ② 更改文件夹名称为mysql并复制到/usr/local文件夹下 ③ 使用cd指令进入/usr/local/mysql文件夹,使用ls –l查看 查看后 ...

  4. Windows下安装GnuRadio最简单的方法(没有之一)

    作者在Windows XP SP3 32位下亲测通过,理论上Win7也没问题. 1. 如果系统中安装有Python,请先把Python卸载. 2. 下载安装Python(x,y) 2.7.5.0, 下 ...

  5. c/c++面试总结(2)

    4.深拷贝和浅拷贝 (1)什么时候会用到拷贝函数 一个对象以值传递的方式传入函数(就是作为入参) 一个对象以值传递的方式从函数返回(就是作为返回值) 一个对象需要通过另外一个对象进行初始化 (2)是否 ...

  6. C#调用C、C++结构体数组的方法总结

    一个客户要使用C#调用我们用C++开发的一个动态链接库,本来我没有C#的开发经验,就随便写了一个例程.以为很简单就可以搞定,没想到客户开发的过程中遇到了不少问题,最困难的就是用C#调用C++接口中的自 ...

  7. how to debug thread cpu 100%

    when we write a program, cpu and memory usages are very important to indicate the stability of the p ...

  8. 转载: ABAP动态内表操作

    顾名思义,动态表的列是可以根据数据的变化而变化的,会使报表显示更简洁漂亮. 以下是实现方法. ------------------------------------------- 1, 创建动态内表 ...

  9. git 终端常输入命令

    cd 输入命令 ls 返回目录 git add . 相当于保存代码 git commit -m "" 相当于提交 get pull把服务器上代码拉回本地代码. get pust 刷 ...

  10. Oracle 动态视图5 V$SESSION_LONGOPS

    一.视图V$SESSION_LONGOPS显示运行超过6秒的操作的状态.包括备份,恢复,统计信息收集,查询等等 Column Datatype Description SID NUMBER Sessi ...