recursal/Fanatic-Fandom huggingface dataset:
开发工具

此页面未完成！

 此页面还并没有完成，若没出现禁止的提示，您可以编辑完善此页面

## 起源2自带工具

* Hammer地图编辑器
* Material editor材质编辑器 半完成
* Modeldoc模型编辑器 未完成
* Animgraph editor动画节点编辑器 未完成
* Particle editor粒子效果编辑器 未完成
* Postprocessing editor后处理效果编辑器 未完成
* Subrect editor"热点贴图"编辑器 未完成
* Source 2 FilmMaker(S2FM)起源2电影制作器VDC页面
* VConsole控制台 VDC页面

## 起源2拥有但只在S&box内开放的

* Faceposer面部表情编辑器 未完成
* SoundTool声音编辑器 未完成
* TooltyleEditor编辑器样式编辑器 未完成

## 未知的(未开放的)

* Surface property editor表面属性编辑器 未公布
* PlantTool树状编辑器 未公布
* SampleTool样本编辑器 未公布
* Snooper监听器 未公布
关于sbox

S&box是一款基于起源2引擎打造的沙盒类游戏，类似于Facepunch工作室曾经的作品

Garry's mod。没有任何预定的目标，你可以添加插件，切换地图，在游戏里做自己想干的事情。可以让不同的物体组合在一起，通过工具让其变成新的物体！火箭，汽车，投石机，甚至是没有任何名字的机器。如果你玩腻了，你也可以根据自己的想法去制作你的插件。不像前作使用的起源1引擎，S&box使用的起源2开发工具能高效、便捷的制作插件，同时比前代更加开放，拥有许多新功能。在这里，你天马行空的想象不会受到限制！

**S&box**是一款由Facepunch工作室制作的沙盒游戏，使用起源2引擎打造。集成了起源2引擎的开发工具供玩家使用。

发售日期: 待定
引擎: 起源2
开发者: Facepunch Studio
发布者: Facepunch Studio

**注释:**S&box不仅仅是一个可以添加模组的游戏! 它是一个开发平台，包含一个经过修改的、功能齐全的、带有C#绑定的起源2引擎工具包，以及一个名为asset.party的发布平台。
## 测试资格

目前S&Box已经开始发放Key给已经获得资格的人，您可以通过询问他人或朋友来得到测试资格
以下是获取测试资格的一些途径：

1. 通过邀请码，在asset.party登录，输入邀请码即可获得
2. 通过Facepunch论坛或S&boxDiscord组向开发成员申请（要通过此途径，你必须说明你能做什么，你拿到S&box的资格会对社区带来什么贡献，且你必须通过一些途径(类似创意工坊)来证明你的影响力）

## 发售日

目前来说，发售日期仍然是个谜。Garry曾经表示打算在2023年发售 S&box：“Our plan is to get to a releasable state over the next 6–12 months, then improve it over 10–20 years.”（我们的计划就是在接下来的6到12个月里使它进入一个可发售的阶段，然后在10到20年中改善它。）

## 附加内容

目前S&box有五种模组类型：

* Games - 游戏模式
* Maps - 游戏地图
* Content - 大概是未来的游戏插件形式（目前无法发布）。
* Tools - 制作工具并将其集成到开发引擎当中，用来帮助工作自动化。
* Addons - 游戏扩展插件（基本实现，仍在早期阶段）

**注释:**至少到目前为止，S&box的Addons仍然处于一个极为早期的阶段。尽管其经历了许多次更新，但进度还是比较缓慢。
CSharp基本语法

这篇文章写的很愚蠢！

 该文章的质量不佳，表达不够通俗和通顺，需要整改

   此页面未完成！

 此页面还并没有完成，若没出现禁止的提示，您可以编辑完善此页面

# C#简介

*C# 是一个简单的、现代的、通用的、面向对象的编程语言，它是由微软（Microsoft）开发的。*

本篇文章将会教您C#的基本语法，以及C#与其他语言有何不同，尤其是与Lua。

**注释:**C# 编程是基于 C 和 C++ 语言的，因此如果您对 C 和 C++ 编程有基本的了解，将有助于您学习 C# 编程语言。且C#与Java在语法上也有相似之处
## C# 学习资源

* 菜鸟教程C#
* 微软官方C#教程
* LearnCS

## C# 与 Lua 有何不同？我该做出怎样的改变？

1. **数据类型上**：
Lua是弱类型语言，变量声明时无需指定数据类型。
C#是强类型语言，定义数据必须指定数据类型。
2. **函数关系上**：
Lua中的函数没有明确的归属类，独立存在。
C#中的函数都属于类。
3. **结尾上**：
C#代码每行必须以;结尾，
Lua代码可以用;结尾，也可以没有。

**以上是比较明显的点**

## 数据类型

要学习编程语言，首先要了解的便是数据类型。C#的数据类型与C语言家族虽有较大改变，但大致概念是相同的。

### 一、整数类型

C#根据存储的空间，将整型变量分成了八种

 Ulong | 无符号数，占用8个字节，0 到 18,446,744,073,709,551,615

在这其中，**ushort**，**uint**，**ulong**中的**u**字母是取自 **unsigned** 单词中的首字母,代表无符号。**sbyte**中的s字母是取自 **signed** 单词中的首字母，代表有符号。

与C++不同的是，C++的类型只有4个，分别是short,int,long,long long

### 二、浮点型

C#在浮点型方面与C语言家族一样，都分为了单精度浮点数和双精度浮点数。

 double | 双精度浮点型，占用8个字节，最多保留16位小数

C#与C语言家族一样，float类型的赋值在结尾要加上f，例如:

 `float num = 3.14f;`
反之，double则不用添加。

### 三、字符串类型与字符类型

C#与C语言家族不同的是，C#大多数情况下默认带着String，而且兼容的很好。

这样省去了一些麻烦，我们终于不用写`#include<string>`了。

在C/C++中，如果我们不用string的话，我们只能使用char[]来实现字符串的效果，这在一些方面比较麻烦，因为char是字符类型，char[]是把字符存入一个数组，再拼合起来成为字符串。C#当然也保留了Char。

例如：

```
string str1 = "abc";
char charValue = "A";
char charArray[] = "abc";

```

若要将string的数据赋值到char数组，我们需要用到ToCharArray函数:

```
char charArray[] = str1.ToCharArray();

```

### 四、布尔

bool就没有什么好说的了，基本所有语言都一样，True与False

指针
--

很抱歉，在C#中指针是不安全的存在，C#在有限的范围内支持指针，它只不过是一个持有另一类型内存地址的变量。

在运用它们的时候，我们要标上unsafe
Entities components

实体可以有组件，组件是代码类，可以在游戏过程中通过代码与实体连接或分离。由于实体组件是无限制的，它们几乎可以用于任何用途，从为玩家提供power-ups，到处理高级 NPC AI 行为。

实体组件也是网络化的，因此一旦添加到实体上，客户端和服务器端都可以使用。

许多其他游戏引擎都使用类似的组件模型，包括 Unity 和 Unreal。

# 定义组件

```
public partial class MyComponent : EntityComponent
{
 [Net] public string MyVariable { get; set; }

 // 组件也支持 [Predicted]
 [Net, Predicted] public int MyPredictedVariable { get; set; }
}

```

组件也可以拥有事件。

```
public partial class FlyingComponent : EntityComponent
{
 [GameEvent.Tick]
 public void OnTick()
 {
 Entity.Velocity += Vector3.Up \* 16.0f;
 }
}

```

# 创建组件

您可以随时从实体中创建、获取和删除组件，在这个例子中，我们只是在生成时分配他们。

```
public partial class MyEntity : Entity
{
 public override void Spawn()
 {
 var c = Components.Create<MyComponent>();
 var c = Components.GetOrCreate<MyComponent>();
 var c = Components.Get<MyComponent>();

 var c = new MyComponent();
 Components.Add( c );

 Components.Remove( c );
 Components.RemoveAll();

 foreach ( var c in Components.GetAll<MyComponent>() )
 {

 }

 foreach ( var c in Components.GetAll<EntityComponent>() )
 {

 }
 }
}

```

# 绑定组件

如果需要经常访问某个组件，并希望在服务器和客户端之间建立网络引用，可以使用 `BindComponent` 属性（attribute）将组件设置为属性（property）。

```
public partial class MyEntity : Entity
{
 [BindComponent] public MyComponent Component { get; }

 public override void Spawn()
 {
 Components.Create<MyComponent>();
 base.Spawn();
 }
}

```

现在，"组件 "在客户端和服务器上都将指向同一个网络组件。

* 请注意，您仍然需要创建组件，而且只能在服务器上创建。
* 您也不需要将组件分配给属性，因为该属性不应该有设置器。
动画节点编辑器界面介绍

此页面需要校对！

 此页面可能为机翻或者经验不足者编写，请尽您所能的校对此页面

# 介绍&前言

AnimGraph 是一个数据驱动系统，用于动态合成关键帧和程序骨骼动画，并控制组合之间的切换时间。它由两个主要部分组成：一个是编辑器，用于创建定义动画行为的基于节点的Graph；另一个是Runtime，用于在游戏过程中根据来自AI、导航、环境和其他游戏系统的输入评估Graph。

AnimGraph 的核心是一棵连接节点的树。每次游戏Update时，都会对图形进行评估，以计算该帧中角色的姿势。在图形更新过程中，每个节点都会从其子节点获取动画姿势，对其执行混合或 IK 等操作，并将生成的姿势传递给其父节点。传递给树根节点（最终姿势节点）的姿势就是角色在渲染时使用的姿势。开发人员可以通过组合不同类型的节点来定义游戏角色的动画性能，这些节点将执行不同的混合操作，或根据游戏的当前状态决定使用哪个子节点的动画。

在更新 Source 2 项目以使用 AnimGraph 时，需要牢记的最大区别是游戏代码不再直接告诉动画系统播放哪个序列。取而代之的是，游戏代码向图形提供命令和游戏环境的上下文，由图形中的逻辑来决定播放哪些动画以及如何播放。这样，游戏代码就可以专注于更高层次的游戏玩法，而无需对动画进行微观管理，动画师也可以在不懂 C++ 的情况下创造和迭代更好的角色表演。

## AnimGraph 编辑器

您可以在编辑器中创建Runtime使用的Graph，在受控环境中对其进行测试，并调试发现的任何错误。

## 主面板

这是编辑器的主要区域。它显示当前查看项目的详细编辑器。双击右上角带有指示器的节点，即可打开其特定的编辑器。

默认情况下，它显示图形顶层的所有节点和连接，但对于状态机和运动匹配等更复杂的节点，它也会重复使用，以显示特定编辑器的可视化效果。

## 预览窗口

在预览模式下，预览窗口会实时显示应用于一个或多个模型的图形所创建的动画。

**控制按键**:

* **鼠标左键**：使用活动工具（在预览模式下）
* **鼠标左键** + **alt**：围绕场景中心旋转
* **鼠标右键**：转动摄像头。在第一人称模式下，按住并使用 WSAD 键使摄像机旋转
* **鼠标右键** + **alt**：缩放
* **鼠标中键**：平移
* **鼠标滚轮**：缩放

## 主输入

此面板显示并允许用户控制所有 AnimGraph 的通用值。其中包括外观方向和当前斜率等。

## 驱动器

允许您**添加**、**编辑**和**删除**驱动器。

驱动器负责接收游戏或用户关于角色移动方式的输入，并将其转换为Graph可用于驱动动画选择的格式。例如，人工智能角色可以使用 "路径 "驱动器，它将从导航系统中获取一条路径，并确保角色沿着这条路径移动；或者使用 "玩家控制 "驱动器，它将使用前进、后退、向左和向右等方向性输入。不会移动的角色则不需要驱动器。

驱动器会更新两次：
在节点更新之前，以便处理来自游戏的任何输入，并将其提供给节点
节点更新完成后，以便对节点更新时计算出的根运动进行必要的修正

参数
--

允许您**添加**、**编辑**和**删除** AnimGraph 参数。

**参数**允许其他游戏系统向Graph发送信息，以便Graph决定播放哪些动画以及如何播放。Graph可以拥有任意数量的参数，这些参数是游戏提供给Graph的值，以便Graph决定播放哪些动画。与 **"主输入"**面板中的字段不同，参数是Graph的特定参数。这些参数包括是否下蹲、角色当前的健康状况或角色持有的武器等。

参数是类型化的，类型决定了参数的使用方式：

* **Bool** 参数可以是1或0。适用于可切换的状态
* **枚举（Enum）**参数可以是多个用户定义的值之一，每个值都可以有一个与之相关的名称。例如，武器枚举的值可以是刀、手枪、步枪或霰弹枪。虽然枚举参数与  **Int** 参数类似，但它们只能有有限的值，而且这些值的名称在整个编辑器中都会使用，这使得它们不容易出错，而不必总是记住例如值 **2** 表示步枪。
* Int 参数可以是任何整数
* Float 参数可以是任何小数（浮点数）
* Vector 参数由 3 个浮点数组成

标签
--

允许**添加**、**编辑**和**删除** **AnimTags**。

**AnimTags** 是由 **AnimGraph** 发送给游戏中其他系统的信号，当特定事件发生时，这些系统就会知道。它们可以放置在Graph中的项目上，然后由项目负责发送给任何监听器，并包含事件的相关信息。

AnimTags 是对之前动画系统中 AnimEvents 的改进，也是通知游戏代码发生特定事件的首选方法。虽然 AnimGraph 仍然支持 AnimEvents 以保证兼容性，但标签具有以下几个优点：

标签可以有持续时间。监听器将以 "开始/结束 "对的形式接收标签通知，或者以 "已触发 "的形式接收标签通知，这意味着标签没有持续时间。使用 animevents 可以在动画上创建开始/结束对，但如果动画在到达结束事件之前被中断，那么游戏代码就会永远卡在等待状态。已开始的标签即使被中断，也能保证发送结束通知。标签也会自动合并，因此如果一个动画在结束时有一个标签，而另一个动画在开始时有相同的标签，那么游戏代码只会看到一对开始/结束对，而不是两对。 标签也可以放在动画以外的项目上，例如状态机节点中的状态。
标签是类型化的。AnimEvents 只用一个 ID 来区分自己，因此游戏代码必须监听所有的动画事件，即使它只对某个动画事件感兴趣。有了 AnimTags，游戏代码就可以只注册监听它感兴趣的标签类型。例如，声音系统可以注册只接收图形中的音频标签。
标签可以有任意的有效载荷。因此音频标签可以包含声音文件，而布料标签可以包含布料解算器的设置。AnimEvents 只接受一个字符串作为有效载荷，虽然该字符串可以是多个设置的 KV3 描述，但字符串仍需解析为代码可以使用的结构体
标签是数据驱动的。每个图形都可以定义自己的标签集，而无需修改代码。在代码中定义的静态列表中，所有动画事件都必须有一个唯一的条目。随着多年来新事件的不断产生，这个列表已经变得非常大，而且可能是某个项目独有的事件仍然会出现在所有其他项目的构建中，从而导致未公布项目的泄露。

## 播放控制器

控制 AnimGraph 在预览模式下的播放。

 按此按钮进入预览模式，并在编辑器中运行当前Graph。你还可以从该面板加载 AnimGraph 重放记录。

## 属性面板

此面板将显示当前选定项目的属性。其中包括基本属性列表，也可能包括一些更详细的信息，如迷你编辑器或 3D 预览等子面板。

## 搜索栏

**AnimGraph** 可能会变得很大，这时就很难找到你要找的节点。单击搜索框或按下 Ctrl+f 可搜索图形中的节点名称、节点类型或属性。您还可以搜索标签或参数，搜索结果将显示使用这些标签或参数的所有位置。

译者:TrimesS

原页面:点击跳转

使用辅助（机器翻译）：DeepL
Model Editor

Material Editor为起源2引擎的旧版模型编辑器，是Modeldoc模型编辑器的前身，Material Editor可以让用户构建模型，查看编译过的模型和编辑模型相关的数据。模型编辑器的资源系统能够随时知道文件的变更。模型会在保存的时候自动编译, 或者当模型的外部文件遭到变更 (例如模型编辑器开着，而FBX文件重新导出)。

**注释:** Material Editor在S&box中已被移除，但在Dota2中仍然存在。
不管怎样，我们仍然极力推荐您使用Modeldoc，如果您实在想要体验 Material Editor，请参考VDC，并使用Dota2与HLA的开发工具

页面:https://developer.valvesoftware.com/wiki/Source\_2\_Model\_Editor

**警告：**Modeldoc模型编辑器与 Material Editor模型编辑器在使用上可能会有所出入
Vmap

.vmap是起源2引擎的地图文件，全称为Valve Map。其文件本身只是一个dmx在二进制文件格式4下的文件，可以在Hammer内点击“Save Copy As Text”导出为ascii编码的vmap。

**.vmap**文件是起源2引擎的地图文件格式，用于代替起源1的.vmf与.bsp文件。

工作引擎:起源2
类型: 地图类
编辑软件: Hammer编辑器
编译后文件: .vmap\_c
依赖文件: vwrld, vwnod, vvis, vphys, vents, vtex, vmdl, vrman

## 编译文件

.vmap编译后的文件为.vmap\_c，并与其依赖文件打包与vpk当中（在S&box中可能有些不同）

1. ↑ https://developer.valvesoftware.com/wiki/VMAP
2. ↑ https://developer.valvesoftware.com/wiki/VMAP
Bots

## 什么是机器人？

机器人是可以添加到游戏中的假客户端，占用一个普通玩家的位置。 它们的输入和行为可以像其他大多数东西一样用 C# 来编写。

## 默认机器人

默认情况下，控制台命令 bot\_add 会添加一个模仿其他玩家输入的机器人。您还可以使用该命令的一些附加参数：

bot\_add <clientIndex> <yawOffset> <forceCrouch>

**clientIndex** （定义：1）要模仿的客户端。如果设置为 0，则不会模仿任何东西，而是保持空闲。

**yawOffset** （定义：180）机器人相对于目标客户端进行方位旋转。

**forceCrouch** (def: 0) 是否强制机器人下蹲。

## 自定义机器人

要创建自定义机器人，首先需要扩展机器人的类，该类有两个重要方法： **Tick** 和 **BuildInput**

### 示例

值得注意的是，下面使用的方法只在服务器端调用，这与普通客户端不同，普通客户端的输入是在客户端构建并发送到服务器的。

```
public class MyCustomBot : Bot
{
 [ConCmd.Admin( "bot\_custom", Help = "Spawn my custom bot." )]
 internal static void SpawnCustomBot()
 {
 Game.AssertServer();

 // 创建自定义机器人的实例
 \_ = new MyCustomBot();
 }

 public override void BuildInput()
 {
 // 在这里，我们可以 选择/修改 机器人每一Tick的输入
 // 我们将通过按住 "主要攻击"（PrimaryAttack/或译主武器开火）按钮使它们持续攻击
 Input.SetButton( InputButton.PrimaryAttack, true );
 // 在这里，我们将使机器人向前行走并转一个大圈
 Input.AnalogMove = Vector3.Forward;
 Input.AnalogLook = new Angles( 0, 30 \* Time.Delta, 0 );
 // 最后，我们将在机器人客户端的Pawn上调用 BuildInput
 // 注意，由机器人驱动的模拟客户端的Pawn不会自动调用 Entity.BuildInput，所以我们才在这里调用它
 (Client.Pawn as Entity).BuildInput();
 }

 public override void Tick()
 {
 // 在这里，我们可以对机器人做一些事情
 // 在这里，我们将每隔一秒打印机器人的名字
 Log.Info( Client.Name );
 }
}

```

在上面的示例中，我们自己设置了输入值，然后在棋子上调用 BuildInput。这样，处理真实用户输入的代码也可以处理模拟输入。

## Pawn

每个机器人都有一个客户端属性，指的是其底层的假客户端。每个机器人都可以拥有自己的Pawn，也可以做任何其他普通客户端可以做的事情。
Entities code

实体是可以放置在游戏世界中的对象，例如道具、玩家和重生点。它们可以通过 C# API 创建和生成，也可以作为关卡的一部分自动生成。

* Entity 是所有实体的基类。
	+ RenderEntity 扩展了 Entity ，并可用于自定义渲染。
	+ ModelEntity 扩展了 Entity ，并增加了对非动画模型的支持。
		- AnimatedEntity 扩展了 ModelEntity ，并增加了对动画模型的支持。

# 生成实体

创建实体类的新实例会自动在世界中生成实体。

```
Entity myEntity = new MyEntity();

```

生成实体会调用虚拟方法 Entity.Spawn()，如果在客户端复制实体，则调用 Entity.ClientSpawn()。

```
[Library("sb\_myent", Title = "My Entity")]
class MyEntity : Entity
{
 ...
}

public void SpawnEntity() {
 MyEntity ent = TypeLibrary.Create<MyEntity>("sb\_myent");
}

```

# 事件 / 重写

当实体被创建以及销毁时，它们会自动注册以接收来自事件系统的事件。

```
partial class MyEntity : Entity
{
 [Event.Tick]
 void Tick()
 {
 Log.Info( $"This is called every tick whilst {this} lives." );
 }
}

```
除了事件系统外，实体还有许多虚拟方法可以重写，你可以使用 Intellisense（代码补全） 找到所有这些方法。

```
public override void Touch( Entity other )
{
 Log.Info( $"{this} says {other} is touching me." );
}

```

# 联网 / 复制

实体会根据 Entity.Transmit 的设置从服务器复制到客户端。默认情况下，实体只传送给能看到它们的客户端。

```
partial class MyEntity : Entity
{
 public override void Spawn()
 {
 // 始终向所有客户端传输该实体
 Transmit = TransmitType.Always;
 }
}

```
当实体被复制时，任何标记为 Networked（网络类型） 的属性也会被复制到客户端的实体中。

```
partial class MyEntity : Entity
{
 [Net] public string MyString { get; set; }
}

```

# 组件（Components）

实体可以有实体组件，这些组件会自动复制到客户端。

```
partial class MyEntity : Entity
{
 public override Spawn()
 {
 Components.Create<MyComponent>();
 }
}

```

# 删除实体

实体不会像普通 C# 类型那样被垃圾回收，因为它们属于整个世界。通过调用 Entity.Delete()，可以显式地删除实体。这些实体会变为无效，不应再被使用。

任何对已删除实体的引用都会在 Entity.IsValid() 中返回 false，因此应使用此方法来代替对实体的 null 检查。
Camera code

这篇文章写的很愚蠢！

 该文章的质量不佳，表达不够通俗和通顺，需要整改

简介
--

您可以通过引用全局客户端变量 **Camera** 来控制游戏摄像头。在客户端游戏循环的任何地方都可以访问和更改该变量。

您应在每帧调用的方法中编写摄像机代码，如 **FrameSimulate**。

示例
--

/// Get the View as Angles used in <see cref="BuildInput"/> and <see cref="FrameSimulate"/>
/// </summary>
[ClientInput] public Angles ViewAngles { get; set; }

/// <summary>
/// Allows to query the input and perform operations with it
/// </summary>
public override void BuildInput()
{
 InputDirection = Input.AnalogMove;

 var look = Input.AnalogLook;

 var viewAngles = ViewAngles;
 viewAngles += look;
 ViewAngles = viewAngles.Normal;
}

/// <summary>
/// Called every frame on the client
/// </summary>
public override void FrameSimulate( IClient cl )
{
 base.FrameSimulate( cl );

 // Update rotation every frame, to keep things smooth
 Camera.Rotation = ViewAngles.ToRotation();
 Camera.Position = AimRay.Position;
 Camera.FieldOfView = Game.Preferences.FieldOfView;

 // Hide the player from the camera
 Camera.FirstPersonViewer = this;
 Camera.ZNear = 1f;
 Camera.ZFar = 5000.0f;
}

```

### **正交相机**

```
public override void FrameSimulate( IClient cl )
{
 base.FrameSimulate( cl );

 Camera.Main.Ortho = true;
 Camera.Main.OrthoWidth = 100f;
 Camera.Main.OrthoHeight = 100f;
}

```
MacOS运行S&box

此页面未完成！

 此页面还并没有完成，若没出现禁止的提示，您可以编辑完善此页面

*Mac 还玩游戏？滚出克吧（（*

翻译自sbox wiki

## 在 M1 (Apple Silicon) 上的 macOS 上运行 s&box 的实验性记录

这一切都将在某个时间点清理并公开，但我只想写下总体思路和所需事项。

目前，这种方法只能让你进入主菜单并使用工具，而 Hammer 是唯一能正常运行的工具。

前提是你已经安装了游戏移植工具包，并且已经安装了 steam。

配置
--

在 WineCfg 中将 Windows 版本设为 Windows 7

运行
将 s&box 安装到游戏移植工具包的 steam 中后，就必须使用以下批处理文件运行它，设置正确的 DOTNET 环境变量，以防崩溃

```
set DOTNET\_SYSTEM\_NET\_HTTP\_SOCKETSHTTPHANDLER\_HTTP3SUPPORT=0
set DOTNET\_EnableWriteXorExecute=0
"C:\Program Files (x86)\Steam\steamapps\common\sbox\sbox.exe"

```

您还必须将这些文件从 sbox/bin 文件夹复制到 sbox 文件夹的另一个目录中，使它们位于 EXE 的旁边，并在 winecfg.exe 中将它们设置为本地优先级。

d3dcompiler\_47.dll
vcruntime140.dll
vccorlib140.dll
concrt140.dll
msvcp140.dll
d3dcsx\_43.dll

其中有些可能不需要移动，但就我所知，d3dcompiler\_47.dll 需要移动。

TODO：找出为什么 wine 无法识别 bin 文件夹中的这些文件？
Linux运行S&box

首先，在steam库中右击你的S&box，并点击属性

兼容性 > 单击强制使用特定 Steam Play 兼容性工具 > 选择Proton Experimental

目前Proton Experimental效果最佳，如果不行，请尝试其他版本。

您需要使用其中一种方法才能在任何地图中进行游戏

```
临时方法：
sudo sysctl -w vm.max\_map\_count=16777216
固定方法:
sudo bash -c 'echo "vm.max\_map\_count = 16777216" > /etc/sysctl.d/20-sbox-max\_map\_count.conf && sysctl --system'

```

您还需要使用此方法才能玩 s&box 中的任何游戏

1. 如果尚未完成，请设置 flatpak (https://flatpak.org/setup/)
2. flatpak install flathub com.github.Matoking.protontricks
3. flatpak run --branch=stable com.github.Matoking.protontricks 590830 win8

开发
--

待补充
Voice

*语音 API 允许开发人员更改语音聊天的各种属性和行为。*

用法
--

### **OnVoicePlayed**

您可以重载 **Sandbox.Game** 中的 **OnVoicePlayed()** 方法，以控制当其他客户端的语音数据通过时会发生什么。请注意，您自己的客户端不会调用 **OnVoicePlayed**，只有其他客户端才会。

```
public override void OnVoicePlayed( Client cl )
{
 Log.Info( $"{cl.Name} is speaking!" );
 VoiceList.Current?.OnVoicePlayed( cl.SteamId, cl.VoiceLevel );
}

```

## 语音UI

### 语音列表

默认情况下，**OnVoicePlayed** 会填充一个名为 **VoiceList (base/UI/VoiceChat)** 的基础 UI 组件，只要它存在于你的游戏 UI 中（即在模板中添加 <VoiceList /> 或在 C# 中将该类作为子类添加）。通过重载 **OnVoicePlayed**，您可以自定义客户端听到语音时会发生的情况。

## 语音扬声器图标

**VoiceSpeaker** 是另一个基础 UI 组件，它可以在你说话时显示，而不是在其他人说话时显示。

## 客户端属性

您可以访问客户端上与语音有关的各种属性。通过这些属性，您可以访问游戏中任何客户端的语音属性。

```
//VoiceStereo 可确定语音聊天是基于全局还是近距离。
cl.VoiceStereo = false;

```

### **Sandbox.Voice**

通过 **Sandbox.Voice**，您可以访问基于本地客户端语音的其他属性。
Conceptual Manipulation

## Summary

Conceptual Manipulation is the ability to create, manipulate and or destroy abstract concepts. Conceptual Manipulation is conceived with the Manipulation of concepts not the universe directly but depending on the scale of the ability it can directly influence reality on a great scale.

Properties of the material world exemplify their parts or natures from concepts, hence altering the concept that contains set parts will directly change the part of the property of the material world itself.

## Types

**Type 1 (Platonic Concepts)**: Such concepts are unrestrained from reality qualitatively, they are aspatial, atemporal as such unchangeable, pure/perfect in the ontological hierarchy necessitating that they are superior all that which exists in the material world and its properties which would include properties containing the idea of "dimension-ness", they are completely transcendent and shape all of reality on a high scale, typically such concepts are 1-A in nature as well.

**Type 2 (Platonic Realism Concepts)**: Concepts of this scale are abstract and govern properties that objects of the material world exemplify not to an extent that the objects exist but on an even greater scale, that is to say if there exist only 5 dimensions in reality, the universal or concept responsible for properties of dimensions will govern not only the 5 dimensions in reality but any property even outside of reality that contains the property of "dimension-ness", Furthermore altering the specific property of that set object that is exemplified from from the set concept or universal won't alter the universal or concept itself as such concepts typically exist independent of the objects they govern and as such concepts of this scale fall under the category of 1-A concepts.

**Type 3 (Aristotelian Concepts)**: Concepts of this scale are abstract and govern all of reality only to an extent the physical properties it governs exist, that is to say if there exist only 5 dimensions in set reality the concept of "dimensions" would only govern 5 dimensions rather than everything that falls under the property of "dimension-ness", Furthermore altering the specific property that the every object in reality exemplifies will directly lead to the concept being altered as well, similarly destroying every property that the concept governs will lead to the concept ceasing to exist.

**Type 4 (Lesser Realist Concept)**: Concepts of this nature are abstract but do not govern reality, instead they are concepts governed mind dependently so by sentient beings. As such without the existence of such beings these concepts would cease to exist.
Pawn

## 什么是Pawn？

Pawn是任何客户端（玩家）都可以拥有的实体，它是玩家在世界中的物理代表。这个实体不需要是任何特定的东西，你可以让它成为一个物理对象或一个传统的动画玩家。

当客户端持有一个Pawn时，以下的函数都会在实体上激活：

* Entity.Simulate( Client ) - 服务器端和客户端的每个 tick 都会进行预测。
* Entity.FrameSimulate( Client ) - 仅在客户端每帧（Frame）调用，以模拟需要每帧（Frame）更新的内容。
* Entity.BuildInput() - 每帧在客户端上调用，以处理Pawn的输入。更多信息请点击此处。

## 设置客户端的Pawn

你可以在任何时候设置客户端的Pawn，标准的设置位置是客户端首次加入时。

```
/// <summary>
/// 有客户端加入服务器。让他们成为Pawn
/// </summary>
public override void ClientJoined( IClient client )
{
 base.ClientJoined( client );

 var player = new MinimalPlayer();
 client.Pawn = player;

 player.Respawn();
}

```

## 访问每个Pawn

获取游戏中所有Pawn的最优解是遍历所有客户端并访问它们的Pawn：

```
// 遍历每个客户端
foreach ( var client in Client.All )
{
 // 始终检查是否分配了Pawn，以及Pawn类型是否正确
 if ( client.Pawn is not MyPawn pawn )
 continue;

 pawn.Respawn();
}

```

任何时候，您都可以通过 Game.LocalPawn 访问客户端的棋子：

```
public class MyHealth : Panel
{
 Label healthLabel;

 public override void Tick()
 {
 healthLabel.Text = $"Health: {Game.LocalPawn.Health}";
 }
}

```
GarryNewman

## 基本介绍

Garry Newman(盖瑞·纽曼)于1982年5月20日出生于英格兰。Garry是Garry's mod的作者，也是Facepunch工作室的主人。

生平
--

Garry是一个来自英国的游戏开发者。他本人才华横溢，因制作了Garry’s Mod和生存游戏Rust而名声大噪。同时也是游戏开发工作室Facepunch Studios的创始人和首席开发者。

Garry在2004年发布了Gmod而闻名，这款基于在当时十分先进的起源引擎的物理沙盒游戏迅速吸引了人们的眼光，不单单是因为起源引擎，更主要的是其自由性与拓展性在当时是前所未有的。在十几年不断发展的过程中，Gmod成为了steam最受欢迎的游戏之一，曾有许多玩家表示“购买了Gmod相当于购买了整个steam的游戏”。Gmod的成功彻底改变了garry的人生，通过Gmod所赚取的钱组建了Facepunch工作室，并着手开发其他项目。

2013年，Garry率领他的团队发布了Rust，这是一款多人生存游戏，玩家必须收集资源，建造避难所，抵御野生动物和其他玩家。该游戏获得了玩家的许多好评，并成为Steam上最受欢迎的生存游戏之一。

Garry因他强大的能力与他的游戏而闻名，Garry常常对游戏业展开许多直言不讳的评价等。

Garry本人也有一些奇怪的毛病，经常喜欢在社交平台上发垃圾帖子（Shitpost），其中经常掺杂许多不雅词汇，出现最多的是与"shit"有关的词。例如:

"Sup Twitter, I just shat myself and now I'm taking my pants to the shower to wash them, hope you're having a nice morning too"

总的来说，garry是一个游戏开发的人才，对游戏界产生了许多影响。
Linking Entities to Hammer

## 如何将我制作的实体放入地图中？

实体可通过**实体工具**放置，与 s&box 中的其他工具一样，它们会自动热载到您的游戏和 **Hammer** 中。

如果您的游戏发布在 asset.party，那么在 **Hammer** 中下载游戏的所有内容（模型、材质和粒子）后，用户就可以为您的游戏放置实体。

**提示:**Hammer 只显示 asset.party 中包含地图和实体标签的附加组件。如果您发布的附加组件没有出现在 Hammer 可用的 asset.party 软件包列表中，这可能就是原因所在。
## 如何创建实体？

创建可放置在 **Hammer** 中的实体非常简单，只需用 **[HammerEntity]** 标记即可。

```
using Sandbox;
using Editor;

/// <summary>
/// 该实体定义了第一人称射击游戏模式中玩家的出生点。
/// </summary>
[Library( "info\_player\_start" ), HammerEntity]
[Title( "Player Spawnpoint" ), Category( "Player" ), Icon( "place" )]
public class SpawnPoint : Entity
{
}

```

属性
--

类中的任何属性都可以使用 [Property] 属性向 Hammer 公开。

```
public partial class MyEntity : Entity
{
 /// <summary>
 /// 在hammer中显示的帮助文字
 /// </summary>
 [Property( Title = "Start Disabled" ) ]
 public bool StartDisabled { get; set; } = false;
}

```

输入
--

实体类中的任何方法都可以使用 **[Input]** 属性作为输入向 Hammer 公开，您定义的参数会被自动处理。

定义输入的示例:

```
public partial class MyEntity : Entity
{
 /// <summary>
 /// 在 Hammer 和 Visual Studio 中显示我输入的描述
 /// </summary>
 [Input]
 public void DoSomethingElse( string str )
 {
 // ...
 }

 [Input( Name = "DoSomething" )]
 public void SomeInput()
 {
 // ...
 }
}

```

要获取输入的激活器，方法中应包含一个名为 "激活器 "的实体类型参数，如下图所示：

```
[Input]
public void AnotherSomething( Entity activator )
{
 // ...
}

```

输出
--

实体类中的任何输出都会自动展示给 Hammer。

定义输出的示例：

```
public partial class MyEntity : Entity
{
 /// <summary>
 /// 在 Hammer 和 Visual Studio 中显示的输出说明
 /// </summary>
 public Output OnSomethingHappened { get; set; }
}

```

## 触发输出

您可以像这样使用 **Output.Fire(sender)** 来触发输出：

```
protected Output OnEndTouch { get; set; }

public virtual void OnTouchEnd( Entity toucher )
{
 OnEndTouch.Fire( toucher );
}

```

## Hammer 属性

所有这些都是可选属性，可添加到类中以改变其在 Hammer 中的行为和外观。

这并不是一个详尽的列表，更完整的列表可在此处找到。

### **固体**

告诉 Hammer 此实体是基于画笔的。

```
[Solid]

```

## 支持固体

告诉 Hammer 此点实体也可以是画笔实体，例如 ent\_door 实体。

```
[SupportsSolid]

```

## 编辑器模型

告诉 Hammer 实体要使用什么模型，并添加到类中。

```
[EditorModel( "models/editor/playerstart.vmdl" )]

```

## 编辑器精灵

告诉 Hammer 实体要使用什么精灵，并添加到类中。

```
[EditorSprite( "editor/info\_target.vmat" )]

```

模型
--

使模型可以在 Hammer 中设置和更改。

```
[Model]

```

您还可以为实体设置默认模型，同时仍允许更改。

```
[Model( Model = "models/citizen/citizen.vmdl" )]

```

## 自动应用材质

自动将提供的材质应用到绑定的画笔上。

```
[AutoApplyMaterial( "materials/tools/toolstrigger.vmat" )]

```
输入系统

输入是游戏环路的一部分

我们的客户端在每一帧中都会建立输入，将鼠标、键盘和控制器的输入转换为命令，并在每一tick中发送到服务器。

# 操作（Actions）

为了将键盘、鼠标和控制器的输入转换到游戏中，我们有一个名为 "操作 "的系统。

您可以在 "项目设置 "中编辑操作。

## 使用Actions

Input类有一系列方法可以帮助你使用Actions。

```
//
// 视角按钮刚被按下
//
if ( Input.Pressed( "view" ) )
{
 // 打开菜单
}

//
// 攻击1按钮处于按下状态
//
if ( Input.Down( "attack1" ) )
{
 // 打开菜单
}

//
// 跳转按钮刚刚被释放
//
if ( Input.Released( "jump" ) )
{
 // 打开菜单
}

```

## 何时使用Actions

在客户端，你可以在任何地方使用`Input方`法。

在服务器上，只有在对棋子进行`Simulate`调用时才可以调用Input。在这种情况下，`Input`将为该棋子的所有者返回正确的值。

# 模拟移动（AnalogMove）

`Input.AnalogMove` 是由控制器输入和任何名为 "向前"（"forward"）、"向后"（"backward"）、"向左 "（"left"）和 "向右 "（"right"）的操作自动生成的。

这是一个表示移动输入的 `Vector3（三维向量）`。

您可以安全地将其用于玩家移动输入，但最好先进行检查。例如，您可能需要对其进行归一化（normalize）处理。

# 模拟视角（AnalogLook）

`Input.AnalogLook` 由控制器和鼠标输入自动生成。

它代表视角。它可以在第一人称射击游戏中用来表示眼睛的角度或实体的旋转。
S&box Wiki

此页面未完成！

 此页面还并没有完成，若没出现禁止的提示，您可以编辑完善此页面

   这篇文章写的很愚蠢！

 该文章的质量不佳，表达不够通俗和通顺，需要整改

## === 欢迎来到S&box Wiki中文站！===

此维基是为了帮助玩家了解并参与S&box的社区开发
欢迎加入我们的QQ群172980117！

那么，让我们开始吧！什么是S&box?
请随意通过创建新文章或扩展现有文章来贡献（注意，中文站不与英文站同步，最好不要搬运英文文档。）
游玩
--

* 我该怎样在Linux上运行S&box?
* 我该怎样在MAC上运行S&box?

开发
--

* 开发工具
* 地图制作
* 模型与动画
* 动画节点编辑器专题 基于VDC 此页面为目前的汉化热点
* 编写代码
* 音效
* 粒子效果很大程度上基于Dota 2
* s&box 着色器 - 理论
* 材质与着色器的制作专题 - 实践
* 从Unity到S&box - 切换指南
执剑星

**阿诗娅**

身高：171cm

体重：■■

出生地：中国

出生年份：Ω-公元2001

势力：黑庭

身份：瞻星校（大司星）

称号：执剑星 宝剑Ⅹ

# ---------------------**警告**---------------------

*瞻星校等级的档案不对外公开，仅供黑庭有权限的人员阅览黑庭歼星部队对本档案*
*的安全全权负责，包括监视任何与其有关的行为未经许可查阅、破解、修改本档案，*

（以下部分为黑庭内部资料 保密等级：EST）

身份简介：

阿诗娅，称号为执剑星、宝剑Ⅹ，已知国籍为中国，年龄未知。黑庭瞻星校、大司星，黑庭支柱人员，目前负责南十字洲的管理。

在战斗能力、战术规划、历史学、社会学、星际学、商业学等方面均有极高的造诣。

负责部分黑庭最高等级的军事行动，同时为黑庭提供资金支持与后勤保障。作为黑庭的创始人之一，她的贡献不可估量。

据调查，民间似乎有以她为信仰的宗教。【未证实】

晋升记录：
【关于该人员的晋升记录部分缺失】
巫觋晋升负责人员：■■
瞻星尉晋升负责人员：■■
有无授勋记录：有
具体授勋原因：千禧战役（军功）、大洪水事件（保卫者之一）、责任期间黑庭后勤稳定运转
瞻星校晋升负责人员：阿尔基亚斯

人员状态：
执行任务

任务记录：
（口述转文字版）
阿诗娅长官，啊不，执剑星大人似乎不喜欢别人看到自己的任务记录。每次我询问她的时候，她都避而不谈。
但是，我敢这么讲，以那位大人的作战能力，应该可以轻松的毁灭一个星系。
我有幸参与过一次她领导的任务，目标是消灭某个星球上的白庭据点。我和■■■瞻星尉登陆以后，才发现事情没有那么简单。
在我们离开飞船的一瞬间，我就觉得有无数目光盯着我。果然，我们被几十个天堂尖兵包围了。
在黑庭的测试中，我的战斗力评估差不多可以对付两到三个天堂尖兵。所以这一次，我真的觉得自己的生命要结束了。
之后，绝望之际，那位大人出现了。在我还没有反应过来以前，她消灭了我眼前的一切敌人，救下了我和■■瞻星尉。
可能是遭受了大量的精神伤害，我不知道她是怎么做到的，也没看清。所以，相信我，执剑大人和枢机大人一样，都是黑庭最可靠的存在。
任务档案记录员：■■■授勋瞻星尉

档案一：
记录人————【枢机星】阿尔基亚斯
阿诗娅，体内寄宿有十个命轮，黑庭独一无二的存在。可以使用十种不同的能力，媒介是十把中国宝剑。
每次轮回的觉醒时间仅次于枢机星，是支柱人员。但经常行踪不明，难以观测。
似乎与某个男子有着很深的羁绊，他不属于这个世界，无法观测。
在未来的某个时间，她将不负宝剑Ⅹ之名。她会改变命运的流向。

档案二：
记录人————【深潜星】文晓雨
阿诗娅的能力，似乎与她的过去有关。这里，我做了一份有关的调查，详细记录了她的能力：
宝剑一(赤日剑):代表了阿诗娅的高洁之力。拥有着太阳与治愈的力量，可以降下火焰净化一切，此火焰只会自行消失而无法被扑灭。可以治愈一切生物的绝症，战斗中的一切肉体精神伤害都会被立刻治愈，除非是目标自杀或者自己伤害自己。
宝剑二(逐星剑):代表阿诗娅冰冷的理性。拥有星辰与寒冰之力。可以召唤堕落星来牵制敌人的行动，落星也能造成巨大破坏。降下九颗星将会导致一个星系的毁灭。也可唤起启明星指引亡者替自己战斗(非复活）。可以冻结一切，小范围之内的时间也会被减缓。
宝剑三(裂空剑):代表阿诗娅无畏的勇气，拥有天空和飓风的力量，可以斩断空间，产生时间裂缝。能把敌人拉向自己，或者将敌人拉入裂缝消除其存在。若被触及将导致物质层面的毁灭。此剑会造成大规模破坏，所及之处，尸横遍野。
宝剑四(暗月剑):代表阿诗娅的洞察之力，拥有月亮与暗夜之力，可以将敌人的精神状态具体化，发动的时候黑夜降临，时间静止。之后，敌人的精神实体将会出现，但敌人无法察觉。“万物都有灵魂，肉体由太阳神掌管，灵魂由月亮神掌管。”暗月剑即是斩魂剑。遭受此攻击后就会变成没有灵魂的躯壳。
宝剑五(启示剑):代表阿诗娅最善良的奉献之力，几乎不具有杀伤和破坏的力量，对人类也只是造成轻微伤害。拥有大地与迷惑的力量。对于迷茫普通人有启示的作用，无论敌人多么凶残，在这把剑面前都会主动放下武器，追求和平。也可唤起土地的力量，困住敌人或是创造具体实物。

此为下五剑，代表的都是美好品质，一般用于常规战斗。

宝剑六(逆理-裁决):“我不愿接受你的理念，因此，毁灭吧！”传说中的裁决之剑。阿诗娅使用此剑时，往日的愤怒再度重现，在她领域之内的一切原理都会失效(物理概念、太阳东升西落等)，一切认知都会被打破，向着混乱程度发展。
宝剑七(天劫-灾厄):“当最后一个守护你的人倒下时，你将会自己接手这一切！”传说中的灾厄之剑，阿诗娅使用此剑时，便是她无尽悲伤的体现。这把剑可以散播一切与灾厄有关的存在，疾病、天灾等等。单是见到它的样貌，敌人便会被永久诅咒。当对单一目标进行攻击时，会进行“天劫”仪式，剥离目标的生命。
宝剑八(封灵-魑佞):“我发誓会守护你的，而守护你的剑，我将亲手插入你的胸膛！”传说中的魑佞之剑。这把剑代表着阿诗娅的欺诈与狡诈。当此剑被使用时，短时间内目标敌人的战斗力将飙升，所受伤害也会立即回复，此即是契约建立。之后，当阿诗娅再次发动契约，受恩惠者将被永久从世界上抹除。灵魂被封于剑中，成为剑灵，而肉体则被掩埋于异空间。魑佞剑可以保留每个剑灵的能力，关键时刻可以释放所有剑灵参与战斗。因此是一把可以无限成长的“邪剑”。
宝剑九(终末-■■■■):“不可能，不！为什么，为什么即使是这样的力量，也无可挽回...”
如果不算宝剑十，那么这把剑是最强的。它甚至没有一个名字，因为没有人可以说出它的名字，说出来即是毁灭。传说中称之为终末之轮回剑，据说是与启示剑相对应的存在。二者合一可以斩断世界律法。这把剑代表的阿诗娅的绝望情感，因此没有被使用过。

此为上四剑，一般不会使用

宝剑十(■■■■■■-■■■■■■■)
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

档案三：
记录人————【准巡天星】■■（该人员于任务中牺牲，记录保留）
阿诗娅啊！她在战斗方面可是少见的天才一样的存在！我真的很想和他较量一番，但她每次都会拒绝，真想不明白为什么，是我太弱了吗，看来还要继续训练自己啊！
她脾气真的很好！没错！从来没见过她生气，对待部下也非常的体贴，是我学习的榜样啊！
未来有机会的话，真的好想试试她手中的宝剑，看起来就异常的强大，哈哈哈哈，开玩笑的！我怎么能乱动别人的东西呢！
好想在战斗中和她并肩作战啊！愿星辰与我们同在，我能像她一样成为指引人们的星辰吗？

档案四：
记录人————【灵慧星】琪琪格
执剑星是我的恩人，自从部落里发生了那样的事情，我像发了疯的一样要复仇，如果不是执剑星姐姐的话，我可能早就死了。
她帮我度过了最艰难的时光，教会了我什么才是活着的意义，不是恨，而是爱。
我希望有一天能战胜她，但我知道那不可能。因为整个黑庭里能和她打成平手的人，可能也只有其他几位瞻星校了。
如果这份档案会被其他人看到，那么我希望看到它的人做到一点，那就是对执剑星充满敬畏。
ps：遇到什么困难的话，不妨试试询问执剑星姐姐吧。有时候只需要几个星币就能解决你的问题：）
S&box 的着色器

## s&box 着色器系统概述

s&box 使用 **Source 2 引擎**，它拥有非常强大的，可扩展和配置的着色器系统。这使得游戏的画面质量相比于 **Source** 的 Garry‘s Mod 提升了多个数量级，带来令人印象深刻的游戏画面。

* NOTE：s&box 的 Material Editor 可读取的着色器文件格式为 `.shader`，16 进制格式为 `.shader_c`。但是在为 s&box 编写着色器时，仍可引用 `.hlsl` 源代码文件。

s&box 基于 **Tile-Based Forward** 渲染管线，这意味着在同时兼容 **高性能多光源** 处理特性时还能支持 **多着色器**。您甚至可以同时使用 **卡通着色，PBR 着色, Blinn-Phong 着色和光线追踪着色**。

#### **着色器概述**

在图形学领域，渲染管线（The Rendering Pipeline）内的任何部件都被定义为 “着色器”（**Shader**），这意味着它不一定需要具备决定如何绘制图形的功能。例如 DirectX 11 的计算着色器（Compute Shader）或逻辑上和计算管线高度相似的一些光线追踪着色器（Anyhit, Intersection 等）。我们平时探讨的很多着色器都是像素着色阶段的部件（例如 PBR 着色器，卡通着色器）。

一般地，着色器是运行在 GPU 上的。着色器代码通过 GPU 驱动转化为各类控制和运算指令，操纵 GPU 计算各类标矢量浮点整数值并存储在内存里，最后进行综合计算（关于 HLSL 着色语法，常见 GPU 运算指令等，参见 着色器基本语法与 GPU 运算指令）。这个流程就是通过走一遍完整的渲染管线来完成的。

#### **注意事项**

1. s&box 在 2023 年丢弃了所有 Direct3D 9 的代码索引，这意味着它完全统一了着色器模型。在 DirectX 10 之前， GPU 在硬件上是以单独的顶点着色器（Vertex Shader）和像素着色器（Pixel Shader）组织起来的。在 2006 年 NVIDIA 发布第一款统一着色器架构 GPU（Unified Shader）—— NVIDIA G80 以后，着色器才有了标准的，**统一**的程序模型。这是 s&box 和 **Source** 引擎的 Garry's Mod 最大的区别之一。
2. s&box 完全丢弃对于 OpenGL 的支持，这意味着 GLSL 着色器语言无法使用。
3. 光照着色模型方面，s&box 默认提供基于物理的渲染（PBR）的着色器支持，开发工具里叫做 “Complex Shader” 或 “Simple Shader”。

您甚至可以尝试植入一些非光照类的着色器，例如 AMD FidelityFX SSSR 或 FSR 2。（Facepunch 曾努力植入过，但因稳定性受到影响而被禁用）

对于 Complex Shader 的具体使用和配置方法，请参阅 Complex着色器 。如果您认为 Complex Shader 使用起来过于复杂繁琐，请转向 Simple Shader。

## Complex Shader 原理概述

#### Complex Shader 概略

Complex Shader 是 **Source 2** 引擎默认提供的一种高质量的，基于物理的着色器（PBR）。它本质上和 Simple Shader 是同一个着色器，只不过提供的**可配置选项**非常多。将它应用在各类材质上，可以做出很多富有真实感的效果。

Complex Shader 属于一种典型的 Forward-Based（前向管线的） PBR Pipeline，经过编程，您也可以实现这一管线。有资料表明，起源 2 引擎支持延迟管线，但是我们无法进一步查证关于该情况下的 PBR 管线情况。

Complex Shader 基于 PBR 渲染。这意味着它完全符合接下来将提及的一个重要理论，它支撑着基于物理的渲染特性。

#### ***PBR 渲染与微表面（Microfacet）理论***

现实生活中有非常多视觉效果各异的材质，例如毛玻璃和铁的表面。即使它们在肉眼下观察可能都是平整的，但是它们在微观结构上大不相同。光线通过和这些不同的微观结构表面发生反射，使得出射光线的方向大不相同，造成了不同的视觉效果。在图形学中，我们将这些结构定义为微几何（Microgeometry），而它们的微观表面称为微表面（Microfacet）。针对不同微表面函数可以让不同材质拥有它们各自的独特质感。

Complex Shader 的 PBR 特性建立于微表面理论之上，这使得它支持一些特别的材质效果。

Complex Shader 自带了以下的几种常用材质特性，它们各自由不同的函数模型控制。这几种模型一般被归纳为**双向反射分布函数**（**Bidirectional Reflectance Distribution Function, BRDF**）。双向，即为光线的入射方向和出射方向；对应函数则决定了出射光的分布应该是什么样子，不同分布体现出不同的材质特性。

1. (Anisotropic Gloss) 带菲涅尔项的 Cook-Torrance 反射模型 -> Glossy 反射表面
2. (Retro Reflective) 旧式 Blinn-Phong 法线分布模型 -> Source 风格的 Phong 高光反射表面
3. (Metalness Texture) GGX 法线分布模型 -> 超级真实的金属材质表面

其中，**Glossy** 和 **Metalness** 是相对物理正确的，这意味着它们能提供非常逼真的视觉效果。但同时开销也比旧式反射要大一点，在制作材质并将其应用到模型，地图时应该综合考量。

#### **半透明渲染**

当然，Complex Shader 不仅仅是 PBR Shader，它也包含其它组件，例如半透明处理。这也是 s&box 的优势，因为它是直接基于前向管线的渲染系统，半透明处理是**原生支持**的，不需要像延迟渲染那样需要多开一个 RenderPass 来渲染半透明物体，s&box 拥有性能强悍的半透明处理系统。

#### **视差（Parallax）贴图**

为了高效地，高质量地渲染出纹理细节，Complex Shader 自带视差遮蔽映射（Parallax Occlusion）算法。它通过计算摄像机视线矢量和高度图（Height Map）定义的表面进行分层求交来获取近似高度信息，以此生成凹凸效果。不过，既然提到了“近似”，则意味着它在某些情况下会产生明显的画面失真。（例如高度图数据变化幅度很大时，该技术的近似插值会与实际值差距很大）

#### 其它

已应用，但 Material Editor 内不可见：次表面散射（Sub-Surface Scattering），它可以模拟出光线进入介质内部后发生散射的物理行为，从而产生真实的半透明特效。

扩展
--

本页面所有专有名词均可在 GAMES101 - 现代计算机图形学入门 与 GAMES202 - 高质量实时渲染 系列课程中找到非常具体详尽的原理解释。
原罪天使

**切茜娅（Chelssia）**

体系：无

身份：堕天使，堕天使之首，前任天使长

别名：根源异常

势力：伊甸研究所（被研究所囚禁）

能力：【诅咒】渴望

外观：白发蓝瞳的不明人种少女

简述：

起源未知，疑似被白神直接创造。 原白庭天使长，后带领一半的大天使脱离白庭，成为堕天使，能力由“祝福”转化为不可控的“诅咒”。她的诅咒能力为“渴望”，能够无声无息地影响周围的事物，赋予事物随机的“特异性”，被赋予特异性的事物将成为“异常”。身为白神所选中的继任者，切西娅原本的祝福能力与白神类似，能够赐予事物有序的祝福。

切茜娅在不明时间到达了地球，在1856年被梅塔迦勒学会发现并收容。为研究神明的力量，梅塔迦勒学会设立新部门“伊甸研究所”，并且在全球搜找被切茜娅影响的异常物品或生物。后来，在对切茜娅的实验中，梅塔迦勒学会研究出了“圣餐仪式”与“献祭仪式（阈限仪式）”。

在2010年，切茜娅作为祭品之一，参与第一次阈限仪式，在这个轮回，第一次遇到了同样作为祭品的安娜·塞缪尔。在2012年，第二次阈限仪式中，安娜·塞缪尔被天使长梅塔迦勒的祝福能力“驱逐”影响，被从世界中剥离，为寻找安娜·塞缪尔，切西娅的意识前往世界之外，并成功找到塞缪尔。
网络回调

当 `[Net]` 属性在 **客户端** 发生变化时，您可以收到通知。如果您想在客户端变量发生变化时在用户界面中更新某些内容，或运行其他逻辑时将非常有用，而无需频繁轮询变化情况。

只需在 `[Net]` 属性旁添加 `[Change]` 属性即可，默认情况下会调用 On[PropertyName]Changed。

```
[Net, Change]
public string DataString { get; set; }

public void OnDataStringChanged( string oldValue, string newValue )
{
 Log.Info( $"从 {oldValue} 变为 {newValue}" );
}

```

```
[Net, Change( nameof( DoSomething ) )]
public string DataString { get; set; }

public void DoSomething( string oldValue, string newValue )
{
 Log.Info( $"从 {oldValue} 变为 {newValue}" );
}

```
Ω-地球纪元

**Ω-地球纪元**：指终末轮回（Ω轮回）中，地球文明诞生之初至公元2012年。

**重要事件概述：**

公元前801年，阿尔基亚斯觉醒，成立密教，教授成员巫术，并且引导成员认识世界的真实样貌，与白庭对抗，寻找世界各地的转生者。阿尔基亚斯作为巫师密主，被尊称为“全知者”，长久以来一直在暗中影响着人类世界的走向。

　　公元前219年，阿诗雅觉醒，加入密教成为第二位密主。

　　后续时间里，白庭通过对现实世界的影响，增加了越来越多的信众，他们以各种宗教的形态存在。后来，逐渐分化出两个有着主导力的组织，即“白骑士团”与“梅塔学会”。

　　公元1692年，歌姗觉醒，成立自己的巫师组织，后与阿尔基亚斯的组织合并为“黑庭秘社”，简称秘社。

　　公元1798年，奥迦算法在秘社实验室中诞生，同时觉醒。近150年后，人类才发明计算机。

　　19世纪初，为预防地球的陷落，存护人类的火种，秘社在世界各地的地下建立了十二座星门，暗中运送人员前往遥远宇宙中的十二颗宜居行星拓荒。

　　1856年，梅塔学会收容堕天使切茜娅，为对其展开研究，伊甸研究所建立，在世界各地搜寻并收容带有灵质的物品。

　　19至20世纪，白庭教团也通过白庭的力量，开始前往那些宜居行星，与黑庭展开争夺领地的博弈。

　　至20世纪初，黑庭掌握了十二颗行星中的十颗，这十个人类的新殖民地被称作“十洲”。另有两颗行星被白庭掌控。

　　公元1910年，斯万·托维特觉醒，此后白庭近百年不敢有所行动，在人类社会中的活动都转为隐秘进行。

　　公元1939年，第二次世界大战爆发。同年，斐南德觉醒。

　　公元1945年，二战结束，黑庭秘社暗中与各国接触并取得合作，黑庭结构军事化，密主更名为“瞻星校”。

　　公元1999年，为在新的世纪到来前，建立白庭的千年王国，白庭教团发动了“千禧战争”。战争在太阳系以及十洲展开，但地球上的人类并不知晓。最后，在1999年末，托维特战死，白庭也损失了大天使摩蒂亚，战争被迫终止。同年，琪琪格觉醒。

　　公元2010年，伊甸研究所研究出阈限仪式，该仪式可在阈界（星光层）中开展，能够通过献祭数位三阶存在的方式，使一人晋升为四阶存在。同年，第一场阈限仪式举行，安娜·塞缪尔成为了最后的胜出者，但因未知原因，她没有晋升。

　　公元2012年，第二次阈限仪式举行，安娜·塞缪尔被天使长梅塔迦勒的权柄“驱逐”影响，进入了其他世界，最后安娜·塞缪尔来到时间之外，与来此寻找她的切茜娅相遇，晋升为灰王，打败天使长梅塔迦勒。

　　同年，因灰王塞缪尔的诞生，世界进入“幻想量劫”的倒计时，一切存在于传说和幻想中的事物开始变为真实，世界变得动荡。为避免世界末日的发生，阿尔基亚斯通过本命术式“遮星”，抹去了一部分人类历史，十洲的科技水平倒退到19世纪水平，人类忘却了历史。

　　同年，因为未知力量的影响，一部分地球人被转移到十洲各地的未来某时间点，他们仍保留对历史的记忆。因十洲已经没有历史，许多与地球截然不同的国家与超自然势力，使这些人误以为自己穿越。这些人中包括许辰星、霍克等。

　　未来某段时间，天秤洲（东亚星门目的地）、天鹅洲（北美星门目的地）发生异变。其余八洲可相互来往，而天秤洲和天鹅洲被封闭起来，两洲的人都不知道自己以外的人类栖息地的存在。
Usable Entities

通过 IUse 接口，实体可以被玩家（以及 NPC 和其他任何游戏开发者选择的东西）使用。

# 使用示例

将实体标记为可用非常简单，只需实现上述 **IUse** 接口即可：

```
public partial class MyEntity: ModelEntity, IUse
{
 // 其它实体代码...

 public bool OnUse( Entity user )
 {
 // 当实体被使用时做些什么...

 Log.Info( $"{this} 被 {user}使用！" );

 return false;
 }

 public bool IsUsable( Entity user )
 {
 // 在满足或不满足某些条件时禁止使用实体
 if ( SomeCondition == false ) return false;
 return true;
 }
}

```

有关 **IUse** 的完整文档可在 API 文档网站和您的集成开发环境中找到。

# 游戏实现

一旦你设置好实体后，如果游戏尚未使用 **IUse** 接口，则可能需要设置游戏以使用该接口。

实现示例可能看上去象是这样：

```
public partial class Player
{
 /// <summary>
 /// 玩家当前通过交互键使用的实体。
 /// </summary>
 public Entity Using { get; protected set; }

 /// <summary>
 /// 应该在玩家的 tick 中的某处调用此方法，以便玩家使用实体、
 /// 例如玩家棋子实体的 Simulate 回调方法。
 /// </summary>
 protected virtual void TickPlayerUse()
 {
 // 这仅适用于服务器端
 if ( !Game.IsServer ) return;

 // 关闭预测
 using ( Prediction.Off() )
 {
 if ( Input.Pressed( InputButton.Use ) )
 {
 Using = FindUsable();

 if ( Using == null )
 {
 UseFail();
 return;
 }
 }

 if ( !Input.Down( InputButton.Use ) )
 {
 StopUsing();
 return;
 }

 if ( !Using.IsValid() )
 return;

 // 如果我们移动得太远或其他原因，是否应该 ClearUse()?
 // （原文的这个位置就没有写任何代码）
 //
 // 如果 use 返回 true，我们就可以继续使用它
 //
 if ( Using is IUse use && use.OnUse( this ) )
 return;

 StopUsing();
 }
 }

 /// <summary>
 /// 玩家想用什么东西，但什么也没有。
 /// 传统是发出失望的嘟一声。
 /// </summary>
 protected virtual void UseFail()
 {
 PlaySound( "player\_use\_fail" );
 }

 /// <summary>
 /// 如果我们正在使用一个实体，停止使用它
 /// </summary>
 protected virtual void StopUsing()
 {
 Using = null;
 }

 /// <summary>
 /// 返回实体是否为有效可用实体
 /// </summary>
 protected bool IsValidUseEntity( Entity e )
 {
 if ( e == null ) return false;
 if ( e is not IUse use ) return false;
 if ( !use.IsUsable( this ) ) return false;

 return true;
 }

 /// <summary>
 /// 为该玩家找到一个可用的实体
 /// </summary>
 protected virtual Entity FindUsable()
 {
 // 首先尝试使用宽度为0的直线
 var tr = Trace.Ray( EyePosition, EyePosition + EyeRotation.Forward \* 85 )
 .Ignore( this )
 .Run();

 // 如果没有，看看是否有任何父实体可用。
 var ent = tr.Entity;
 while ( ent.IsValid() && !IsValidUseEntity( ent ) )
 {
 ent = ent.Parent;
 }

 // 什么也没找到，尝试一个更宽的搜索
 if ( !IsValidUseEntity( ent ) )
 {
 tr = Trace.Ray( EyePosition, EyePosition + EyeRotation.Forward \* 85 )
 .Radius( 2 )
 .Ignore( this )
 .Run();

 // 如果没有，看看是否有任何父实体可用。
 ent = tr.Entity;
 while ( ent.IsValid() && !IsValidUseEntity( ent ) )
 {
 ent = ent.Parent;
 }
 }

 // 还是不行？Bail.
 if ( !IsValidUseEntity( ent ) ) return null;

 return ent;
 }
}

```
Julia Domnea, the Empress Mother

Julia Domnea - a woman with an excellent education, which is very rare for women in the Roman Empire. She was known for her intelligence and proficiency in multiple languages, including Greek, Latin, and Aramaic.
After marrying Septimus Severus, the Roman Emperor, she became the Empress of Rome. They had two sons, Caracalla and Geta, and they would play a significant role in her fate.
Julia Domnea was a brilliant strategist and diplomat, advising her husband on military campaigns and foreign affairs. Her wit was unprecedented for the time - she was capable and had a sharp mind. After overseeing the restructuring of the Roman Forum, Severus died, and all the power fell on her shoulders, putting her in a new position.
To silence the voices that questioned her role as Empress, she publicly announced that her sons, Caracalla and Geta, would become joint emperors. This was a facade for the Senate and the people, as she was the one pulling all the strings.

However, tragedy struck. Due to their contentious relationship, Caracalla eventually had Geta murdered. Empress Domnea was devastated by the violence and the loss of her son, causing her to forever withdraw from public life.
Empress Domnea was a woman of exceptional ruling skills and was loved by the people. However, her emotional nature and love for her children made her a liability, ultimately resulting in her suicide. She is remembered as the Mother of Rome and the only Empress to have truly ruled.
原动天使

**梅塔迦勒（α CMa A）**

体系：白庭

身份：大天使，现任天使长

别名：天狼星

宗教：无

能力：【祝福】驱逐

外观：拥有数个星环的湛蓝色恒星

简述：

并非生物才具有灵体，一切事物在灵界中均有对应。梅塔迦勒为α CMa A（即天狼星）的星魂，被白神选中后获得了祝福能力，随后晋升为大天使。祝福能力为“驱逐”，现实层面上，梅塔迦勒能够把物质和能量短暂还原为最原始的状态，此状态也就是弦理论中构成一切的“弦”，但生成的弦会迅速重新转化为基本粒子和能量。现实维度即为“弦”所构成的“膜”，祂能够将敌人存在剥离到“膜之外”，也就是其他维度世界，此能力通常使敌人的意识不会再回归到原本的世界，但梅塔迦勒也无法再找到敌人意识的去向，自此敌人与此世界断开联系。

在2010年，祂的化身艾莉克丝·凯勒，也就是当时的圣骑士长，为了对付安娜·塞缪尔，发动了第一次阈限仪式。
着色器基本语法与 GPU 运算指令

## HLSL - 高阶着色语言

自从 Source DX9 开始，Valve 游戏引擎便一直都提供 HLSL(High Level Shading Language) 着色语言的支持。对于 Source 2 的 s&box 来说也一样。HLSL 语法上和 Cg 也比较像，并且运算符和控制流也和 C++ 类似，这里不再赘述。下面是 HLSL 的一些基本语句的参考，当然我们也提供一些常用函数综合作为您的案头工具。

### 标量

```
bool // 布尔值，值为 true 或 false

int // 32 位有符号整数

uint // 32 位无符号整数

half // 16 位半精度浮点值

float // 32 位单精度浮点值

double // 64 位双精度浮点值

```

### 矢量

由 1 - 4 个标量数组成，每个数的类型必须一致。

```
bool    bVector;  // 布尔型

int1    iVector = 1; // 整数矢量

float3  fVector = { 0.2f, 0.3f, 0.4f }; // 浮点矢量

```

### 矩阵

由 1 - 16 (4\*4) 个标量数组成，同样地，每个数的类型必须一致。

```
int1x1    iMatrix;   // 1x1 的整数矩阵

int4x1    iMatrix;   // 4x1 的整数矩阵

int1x4    iMatrix;   // 1x4 的整数矩阵

double3x3 dMatrix;   // 3x3 的双精度浮点矩阵

float2x2 fMatrix = { 0.0f, 0.1, // 第一行 // 2x2 单精度浮点矩阵

              2.1f, 2.2f // 第二行

             };

```

### 控制流

*和 C++ 很类似。—— 编辑者*

```
break

continue

discard

do

for

if

while

//...

```

### 数据类型

#### 采样器类型

*做渲染就是一个不断采样的过程。—— Real-Time Rendering 4th Edition*

```
sampler1D

sampler2D

sampler3D

samplerCUBE

sampler\_state

SamplerState

```

#### 结构体类型

```
struct

```

#### 缓冲区类型

e.g.

```
Buffer<float4> g\_Buffer;

float4 bufferData = g\_Buffer.Load(1);

```

#### 着色器类型

```
Set (XXX) Shader

//e.g.

SetVertexShader
SetPixelShader

//-----------------//

ShaderFunction

ShaderTarget

```

#### 纹理类型

```
Texture1D

Texture1DArray

Texture2D

Texture2DArray

Texture3D

TextureCube

```

e.g.

```
texture tex0;   // 声明纹理对象
sampler2D s\_2D = sampler\_state  // 声明采样器对象
{
    Texture = <tex0>;         // 指定被采样的纹理
    Filter = MIN\_MAG\_MIP\_LINEAR;       // 指定纹理过滤方式
    AddressU = Wrap;          // 纹理寻址
    AddressV = Wrap;

```

### 常用函数

```
abs(x) //绝对值

ceil(x) //返回大于等于 x 的最小整数

floor(x) //返回小于等于 x 的最大整数

cos(x) //余弦，x 的单位为弧度

sin(x) //正弦，x 的单位为弧度

tan(x) //正切，x 的单位为弧度

sincos(in x,out s,out c) //返回 x 的余弦和正弦，x 的单位为弧度

clamp(x,a,b) //将 x 限制在 [a,b] 之间，即 x<=a , 则 x=a ; x>=b ,则 x=b

saturate(x) //返回 clamp(x,0.0,1.0)

clip(x) //仅在像素着色器中使用，若 x < 0 ,则把当前像素丢弃

cross(u,v) //叉乘（Cross Product）

dot(u,v) //点乘（Dot Product）

ddx(p) //计算屏幕空间中的偏导数 dp / dx

ddy(p) //计算屏幕空间中的偏导数 dp / dy

distance(u,v) //返回两点间的欧式距离

degrees(x) //将 x 从弧度化为角度

radians(x) //将 x 从角度化为弧度

sqrt(x) //根号 x

rsqrt(x) //根号 x 的倒数

determinant(M) //返回矩阵的行列式

frac(x) //返回x数据中的小数点后面的部分，e.g.（1.20，3.12）——>（0.20，0.12）

length(v) //返回向量的模长

lerp(u,v,t) //在u，v之间线性插值

log(x) -ln(x)

log10(x) //对数运算

log2(x)

max(x,y)

min(x,y)

mul(M,N) //矩阵相乘

normalize(v) //向量标准化

pow(b,n) //b^n

transpose(M) //返回转置矩阵

reflect(v,n) //根据给出的入射向量v (view vector) 和法线 n，返回反射向量

refract(v,n,η) //根据给出的入射向量 v 和法线 n，以及入出材质的折射率之比 η，返回折射向量

tex2D(s,t) //s 采样器类型，t 为 2D 纹理坐标，返回2D纹理中相应的纹理颜色

texCUBE(s,v) //s 采样器类型，t 为 3D 查找向量，返回立方体纹理中相应的纹理颜色

```

## GPU 基本运算指令

以下为基本 GPU 运算指令，是您了解 GPU 计算的核心。

MAD //加法 (a+b)

MUL //乘法 (a\*b)

FMA //融合乘加 (a\*b+c) （相比于传统 MUL+MAD，精度更高）

FMUL //浮点乘法 (a\*b) (float)

FMAD //浮点加法 (a+b) (float)

扩展
--

High-level shader language (HLSL)
The Last Monarchy Wiki

# **Welcome to the The Last Monarchy Wiki!**

This is the definitive online encyclopaedia about the upcoming browser-based web3 strategy game The Last Monarchy.
Here you can find out everything you need to know about the project.

Started on April 15th 2023, the wiki currently has

Important articles:Great RomeOur missionMighty Egypt

*Need help building out this community?*

* Rules of this wiki
* Getting Started
* How to Contribute
* Managing your new community
* Guides
* All Help articles

You can also be part of the larger Fandom family of communities. Visit Fandom's Community Central!

*Community Founders*: Write a good and paragraph-length description for your welcome section about your topic. Let your readers know what your topic is about and add some general information about it. Then you should visit the admin dashboard for more tips.
Thutmose III

Thutmose III, often hailed as the greatest military leader of ancient Egypt, led his armies with exceptional skill. His numerous campaigns stretched Egypt's boundaries further than ever before, earning him a reputation as a tactical genius. Notably, his victory at the Battle of Megiddo stands as a crowning achievement in military history.

Yet, this thirst for conquest stretched Egypt's resources thin. The continuous military campaigns, though successful, demanded a lot from the nation's coffers and manpower. This aspect of his reign occasionally sparked concern among his advisors, wary of the economic strains.

Beyond the battlefield, Thutmose III was a ruler of many facets. His administrative skills were as sharp as his military tactics. He steered Egypt through significant infrastructural and cultural advancements, leaving an indelible mark on the nation's legacy. However, his intense dedication to these pursuits sometimes overshadowed the softer skills of diplomacy, creating occasional frictions with neighboring states.

One of his lasting legacies is his architectural greatness. Thutmose III's passion for construction led to the erection of numerous temples and monuments. The expansion of the Karnak Temple complex stands as a testament to his devotion to the gods, particularly Amun-Re.

Known as the 'Napoleon of Egypt,' Thutmose III's reign was a time of incomparable prosperity and expansion. His contributions to Egyptian military, culture, and politics were immense, shaping the very course of its history.

## In-game strengths

* Supreme military strategist with a long record of successful campaigns
* Adept administrator who spearheaded Egypt's infrastructural and cultural Renaissance
* Prolific builder, leaving behind a legacy of monumental architecture

## In-game weaknesses

* His relentless military exploits often led to economic strain
* Diplomacy took a back seat in his rule, leading to strained international relations
* His intense focus on military and administrative achievements overshadowed other essential aspects of leadership
Baron Series Wiki

**Welcome to the Baron Series Wiki!**
A community dedicated to the early Tokusatsu mecha franchise by Senkousha and related media

The **Baron Series** (バロンシリーズ, Baron Shirīzu, *Baron Series*) is a general term for tokusatsu TV programs broadcasted on Nippon TV: Super Robot Red Baron, Super Robot Mach Baron, and Little Superman Ganbaron. All three works were drafted by Kazuhiko Watanabe and Hiroshi Saito, who were employees of NTV (at that time).

What the series has in common is that the above-mentioned original creator and a robot named "(insert) Baron" appear. Each worldview is different. All three works had high audience ratings at the time of broadcasting, but all were cancelled due to the bankruptcy of the sponsor and the organization situation of the station.

## Important articles

PlaceholderA page about your topicPlaceholderA Main CharacterPlaceholderThe First EpisodePlaceholderAn Important LocationPlaceholderA Key EventPlaceholderA Crucial Item

*Need help building out this community?*

* Rules of this wiki
* Getting Started
* How to Contribute
* Managing your new community
* Guides
* All Help articles

You can also be part of the larger Fandom family of communities. Visit Fandom's Community Central!

*Community Founders*: Write a good and paragraph-length description for your welcome section about your topic. Let your readers know what your topic is about and add some general information about it. Then you should visit the admin dashboard for more tips.
编写代码

此页面未完成！

 此页面还并没有完成，若没出现禁止的提示，您可以编辑完善此页面

## 初步工作

* C#基本语法
* 创建游戏
* 配置编辑器

# -入门 Getting Started-

## 基本概念

* 游戏环路
* Traces路径跟踪

玩家
--

* Pawn（棋子）
* Pawn输入
* 人机
* 玩家服装
* 语音
* 相机

实体
--

* 实体
* 实体组件
* 实体预设
* 实体标签
* 地图实体
* 渲染实体
* 可用的实体

输入
--

* 输入字母
* 输入系统
* 语音识别

# -进阶 Advanced-

网络
--

* 指令
* http请求
* 网络基础
* 延迟补偿
* 网络回调
* 网络类型
* 预测
* RPCs 过程调用
* Websockets双向通信

渲染
--

* 渲染标签
* 渲染Hook

物理
--

* 自定义模型实体物理
* Hitboxes

## UI界面

* 自定义字体
* 嵌入网站
* 启用指针事件
* 事件与输入
* 本地化
* UI基础
* 世界UI
* 自定义样式属性
* 支持的样式属性
* Razor专题

VR
--

* 在VR下的输入
* VR覆盖

## 编辑器及工具

* 自定义资产类型
* Hammer API
* Hammer小物件
* 热加载性能

杂项
--

* 后端API
* 本地数据ConVars

```
   ————更多的，请参考Valve开发者维基ConVar页面

```

* 代码存取表
* CPU性能分析
* 显示信息
* 在运行时挂载资产
* package/find
* Precaching
* 游戏存档
* 类型库
* 制作简易的AI
Traces

# 什么是 traces

追踪会发射一条假象的线。当你运行一次追踪时，你可能会得到一个追踪结果（TraceResult）-- 它会告诉你这条射线击中了什么。

例如，如果你作为玩家，想要生成一个盒子。你可以从玩家的眼球向玩家视线方向的 200 个单位运行追踪。TraceResult 会显示它击中了一个点，这时候盒子才能在正确的位置被放置。

# Tracing

追踪使用Trace静态函数构建，并使用成员方法进行配置。使用 Run() 运行追踪并获取结果。

```
var mytrace = Trace.Ray( startPos, endPos );
mytrace = mytrace.WorldOnly();
var result = mytrace.Run();

```

所有配置方法都会返回一个新的`Trace`对象。这是一种方便的做法（称为构建器模式），因此你可以这样格式化追踪：

```
var result = Trace.Ray( startPos, endPos ).WorldOnly().Run();

```

或者像这样：

```
var result = Trace.Ray( startPos, endPos )
 .Ignore( playerEntity )
 .Ignore( playerVehicle )
 .Size( 10 )
 .Run();

```

## Size

在上面的示例中，Size() 调用描述了要追踪的 AABB （轴对齐包围盒）的大小。

这意味着你不是在追踪一条简单的直线，而是沿着直线追踪一个更大的立方体。

请注意，这个立方体是轴对齐的，这意味着它不能 "旋转"。

## RunAll

您可以使用 RunAll() 函数来代替用 Run() 函数结束追踪。

使用 RunAll() 会告诉您的追踪程序，您不想在第一个被击中的实体停止。相反，它会返回一个数组，其中包含沿追踪路径被击中的每个实体的 TraceResult。

该函数的一个示例用例是子弹穿透物体。

```
// Will return TraceResult[] that you can iterate over
// 将返回可遍历的 TraceResult[] 结果
var tr = Trace.Ray( startPos, endPos )
 .RunAll();

```

# TraceResult

追踪结果是一个简单的结构体。它提供的信息包括追踪是否击中、击中的位置、击中了什么等。

在这里你可以看到测试追踪是否命中，并使用命中位置在其上方 10 个单位处生成一个实体。

```
if ( tr.Hit )
{
 var ent = new ModelEntity();
 ent.SetModel( "models/sbox\_props/watermelon/watermelon.vmdl" );
 ent.Position = tr.EndPosition + tr.Normal \* 10;
}

```

# Box, Sphere, Capsule, PhysicsBody traces

除了射线/直线追踪外，您还可以使用`Trace`类的其他静态方法追踪其他形状，例如轴对齐边框追踪：

```
public void TraceVisualizer( Player owner, float maxDist )
{
 // This function should be called every frame (for example in a Sandbox weapon or a tool Simulate method)
 // 此函数应每帧调用一次（例如在沙盒武器或工具模拟方法中）

 var startPos = owner.EyePosition;
 var dir = owner.EyeRotation.Forward;

 var box = new BBox( new Vector3( -30, -10, -30 ), new Vector3( 30, 0, 30 ) );

 // Can also do Trace.Ray( .. ).Size( box )
 // 也可以使用 Trace.Ray(..).Size(box)
 var tr = Trace.Box( box, startPos, startPos + ( dir \* maxDist ) )
 .WithAllTags( "solid" )
 .Ignore( owner )
 .Run();

 // Draw the line from start pos to hit pos
 // 绘制从起始位置到击中位置的直线
 DebugOverlay.Line( startPos, tr.HitPosition, Color.Yellow, 0f );

 // Move the box to the start position, and adjust for weird shapes, and draw the starting position.
 // 将方框移动到起始位置，并根据奇怪的形状进行调整，然后绘制起始位置。
 var startBox = box.Translate( startPos - box.Center );
 DebugOverlay.Box( startBox, Color.Yellow, 0f );

 // Move the box to the hit position, and adjust for weird shapes, and draw the final position.
 // 将方框移动到命中位置，并根据奇怪的形状进行调整，然后绘制最终位置。
 var finalBox = box.Translate( tr.HitPosition - box.Center );
 DebugOverlay.Box( finalBox, Color.Yellow, 0f );
}

```

请注意，包围盒是属于世界空间的，它的形状**不会**随着玩家的视角旋转而改变。

命中位置将始终位于给定形状的中心。其他形状（如球体和胶囊）的工作方式完全相同。

通过 Trace.Body，您可以追踪任何`PhysicsBody`，因此也可以追踪任何自定义形状。它**可以**保留体的旋转。
PawnInput

此页面需要校对！

 此页面可能为机翻或者经验不足者编写，请尽您所能的校对此页面

为了帮助你操作 Pawn，你可能需要从客户端提供一些特殊的输入数据。

## 客户端输入属性

你可以在Pawn上使用 [ClientInput] 特性或在实体组件上标记属性。

带有该特性的属性会自动序列化并发送到服务器。

## 构建输入

每帧  BuildInput() 都会在客户端调用。静态**输入类**可用于抓取原始输入数据，然后使用该数据设置任何带有[ClientInput] 特性的属性。

```
// 玩家 Pawn 类中的 BuildInput 方法示例。
[ClientInput] public Vector3 InputDirection { get; protected set; }
[ClientInput] public Angles ViewAngles { get; set; }

public override void BuildInput()
{
 InputDirection = Input.AnalogMove;

 var look = Input.AnalogLook;

 var viewAngles = ViewAngles;
 viewAngles += look;
 ViewAngles = viewAngles.Normal;
}

```

模拟
--

客户端每Tick一次都会发送一个命令，其中包含从 **BuildInput** 中生成的值。该命令会在 Game.Simulate( Client ) 中模拟每个客户端。

在 **Simulate( Client )** 中，静态输入类包含当前模拟客户端的特定输入，这样就可以在服务器和客户端上运行相同的代码进行预测。

```
// 玩家 Pawn 类中的模拟方法示例。

public override void Simulate( Client cl )
{
 if ( Input.Pressed( "jump" ) )
 {
 Velocity += Vector3.Up \* 100f;
 }

 Velocity += InputDirection \* 400f;
 Rotation = ViewAngles.ToRotation();
}

```

## 按钮状态

[ClientInput] 特性也可以是 **ButtonState**。通过该结构体，你可以将输入视为一个按钮，这样在模拟中就可以知道输入是**按下**还是**松开**，或者是**向下**。这可以让像**couch co-op**等操作变得更简单。

```
[ClientInput] public ButtonState Jump { get; set; }

public override void BuildInputs()
{
 if ( IsPlayerOne )
 Jump = Input.Down( "jump" );
 else if ( IsPlayerTwo )
 Jump = Input.Down( "drop" );
}

public override void Simulate( Client client )
{
 if ( Jump.Pressed )
 {
 Velocity += Vector3.Up \* 100f;
 }
}

```
Red Baron (Brave Storm)

Template:ArticleHero
Template:TokuMechaInfo

For other versions, see Red Baron (disambiguation).
**Red Baron** is a super robot featured in the Brave Storm film.

A gigantic robot with a crimson body that was build for five years by Kenichiro Kurenai after examining Black Baron's blueprints brought by the Kasuga siblings. In place of Black Baron's Planet Modulator, the Red Baron is powered through 100 million volts of electricity from the electrodes mounted in its body, which can discharge its powerful **Electrigger** (エレクトリッガー, *Erekutoriggā*) discharge beam attack.