- 物理检测相交球
Collider[] colliders = Physics.OverlapSphere(transform.position, 100,1<<LayerMask.NameToLayer("NPC"));
第一参数:搜索的原点,这个原点就是球形检测的圆心;
第二个参数:球形检测的半径;
第三个参数:固定用法,通过Layer的名字去转化成搜索层
1<<LayerMask.NameToLayer("NPC") 通过位运算来叠加,搜索多个层。
Collider[] colliders = Physics.OverlapSphere(transform.position, 100,( 1 << LayerMask.NameToLayer("NPC"))+ (1 << LayerMask.NameToLayer("WA")));
这样的写法就一次性搜索了两个层的物体
- 延迟函数
1.Destroy: Destroy(this.gameObject, 2);销毁一个游戏物体,n秒之后执行销毁动作
2.Invoke:Invoke("InvokeTestMethod", 5); n秒之后调用这个方法;当你触发这个延迟函数之后,不管脚本是否失活,还是挂载的游戏物体失活,都会继续执行这个延迟调用函数;如果这个代码组件销毁了或者组件所挂载的游戏物体销毁了,那么延迟函数调用就不会再执行了。
3.InvokeRepeating:InvokeRepeating("InvokeTestMethod", 3, 1);第一个参数是调用的函数名;第二个参数:多久之后调用;第三个参数:多长时间调用一次;----做倒计时
4. CancelInvoke();打断当前类里的延迟函数调用,出了Detroy延迟函数;
- 协程
- 为什么不用多线程?Unity不支持多线程,开发者自己new出来的线程里不能涉及到UnityEngine里面的任何组件。Unity一般使用多线程是在网络交互的时候用,因为网络使用的是传递数据,不涉及到Unity的任何组件,所以可以用多线程。
- 协程:代码都是线性执行的,也就是有顺序的。有的时候需要等待一个加载完成之后才能做剩下来的事。
- 协程需要返回值:IEnumerator,如果想中途挂起协程,需要用yield关键字去修饰的return 如:yield return new WaitForSeconds(5);这样协程就会被挂起5秒,这个函数在这个地方阻塞,主线程继续执行。
- 声明协程函数:IEnumerator M_IEnumTest(int i),参数不能用out ref来修饰
启用协程函数:StartCoroutine("M_IEnumTest",3);
StartCoroutine(M_IEnumTest(3));
停止协程的方法:StopCoroutine("M_IEnumTest");
B:IEnumerator c;
c = M_IEnumTest();
StartCoroutine(c);
StopCoroutine(c);
C:IEnumerator c;
c = M_IEnumTest(4);
StartCoroutine(c);
StopCoroutine(c);
D:Coroutine cor;
cor = StartCoroutine(M_IEnumTest(3));
StopCoroutine(cor);
E:StopAllCoroutines();
停止当前类的所有协程
- yield return new WaitForSeconds(5s);:让程序挂起5秒
yield return new WaitForEndOfFrame();让程序挂起,直到当前帧结束在执行;
yield return new WaitForFixedUpdate();等固定时间,这个时间默认0.02秒;
yield return null; 等一帧
yield break;直接结束协程,不会再返回执行了;
StopAllCoroutines(),防止关闭了别人写的协程;
2:当我们协程启动了之后当前代码组件失活了,yield后面的代码依然会执行,
但是如果这个脚本组件所挂载的游戏物体失活了,那么yield后面的代码就不会执行了;如果一个游戏物体频繁的改变开启和关闭状态,而且他还挂载了代码,这个代码里面有协程,那么最好是把协程写到协程管理类里,这个管理类挂载的物体一般不会轻易改变游戏状态;
3:当我们使用方法加括号的形式开启协程时,不能使用相应的方法关闭协程,
StartCoroutine(M_IEnumTest(3));只能通过StopAllCoroutines();
来关闭协程。
- Unity特殊文件夹
- Resources:文件夹内的文件可以直接使用Resources.Load进行加载,加载路径需要跟真实资源路径保持一致;一个项目中可以建多个Resources文件夹,但是会让项目很乱,不建议这样干。
- Plugins:SDK相关的资料或者是文件,会放到这里面;SDK就是其他平台提供的一些接口;
- Editor:自己写的编辑器代码存在Editor里,这个文件的任何代码、资源都不会打包到安装包内。跟Resources相反,Resources下的任何文件都会打包到安装包内;不在这两个文件夹下的文件跟其他资源没有依赖关系就不会打进安装包,有依赖关系就会打进包;
- Stardard Assets:默认资源文件夹,这个文件下的脚本会最先被编译;
- Gizmos:放一些需要编辑使用的贴图和图标
- StreamingAssets:这个文件夹下的文件也会全部打到安装包里,跟Resources有区别,Resources下的文件会被压缩,StreamingAssets下的文件不会被压缩,但是StreamingAssets下的文件是只读。AssetsBundle文件一般会放在这个文件下。
- 隐藏文件夹:以.开头的文件夹会被Unity忽略,这个文件夹不会被编译、不会被导入、不会出现在Project的视图中。