Addressables的使用
来源:https://www.youtube.com/watch?v=C6i_JiRoIfk
先在Package Manager里面下载好Addressable包。Addressable整体基于Unity Asset Bundle。
在Window——Asset Management——Addressables——Group点击打开Addressable Groups窗口。点击窗口内的“Create Addressable Settings”。
我们可以在Groups窗口上右键——Create New Group。不同的Group在Build的时候会打成不同的Asset Bundle。
接下来,将需要管理的资产放进Group里面,可以直接把资产向Groups窗口上的Group拖拽,也可以勾选每个资产Inspector窗口上的“Addressable”复选框,勾选后每个资产对应的路径都会显示在后面。
我们还可以把包含整个资产的文件夹拖拽进来,这样文件夹内的所有资产都会打上Addressable标记。
一个文件夹被标记为Addressable后,再放进此文件夹的新资产都会自动设置为Add ...
UnityECS中的“S”
来源:https://www.youtube.com/watch?v=k07I-DpCcvE
一个System的基础结构通常一个System是每一帧都运行的。
123456789101112131415161718192021[BurstCompile]public partial struct MySystem : ISystem{ [BurstCompile] public void OnCreate(ref SystemState state) { //... } [BurstCompile] public void OnDestroy(ref SystemState state) { //... } [BurstCompile] public void OnUpdate(ref SystemState state) { //... }}
每一个System实例都属于一 ...
UnityECS中的“E”和“C”
基本的Unity GameObject传统的Unity GameObject是很消耗性能的,我们先看一下传统GameObject的结构:
UnityEngine.GameObject
属于C#类
是UnityEngine.Component各种实例的容器
永远包含一个Transform Component
可以作为其他GameObject的子级
UnityEngine.Component
属于C#类
内部包含Update()等一些需要在特定游戏生命周期触发的函数。
会引用很多managed object(包括GameObjects、其他components还有assets等)
UnityEngine.GameObject和UnityEngine.Component都是managed object,不能够在Burst编译器内应用,在大部分情况下也不能应用Jobs。
创建和销毁GameObjects和它们的Components开销很大,因为Managed Object在内存中分散存在,而不是像在Array中整块儿存在,在Unity生命周期中这些GameObjects和它们的 ...
Unity Job System介绍
来源:The Unity Job System - YouTube
在Profiler窗口中,除了Main Thread,Unity还根据当前处理器核心数创建了Worker Thread。这些Worker Thread除了执行Unity内部功能外,我们也可以使用一些代码自定义使用它们。
一个基本的Job结构12345678910111213141516using Unity.Burst;using Unity.Collections;[BurstCompile]public struct SquaresJob : IJob{ public NativeArray<int> Nums; public void Execute() { for(int i = 0; i < Nums.Length; i++) { Nums[i] *= Nums[i]; } }}
在这个Job中,我们给一个NativeArray的每 ...
DOTS1.0使用:Entity Prefab、Tag Component
实例化Entity Prefab创建Player Prefab在“TestEntitySubScene”下新建一个空对象,命名为“PlayerSpawner”。
在Scripts文件夹中新建“PlayerSpawnerComponent”
123456using Unity.Entities;public struct PlayerSpawnerComponent : IComponentData{ public Entity playerPrefab;}
再新建“PlayerSpawnerAuthoring”
1234567891011121314151617using Unity.Entities;using UnityEngine;public class PlayerSpawnerAuthoring : MonoBehaviour{ public GameObject playerPrefab;}public class PlayerSpawnerBaker : Baker<PlayerSpawnerAuthoring ...
DOTS1.0使用:ISystem、IJobEntity
我们使用ISystem来创建System
创建MovingISystem在Scripts文件夹中新建MovingISystem文件:
12345678910111213141516171819202122using Unity.Entities;public partial struct MovingISystem : ISystem{ public void OnCreate(ref SystemState state) { } public void OnDestroy(ref SystemState state) { } public void OnUpdate(ref SystemState state) { var randomComponent = SystemAPI.GetSingletonRW<RandomComponent>(); foreach (MoveToPositionAspect moveToPositionAs ...
DOTS1.0使用:Aspect、RandomSingleton
添加ASpectQuery联合查询接上一节,我们需要应用之前创建的Speed Component,可以这样写代码
MovingSystemBase:
123456789101112131415161718192021using Unity.Entities;using Unity.Transforms;using Unity.Mathematics;public partial class MovingSystemBase : SystemBase{ protected override void OnUpdate() { foreach ((TransformAspect transformAspect,Speed speed) in SystemAPI.Query<TransformAspect,Speed>()) { transformAspect.LocalPosition += new float3(SystemAPI.Time.DeltaTime * speed.valu ...
DOTS1.0使用:E、C、S创建
DOTS1.0发布了,记录一下它的简单使用。
笔记基于:Unity DOTS 1.0 in 60 MINUTES! - YouTube、Spawner example | Entities | 1.0.0-pre.44 (unity3d.com)
相关链接:Unity ECS 1.0 Full Project Tutorial | Step-by-Step 🧟♂️ - YouTube
官方的例子:Unity-Technologies/EntityComponentSystemSamples (github.com)
准备Unity需要2022版本,新建一个3D URP项目,打开Package Manager窗口,点击左上角的加号,再点击“add package by name”,输入“com.unity.entities”回车,等待Unity自动安装。在写此笔记时,DOTS虽然已经是1.0,但还是preview(记住打开Package Manager的允许预览包)。所有的依赖也会安装。
再次重复步骤,输入“com.unity.entities.graphics”,安装基 ...
Unity Shader的结构
一个Unity Shader的基础结构如下所示:
123456789101112Shader "ShaderName"{ Properties{ //属性 } SubShader{ //显卡A使用的子着色器 } SubShader{ //显卡B使用的子着色器 } Fallback"VertexLit"}
Unity会根据目标平台来把这些结构编译成真正的代码和Shader文件。
Shader名每一个Unity Shader文件的第一行都需要通过“Shader”语义来指定该Unity Shader的名字。
1Shader"Custom/MyShader"{ }
PropertiesProperties语义块中包含了一系列属性(Property)这些属性将会出现在材质面板中。
Properties语义块定义:
12345Properties{ Name {"display name",Pr ...
Unity Shader概述
没有Unity这类编辑器的情况下,原生Shader的设置可能是这样的(伪代码):
12345678910111213141516171819202122232425262728void Initialization(){ //从硬盘上加载顶点着色器代码 string vertexShaderCode = LoadShaderFromFile(VertexShader.shader); //从硬盘上加载片元着色器代码 string fragmentShaderCode = LoadShaderFromFile(FragmentShader.shader); //把顶点着色器加载到GPU中 LoadVertexShaderFromString(vertexShaderCode); //把片元着色器加载到GPU中 LoadFragmentShaderFromString(fragmentShaderCode); //设置顶点着色器中定义的“vertexPosition”属性,vertices即模型顶点坐标 SetV ...