Unity基础
协程
- 为单线程
当我们在定义协程的时候,编辑器会跳出
IEnumerator:是一个实现迭代器功能的接口
和
IEnumerable:是在IEnumerator基础上的一个封装接口,有一个GetEnumerator()方法返回IEnumerator
开启协程:
像此时就可以在里面写一个MoveToPath
它的底层和foreach一样,都是迭代器模式
以yield为分界线,前面的放MoveNext里面;
后面的放hasNext里面(就一行)
内置方法:
yield return null;//下一帧之后继续执行后续代码 yield return 0;//同上,可以为任意数字 yield break;//直接结束该协程 yield return StartCoroutine(Timer());//等待Timer()协程运行完成 yield return new WaitForSeconds(3f);//等待3秒,收到DeletaTimd影响 yield return new WaitForSecondsRealtime(2f);//等待2秒,不受任何影响 yield return new WaitUntil(() => true);//等待某条件为真时,往后运行 yield return new WaitWhile(() => false);//等待某条件为假时,往后运行
寻路系统
- 搭建一个场景
- 将创建中不会动的物体(地面/障碍物/等)设为静态
3.再在Window-AI里找到导航系统
4.然后就是烘焙,他会自动根据设为静态物体的网格或地形去生成寻路网格(记得一定要开Gizmos😇)
5.需要寻路的物体得添加NavMeshAgent组件,在脚本里调用。
6.
Off Mesh Link组件
搭桥作用,需要两个空物体,任意一个加上这个组件就行
拖到Start和End里
寻路烘焙之后,两块烘焙之间有空隙,在两个烘焙上分别放上start和end,物体就会从start移动到end。
空物体需要离烘焙近一点。
7.
Nav Mesh Obstacle组件
动态障碍物,,
额,寻路组件自带的碰撞体组件是假碰撞体组件,倘若寻路时中间有碰撞体,还是会穿模。
使用这个组件就相当于寻路系统里的碰撞体,物体寻路时会绕开,而且在运行阶段也能移动。
能挡,能运动(设置静态练动画组件都用不了)
8.寻路也有遮罩,为道路设定它的遮罩,寻路者里如果没有添加该遮罩,就不会走到该道路上来
在Nav窗口里修改路面的标签(此时选的是Blue的网格)
AreaMask是每一块路面的标签,可以决定该物体能否走在该路面上
9.
另外,如何动态修改AreaMask的值:
AreaMask是int转为二进制来控制的,举几个例子:值1表示仅勾了表0、值2表示仅勾了表1、值3表示勾了表0和表1......
上述这些就是遮罩
Cost表示消耗:寻路算法会去找最优解,这个最优是通过路程和Cost的大小一同计算出来的
射线
Camera.main是指场景相机中,tag为MainCamera的相机。
刚体
质量
线性阻尼
角度阻尼
是否使用重力
是否启用动力学:勾上的话,游戏对象将不再受物体引擎的影响从而只能通过Transform属性来对其操作。该方式适用于模拟平台的移动或带有铰链关节链接刚体的动画
插值:该项用于控制刚体运动的抖动情况,有3项可供选择。
None:没有插值
Interpolate:内插值。基于前一帧的Transform来平滑此次的Transform
Extrapolate:外插值。基于下一帧的Transform来平滑此次的Transform
碰撞检测:该属性用于控制避免高速运动的游戏对象穿过其他的对象而未发生碰撞,有3项可供选择。
Discrete: 离散碰撞检测。该模式与场景中其他的所有碰撞体进行碰撞检测。该项为默认值。
Continuous:连续碰撞检测。该模式用于检测与动态碰撞体(带有Rigidbody)的碰撞,使用连续碰撞检测模式来检测与网络碰撞体的(不带Rigidbody)碰撞。其他的刚体会采用离散碰撞模式。此模式适用于那些需要与采用连续动态碰撞检测的对象相碰撞的对象。这对物理性能会有很大的影响,如果不需要对快速运动的对象进行碰撞检测,就使用离散碰撞检测模式。
Continuous Dynamic:连续动态碰撞检测模式。该模式用于检测与采用连续碰撞模式或连续动态碰撞模式对象的碰撞,也可用于检测没有Rigidbody的静态网格碰撞体。对于与之碰撞的其他对象可采用离散碰撞检测,动态连续碰撞检测模式也可用于检测快速运动的游戏对象。
物理引擎(布料/关节)
碰撞触发
简单写一下碰撞器和触发器相关:
碰撞器:都要加碰撞盒(都不开Trigger);运动的一方有刚体;OnCollisionEnter();
触发器:都要加碰撞盒(其中一方开Trigger);运动的一方有刚体;OnTriggerEnter();
更详细的碰撞算法会单独出一期。
相机
Animator
动画器
分成两种动画
人物动画和其他动画
市场已经发展了很久了,人物动画在网上有很多
只要下载一个,就能给任意带有人物骨骼的对象使用
而其他动画,因为骨骼不一样,需要定制
现在来做一个人物动画器:
首先,我们需要一个带有人物骨骼的模型
添加Animator,然后
这是Mapping,旁边的肌肉Muscle就是控制人物动画播放时,某一关节的摆动幅度。
这样,他就会自动绑定骨骼子物体,如果没绑上就会标红
当然,一些不重要的骨骼没找到的话不会标红,就只是给你空出来
如果发现还不行,就去clear一下,再做这三步。
然后就是动画状态机
我们有多个动画文件,现在需要他们切换
就去连线就可以了
连完之后点那根线,就会出现切换条件
里面的条件都是并,也就是说,要满足所有条件,他才会切换(例如:按W和S才会切换);
这种就是&&
那该如何实现或呢(例如:按W或S就会切换):
那就是再连一条线😅
这种就是||
还有一种是blend树,有1D和2D的区别
1D
动画少的时候用,每帧最多两个动画在播的时候用这个
一般就是切换动画。
2D
动画多的时候用
可以同时播放若干的动画
动画控制器的Layer
也可以做到几种动画一起播放,比如边跑边攻击。
把权重拉到1,就可以和跑步动画的手臂取平均值。
把权重拉到1,就可以和跑步动画的手臂取平均值。
其次,Mask是遮罩,用遮罩锁起来的骨骼部分就不会影响人物。
脚本里面是,animetor.SetLayerWeight(int Layer,int float);
动画事件
Animator会在遇到动画事件时,去找同一个物体上挂着的脚本组件里,有没有目标方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?