Unity使用
Unity使用
〇、项目管理
1 项目操作
打开项目:直接在Unity Hub中选择带有资源的主文件夹即可。
2 缓存路径
author::修改Unity Cache和Unity Asset Store的默认路径 - 哔哩哔哩 (bilibili.com)
对于Cache,要改变存储位置的话需要新建两个环境变量:
UPM_CACHE_PATH
:D:\packages
UPM_NPM_CACHE_PATH
:D:\npm
一、快捷键
1 移动
按住鼠标右键 + wsad移动 + qe上下
qwerty 对物体进行不同的操作
2 定位
物体控制:
- F:中心定位
- V:顶点吸附
自身移动:
- ctrl + shift + F 当前物体到视野处
- alt + 鼠标左键 围绕物体旋转
- alt + 鼠标右键 围绕物体放大缩小
项目控制:
- ctrl + z 撤回
- ctrl + y 前进
- ctrl + d 复制
二、界面
1 界面显示
scene右上角,切换 3D 和 2D。
2 场景
一个scene相当于一关,制作完成scene后应当保存scene。
3 检视器
右边检视器会显示物体所带的组件。
// 自定义检视器中显示的组件 |
三、材质
物体样式都是通过新建材质,然后改材质参数来进行修改的
1 单个物体
基本属性:
- position:当前位置坐标。(单位:米)
- rotation:当前旋转角度 。
- scale:缩放比例。
scene面板:
- center - pivot:改变轴心点。
- gobal - local:改变坐标朝向。
2 组件
Transform变换组件(如上基本属性)
Mesh Filter网格过滤器:形状
Mesh Renderer网格渲染器:材质
3 打组
父子对象:
- 父对象坐标相对于全局。
- 子对象坐标相对于父物体。
四、camera
场景中只会存在一个主摄像头,Tag是MainCamera。
Clear Flags:
- Skybox:
- 使用天空盒作为背景,并且会清除摄像机中的所有物体和UI。
- 适用于使用天空盒来创建场景背景的情况。
- Solid Color:
- 使用指定的颜色作为背景,并且会清除摄像机中的所有物体和UI。
- 可以自定义背景颜色,适用于需要单一背景色的情况。
- Depth Only:
- 只清除深度缓冲区,保留原先的颜色缓冲区。
- 适用于只需要进行深度测试、但不想清除颜色缓冲区的情况。
- Don’t Clear:
- 不清除任何缓冲区,保留原先的内容。
- 适用于需要将多个相机渲染结果叠加在一起的情况,例如创建镜头特写效果或实现多层次的渲染。
- Don’t Clear(with Skybox):
- 在不清除缓冲区的同时,仍然使用天空盒作为背景。
- 适用于保留天空盒背景而不清除其他缓冲区的情况。
Culling Mask:
- 摄像机绘制的元素。
- 影响对象是物体Layer。
Projection:
perspective:3D投影方式
orthographic:2D投影方式。
Depth:深度值,在场景中深度值大的相机会覆盖住深度值小的相机的界面。
五、渲染
六、光
七、动画
1 Animation
显示动画视图:Window——Animation——Animation
录制:
Animation——Animation。(ctrl + 6)
给指定组件:add Component——Animation。
- Animation中点击create。
- add property,对组件操作。
- 面板左上红色按钮开始录制,调轴,设置动画效果。
使用:
- Animation中补充动画,一运行就会播放。
- Animations中补充动画,选择自动播放。
Animation——Animation使用
时间轴:1:00 表示第1秒第00帧。
轴上的点:一个动画操作。add property可以添加对指定一个物体的一个动画操作。
轴上左键双击(或右键——Add Key):添加轴上点。设置上一点到这一点的帧数,可以设置起始位置和结束位置属性,中间的帧数会自动补齐。
下面Dopesheet:点,Curves:线。
左边的长方形带加号:事件。在某一帧绑定函数。
2 动画状态
Default:默认,一次
Once:一次
Loop:循环
Clamp Forever:播放一次后固定到最后一帧不可再操作
Ping Pong:自动来回
3 Animator
显示动画视图:Window——Animation——Animator
Entry:程序开始。
Exit:程序结束。
Any State:任何状态。
默认动画:右键——Set as Layer Default State
动画连接:进入动画视图后——右键——Make Transition——指定下一个动画
点击箭头可以设置动画连接条件。
Has Exit Time:自然衔接下一动画。
Exit Time:n 个当前动画后进入下一动画
Fixed Duration:固定值还是百分比
Transition Duration:动画过渡时间
Can Transition To Self [Any State的连线的属性]:可以过渡到自己(多图动画要取消,否则会无限播放第一帧)
Blend Tree:Animator——右键——Create State——From New Blend Tree
Blend Type:混合树类型
- 1D:由一个参数控制
Parameter:参数。该参数下的图为动画权重图。
动画:
- Motion:动画,点击加减可以增减动画
- Threshold:阈值。当参数值为该值时权重为1。
- 时间图标:动画播放速度。
- 人图标:镜像动画。一般仅限有Avatar的人形动画使用。
Automate Threshold:自动设置阈值。
方法
// 对parameters中的值进行赋值 |
案例
// Conditions中设置run要Greater0.1来切换闲置到运动动画,设置run要less0.1来切换运动到闲置动画 |
八、物理引擎
1 刚体
Add Component——Rigidbody
Body Type:
- Dynamic(动态):
- 刚体将受到物理力和碰撞的影响,可以移动、旋转,并与其他刚体产生相互作用。
- 可以通过代码或物理引擎施加力或扭矩来改变其运动和旋转状态。
- Kinematic(运动学):
- 刚体不受物理力的影响,不会被弹性碰撞框架推动或旋转。
- 可以通过代码控制刚体的运动和旋转状态。
- 当与静态刚体或非运动学刚体发生碰撞时,运动学刚体可能会传递或接收碰撞信息,但不会有物理反应。
- Static(静态):
- 刚体不受物理力和碰撞的影响,固定在空间中的位置,不可移动或旋转。
- 静态刚体用于创建环境中的静态障碍物或地面等,提供运动学刚体与之互动的碰撞体。
Dynamic:
- Mass:质量(无单位,统一即可)。
- Drag:阻力。(通常,砖头:0.001,羽毛:10)
- Angular Drag:角阻力。
- Use Gravity:是否有重力。
- Is Kinematic:是否运动学。勾选后约等于霸体。
Interpolate:缓解刚体运行时的抖动。
None:无插值。
Interpolate:内插值,基于上一帧的变化来平滑本帧变换。
Extrapolate:外插值,基于下一帧的预估来平滑本帧变换。
Collision Detection:碰撞检测。
Discrete:不连续碰撞检测,用于普通物体。
Continuous:连续碰撞检测。
Continuous Dynamic:连续动态碰撞检测,适用于高速物体。
Constraits:冻结某个方向的作用或旋转。
带刚体的物体在运动时物理引擎会检测刚体状态。所以带刚体无重力和不带刚体的物体表面一致,但在运动判断时有区别。
2 碰撞体
Add Component—— *** Collider(一般选Box Collider,节约性能)
然后可以在Edit Collider中调节碰撞体大小和位置。
Mesh Collider:精确,但十分消耗性能。使用应勾上Convex来减少网格增加性能。
3 物理材质
创建:Project——Assets——Create——Physical Material
挂载:物体的Collider中
- Dynamic Friction:动摩擦力。
- Static Friction:静摩擦力。
- Bounciness:弹力
- Friction Combine:取摩擦力方式。(依两个物体)
- Bounce Combine:取弹力方式。(依两个物体)
九、系统
1 InputManage
编辑器
输入管理器,用于让用户自定义按键。
Edit——Project Setting——Input
Size:按键个数。
按钮属性
Name:按钮名字。
Descriptive Name:正向按钮描述信息。
Descriptive Negative Name:负向按钮描述信息。
正向按钮和负向按钮都有两个,一个按下返回正数一个返回负数。(按钮不够可以写重名按钮来扩充按钮)
Negative Button:按下按键返回负数(-1)。
Positive Button:按下按键返回正数(1)。
Alt Negative Button:按下按键返回负数(-1)。
Alt Positive Button:按下按键返回正数(1)。
初始按钮值为0。按下正向按钮后值会由0依速度变成1,按钮负向按钮后值会由0依速度变成-1。
Gravity:复位速度,值归到0的速度。
Sensitivity:灵敏度,0变到值的速度。
Type:按键类型。键鼠,鼠标移动等。
Axis:鼠标移动时选定轴。(3rd是鼠标滚轮)
2 Input System
2.1 基本配置
下载:Window——Package Manager——Packages:Unity Registry——Install
配置:
Edit——Project Setting——Player——Other Settings——Active input Handing*——Both
Hierarchy——EventSystem——Replace with InputSystemUIIputModule
新增动作:
- Assets右键——Create——Input Action
- Action Maps:新增一种输入方式。
- Actions:新增对应的动作。
在Actions中点击加号——Listen——键盘输入,可以监听到输入的键盘的键,然后点击对应的键完成键盘注册。
左上角Scheme可以新增框架(例如:Mobile,PC等),然后点击到对应的Actions键位的Properties中,在Use in control scheme进行分类。
2.2 案例
移动
移动Action:
- 新加Actions
- 点击新加的Actions,Properties——Action Type:Value——Control Type:Vector2
- 点击新加的Actions右边的加号——Add Binding——Path——Gamepad——Left Stick
- 点击新加的Actions右边的加号——Add Composite——输入wsad
默认情况下拖拽距离会影响移动速度,修改可以在Actions——Binding Properties——Processors——Normalize Vector2
脚本挂载:
- 玩家——Add component——Player Input——拖入InputSystemUIIputModule
- UI——Add component——On-Screen Stick(移动)——Control Path——Left Stick(Movement Range:摇杆可被拉动最大距离)
// 玩家脚本 |
跳跃
移动Action:
- 新加Actions
- 点击新加的Actions,Properties——Action Type:Button
- 点击新加的Actions右边的加号——Add Binding——Path——Gamepad——Button East
脚本挂载:
- 玩家——Add component——Player Input——拖入InputSystemUIIputModule
- UI——Add component——Control Path——Gamepad——On-Screen Button——Button East
private InputAction playerMove, playerJump; |
按钮
点击:ScreenTouch——选择一个Tap
然后给对象绑定On-Screen Button
3 寻路系统
3.1 分类
路点寻路(Waypoint Pathfinding):
- 特点:路点寻路是将地图或场景分为离散的路点,并在这些路点之间进行寻路。通常,每个路点与附近的路点相连,形成一个图。通过搜索算法(如A*算法)在路点之间进行路径搜索。
- 应用场景:路点寻路适用于具有预定的可行走区域的环境,如游戏中的角色移动、路径规划等。
- 优点:简化了地图的表示和寻路的复杂度,使寻路效率较高。
单元格寻路(Cell Pathfinding):
- 特点:单元格寻路将地图或场景划分为各个大小相同的正方形单元格,使用图来表示这些单元格之间的连接关系。通过搜索算法寻找单元格之间的路径,可以使用A*、Dijkstra等算法。
- 应用场景:单元格寻路适用于需要在细粒度地图或场景中寻找最短路径的情况,如机器人导航、智能交通系统等。
- 优点:能够应对复杂的地图结构和障碍物,可以处理更精确的路径规划。
网格寻路(Grid Pathfinding):
- 特点:网格寻路将地图或场景划分为规则的二维网格,每个网格代表一个固定大小的区域。通常,将可行走区域标记为可通过的网格,将障碍物标记为不可通过的网格。通过搜索算法,在这些网格之间进行路径搜索。
- 应用场景:网格寻路适用于在离散化的环境中进行路径规划的情况,如游戏中的NPC移动、机器人避障等。
- 优点:简化了地图的表示和搜索算法的实现,适用于对精确路径要求不高的情况。
3.2 使用
寻路组件(网格寻路):Component——Navigation
Nav Mesh Agent:寻路者。
Off Mesh Link:无材质路点连接。
Nav Mesh Obstacle:寻路网格障碍物,用于动态碰撞。
使用步骤:
- Component——Navigation——Nav Mesh Agent:设置寻路者。
- Window——AI——Navigation——Object:选择Navigation Static和Generate OffMeshLinks。
- Window——AI——Navigation——Bake——Bake:进行路面烘焙。(路面物体设为Static)
3.3 Nav Mesh Agent
Base Offset:寻路间隔上下偏移。
Steering:
- Speed:移动速度。
- Angular Speed:转弯角速度。
- Acceleration:转弯加速度。
- Stopping Distance:停止时离目标的距离。
- Auto Braking:自动停止。
Obstacle Avoidance:
- Radius:寻路间隔半径。
- Height:寻路间隔高。
- Quality:躲避等级。较高的质量级别将导致更准确的障碍物避免计算,但可能会增加计算开销和性能损耗。
- Priority:优先级参数用于定义障碍物避免的重要性。值0-100。较高的优先级值表示对象更重视避免障碍物。
Path Finding:
- Auto Traverse Off Mesh
- Auto Repath
- Area Mesh:寻路遮罩,选择可走区域。
3.4 Off Mesh Link
Start / End:开始和结束点。
Cost Override:路径移动消耗。默认-1。设置为整数表示是默认消耗的几倍。
Bidirectional:是否双向。
Activated:路径是否激活。
Auto Update Positions:自动更新路径。
Navigation Area
3.5 Nav Mesh Obstacle
Shape:碰撞形状。
Center,Size:位置和大小。
Carve:开启后,会影响agent路径的计算。不开启则不会。
- Move Threshold:移动多少米后重新计算网格。
- Time To Stationary:静止多少秒后重新计算网格。
- Carve Only Stationary:仅静止时才有网格。
3.6 Navigation
Bake:
- Agent Radius:和静态障碍物的半径距离。
Agent Height:寻路网格和路面距离:
- Max Slope:最大坡度。
Step Height:台阶高度:
- Generated Off Mesh Links:自动搭桥
- Drop Height
- Jump Distance:地面距离小于n自动搭桥
Areas:
- 区域名称和花费。消耗值越小会被优先考虑。
Object:
- Navigation Area:选择区域。
3.7 注意
- 设置好了寻路网格后,路面可以取消材质甚至设置为非激活状态。agent一样可以寻路。但是加了重力后就会脱离路面。
- 改变场景后要重新烘焙,烘焙路面不会随场景改变而自动改变。
// 寻路者脚本 |
十、其他
1 预制件
同类的对象拖动至 Assets 中,可以对其进行操作,然后应用到所有同类对象中。
改 Assets 会对所有对象生效,改 Object 的仅对自己生效,可以选择还原或应用。
Prefab——:
- Select:通过预制件实例找到对应预制件。
- Overrides——Revert all:全部还原。
- Overrides——Apply all:全部应用。
// 代码读取资源,必须在Resources目录下 |
2 坐标
World Space:世界坐标。相对世界原点。
Local Space:局部坐标。相对父物体。
Screen Space:
- 屏幕坐标。相对屏幕的坐标。单位为像素。左下
(0,0)
,右上(Screen.weight,Screen.height)
。Z轴为到相机的距离。- 用于物体在屏幕中的位置。
Viewport Space:
- 视口坐标。屏幕左下为
(0,0)
,右上为(1,1)
,Z轴为到相机的距离。
- 用于表示物体在摄像机中的位置。
3 打包
File——Build Settings——Build
Q1.Cannot build player while editor is importing assets or compiling scripts
A1(任一):
- 很可能是代码错了,看Console报错信息。
- 引用了UnityEditor的脚本放在Editor文件夹下(好像就不会编译了)。
#if UNITY_EDITOR using UnityEditor; #endif
official:: WebGL Player settings
Q2:WebGL打包后,运行时显示
Unable to parse Build/Build.framework.js.br! If using custom web server, verify that web server is sending .br files with HTTP Response Header "Content-Encoding: br". Brotli compression may not be supported over HTTP connections. Migrate your server to use HTTPS.
A2:原因:Brotli 在http上不支持压缩,改成G-zip或不压缩。在Edit——ProjectSetting——Player——H5图标——Publishing Settings——Compression Format——Gzip或Disabled
Q3:选择Gzip压缩后报错:
Unable to parse Build/*.framework.js.gz! This can happen if build compression was enabled but web server hosting the content was misconfigured to not serve the file with HTTP Response Header "Content-Encoding: gzip" present. Check browser Console and Devtools Network tab to debug.
A3:在Edit——ProjectSetting——Player——H5图标——Publishing Settings——Decompression Fallback勾上即可。
Q4:构建时警告:Unity Error: In order to build a player go to ‘Player Settings…’ to resolve the incompatibility between the Color Space and the current settings.
A4:Edit——ProjectSetting——Player——H5图标——Publishing Settings——OtherSettings——Color Space——修改成Gamma
/*打包不能使用的包如下:*/ |
4 特殊文件夹
StreamingAssets
该文件夹在打包时不会被压缩和加密。
用于存放相关配置文件,比如版本,提示语句等。
// 读取配置文件 |
// 读取配置文件内容,配置文件格式如下: |
十一、问题
1 Project看不到文件夹下文件
2 Package Manager下载路径
默认路径:
C:\Users\[YourName]\AppData\Roaming\Unity\Asset Store-5.x
- 找到路径
- 打开cmd
mklink /j “C:\Users\[YourName]\AppData\Roaming\Unity\Asset Store-5.x” “[NewPath]”
- 去除原文件夹的只读属性
3 您暂无权限在该组织中创建远程仓库!
4 关闭Plastic SCM
直接找到工程文件,删除隐藏文件夹.plastic即可。