Unity3d中Update()方法的替身

在网上看到一些资料说Unity3d的Update方法是如何如何不好,影响性能。作为一个菜鸟,之前我还觉得挺好用的,完全没用什么影响性能的问题存在。现在发现确实有很大的问题,我习惯把一大堆检测判断放在Update中去执行,这种检测判断每帧都在执行,而往往其中的方法可能只执行一次或几次,这样确实对性能有很大的影响。

下面这种是我经常使用的写法:

[javascript] view plaincopyprint?
function Update () {
 if (!wait) {
 transform.Translate(Vector3.forward * Time.deltaTime);
 }
 else if (Time.time >= timer) {
 wait = false;
 }
 if (Input.anyKeyDown) {
 wait = true;
 timer = Time.time + 1.0;
 }
}

  其实我们完全可以这么写:

[javascript] view plaincopyprint?
function Start () {
 while (true) {
 transform.Translate(Vector3.forward * Time.deltaTime);
 if (Input.anyKeyDown) {
 yield WaitForSeconds(1.0);
 }
 yield;
 }
}

  这样简单明了,而且不影响性能。下面是我摘自网上的一段代码,使用coroutine替换update方法的例子:

[csharp] view plaincopyprint?
using UnityEngine;
using System.Collections;
///
/// Thinkgear user interface help message.
///
/// By chiuan 2012.8.18
///
public class ThinkgearUIHelpMessage : MonoBehaviour {
 //the time gap that need to disable the component .
 const float _TimeToDisable = 0.2f;
 bool isNeedToDisable = false; 

 #region for other call message or invoke. 

 public void UnActiveObject()
 {
 isNeedToDisable = true;
 StartCoroutine("StartCheckDisable");
 } 

 public void ActiveObject()
 {
 if(isNeedToDisable == true)
 {
 //because this means the coroutine has started.
 //than u need to stop it,if u wanna active this .
 StopCoroutine("StartCheckDisable");
 }
isNeedToDisable = false;
 } 

 #endregion
 IEnumerator StartCheckDisable()
 {
 yield return new WaitForSeconds(_TimeToDisable);
 if(isNeedToDisable)
 {
 gameObject.SetActiveRecursively(false);
 }
 }
} 
时间: 2024-10-16 02:59:12

Unity3d中Update()方法的替身的相关文章

unity3d中dllimport方法的使用,以接入腾讯平台为例!!!

说到有关dllimport方法可能还有很多人比较陌生,其实我自己也说不太清楚,大概说说什么时候要用它. 事实上功能类似于调用android的第三包,我们想要使用苹果上特定的api或者第三方平台的一些东西(现在很少第三方平台会为unity做独立的插件吧),我们就会用到这个叫dllimport的功能. 今天接了一下腾讯的平台,就拿它来做一个记录好了,免得我到时候又忘记了. ios用的是obj-c,说实话对这个语言一窍不通还,大概看了一下,把握了一下demo里面的使用方法,所以有一些SB的地方也请原谅

Unity3D中Update()与FixedUpdate()的区别

Unity3D中Update()与FixedUpdate()的区别是什么呢?从字面上理解,它们都是在更新时会被调用,并且会循环的调用.但是Update会在每次渲染新的一帧时,被调用.而FixedUpdate会在每个固定的时间间隔被调用,那么要是Update 和FixedUpdate的时间间隔一样,是不是就一样呢?答案是不一定,因为Update受当前渲染的物体,更确切的说是三角形的数量影响,有时快有时慢,帧率会变化,update被调用的时间间隔就发生变化.但是FixedUpdate则不受帧率的变化

mongodb中update方法的upsert和multi

mongodb中的update的形式是这样的: db.collectionName.update(query, obj, upsert, multi); 对于upsert(默认为false):如果upsert=true,如果query找到了符合条件的行,则修改这些行,如果没有找到,则追加一行符合query和obj的行.如果upsert为false,找不到时,不追加. 对于multi(默认为false): 如果multi=true,则修改所有符合条件的行,否则只修改第一条符合条件的行.

oracle中Update方法

1.两表(多表)关联update -- 被修改值由另一个表运算而来 update customers a set city_name=(select b.city_name from tmp_cust_city b where b.customer_id=a.customer_id) where exists (select 1 from tmp_cust_city b where b.customer_id=a.customer_id) 实例: update bd_psndoc set bd_

Unity3D中的系统调用方法

在Unity3D中有一些方法不是程序员手动调用的,而是Unity3d工具自身设计时就决定自动调用的,不过调用的时机和场合不同,下面就一一介绍一下: Awake:顾名思义,Unity3D的脚本苏醒时需要调用的方法,这个方法比Start方法执行的还要早,也是执行一次. Start:可以理解为类的构造函数,或者是init函数,用于初始化各种变量,仅执行一次. Update:类似于flash as3 onframe的回调函数,每帧均回调. Fixedupdate:每一帧都执行,处理Rigidbody时,

(转)Unity3D中移动物体位置的几种方法

1. 简介 在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale). 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position). 2.1 Transform.Tra

在Unity3d中解析Lua脚本的方法

由于近期项目中提出了热更新的需求,因此本周末在Lua的陪伴下度过.对Lua与Unity3d的搭配使用,仅仅达到了一个初窥门径的程度,记录一二于此.水平有限,欢迎批评指正. 网络上关于Lua脚本和Unity3d的配合使用的资料不多,例子工程大多相同.大概了解到针对性的插件有uLua.UniLua.KopiLua三种.试用了前两种,抛开效率与安全性不说,感觉uLua试用起来比较简单,本文只介绍uLua的使用步骤. uLua的原理是在Unity3d中解析字符串形式的Lua脚本,让Lua与C#相互传递参

ShareREC在Unity3D中无法录制视频的解决方法

最近有一些同学问到ShareREC集成到Unity3D中提示:#warning:无法录制当前应用! 这是由于Unity3D在4.6.3之后加入了对Metal框架的支持,导致ShareREC无法进行录制(目前ShareREC不支持录制Metal框架). 解决的办法就是把Metal给禁用掉,操作方法如下: 1.先从Unity3D中导出XCode工程 2.定位到UnityAppController+Rendering.mm文件,找到IsMetalSupported方法,把里面的内容注释掉,只保留ret

MongoDB中insert方法、update方法、save方法简单对比

MongoDB中insert方法.update方法.save方法简单对比 1.update方法 该方法用于更新数据,是对文档中的数据进行更新,改变则更新,没改变则不变. 2.insert方法 该方法用于插入数据到文档中,也就是给文档添加新数据. 3.save方法 该方法同样用于插入数据到文档中,功能是类似于insert方法的.与insert方法不同的是, save方法是遍历文档,逐条将数据插入进去的,而insert方法是将整个文档整体插入进去的. 由两个方法的源码可以看出来. save方法的写法