Skip to content

Commit decfd66

Browse files
authored
translate few documents into chinese (zh-cn) (#750)
1 parent 0179a0c commit decfd66

15 files changed

+896
-0
lines changed

FAQs/lang.cn_wip/ContentManagement.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
Content Management 资源管理
2+
==========
3+
Nez 自己内置了一套基于 MonoGame 资源管理系统的资源管理系统. 所有的资源管理都应该经过 Nez 的 `NezContentManager`, 该类继承于`ContentManager`. 调试控制台有一个叫 'assets' 的命令, 它会输出所有的场景资源以及全局资源, 这样你就能知道还有哪些资源还在内存中待着.
4+
5+
Nez 提供了全局和每个场景资源的容器. 你也可以在你需要管理短生命周期的资源的时候创建你自己的 `NezContentManager`. 你可以在任何时候使用 `UnloadAsset<T>` 方法释放资源. 注意 Effect 需要特殊的`UnloadEffect` 方法释放, 这是一个特例.
6+
7+
8+
## Global Content 全局资源
9+
`Core.Content` 中有个全局的 NezContentManager, 你可以用这个 manager 去加载生命周期为整个游戏的资源. 比如字体, 全局通用的动画, 全局通用的音效等.
10+
11+
## Scene Content 场景资源
12+
每个场景都有它自己的 `NezContentManager` (Scene.Content), 用它加载场景特定的资源. 当前往新场景时, 旧场景的资源会被自动释放.
13+
14+
## Loading Effects 加载 Effects
15+
相比于 MonoGame, Nez 有很多种它没有的方式去加载 Effects 以让加载和管理 Effects 更加容易简便. 尤其是当去解决 Effect 的一堆子类的时候(比如 AlphaTestEffect 和 BasicEffect). Nez 内置的Effects 加载起来都很方便. 可用的方法有:
16+
17+
- **LoadMonoGameEffect<T>**: 加载 MonoGame 内置的 Effect 比如 BasicEffect, AlphaTestEffect
18+
- **LoadEffect/LoadEffect<T>**: 从文件直接加载一个 ogl/fxb Effect, 在资源管理器被释放时会自动处理 Effect 的释放
19+
- **LoadEffect<T>( string name, byte[] effectCode )**: 从字节数组中加载一个 ogl/fxb Effect, 同样也会被自动释放
20+
- **LoadNezEffect**: 加载一个 Nez 内置的 Effect. 它们继承于 `Effect`, 在 Nez 的 Graphics/Effects 目录下.
21+
22+
23+
## Auto Generating Content Paths 自动生成 Content 路径
24+
Nez 包含一个自动生成所有资源路径到一个 `Nez.Content` 的静态类的 T4 模板. 这允许你像下面一样写代码:
25+
26+
```csharp
27+
// 在使用 ContentPathGenerator 之前你必须使用没有任何智能提示的字符串去指代你的资源
28+
var tex = content.Load<Texture2D>( "Textures/Scene1/blueBird" );
29+
30+
// 在使用之后你就能在指代资源时使用智能提示了, 同时你不会错误地指代到一个不存在的资源
31+
var tex = content.Load<Texture2D>( Nez.Content.Textures.Scene1.blueBird );
32+
```
33+
34+
使用 ContentPathGenerator 最大的好处是你将不会错误地指示到一个不存在的资源, 你能在编译时就能检查你的资源路径是否正确. 下面是建立该工具的步骤:
35+
36+
- 复制 ContentPathGenerator.tt 到你的项目根目录(如果你要放在其他地方记得修改文件里的 `sourceFolder` 变量, 比如, 如果使用预编译的XNB文件在一个FNA项目里你需要设置 `sourceFolder = "Content/"`)
37+
- 在文件属性面板里设置 "Custom Tool" 为 "TextTemplatingFileGenerator"
38+
- 如果你使用 Visual Studio:
39+
- 右键文件, 选择 "Tools" -> "Process T4 Template", 这样这个类就会被生成了
40+
- 如果你使用 Visual Studio Code:
41+
- 安装 [mono dotnet-t4 tool](https://github.com/mono/t4).
42+
- 该工具能被全局安装: ```dotnet tool install -g dotnet-t4```
43+
- 用命令行执行 dotnet-t4 : ```t4 -o ContentPathGenerator.cs ContentPathGenerator.tt```
44+
- 如果你使用 JetBrains Rider:
45+
- 右键文件, 选择 "Run Template"
46+
47+
## Async Loading 异步加载
48+
`NezContentManager` 同样提供了一些异步加载资源的方法. 你能使用 `LoadAsync<T>` 方法加载单个或多个资源, 你需要传入一个回调方法这样你就能知道资源什么时候加载完成了.

FAQs/lang.cn_wip/DearImGui.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
Dear IMGUI
2+
==========
3+
4+
## Setup 配置
5+
6+
你的主项目应该包含对 Nez.ImGui 项目的引用. ImGui UI 可以通过两种方式展现: 手动安装一个 `GlobalManager`, 或使用 Nez 的调试控制台. ImGui 会安装它自己的指令 (toggle-imgui), 负责为你安装 `GlobalManager`. 注意 ImGui 是一套自己的程序集, 如果你想要它的指令被加载的话你需要手动加载程序集. 像这样: `System.Reflection.Assembly.Load("Nez.ImGui")`.
7+
8+
手动安装 ImGui manager 如下所示:
9+
10+
```csharp
11+
var imGuiManager = new ImGuiManager();
12+
Core.RegisterGlobalManager( imGuiManager );
13+
14+
// 开关 ImGui 渲染, 默认是开启的
15+
imGuiManager.SetEnabled(false);
16+
```
17+
18+
![Dear ImGui](../images/ImGuiSample.png)
19+
20+
更多信息和例子见 [Nez.ImGui README](../../Nez.ImGui/README.md)

FAQs/lang.cn_wip/DeferredLighting.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
Deferred Lighting 延迟光照
2+
==========
3+
(译注: 部分专业名词本人不是很了解)
4+
5+
延迟光照系统可以让你的场景拥有很真实的光线. 包括点光源, 平行光, 聚光灯和区域光源.
6+
7+
延迟光照是一个解决光照绘制的方法, 它会在所有物体渲染完毕时再渲染光源. 这种方式是很高效的. 它们的工作要点普遍是这样的: 首先, 我们把所有物体都渲染到一个漫反射渲染贴图, 同时渲染它们的法线贴图到一个法线贴图(通过多个渲染目标实现). 所有的灯光就这样被使用法线数据渲染到第三个贴图上. 最后, 这个贴图和漫反射贴图结合, 输出最后的结果. 上述的贴图你能够在运行时开关 `DeferredRenderer.EnableDebugBufferRender` 属性来查看.
8+
9+
## Material Setup 材质配置
10+
这就是你做 2d 游戏的正常工作流程与延迟光照系统不一样的地方. 在大多数没有实时光照的游戏里, 你一点也不会需要沾 Material 系统的边. 延迟光照需要一些附加的信息(主要是法线贴图)去计算光照, 所以我们必须深入 Nez 的 Material 系统. 现在假设你知道如何去制作一些资源比如法线贴图, 这里我们不会去讨论如何制作这些东西.
11+
12+
Nez 的延迟光照系统采用了一个巧妙的叫自照明(self illumination)的技巧. 你的贴图的一部分不需要光就能可视. 它们总是被点亮的. 你可以通过调整你的法线贴图的 alpha 通道来决定贴图的哪一部分需要自光照. 0-无自照明 到 1-完全自照明. 不要忘记使用自照明时不要预乘 alpha 值!. Nez 需要完整的 alpha 通道来得到所有的自光照数据. 当使用自照明时你必须要让 Nez 知道, 通过设置 `DeferredSpriteMaterial.SetUseNormalAlphaChannelForSelfIllumination`. 一个额外的运行时控制自照明的方式是设置 `DeferredSpriteMaterial.SetSelfIlluminationPower`. 调整自照明强度能让你的场景增加一些很出色的氛围.
13+
14+
有时候你不想让你的物体有法线贴图(be normal mapped)或者你还没准备好贴图. 延迟光照系统也提供了这个功能, 它内置了一个在 Material 里能被配置的 "空法线贴图", 这让你能让一个物体只参与漫反射光照. 默认地, `DeferredLightingRenderer.material` 会是一个空的法线贴图. 每当渲染器绘制一个 RenderableComponent 时如果它有个空的 Material 那么它会使用渲染器自身的 Material. 意思就是说如果你向一个 RenderableComponent 扔了个空 Material 那么它只会被漫反射光照渲染.
15+
16+
下面是三个最常用的 Material 配置: 法线贴图光照, 法线贴图自照明, 和仅漫反射(normal mapped lit, normal mapped lit self illuminated and only diffuse (no normal map))
17+
18+
```cs
19+
// 光照, 法线贴图 Material(lit, normal mapped Material). normalMapTexture 是你法线贴图 Texture2D 类型的引用
20+
var standardMaterial = new DeferredSpriteMaterial( normalMapTexture );
21+
22+
23+
// 漫反射光照 Material. 使用 NullNormalMapTexture.
24+
var diffuseOnlylMaterial = new DeferredSpriteMaterial( deferredRenderer.NullNormalMapTexture );
25+
26+
27+
// 带光照, 法线贴图和自照明的 Material
28+
// (lit, normal mapped and self illuminated Material.)
29+
30+
// 首先我们需要用我们的法线贴图创建一个 Material. 注意你的法线贴图需要有 alpha 通道给自照明使用
31+
// 需要把预乘 alpha 值关闭
32+
var selfLitMaterial = new DeferredSpriteMaterial( selfLitNormalMapTexture );
33+
34+
// 我们可以通过 Material<T> 的 `TypedEffect` 来访问 Effect. 我们需要告诉 Effect 我们需要自照明并且可选的调整它的强度
35+
selfLitMaterial.effect.SetUseNormalAlphaChannelForSelfIllumination( true )
36+
.SetSelfIlluminationPower( 0.5f );
37+
```
38+
39+
## Scene Setup 场景配置
40+
场景的配置就比较简单了. 你只需要扔一个 `DeferredLightingRenderer` 到你的场景就行了. 但是在它的构造器里你需要传递的值是很重要的! 你需要指定其应该使用哪个 RenderLayer 以及你的精灵(normal sprites)应该包含在哪个 RenderLayer 里.
41+
42+
```cs
43+
// 定义你的 RenderLayers, 这样你会方便访问一些
44+
const int LIGHT_LAYER = 1;
45+
const int OBJECT_LAYER1 = 10;
46+
const int OBJECT_LAYER2 = 20
47+
48+
// 加入 DeferredLightingRenderer 到你的场景里, 然后指定相应的 RenderLayer 和一堆你希望渲染到的 RenderLayers
49+
var deferredRenderer = scene.AddRenderer( new DeferredLightingRenderer( 0, LIGHT_LAYER, OBJECT_LAYER1, OBJECT_LAYER2 ) );
50+
51+
// (可选的) 设置环境光照
52+
deferredRenderer.SetAmbientColor( Color.Black );
53+
```
54+
55+
## Entity Setup 实体配置
56+
现在我们只需要确保在创建我们的 Renderables 之前使用正确的 RenderLayers (这很简单! 因为我们之前很聪明的把它们保存到了 `const int` 中) 和 Materials.
57+
58+
```cs
59+
// 创建一个包含 sprite 的实体
60+
var entity = Scene.CreateEntity( "sprite" );
61+
62+
// 加入一个 sprite, 这里还有个重要的部分: 确保设置 RenderLayer 和 Material.
63+
entity.AddComponent( new Sprite( spriteTexture ) )
64+
.SetRenderLayer( OBJECT_LAYER1 )
65+
.SetMaterial( standardMaterial );
66+
67+
68+
// 创建一个没有设置 Material 的 Entity. 它会使用默认仅漫反射的 DeferredLightingRenderer.Material
69+
scene.CreateEntity( "diffuse-only" )
70+
.AddComponent( new Sprite( spriteTexture ) )
71+
.SetRenderLayer( OBJECT_LAYER1 );
72+
73+
74+
// 创建一个包含我们点光源的 Entity
75+
var lightEntity = scene.CreateEntity( "point-light" );
76+
77+
// 加入一个点光源组件然后确保 RenderLayer 是在光照层(LIGHT_LAYER)上!
78+
lightEntity.AddComponent( new PointLight( Color.Yellow ) )
79+
.SetRenderLayer( LIGHT_LAYER );
80+
```
81+

FAQs/lang.cn_wip/EntitySystems.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
Entity 系统
2+
============
3+
Nez 不会再打包自己的一套 Entity 系统了, 因为 "Nez的ECS往往都是可选的, 并且也是很糟糕的"
4+
5+
如果你想使用一个完整的 ECS 架构的实现请见:
6+
7+
- [Flecs#](https://github.com/flecs-hub/FlecsSharp)
8+
- [DefaultECS](https://github.com/Doraku/DefaultEcs)

FAQs/lang.cn_wip/FNACompat.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
FNA Compatibility FNA兼容
2+
==========
3+
为了让FNA项目准备起来更快, 我们分离开了 FNA 特定的项目 *.FNA.csproj. 注意你仍然需要安装[这个文档](https://github.com/FNA-XNA/FNA/wiki/1:-Download-and-Update-FNA)里的每一个 FNA 本机库. [MonoGameCompat class](../../Nez.Portable/Utils/MonoGameCompat.cs)也被包含了进来, 其中包含拓展方法, 是一些 MonoGame 里很常用的但是 FNA 里没有的方法.
4+
5+
[README.cn.md](../../README.cn.md#using-nez-with-fna)中 "使用 FNA 的 Nez" 部分

0 commit comments

Comments
 (0)