事件函数
博客专区 > LIndieGS 的博客 > 博客详情
事件函数
LIndieGS 发表于8个月前
事件函数
  • 发表于 8个月前
  • 阅读 10
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

原文链接: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);
    }
}

                                                                     

共有 人打赏支持
粉丝 0
博文 9
码字总数 6421
×
LIndieGS
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: