【和我一起学习Unity3D】初识脚本编程

在我的理解中Unity3D是以编辑器为主,脚本为辅的游戏引擎,在编辑器里面设置参数就可以完成大部分的功能,比如碰撞检测什么的,在编辑器里面就可以做一个完整的物理世界。但是作为程序员,只用编辑器是不是显得太单纯了?所以编程还是很有必要的,Unity3D中将所有的代码都叫做脚本,不管是C#语言,javascript语言,boo语言,通通是脚本,脚本也是一个组件,可以附加在GameObject上,附加的方法有很多种,比如直接将脚本拖动到GameObject的属性框上。

我主要是学用C#进行开发,javascript的代码也能看懂,不过学习还是以C#为主。刚刚开始创建脚本的时候,系统会自动生成一个模板,如下所示

using UnityEngine;
using System.Collections;  
  
public class CTest: MonoBehaviour {  
  
    // Use this for initialization  
    void Start () {  
      
    }  
      
    // Update is called once per frame  
    void Update () {  
      
    }  
}

首先第一个,脚本必须继承MonoBehaviour类, 不继承这个类呢,是不能绑定在GameObject上的。然后模板上提供了两个函数,void Start()和void Update(),这两个函数实际上是重写MonoBehaviour类中的两个函数接口,第一个函数Start在载入脚本之后,第一帧之前调用,第二个函数Update会每帧调用一次。通常的习惯呢,就是在Start中写初始化的代码,在Update中写运行时的代码,比如检测按键按下,检测鼠标事件等。下面是一个例子:

using UnityEngine;
using System.Collections;  
  
public class CTest: MonoBehaviour {  
     public int m_iSign;
    // Use this for initialization  
    void Start () {  
         m_iSign = 0;
         Debug.Log("初始化m_iSign =" + m_iSign );
    }  
      
    // Update is called once per frame  
    void Update () {  
         m_iSign++;
         Debug.Log("每帧调用 m_iSign =" + m_iSign );
    }  
}

当然了,系统不只是提供这些接口,还有很多很多,光是Update就有Update,FixedUpdate,LateUpdate这三种,说说三者的区别吧。

第一个Update是在每帧渲染前执行的,最常用的。

第二个FixedUpdate是固定时间执行的,每间隔一定的时间就执行这段代码,当然这个时间是在编辑器里面可以设置的,默认的时间是0.02秒,这个函数主要用于物理引擎的一些代码,保证其运行的结果一致性。因为第一个Update是根据帧数来运行的,游戏在不同的电脑中跑的效果是不一样的,在开发机上也许能跑到60fps,在玩家的电脑上也许只能跑到30fps,这样两帧的间隔时间就不一致了,运行的结果也不能保证了。

第三个LateUpdate是在渲染完成后执行的,可以在渲染完成之后,再对场景做某些事情。

------------------------------------------------------------------------

除了Update之外,Unity3D还提供了一些碰撞检测的函数,比如OnCollisionEnter,OnCollisionExit,OnCollisionStay与OnTriggerEnter,OnTriggerExit,OnTriggerStay。

其中前三个是用于物理世界的碰撞的,后三个是非物理世界的碰撞。

前三个碰撞必须是含有刚体组件(rigidbody)或者含有碰撞组件(collider)与另外一个含有刚体组件(rigidbody)或者含有碰撞组件(collider)的GameObjcet碰撞才能触发。其中collider组件不能勾选IsTrigger,一旦勾选中这个的话,这个GameObject就不参与任何物理世界的东西了。

OnCollisionEnter是在碰撞开始的时候触发,函数原型为:void  OnCollisionEnter (Collision collisionInfo); 其中参数collisionInfo就是碰撞的刚体,可以通过collisionInfo,gameObject.name获取到这个刚体的名字。

OnCollisionExit是在碰撞结束后触发,函数原型为:void  OnCollisionExit (Collision collisionInfo); 参数意思同上

OnCollisionStay是在碰撞中不断的触发,每帧都会调用

后三个是用于触发机制的,也就是非物理世界的,当GameObject含有collider组件,并且勾上了IsTrigger属性,那么在他碰撞的时候,就会触发这三个函数,触发的时机也和上面三个函数的时机是一样的。

后面三个的函数原型分别为:

void OnTriggerEnter (Collider other); 
void OnTriggerExit (Collider other); 
void OnTriggerStay(Collider other); 

----------------------------------------------------------------------------

还要介绍一些函数,比如OnGUI函数,这个函数专门用于执行绘制UI控件操作,他会在每帧调用,但是与Update不同的是,当脚本的enable属性设置为false的时候,这个函数将不被调用,enable属性是继承自父类Monobehaviour的。

OnGUI的函数原型为 void OnGUI(); 就不再举例了,大家可以自行翻阅手册。

还有一个函数是OnDestroy,会在该脚本被销毁的时候,或者是该脚本所依附的GameObject被销毁的时候调用,类似于类的析构函数。

-----------------------------------------------------------------------------

大概就是这些函数,还有很多有用的函数,大家可以翻阅一下手册:http://game.ceeger.com/Script/MonoBehaviour/MonoBehaviour.OnDestroy.html

我也在努力学习中...

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值