文档章节

事件函数

LIndieGS
 LIndieGS
发布于 2017/05/21 00:04
字数 1002
阅读 26
收藏 0

原文链接:https://docs.unity3d.com/Manual/EventFunctions.html

    在Unity中,脚本不像传统意义的程序。那些程序都在一个循环里不停地地运行,直到它完成了自己的工作。相反的,Unity通过调用已声明了的函数,间歇性地把控制权交给脚本。一旦一个函数执行结束,控制权又交还给Unity。这些函数被称为事件函数(event function),因为它们只在响应一个事件时被激活。 Unity使用了一套命名方案去区别那个函数去执行那个事件。比如,你已经见过的Update函数(在更新每一帧前调用)。Start函数(仅在对象的第一帧前调用)。详情见:MonoBehavior类的脚本指南,里面有所有函数的详细用法。下面介绍一些最常见的事件函数。

有规律的更新事件

    游戏更像是动画,频繁地生成一帧一帧的画面。游戏编程中,最核心的概念是在每一帧被渲染前,制造位置,状态和物体行为的变化。Update()函数就是放这些代码最主要的地方。Update函数在每一帧被渲染前调用,也在动画被计算出来前调用。

void Update() {
    float distance = speed * Time.deltaTime * Input.GetAxis("Horizontal");
    transform.Translate(Vector3.right * distance);
}

    游戏的物理引擎刷新画面是在不连续的时间进行的。一个单独的函数叫FixedUpdate()就仅在每一次物理刷新前被调用。因为物理事件的刷新和每一帧的刷新不会以同样的频率出现,比如在处理类似RigidBody的事件时,把代码放在FixedUpdate里就会得到更加好的效果。

void FixedUpdate() {
    Vector3 force = transform.forward * driveForce * Input.GetAxis("Vertical");
    rigidbody.AddForce(force);
}

      有时,在Update()函数和FixedUpdate()函数被调用后或者在所有的动画被计算出来后,允许做一些变化也是很有必要的。比如,游戏中的相机跟踪目标对象,脚本代码改变一个动画的效果(使角色的头朝向场景中的目标对象)。LateUpdate()函数就被用于这样的情况下。

oid LateUpdate() {
    Camera.main.transform.LookAt(target.transform);
}

初始化事件  

      在游戏设计中,调用初始化代码并先于所有画面刷新是经常使用的。Start()函数就是先于第一帧或第一次物理更新前调用。Awake()函数在脚本实例被载入时调用。值得注意的是,虽然不同的物体的Start()和Awake()能以任意顺序调用,但是所有的Awake()都在Start()调用之前完成。这意味着,在Start()中的代码能够使用在Awake()里初始化的数据。

GUI事件    

    Unity有一套系统去渲染在场景中的GUI控件和响应点击这些控件。这些代码有点不同于普通的帧刷新代码,所以它必须放在OnGUI()函数中,OnGUI()函数会被周期性的调用。

void OnGUI() {
    GUI.Label(labelRect, "Game Over");
}

      你也可以用它侦查鼠标事件。比如武器瞄准或显示当前鼠标指针指向角色的信息。可以设置OnMouseXXX()事件函数(比如:OnMouseOver ,OnMouseDown)允许脚本对玩家鼠标行为起反应。比如,如果鼠标按钮被点击,这是在它指针所指向的对象脚本中的OnMouseDown()函数就会被调用。

物理事件

       物理引擎反馈物体的碰撞(collision)通过调用物体上的事件函数来实现。OnCollisionEnter(),OnCollisionStay()和OnCollisionExit()函数在物体被接触,抓取和损毁时调用。这和OnTriggerEnter(),OnTriggerStay()和OnTriggerExit()函数一样,在物体的碰撞框被设置成触发器(Trigger)时调用。如果超过有多个接触在物理更新中发生,这些函数可能被连续调用数次。因此当一个参数被传进函数时,就给了给物体碰撞的详情(如:位置,进入物体的身份等等)。

void OnCollisionEnter(otherObj: Collision) {
    if (otherObj.tag == "Arrow") {
        ApplyDamage(10);
    }
}

                                                                     

© 著作权归作者所有

共有 人打赏支持
LIndieGS
粉丝 0
博文 9
码字总数 6421
作品 0
程序员
【Qt笔记】event()

前面的章节中我们曾经提到函数。事件对象创建完毕后,Qt 将这个事件对象传递给的函数。函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handl...

大道无名
2016/07/30
11
0
【Qt笔记】事件总结

Qt 的事件是整个 Qt 框架的核心机制之一,也比较复杂。说它复杂,更多是因为它涉及到的函数众多,而处理方法也很多,有时候让人难以选择。现在我们简单总结一下 Qt 中的事件机制。 Qt 中有很...

大道无名
2016/07/30
15
0
jQuery(三)jQuery事件执行/简单事件/复合事件

jQuery事件执行 写在前面,jquery代码执行时机对比:$(docuemnt).ready(function(){xxx 代码}); 与window.onload()=function(){xxx 代码}的区别。 window.onload()程序是等所有文件都下载完成...

年少爱追梦
2016/06/05
82
0
node.js中的事件处理机制及事件环机制

EventEmitter类 在node.js的用于实现各种事件处理的event模块中,定义了一个EventEmitter类。所有可能触发事件的对象都是一个继承了EventEmitter类的子类的实例对象。EventEmitter定义了许多...

前端小虾
2016/10/28
160
0
jQuery Event.stopPropagation() 函数详解

函数用于阻止当前事件在DOM树上冒泡。 根据DOM事件流机制,在元素上触发的大多数事件都会冒泡传递到该元素的所有祖辈元素上,如果这些祖辈元素上也绑定了相应的事件处理函数,就会触发执行这...

zh151832
2016/12/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java Lock接口分析之ReentantReadWriteLock

ReentantReadWriteLock读写锁,在读线程多余写线程的并发环境中能体现出优异的性能,相比于synchronized与ReentrantLock这种独占式锁的模型,ReentantReadWriteLock采用独占式写锁与共享式读...

我爱春天的毛毛雨
25分钟前
1
0
EFK (Fluentd ElasticSearch Kibana) 采集nginx日志

本文描述如何通过FEK组合集中化nginx的访问日志。本人更喜欢按顺序来命名,所以使用FEK而不是EFK. 首先在nginx服务器上执行以下操作. 安装ruby http://blog.csdn.net/chenhaifeng2016/artic...

xiaomin0322
26分钟前
1
0
一键下载:将知乎专栏导出成电子书

老是有同学问,学了 Python 基础后不知道可以做点什么来提高。今天就再用个小例子,给大家讲讲,通过 Python 和爬虫,可以完成怎样的小工具。 在知乎上,你一定关注了一些不错的专栏(比如 ...

crossin
36分钟前
2
0
synchronized 之 对象锁 和 类锁

一、synchronized(object) 如果object没有被加锁,则获取object的锁;如果object已经被加锁则等待object的锁被释放。 二、需要加锁的情景 多线程共享同一资源会引起线程安全的情况下,才需要...

MyOldTime
37分钟前
7
0
tomcat 单机/多机 部署多应用

一.单机部署多应用: 1.在 linux 下解压安装两个 tomcat:tomcat1, tomcat2; 2.修改 /etc/profile, 增加 tomcat 环境变量: path 中加上 重新加载配置文件 source /etc/profile 3.修改 tomc...

imbiao
48分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部