monobehaviour函数生命周期
一、基础函数:
1.1.Awake 函数 :
在加载场景时运行 , 即在游戏开始之前初始化变量或者游戏状态 . 只执行一次
1.1.1. 如何让已经存在的GameObject在LoadLevel后不被卸载掉?
void Awake() { DontDestroyOnLoad(transform.gameObject); }
.1.2. OnEnable 函数 :
在激活当前脚本时调用 , 每激活一次就调用一次该方法,可在同一周期中可以反复地发生。
1.3. Start 函数 :
在第一次启动时执行 , 用于游戏对象的初始化 , 在Awake 函数之后执行,只执行
执行该脚本 , 运行结果如下 :
1.4. Fixed Update : 固定频率调用 , 与硬件无关, 可以在 Edit -> Project Setting -> Time -> Fixed Time Step 修改
1.4.1.物理更新一般放在哪个系统函数里?
FixedUpdate,固定时间间隔执行 可以在edit->project setting->time设置 update 是在渲染帧执行,和Update不同的是FixedUpdate是渲染帧执行,如果你的渲染效率低下的时候FixedUpdate调用次数就会跟着下降。FixedUpdate比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update就比较适合做控制。
1.5. Update : 几乎每一帧都在调用 , 取决于你的电脑硬件 , 不稳定
1.6. LateUpdate : 在Update函数之后调用 , 一般用作摄像机跟随
1.6.1移动相机动作在哪个函数里,为什么在这个函数里?
LateUpdate,是在所有的update结束后才调用,比较适合用于命令脚本的执行。都是所有的update操作完才进行摄像机的跟进,不然就有可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。
1.7. OnGUI 函数 : 调用速度是上面的两倍 , 一般用于老版本的额 GUI 显示
1.7.1为何大家都在移动设备上寻求U3D原生GUI的替代方案
不美观,OnGUI很耗费时间,效率不高,使用不方便
1.8.Reset
1.9. OnDisable 函数 : 和 OnEnable 函数成对出现 , 只要从激活状态变为取消激活状态 , 就会执行一次 (和 OnEnable互斥)
1.10. OnDestroy 函数 : 当前游戏对象或游戏组件被销毁时执行
二、事件响应函数:
MonoBehaviour中的事件响应函数都是已On开头的,比如:鼠标事件,脚本激活、销毁,碰撞等。
OnApplicationFocus:当玩家获得或失去焦点时发送给所有游戏物体。可以作为协同程序,在函数中使用yield语句即可
OnApplicationPause:当玩家暂停时发送到所有的游戏物体。可以作为协同程序,在函数中使用yield语句即可。
OnApplicationQuit:在应用退出之前发送给所有的游戏物体。当用户停止运行模式时在编辑器中调用。当web被关闭时在网络播放器中被调用。
OnBecameInvisible:当renderer(渲染器)在任何相机上都不可见时调用OnBecameInvisible。
OnBecameVisible:当renderer(渲染器)在任何相机上可见时调用OnBecameVisible。
OnCollisionEnter:当此collider/rigidbody与另一个rigidbody/collider接触时调用。
OnCollisionExit:当此collider/rigidbody停止触发另一个rigidbody/collider时。
OnCollisionStay:当此collider/rigidbody触发另一个rigidbody/collider时,OnCollisionStay将会在每一帧被调用。
OnConnectedToServer:当你成功连接到服务器时,在客户端调用。
OnDisconnectedFromServer:失去连接或从服务器端断开时在客户端调用。
OnFailedToConnectToMasterServer:当连接主服务器出现问题时在客户端或服务器端调用。
OnControllerColliderHit:在移动的时,当controller碰撞到collider时OnControllerColliderHit被调用。
OnDestroy:脚本销毁时调用。
OnDisable:对象禁用或者取消激活时调用。
OnEnable:对象变为可用或激活状态时此函数被调用。
OnDrawGizmosSelected:如果想在物体被选中时绘制gizmos,执行这个函数。
OnGUI:渲染和处理GUI事件时调用。
OnJointBreak:当附在同一对象上的关节被断开时调用。
OnLevelWasLoaded:一个新关卡被载入时此函数被调用。
OnMouseDown、OnMouseDrag、OnMouseEnter、OnMouseExit、OnMouseOver、OnMouseUp:鼠标事件。
OnMouseUpAsButton:只有当鼠标在同一个GUIElement或Collider按下,在释放时调用。
OnTriggerEnter:当Collider(碰撞体)进入trigger(触发器)时调用OnTriggerEnter。
OnTriggerExit:当Collider(碰撞体)停止触发trigger(触发器)时调用OnTriggerExit。
OnTriggerStay:当碰撞体接触触发器时,OnTriggerStay将在每一帧被调用
三、默认组件
3.1 Transform:对象的位置,角度,缩放。变量名:transform
3.1.1. 物体自身旋转使用的函数?
Transform.Rotate()
3.1.2. U3D中用于记录节点空间几何信息的组件名称,及其父类名称
Transform 父类是 Component
Rigidbody:刚体属性。
Render:渲染物体模型。
Light:灯光属性。
Camera:相机属性。
Collider:碰撞体属性。
Animation:动画属性。
Audio:声音属性。
四、组件获取函数
获取组件的方法由于比较耗时,所以如果你在update修改transform的话,一般可以先在Start中获取这个组件的引用,然后在update中使用引用去修改。
比如获取上面例子cube1的script1脚本:
[c-sharp]Script1 spt1 = GetComponent<Script1>( );[/c-sharp]
下面是获取组件的函数:
GetComponent:获取组件。
GetComponents:获取组件列表。
GetComponentInChildren:返回Type类型组件,在GameObject或它的任何子物体使用深度优先搜索,仅返回激活的组件。
GetComponentsInChildren:在GameObject或任何它的子物体,返回全部Type类型组件。
五、获取场景中的游戏对象
同样和获取组件一样,该方法比较费时,一般在Start中获取引用。
GameObject cube1 = GameObject.Find("Cube1");
5.1.GameObject和transform.Find的区别。 GameObject通过名字或者路径来查找游戏对象:GameObject.Find(“a”) (1)无法查找隐藏对象。在查找路径上任意一个父物体隐藏都查不到 (2)如果查找不在最上层,就需要根据路径查找,但路径查找是把双刃剑 优点1:解决查找中可能出现的重名问题 优点2:如果有完全的路径,减少查找范围,减少查找时间 缺点:结构或路径调整后,容易影响到物体的查找,需要重新定位查找路径 (3)使用方便但效率低下。 此查找相当于递归遍历查找,虽然操作方便,但效率低下,建议在start中查找对象并保存引用,切忌在update中动态查找。 transform.Find (1)可以查找隐藏对象 (2)支持路径查找 (3)查找隐藏对象的前提是transform所在的根节点必须可见,即active=true **其他查找: GameObject.FindWithTag GameObject.FindGameObjectsWithTag **隐藏根节点也可查找:使用
5.2.GameObject.Find()和Transform.Find的区别 答;GameObject.Find()是在场景中所有预设中查找。Transform.Find只在子节点中查找。
5.3.怎样能迅速找到某一个UI控件。
答案:分情况处理,这是一个优化策略的题目。首先如果这个控件我在awake的时候能知道,那么我会把它存成一个private变量,代码中使用的时候直接使用即可。如果不行,这个子物体是动态生成的(他可能有或者没有),那尽量使用FindChild,得到之后加以判断。如果不得不全局找一个东西(比如找到角色物体),才会用Find。
Resouces.FindObjectsOfTypeAll
GameObject cube1 = GameObject.FindWithTag("tag_cube1");
[/c-sharp]
除了上面的方法,也可以使用public对象,直接使用面板拖拽赋值。