关于Unity中Awake等函数执行以及预制体的使用
2016-07-30 01:32
344 查看
1. 执行顺序来说
Awake
Start
Update / FixedUpdate
LateUpdate
(1) Awake 在对象被唤醒时即被调用,所以我认为是创建以后即将执行的,
个人习惯:
将 (获取其他组件)/(设置事件响应) 放在此处
会产生事件的参数设置在此进行初始化(使用内部赋值方法),而在其他地方使用外部赋值方法
关于这个赋值方法,在代码中进行示例:
(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) 动态调用
代码中加入如下代码:
(1) 一定要实例化,没有实例化,相当于你只明确了一个类,而没有实际的东西(实例)。
(2) 在我的初始化的过程中,使用了 System.Random 类,而得到的全都是一样的结果,是因为 System.Random() 构建时采用的是时间作为种子,所以我在全局建立了一个 System.Random 对象,然后让所有的初始化均用一个对象得到随机数,以完成区分。
(2016.11.13新增)
3.在场景中直接实例化模板对象
由于我处理的场景中,对象要么只有一个实例,要么就是动态进行处理的多个实例,所以我采用了模板对象的方式,具体做法:
GameObject templateGo = gameObject.Find("template");
GameObject instGo = Instantiate(templateGo);
第一句的作用是找到模板对象,第二句就是按照模板对象进行一个实例化,之后你可以根据你的需求,对实例对象进行处理,最后激活即可。
这样做需要有一个前提是你在场景中保留一个模板对象的未激活实例。
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) <span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">(!!!在其他组件的 Awake 中使用 !!!)</span> { 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);
第一句的作用是找到模板对象,第二句就是按照模板对象进行一个实例化,之后你可以根据你的需求,对实例对象进行处理,最后激活即可。
这样做需要有一个前提是你在场景中保留一个模板对象的未激活实例。
相关文章推荐
- 关于JavaScript预编译和执行顺序以及函数引用类型的思考
- oracle数据库--关于使用分组函数以及group by的注意点
- 关于大小端的简单介绍以及使用C写一个函数判断当前系统是大端存储还是小端存储
- Unity初始化函数以及退出函数的执行顺序
- 关于回调函数、共享内存的使用,以及进程间函数调用的讨论
- 使用ARM开发详细步骤/关于QT/E安装,编译,以及执行
- 一个关于模板字符串的使用技巧,以及 String.raw() 函数
- unity执行顺序以及unity协程的使用
- Unity里如何停掉Coroutine, Invoke的函数的执行,以及脚本的Start()和Update()
- 关于使用count(X) 函数的说明(附加:关于null的说明以及和0的区别)
- unity中获得一帧中函数执行的时间以及定位性能热点
- 关于CTE的使用,以及TOP/ORDER BY的执行顺序
- Boost关于bind的使用以及函数对象和传递参数的问题
- 关于Unity的Start和Awake的执行顺序
- 关于函数适配器less< Type>以及bind1st和bind2nd的使用
- Tip8:Unity中诸如 Awake() Start() Update()等函数的 执行顺序
- 关于 CreateEvent 和WaitForMultipleObjects以及 WaitForSingleObject 等函数的使用实例
- js如何把字符串转为变量使用,以及js下将字符串当函数去执行的方法
- 关于perl中命令执行以及@ARGV的使用
- 关于unity中使用yield return newWaitForSeconds()后面语句不执行