Unity3D深入浅出 - 脚本开发基础(Scripts)

常用脚本事件:


      Update:每帧调用一次

      Start:在第一次Update执行前调用

      Awake:脚本实例在创建时调用

      FixedUpdate:每个固定物理时间间隔调用一次

      LateUpdate:每帧调用一次,在Update之后

        该文章出自【狗刨学习网】

MonoBehaviour类:


      MonoBehaviour类是uniyt中非常重要的类,定义了基本的脚本行为,所有脚本类均需要从它直接或间接继承。MonoBehaviour还定义了对各种特定事件的响应函数,这些函数名均以On作为开头,下面是一些常用的事件响应函数。


      OnMouseEnter:鼠标移入GUI控件或碰撞体时调用

      OnMouseOver:鼠标停留~~~

      OnMouseExit:鼠标移除~~~

      OnMouseDown:鼠标按下~~~~

      OnMouseUp:鼠标释放~~~

      OnTriggerEnter:当其他碰撞体进入触发器时调用

      OnTriggerExit:~~~~~~~~离开~~~~~~~~

      OnTriggerStay:~~~~~~~停留~~~~~~~~~

      OnCollisionEnter:当碰撞体或者刚体与其他碰撞体或者刚体接触时调用

      OnCollisionExit:~~~~~~~~~~~~~~~~~~~~~~~~离开时~~~

      OnCollisionStay:~~~~~~~~~~~~~~~~~~~~~~~~保持接触时~~~

      OnControllerColliderHit:当控制器移动时与碰撞体发生碰撞时调用

      OnBecameVisible:对于任意一个相机可见时调用

      OnBecameInvisible:对于任意一个相机不可见时调用

      OnEnable:对象启用或者激活时调用

      OnDisable:对象禁用或者取消激活时调用

      OnDestory:脚本销毁时调用

      OnGUI:渲染GUI和处理GUI消息时调用


脚本和组件交互:


      一个对象由若干个组件组成,通常需要利用脚本来访问对象的各种组件并设置组件的参数。对于系统内置的常用组建,Unity提供了非常便利的访问方式,只需要在脚本里访问组件对应的成员变量即可,这些成员变量定义在MonoBehaviour中并被脚本继承了下来。


常用组件以及对应的变量如下。


组件名称 变量名 组件作用
Tranform tranform 设置对象的位置,旋转,缩放
Rigidbody rigidbody 设置物理引擎的刚体属性
Renderer renderer 渲染物体模型
Light light 设置灯光属性
Camera camera 设置相机属性
Collider collider 设置碰撞体属性
Animation animation 设置动画属性
Audio audio 设置声音属性



注意:如果对象上不存在某组件,则返回null。

访问不属于商标中列出的组件,或者是访问对象上的脚本(脚本属于自定义组件),通过如下方式访问来得到组件的引用:


      GetComponent :得到组件

      GetComponents:得到组件列表

      GetComponentlnChildren:得到对象或对象子物体上的组件

      GetComponentsInChildren:得到对象或对象子物体上的组件列表


      注意:这几个函数都比较耗时,因此一般不要在Update函数中使用,应该在外部定一个接受组件引用的对象,在Start函数中使用GetComponent函数来获取组件引用。


示例:在一个cube里有一个move.cs脚本,在move.cs脚本中获cube的Tranform组件

  1. Tranform c_tranform;
  2. Move move;

  3. void Start(){
  4.   //第一种方式
  5.   c_tranform = tranform;
  6.   //第二种方式    
  7.   c_tranform = GetComponent<Transform>();

  8.    move = GetComponent<Move>();
  9. }

  10. void Update{
  11. }
复制代码



访问场景中的对象:


      在unity3d开发中,脚本不但需要访问脚本所在对象的组件,还经常需要访问其他的对象:


      1.通过名称来查找:使用函数GameObject.Find,如果场景中存在指定名称的对象,则返回该对象的引用,否则返回null,如果存在多个同名的对象,则返回第一个对象的引用。


      GameObject cube = GameObject.Find("MyCube");


      2.通过标签来查找:GameObject.FindWithTag,如果场景中存在指定标签的对象,则返回该对象的引用,否则返回null,如果多个对象使用同一个标签,则返回第一个对象的引用。


       注意:与GetComponent一样,GameObject.Find和GameObject.FindWithTag也是比较耗时的参数,因此不建议在update函数中调用它们,而是在初始化中查找一次后保存在变量中。


协同程序(Coroutine):


       Coroutine也成为协同程序协程,可以和主程并行运行,和多线程类似,但是在任一制定时刻只会有一个协同程序在运行,别的协同程序则会挂起。可以用来实现让一段程序等待一段时间后继续运行的效果。


        协同程序(Coroutine)的相关函数如下:

  • StartCoroutine:启动一个协同程序
  • StopCoroutine:停止一个协同程序
  • StopAllCoroutine:终止所有协同程序
  • WaitForSeconds:等待若干秒。
  • WaitForFixedUpdate:等待知道下一次FiexdUpdate调用。

javascript示例:

  1. function Start()
  2. {
  3.     print("starting "+Time.time);
  4.     yield WaitAndPrint();//启用一个协同程序
  5.     print("done "+Time.time)  
  6. }

  7. function WaitAndPrint()
  8. {
  9.     yield WitForSeconds(5);//等待5s
  10.     print("waitandprint "+Time.time)

  11. }
复制代码


C#示例:

  1. IEnumerator Start () {
  2.         Debug.Log("等待5s "+Time.time);
  3.         yield return StartCoroutine(WaitMethod());
  4. }

  5. IEnumerator WaitMethod()
  6. {
  7.         yield return new WaitForSeconds(5f);
  8.         Debug.Log("已经等待5s "+Time.time);
  9. }
复制代码


        这里注意,C#中的协同函数的返回类型必须为IEnumerator,yield要用yield return来替代,并且启动协程用StartCoroutine()函数。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值