Unity使用


〇、项目管理

1 项目操作

打开项目:直接在Unity Hub中选择带有资源的主文件夹即可。

2 缓存路径

author::修改Unity Cache和Unity Asset Store的默认路径 - 哔哩哔哩 (bilibili.com)

对于Cache,要改变存储位置的话需要新建两个环境变量:

  • UPM_CACHE_PATHD:\packages

  • UPM_NPM_CACHE_PATHD:\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 检视器

右边检视器会显示物体所带的组件。

// 自定义检视器中显示的组件
// 公开属性会显示,加上[HideInInspector]则会隐藏
public int HP;
// 序列化的私有属性也会显示
[SerializeField] private int HP;

// 标题,后续的设置的可显示变量会跟在该标题后
[Header("Name")]
...

// 属性中有子属性
[System.Serializable]
public struct Attributes
{
public int HP;
public int MP;
}
public Attribute attribute;

// 空格
[Space]

三、材质

物体样式都是通过新建材质,然后改材质参数来进行修改的

1 单个物体

基本属性:

  • position:当前位置坐标。(单位:米)
  • rotation:当前旋转角度 。
  • scale:缩放比例。

scene面板:

  • center - pivot:改变轴心点。
  • gobal - local:改变坐标朝向。

2 组件

Transform变换组件(如上基本属性)

Mesh Filter网格过滤器:形状

Mesh Renderer网格渲染器:材质

3 打组

父子对象:

  • 父对象坐标相对于全局。
  • 子对象坐标相对于父物体。

四、camera

场景中只会存在一个主摄像头,Tag是MainCamera。

Clear Flags:

  1. Skybox:
    • 使用天空盒作为背景,并且会清除摄像机中的所有物体和UI。
    • 适用于使用天空盒来创建场景背景的情况。
  2. Solid Color:
    • 使用指定的颜色作为背景,并且会清除摄像机中的所有物体和UI。
    • 可以自定义背景颜色,适用于需要单一背景色的情况。
  3. Depth Only:
    • 只清除深度缓冲区,保留原先的颜色缓冲区。
    • 适用于只需要进行深度测试、但不想清除颜色缓冲区的情况。
  4. Don’t Clear:
    • 不清除任何缓冲区,保留原先的内容。
    • 适用于需要将多个相机渲染结果叠加在一起的情况,例如创建镜头特写效果或实现多层次的渲染。
  5. Don’t Clear(with Skybox):
    • 在不清除缓冲区的同时,仍然使用天空盒作为背景。
    • 适用于保留天空盒背景而不清除其他缓冲区的情况。

Culling Mask:

  • 摄像机绘制的元素。
  • 影响对象是物体Layer。

Projection:

  • perspective:3D投影方式

  • orthographic:2D投影方式。

Depth:深度值,在场景中深度值大的相机会覆盖住深度值小的相机的界面。


五、渲染


六、光


七、动画

1 Animation

显示动画视图:Window——Animation——Animation

录制:

  1. Animation——Animation。(ctrl + 6)

  2. 给指定组件:add Component——Animation。

  3. Animation中点击create。
  4. add property,对组件操作。
  5. 面板左上红色按钮开始录制,调轴,设置动画效果。

使用:

  1. Animation中补充动画,一运行就会播放。
  2. 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中的值进行赋值
animator.SetFloat(parameter, Mathf.Abs(leftRight));

案例

// Conditions中设置run要Greater0.1来切换闲置到运动动画,设置run要less0.1来切换运动到闲置动画
animator.SetFloat("Run", Mathf.Abs(leftRight));

八、物理引擎

1 刚体

Add Component——Rigidbody

Body Type:

  1. Dynamic(动态):
    • 刚体将受到物理力和碰撞的影响,可以移动、旋转,并与其他刚体产生相互作用。
    • 可以通过代码或物理引擎施加力或扭矩来改变其运动和旋转状态。
  2. Kinematic(运动学):
    • 刚体不受物理力的影响,不会被弹性碰撞框架推动或旋转。
    • 可以通过代码控制刚体的运动和旋转状态。
    • 当与静态刚体或非运动学刚体发生碰撞时,运动学刚体可能会传递或接收碰撞信息,但不会有物理反应。
  3. 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

配置:

  1. Edit——Project Setting——Player——Other Settings——Active input Handing*——Both

  2. Hierarchy——EventSystem——Replace with InputSystemUIIputModule

新增动作:

  1. Assets右键——Create——Input Action
  2. Action Maps:新增一种输入方式。
  3. Actions:新增对应的动作。

在Actions中点击加号——Listen——键盘输入,可以监听到输入的键盘的键,然后点击对应的键完成键盘注册。

左上角Scheme可以新增框架(例如:Mobile,PC等),然后点击到对应的Actions键位的Properties中,在Use in control scheme进行分类。

2.2 案例

移动

移动Action:

  1. 新加Actions
  2. 点击新加的Actions,Properties——Action Type:Value——Control Type:Vector2
  3. 点击新加的Actions右边的加号——Add Binding——Path——Gamepad——Left Stick
  4. 点击新加的Actions右边的加号——Add Composite——输入wsad

默认情况下拖拽距离会影响移动速度,修改可以在Actions——Binding Properties——Processors——Normalize Vector2

脚本挂载:

  1. 玩家——Add component——Player Input——拖入InputSystemUIIputModule
  2. UI——Add component——On-Screen Stick(移动)——Control Path——Left Stick(Movement Range:摇杆可被拉动最大距离)
// 玩家脚本
using UnityEngine.InputSystem;
InputAction playerMove;
private void Awake()
{
playerMove = GetComponent<PlayerInput>().currentActionMap["Move"];
}
private void FixedUpdate()
{
float x = playerMove.ReadValue<Vector2>().x;
}

跳跃

移动Action:

  1. 新加Actions
  2. 点击新加的Actions,Properties——Action Type:Button
  3. 点击新加的Actions右边的加号——Add Binding——Path——Gamepad——Button East

脚本挂载:

  1. 玩家——Add component——Player Input——拖入InputSystemUIIputModule
  2. UI——Add component——Control Path——Gamepad——On-Screen Button——Button East
private InputAction playerMove, playerJump;
private void Awake()
{
playerJump = GetComponent<PlayerInput>().currentActionMap["Jump"];
}
private void FixedUpdate()
{
if(playerJump.triggered){}
}

按钮

点击: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:寻路网格障碍物,用于动态碰撞。

使用步骤:

  1. Component——Navigation——Nav Mesh Agent:设置寻路者。
  2. Window——AI——Navigation——Object:选择Navigation Static和Generate OffMeshLinks。
  3. 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:寻路遮罩,选择可走区域。

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 注意

  1. 设置好了寻路网格后,路面可以取消材质甚至设置为非激活状态。agent一样可以寻路。但是加了重力后就会脱离路面。
  2. 改变场景后要重新烘焙,烘焙路面不会随场景改变而自动改变。
// 寻路者脚本
public class Navigation : MonoBehaviour
{

private NavMeshAgent agent;
public Transform targetTransform;

private void Start()
{
agent = GetComponent<NavMeshAgent>();
Vector3 target = targetTransform.position;
// 设置目标
agent.SetDestination(target);
}
}

十、其他

1 预制件

同类的对象拖动至 Assets 中,可以对其进行操作,然后应用到所有同类对象中。

改 Assets 会对所有对象生效,改 Object 的仅对自己生效,可以选择还原或应用。

Prefab——:

  • Select:通过预制件实例找到对应预制件。
  • Overrides——Revert all:全部还原。
  • Overrides——Apply all:全部应用。
// 代码读取资源,必须在Resources目录下
GameObject prefabGo = Resources.Load<GameObject>("path");

// 创建资源(预制件,位置,无额外选择)
Instantiate(Prefab,position,Quaternion.identity);

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

/*打包不能使用的包如下:*/
// 1.获取图集中元素(无法通过:GetPackables())
foreach (Sprite sprite in sprites.GetPackables()){}

// 2.获取Assets中的资源(无法通过:AssetDatabase)
GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>("...");

4 特殊文件夹

StreamingAssets

该文件夹在打包时不会被压缩和加密。

用于存放相关配置文件,比如版本,提示语句等。

// 读取配置文件
string configPath = Path.Combine(Application.streamingAssetsPath,"Config.txt");
// 读取配置文件内容,配置文件格式如下:
/*
[Game]
Version = 1

[Login]
Username = Bob
Password = 123456
*/
private ReadConfig()
{
private Dictionary<string, Dictionary<string, string>> configData;
string filePath = Path.Combine(Application.streamingAssetsPath, "Config.txt");

// 读取文件内容
string[] lines = File.ReadAllLines(filePath);

// 初始化字典
configData = new Dictionary<string, Dictionary<string, string>>();

string currentSection = "";

// 解析文件内容
foreach (string line in lines)
{
if (line.StartsWith("[") && line.EndsWith("]"))
{
// 解析节标题
currentSection = line.Substring(1, line.Length - 2);
configData[currentSection] = new Dictionary<string, string>();
}
else if (!string.IsNullOrEmpty(line))
{
// 解析键值对
string[] parts = line.Split('=');
if (parts.Length == 2)
{
string key = parts[0].Trim();
string value = parts[1].Trim().Trim('"');
configData[currentSection][key] = value;
}
}
}

// 打印字典内容(可选)
foreach (var section in configData)
{
Debug.Log("[" + section.Key + "]");
foreach (var pair in section.Value)
{
Debug.Log(pair.Key + " = " + pair.Value);
}
}
}

十一、问题

1 Project看不到文件夹下文件

2 Package Manager下载路径

默认路径:C:\Users\[YourName]\AppData\Roaming\Unity\Asset Store-5.x

  1. 找到路径
  2. 打开cmd
  3. mklink /j “C:\Users\[YourName]\AppData\Roaming\Unity\Asset Store-5.x” “[NewPath]”
  4. 去除原文件夹的只读属性

3 您暂无权限在该组织中创建远程仓库!

解决方案

4 关闭Plastic SCM

直接找到工程文件,删除隐藏文件夹.plastic即可。