关于Unity中Awake等函数执行以及预制体的使用

1.  执行顺序来说

    Awake

    Start

    Update / FixedUpdate

    LateUpdate

    (1)  Awake 在对象被唤醒时即被调用,所以我认为是创建以后即将执行的,

           个人习惯:

                    将 (获取其他组件)/(设置事件响应) 放在此处

                    会产生事件的参数设置在此进行初始化(使用内部赋值方法),而在其他地方使用外部赋值方法

                            关于这个赋值方法,在代码中进行示例:

{
    private bool reachTarget;// 内部赋值方法(!!!在 Awake 中使用 !!!)
    private bool ReachTarget
    {
        get { return reachTarget; }
        set // 外部赋值方法
        {
            if (false == reachTarget && true == value)
            {
                if (null != reachListener)
                    reachListener.Invoke( gameObject ); // 外部赋值方法出发事件
            }
            reachTarget = value;
        }
    }
    private event OnReachHole reachListener; // 到达事件
    public void AddReachListener(OnReachHole listener)  (!!!在其他组件的 Awake 中使用 !!!)
    {
        if (null == reachListener) // 设置事件委托
            reachListener = listener;
        else
            reachListener += listener;
    }
}

    (2)  Start 在对象执行第一个 Update 之前执行,也就是起始时调用的

           这里我进行私有变量的初始化( (1) 中代码 ReachTarget 也需要进行一次重新设置),

           而公有变量在 Inspector 面板中进行设置。           

    (3) Update 和 FixedUpdate 是更新的函数:

          先说 FixedUpdate,该函数是对物理引擎的参数进行定时长更新的,所有与物理引擎相关的参数更新均放在这里

          Update 函数是基本的更新函数,所有参数(除了物理引擎中的参数)的更新均放在此处

    (4) LateUpdate 在所有对象的的 Update 和 FixedUpdate 执行完毕后,进行调用

          当对象的一些更新取决于其他对象的更新时,才会用到此函数,比如说:跟随视角镜头

          

2.  用脚本载入预制体(Prefab)的方法

     我使用的是 Resource.Load 的方法来实现的,虽然网上有很多,但是只有一行代码,具体用起来还是没有太详细的。

     (1)  制作预制体

            我预制了一个运动的物体,在每次生成的时候随机选取一条路径,然后在每个周期更新时前进。

     (2)  移动到 Resources 中

            在 Assets 中创建 Resources 文件夹,将预制体移动到该文件夹内

     (3)  动态调用

            代码中加入如下代码:

GameObject mouse = Resources.Load("PrefabName") as GameObject; // 载入,只需进行一次
GameObject inst = Instantiate(mouse); // 实例化,在每次新建实例时,调用此函数即可
// ... 后面对实例进行设置
     从我的实践来看,有以下需要注意的:

     (1)  一定要实例化,没有实例化,相当于你只明确了一个类,而没有实际的东西(实例)。

     (2)  在我的初始化的过程中,使用了 System.Random 类,而得到的全都是一样的结果,是因为 System.Random() 构建时采用的是时间作为种子,所以我在全局建立了一个 System.Random 对象,然后让所有的初始化均用一个对象得到随机数,以完成区分。


(2016.11.13新增)

3.在场景中直接实例化模板对象

    由于我处理的场景中,对象要么只有一个实例,要么就是动态进行处理的多个实例,所以我采用了模板对象的方式,具体做法:

   

GameObject templateGo = gameObject.Find("template");
GameObject instGo = Instantiate(templateGo);
// ... 在这里添加对 instGo 的处理
instGo.SetActive(true);

  第一句的作用是找到模板对象,第二句就是按照模板对象进行一个实例化,之后你可以根据你的需求,对实例对象进行处理,最后激活即可。

这样做需要有一个前提是你在场景中保留一个模板对象的未激活实例。




你可能感兴趣的:(Unity3D)