zoukankan      html  css  js  c++  java
  • Unity3D脚本中文系列教程(一)

    原地址:http://dong2008hong.blog.163.com/blog/static/46968827201403115643431/?suggestedreading&wumii

    一、 脚本概览
    这是一个关于unity内部脚本如何工作的简单概览。
    Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的。在脚本对象内部不同志的函数被特定的事件调用。最常用的列在下面:
    Update:
    这个函数在渲染一帧之前被调用,这里是大部分游戏行为代码被执行的地方,除了物理代码。
    FixedUpdate:
    这个函数在每个物理时间步被调用一次,这是处理基于物理游戏的地方。
    在任何函数之外的代码:
    在任何函数之外的代码在物体被加载的时候运行,这个可以用来初始化脚本状态。
    注意:文档的这个部份假设你是用Javascript,参考用C#编写获取如何使用C#和Boo编写脚本的信息。
    你也能定义事件句柄,它们的名称都以On开始,(例如OnCollisionEnter),为了查看完整的预定义事件的列表,参考MonoBehaviour 文档。
    概览:常用操作
    大多数游戏物体的操作是通过游戏物体的Transform或Rigidbody来做的,在行为脚本内部它们可以分别通过transform和rigidbody访问,因此如果你想绕着Y轴每帧旋转5度,你可以如下写:
    function Update(){
    transform.Rotate(0,5,0);
    }
    如果你想向前移动一个物体,你应该如下写: 
    function Update(){
    transform.Translate(0,0,2);
    }
    概览:跟踪时间
    
    Time类包含了一个非常重要的类变量,称为deltaTime,这个变量包含从上一次调用Update或FixedUpdate(根据你是在Update函数还是在FixedUpdate函数中)到现在的时间量。
    
    所以对于上面的例子,修改它使这个物体以一个恒定的速度旋转而不依赖于帧率:
    function Update(){
    transform.Rotate(0,5*Time.deltaTime,0);
    } 
    移动物体: 
    function
    Update(){
    
    transform. Translate (0, ,0,2*Time.deltaTime);
    
    }
    如果你加或是减一个每帧改变的值,你应该将它与Time.deltaTime相乘。当你乘以Time.deltaTime时,你实际的表达:我想以10米 /秒移动这个物体不是10米/帧。这不仅仅是因为你的游戏将独立于帧而运行,同时也是因为运动的单位容易理解。( 米/秒)
    
    另一个例子,如果你想随着时间增加光照的范围。下面的表达式,以2单位/秒改变半径。
    function Update (){
    light.range += 2.0 * Time.deltaTime; 
    } 
    当通过力处理刚体的时候,你通常不必用Time.deltaTime,因为引擎已经为你考虑到了这一点。
    
    概览:访问其他组件
    
    组件被附加到游戏物体,附加Renderer到游戏物体使它在场景中渲染,附加一个Camera使它变为相机物体,所有的脚本都是组件,因为它们能被附加到游戏物体。 
    
    最常用的组件可以作为简单成员变量访问: 
    
    
    Component             可如下访问 
    Transform             transform 
    Rigidbody             rigidbody 
    Renderer              renderer 
    Camera                camera (only on camera objects) 
    Light                 light (only on light objects) 
    Animation             animation 
    Collider              collider 
    
    …等等。
    
    对于完整的预定义成员变量的列表。查看Component,Behaviour和MonnoBehaviour类文档。如果游戏物体没有你想取的相同类型的组件,上面的变量将被设置为null。
    
    任何附加到一个游戏物体的组件或脚本都可以通过GetComponent访问。
    
    transform.Translate(0,3,0);
     
    //等同于
     
     GetComponent(Transform)。Translate(0, 1, 0);
    注意transfom和Transform之间大小写的区别,前者是变量(小写),后者是类或脚本名称(大写)。大小写不同使你能够从类和脚本名中区分变量。
    应用我们所学,你可以使用GetComponent找到任何附加在同一游戏物体上的脚本和组件,请注意要使用下面的例子能够工作,你需要有一个名为 OtherScript的脚本,其中包含一个DoSomething函数。OtherScript脚本必须与下面的脚本附加到相同的物体上。
    
    
    
    
    
    
    //这个在同一游戏物体桑找到名为OtherScript的脚本
     
      
    //并调用它上加的DoSomething
     
      
    function
    Update(){
     
      otherScript = GetComponent(OtherScript);
     
      otherScript.DoSomething();
     
      }
    
    概览:访问其它游戏物体
    大多数高级的代码不仅需要操作一个物体,Unity脚本接口有各种方法来找到并访问其他游戏物体和组件。在下面,我们假定有个一名为OtherScript,js的脚本附加到场景的游戏物体上。 
    
    
    var
    foo = 5;
     
     
    function
    DoSomething ( param : String) {
     
     
    print(param + “ 
    with
    foo: ” + foo);
     
     
    }
    
    1.通过检视面板赋值引用
    你可以通过检视面板赋值变量到任何物体
    
    
    //变换拖动到target的物体
     
     
    var
    target : Transform;
     
     
    function
    Update ()
     
     {
     
     target.Translate(0, 1, 0);
     
     }
    
    你也可以在检视面板中公开到其他物体的引用,下面你可以拖动一个包含的游戏物体到检视面板中的target槽。
    
    
    
    //设置在检视面板中赋值的target变量上的foo,调用DoSomething
     
    var
    target : OtherScript;
    function
    Update ()
     {
     
    //设置target物体的foo变量
     
     target.foo = 2;
     
    // 调用target上的DoSomething
     target.DoSomething(“Hello”);
     }
    
    2.通过物体层次定位
    对于一个已经存在的物体,可以通过游戏物体的Transform组件来找到子和父物体;
    
    
    
    //找到脚本所附加的
      
    //游戏物体的子“Hand”
      transform.Find(“Hand”)。Translate(0, 1, 0);
    
    一旦在层次视图中找到这个变换,你可以使用GetComponent来获取其他脚本,
    
    
    //找到名为“Hand”的子
    //在附加到它上面的OtherScript中,设置foo为2;
    
      transform.Find(“Hand”)。Translate(0, 1, 0);
      
    //找到名为“Hand”的子
      
    //然后应用一个力到附加在hand上的刚体
      transform.Find(“Hand”)。GetComponent(OtherScript)。DoSomething(“Hello”);
      
    // 找到名为“Hand”的了
    // 然后应用一个力到附加在hand上的刚体
     
      transform.Find(“Hand”)。rigidbody.AddForce(0, 10, 0);
    
    你可以循环所有的子,
    
    
    
    //变换的所有子向上移动10个单位
    forvar
    child : Transform 
    in
    transform)
      {
      child.Translate(0, 1, 0);
      }
    
    参考Transform类文档获取更多信息。
  • 相关阅读:
    Visual C# 2005中编写Socket网络程序
    [ASP.NET缓存BUG]这几天遇到的头痛问题之一,晚上遇到终于解决一劳永逸
    检测远程URL是否存在的三种方法<转>
    C#开源资源大汇总
    Asp.Net中动态页面转静态页面
    开发人员必进的网站
    基于反向代理的Web缓存加速——可缓存的CMS系统设计
    解决MVC3 服务器无法在已发送 HTTP 标头之后设置状态 问题
    HyperLink 控件控制图片宽度高度的几种方法
    C#进程注入
  • 原文地址:https://www.cnblogs.com/123ing/p/3912050.html
Copyright © 2011-2022 走看看