Unity 中 必然事件 生命周期 游戏对象的访问 组件的访问

什么是必然事件Certain Events

Unity中部分特定函数在一定条件下会被自动调用,成为必然事件。

1.Awake 系统第一个执行。
2.OnEnable 每次激活的时候就会被调用。
3.Start 在第一次调用Update之前会调用一次。
4.FixedUpdate 一固定的频率去调用,0.02秒执行一次。
5.Update 该方法每帧都会调用,游戏主要逻辑放在这里,1秒执行60次。
6.LateUpdate 在Update方法调用完之后调用,一半用来处理画面逻辑。
7.OnGUI 该方法每帧调用两次,渲染和处理GUI事件时被调用。
8.OnDisable 取消激活状态后调用。
9.OnDestroy 脚本被销毁时调用一次。

awake

当物体载入时立即调用1次;常用于在游戏开始前进行初始化,可以判断当满足某种条件执行此脚本“this.enable=true`

OnEnable

每当脚本对象启用时调用

Start

物体载入且脚本对象启用时被调用1次。常用于数据或游戏
逻辑初始化,执行时机晚于Awake。

常用事件响应函数

游戏对象的访问

在Unity场景中出现的所有物体都属于游戏对象( GameObject )

吐槽这话怎么这么耳熟

  • 以下出现的函数均比较耗时,耗时就不要在Update里写了,能不用就不用:应该在初始化时把组件的引用保存在变量中

1.通过名称查找 : GameObject.Find

如果场景中存在指定名称的游戏对象,那么返回该对象的引用,否则返回空值null,如果存在多个重名的对象,那么返回第一个对象的引用。

GameObject player;

void Start()
{
    player = GameObject.Find("MainHeroCharacter");
}

2.通过标签查找 : GameObject.FindWithTag

如果场景中存在指定标签的游戏对象,那么返回该对象的引用,否则返回空值null,如果多个游戏对象使用同一标签,那么返回第一个对象的引用。如果场景中有多个相同标签的游戏对象,可以通过FindGameObjectsWithTag()方法获取游戏对象数组。

GameObject player;
GameObject[] enemies;

void Start() 
{
    player = GameObject. FindWithTag ("Player") ;
    enemies =. Game0bject . FindGameObjectsWi thTag ("Enemy") ; 
}

访问组件

当然,如果游戏对象上不存在某个组件,其组件对应的变量值为:null

void Start() 
{
    Example script = GetComponent<Example>(); / /得到游戏对象上的Example脚本组件
    Transform t= GetComponent<Transform>(); / /得到游戏对象上的Transform组件
}

同上,这个也耗时,应该这么写:

Example script; //声明 一个组件变量
void Start()
{
    script=GetComponent<Example>() ;//在初始化中把组件引用保存到变量
}
void Update ()
{
    script.DoSomething(); // 在Update中直接访问组件变量
}

简便地访问游戏对象和组件的方法

通过声明访问权限为Public的变量然后将要访问的组件或者对象赋值给该变量,就可以在脚本中通过变量来访问组件或对象了

假设有Player Cube Sphere 三个游戏对象 且Player已经加上Player脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public GameObject cube; //声明GameObject成员变量
    public Transform sphereTransform; //声明Transform成员变量

}

将Cube和Sphere拖进Player对象的Inspector视图中的对应参数上

发表评论