1. unity中的特殊文件夹

在Unity中一些文件夹是预设定具有某些特殊功能的。在建立文件夹时若不是使用相应功能,应避免和这些文件夹重名。
***Assets文件夹***为资源的根节点,所有的资源都应在Assets文件夹下,经测试似乎可以命名其他文件夹为Assets,但为了避免混淆,应避免使用这个文件夹名。

Editor 文件夹,用来存放一些调用Unity.Editor的API的脚本。可以在各个层级中有各自的Editor文件夹。因为实际项目不能调编辑器,这个文件夹中的脚本不会被build打包进去。

Editor Default Resources文件夹,注意中间是有空格的。它必须放在Assets根目录下,只能有一个。你可以把编辑器用到的一些资源放在这里,比如图片、文本文件、等等。它和Editor文件夹一样都不会被打到最终发布包里,仅仅用于开发时使用。你可以直接通过EditorGUIUtility.Load去读取该文件夹下的资源。

Gizmos文件夹,用来存在OnDrawGizmos方法内使用Gizmos.DrawIcon所画出的图标。

Plugins文件夹,它必须放在Assets根目录下,只能有一个。用来存放一些插件。如果做手机游戏开发一般 andoird 或者 ios 要接一些sdk 可以把sdk依赖的库文件 放在这里,比如 .so .jar .a 文件。这样打完包以后就会自动把这些文件打在你的包中。

Resources文件夹,可以在各个层级中有各自的Resources文件夹。Resources文件夹下的资源不管你用还是不用都会被打包。可以用Resources.Load方法来直接读取,例如:

GameObject g = Resources.Load<GameObject>("Cube");//载入资源(预制体)
Instantiate(g);//在场景中实例化资源

实际是传递一个Path,默认是在Resource文件夹下。这个方法会找遍所有的Resources文件夹看是否有符合的文件。
(Resources.LoadAssetAtPath()已被弃用)。
官方文档提示:Resources 文件夹是 Unity 项目中许多常见问题的来源。Resources 文件夹的使用不当会使项目构建出现膨胀,导致内存消耗过高,并显著增加应用程序启动时间。

Standard Assets文件夹,存放Unity的标准资产。它必须放在Assets根目录下,只能有一个。

StreamAssets文件夹。它必须放在Assets根目录下,只能有一个。存放媒体文件,如视频等。该文件夹下的资源会打包进发布包,它和Resources文件夹的区别是:Resources文件夹下的资源在打包时会被压缩,但StreamingAssets文件夹下的资源不会被压缩,而是原封不动的打包进发布包中。它是一个只读的文件夹,就是程序运行时只能读 不能写。它在各个平台下的路径是不同的,不过你可以用Application.streamingAssetsPath 它会根据当前的平台选择对应的路径。

2. 预制体

预制体相当于一个GameObject的模板。我们可以把场景中做好的GameObject保存下来,用在别的场景或者来动态生成。
a) 预制体的制作
直接将GameObject从Hierarchy面板拖到Project面版里就行,生成一个蓝色方块即为预制体。

b) 预制体的实例化

  1. 直接从从Project面板拖到Hierarchy面板即可。
  2. 在脚本中开个GameObject类的变量,将预制体资源拖上去,之后再在方法中实例化(克隆)。
public GameObject BallPrefab;//用来接收预制体
void Start()
{Instantiate(BallPrefab);//实例化
}
  1. 将预制体放在Resources文件夹中,用Resources.Load方法读取后再Instantiate实例化。

c) 预制体对实例的覆写
由于预制体相对于实例的模板,对预制体的修改会按一定规则影响实例。通过双击Project面板里的预制体或者实例的Inspector面板里的open按钮。可以打开预制体编辑器。(注意预制体内修改完成后无法撤销。)
注意:
1) 实例中的Transform/position和rotation,RectTransform/width,Height等不会被覆写。
2) 实例中相应组件已经有修改的话,实例中该组件也不会被覆写。
d) 实例对预制体的覆写
如果对某一个实例进行了修改。主要分为:覆写属性的值,添加组件,移除组件和添加子物体。
注意:已在预制体中存在的子物体是不能重新指定父子关系和移除的。
如果想把修改应用到其它实例和预制体本身上的话。按Inspector面板中的Overrides按钮后的applyAll即可(Revert All是丢弃修改,将实例还原成预制体资源中的设置)。

注意:实例之间也遵循之前的规则。大部分修改都会反映到预制体资源,但实例中的Transform/position和rotation,RectTransform/width,Height依然不会覆写进预制体资源。

e) 内嵌预制体
预制体资源中可以有其他的预制体实例。
由于内嵌的预制体实例是作为外层预制体的一部分。所以在实例上不能在内嵌的预制体进行Overrides操作。如果在内嵌预制体实例进行修改了,外层预制体实例的Overrides操作只会影响同类的嵌套预制体实例。而不会影响其他内嵌预制体的本身预制体资源和本身预制体资源的实例。如果想要影响,只能进入预制体编辑器中,这时就可以对内嵌的预制体进行Overrides操作而影响其本身预制体资源和本身预制体资源的实例。

f) 预制体变体
有时候我们希望预制体资源之间也有层级结构。例如希望一个杂兵资源可派生出不同持有不同武器的杂兵资源,但又希望有一些共通的东西能一起改变。这时就可以用预制体变体。
1) 生成方法:右键预制体资源Create/Prefab Variant,即可生成一个预制体变体资源(斜杠方块)。也可以将Hierarchy面板中的预制体实例再次拖入Project面板。选择Prefab Variant即可。
2) 预制体变体资源的使用方法基本和普通预制体一致。但在预制体变体中的修改不会自动反映到原来生成预制体变体的预制体资源(base)。但可以打开预制体编辑器来进行对base资源的覆写。
3) 反之,对base预制体资源的修改会自动地应用到相应的预制体变体资源和实例中。但同样要遵守之前预制体资源和实例之间的修改原则。(Base资源和变体资源跟预制体资源和实例之间的关系雷同。)

g) 预制体实例拆包
如果不想预制体实例关联预制体资源。可右键实例选择UnpackPrefab,即可。这时候实例就变成了普通的Gameobject了。UnpackPrefabCompletely是把子物体中的prefab也都拆了。

3. Monobehavior脚本运行顺序

在脚本中,系统会自动调用一些系统预定义的方法,被称为必然函数,如:Strat(),Update()等。脚本中完整的必然函数的调用参看官方文档:
https://docs.unity.cn/cn/current/Manual/ExecutionOrder.html

常用的方法有:

  • 1) void Awake():在最开始时会被调用,但仅会在挂载的游戏物体第一次被激活时被调用一次,且即使脚本处于未激活的状态也会被调用,提供最基本的初始化。
  • 2) void OnEnable():在也是在最开始时会被调用(比Awake迟),与Awake不同的是脚本处于未激活的状态时不会被调用,每次脚本被激活时都会调用一次。提供重复使用脚本的初始化。
  • 3) void Reset():只会在编辑器下回被调用,对应组件上右键后的reset按钮。
  • 4) void Start():仅在Update函数第一次被调用前调用,且只调用一次。与Awake不同的是比Awake迟,且本处于未激活的状态时不会被调用。
  • 5) void Update():正常帧更新,用于更新逻辑。每一帧都执行一次。由于是随着实际游戏帧数更新的,所以每次Update的间隔时间是由波动的,与这一帧总共的耗时有关(对应Time.deltaTime)。这也是为啥在移动方法中往往要乘个Time.deltaTime,避免角色移动速度随帧数波动。
  • 6) void FixedUpdate():按固定时间间隔来更新,主要用于处理物理计算。可以实验以下代码。用AddForce按10m/s^2加速1秒。
void Update(){if (time < 1f){cub.AddForce(Vector3.forward * 10,   ForceMode.Acceleration);}Debug.Log(cub.velocity);time += Time.deltaTime;}private void FixedUpdate(){//if (time <1f)//{//    cub.AddForce(Vector3.forward * 10, //ForceMode.Acceleration); //}//Debug.Log(cub.velocity);}

会发现在Update()里可能加不到10m/s且每次还不一样。因为实际上一次1秒内执行的Update()是不定的,而每执行AddForce方法只是给加一次力(力大小实际上跟设定的FixedUpdate更新时间有关),而对于一帧只执行一次的Update来说又无法根据帧时间来调节力的大小。所以物理计算要放在FixedUpdate才能保证正确。
可以在Project Setting/Time中设定FixedUpdate的更新时间间隔(即Fixed TimeStep)。由于是固定时间间隔,所以根据一帧的时间,可能更新很多次。一帧时间越长,更新次数越多。那就可能有个情况,本来由于性能或其他原因导致低帧率,那么物理计算就要进行很多次,导致进一步更长的耗时。为了避免这个恶性循环,unity提供了MaximumAllowedTimeStep来设定物理计算(不只是FixedUpdate)阶段最长时间。超过这个时间,unity会按设定的时间来进行物理计算(FixedUpdate的更新次数就可能不准确)。

  • 7) LateUpdate():在游戏逻辑阶段最后执行。同样每帧执行一次。通常用在摄像机控制上。

游戏物体GameObject

gameObject实际上是组件的容器,是靠组件来显示物体,进行交互的。也可以生成一个空游戏物体,其中只有transform组件(transform组件是所有游戏物体所必须的)。
a) static
在Inspector面版的name旁边有static,字面意思上用来标识静止的物体,通常是场景之类的。在unity内部会有不少操作来检测该物体是否为static的,对于static的物体进行一些特殊处理,在rendering优化时会根据是否为static来进行不同的优化,在lightmaping时(光照渲染烘焙),会根据是否是static来进行光照等等。

b) Tag和layer
在Inspector面版的name下边有Tag和layer。tag用来标记物体,可以通过Tag查找到相应物体。layer是Layers通常被摄像机用来渲染部分场景,和灯光照射部分场景使用。但是它们也可以用来做射线检测时忽略一些collder或Collision使用。

c) 在场景中生成游戏物体
1.通过预制体生成。用Instantiate(gameobject);//有重载可以指定位置转角父子关系等。
2.通过GameObject.CreatePrimitive(PrimitiveType);生成unity内置的模型,如立方体球体等。

d) 在场景中查找游戏物体
可以按名字查找:

GameObject.Find(“Name”);

也可以按标签查找

GameObject.FindWithTag(“Tag”);

//在2020.1版本中名字和标签有重复的话会按Sence窗口自上而下深度遍历,返回找到的第一个。

要查到多个物体时,可以给要查找的物体打同一个标签后,使用

GameObject.FindGameObjectsWithTag(“Tag”);//返回的是GameObject数组

//在2020.1版本中索引是按Sence窗口自上而下深度遍历查找。
注意:
1)这三个方法都无法找到未激活的物体。
2)探究返回的是哪一个游戏物体和索引顺序是无意义的。因为之前用2019.4版本时返回的结果有出入。可能下一版本搜索策略又改了。对于要特定操作的游戏物体还是要么直接引用进脚本,要么指定一个独一无二的名字或tag。
3)Find比Findwithtag消耗大,在用Find时应尽量具体地指明路径Find(“/Player/cube”)。但都不应频繁地使用这些查找,如在Update中调用。

e) 不激活和销毁物体

object . SetActive(false(或者true));//激活或者不激活物体。
Destory(gameObject);//销毁物体。
Destory(gameObject , 1f);//延迟一秒销毁物体

f) gameObject的消息发送机制
一共有3种方法

obj.SendMessage(“方法名”);//试图调用obj中同方法名的方法。
obj.BroadCastMessage(“方法名”);//试图调用obj和其子物体中同方法名的方法。(有的话都会被调用)
obj.SendMessageUpward(“方法名”);// 试图调用obj和其父物体以上中同方法名的方法。(有的话都会被调用)

注意:
1) 这个方法由于只是用方法名查找,无法识别重载,只能识别脚本中第一个同名方法。
2) 用这个方法即使被查找的脚本是未激活,脚本里方法是私有方法也会被找出来调用。
3) 默认如果一次调用都没成功就会报错。但可以通过重载设置SendMeessageOptions为SendMessageOptions.DontRequireReceiver时可以忽略这个报错。
4) 对于CPU而言,使用SendMessage()的效率比调用已知的公有方法低。一般规则是,仅当有很多不同类型对象接收消息时,才需要使用SendMessage()。

Unity基础学习笔记(一)相关推荐

  1. Unity超基础学习笔记(二)

    Unity超基础学习笔记(二) 1. 基本数据类型的扩展 之前在K12中学习了一些基本的数据类型,实际上C#支持更多的数据类型.如下: 注意无符号整型数和有符号整型数的表示范围,例如: int 能表示 ...

  2. UE5 Shader基础学习笔记——13-20 DetailNormal/Smoothstep/Length/CeilFloorRound/DDXDDY/SinCos/Power

    UE5 Shader基础学习笔记--13-20 DetailNormal/Smoothstep/Length/CeilFloorRound/DDXDDY/SinCos/Power Lec13 Deta ...

  3. UE5 Shader基础学习笔记——01-12 图形管线/创建shader/数学节点/贴图压缩/LerpDotUV/常用向量/坐标空间/MinMaxClampSaturate/法线贴图混合

    UE5 Shader基础学习笔记--01-12 图形管线/创建shader/数学节点/贴图压缩/LerpDotUV/常用向量/坐标空间/MinMaxClampSaturate/法线贴图混合 Lec01 ...

  4. guido正式发布python年份_Python 基础学习笔记.docx

    Python 基础学习笔记 基于<Python语言程序设计基础(第2版)> 第一部分 初识Python语言 第1章 程序设计基本方法 1.1 计算机的概念 计算机是根据指令操作数据的设备, ...

  5. ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步

    http://blog.jobbole.com/85008/ ASP.Net MVC开发基础学习笔记(5):区域.模板页与WebAPI初步 2015/03/17 · IT技术 · .Net, Asp. ...

  6. Python3 基础学习笔记 C09【文件和异常】

    CSDN 课程推荐:<8小时Python零基础轻松入门>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python:轻松入门& ...

  7. Python3 基础学习笔记 C08 【类】

    CSDN 课程推荐:<8小时Python零基础轻松入门>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python:轻松入门& ...

  8. Python3 基础学习笔记 C07【函数】

    CSDN 课程推荐:<8小时Python零基础轻松入门>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python:轻松入门& ...

  9. Python3 基础学习笔记 C06【用户输入和 while 循环】

    CSDN 课程推荐:<8小时Python零基础轻松入门>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python:轻松入门& ...

最新文章

  1. Typescript之 范型
  2. 让div margin属性消失_margin 和 padding
  3. Linus Torvalds: 成功的项目源于99%的汗水与1%的创新
  4. 让你不再对网络安全产生七种误解
  5. 【杂谈】当前模型剪枝有哪些可用的开源工具?
  6. 2017年第八届蓝桥杯 - 省赛 - C/C++大学A组 - B. 跳蚱蜢
  7. 前端学习(2002)vue之电商管理系统电商系统之绘制商品分类的级联选择器
  8. 攻击者接管账户,攻陷周下载量超700万次的JavaScript 流行库 ua-parser-js
  9. python实现强化学习
  10. 【Shawn-Git】gitlub的使用指导(针对六届软件杯)
  11. 【完结】囚生CYの备忘录(20220525-20220813)
  12. delphi显示jpg、png、gif图片
  13. 计算机禁用网络后怎么打开,无线网关,教您笔记本无线网络禁用后怎么开启
  14. 国产首发:上海川土微电子数字接口电源数字隔离芯片模拟芯片领导者
  15. vue中watch的详解
  16. 有这18个正则表达式,效率嘎嘎上升
  17. 关于MS edge出现STATUS_STACK_BUFFER_OVERRUN的解决方法
  18. 计算机毕业设计Java桌游店会员管理系统(源码+系统+mysql数据库+Lw文档)
  19. GitHub各种加速方式
  20. u盘电视测试软件,智能电视安装软件无法识别U盘怎么办?简单几招教你搞定!...

热门文章

  1. windows系统启用2个以上的mysql服务
  2. asp html转word文档,asp生成word文档
  3. java访问对象的属性_java访问对象的属性和行为详细介绍
  4. Android方法的概括,Android_Android中startService基本使用方法概述,Android中有两种主要方式使用Ser - phpStudy...
  5. java 堆 栈 ===_Java堆,栈,堆栈
  6. 最佳海报样机模板|让作品脱颖而出
  7. 好东西!适合电商促销C4D场景模型海报素材!
  8. Android设计原则及规范指南!UI设计师值得一看!
  9. php pcntl signal,php – 后续的pcntl_signal信号没有启动处理程序
  10. QT 在最新版mac下无法显示变量的问题处理