diff --git "a/DungeonShooting_Document/\351\241\271\347\233\256\345\270\256\345\212\251\346\226\207\346\241\243.md" "b/DungeonShooting_Document/\351\241\271\347\233\256\345\270\256\345\212\251\346\226\207\346\241\243.md" index 2cbd964..a2b0bbc 100644 --- "a/DungeonShooting_Document/\351\241\271\347\233\256\345\270\256\345\212\251\346\226\207\346\241\243.md" +++ "b/DungeonShooting_Document/\351\241\271\347\233\256\345\270\256\345\212\251\346\226\207\346\241\243.md" @@ -104,13 +104,13 @@ } ``` 为了方便区分物体类型, 可以使用`ActivityIdPrefix`类中的常量来添加`id`前缀, 目前支持的类型如下: -* Role: 角色 -* Enemy: 敌人 -* Weapon: 武器 -* Bullet: 子弹 -* Shell: 弹壳 -* Other: 其他类型, 例如门, 箱子等 -* Test: 测试物体 +* **Role**: 角色 +* **Enemy**: 敌人 +* **Weapon**: 武器 +* **Bullet**: 子弹 +* **Shell**: 弹壳 +* **Other**: 其他类型, 例如门, 箱子等 +* **Test**: 测试物体 例如我们创建一个敌人, 那么`[RegisterActivity()]`就可以这么写: ```csharp @@ -123,7 +123,7 @@ var enemy = ActivityObject.Create(ActivityIdPrefix.Enemy + "0001"); ``` -### 3.2.4.自定义`RegisterActivity` +#### 3.2.4.自定义`RegisterActivity` 某些情况下需要更改`RegisterActivity`的参数, 或者需要对实例化出来的`ActivityInstance`进行统一的操作, 那么就需要我们自己写一个子类来继承`RegisterActivity`. 操作`ActivityInstance`需要重写: ```csharp @@ -138,9 +138,9 @@ 例子: 注册武器, [RegisterWeapon.cs](../DungeonShooting_Godot/src/game/item/weapon/RegisterWeapon.cs) 由于创建武器必须指定武器属性数据, 那么原来的`[RegisterActivity()]`就不适用了, `RegisterWeapon`重写了构造函数, 改变了初始化参数, 并且重写`CustomHandler()`, 对`ActivityInstance`进行初始化属性操作 -### 3.2.5.`ActivityObject`常用功能 +#### 3.2.5.`ActivityObject`常用功能 -#### 自定义组件 +##### 自定义组件 这个功能类似于`Unity`的`MonoBehaviour`, 组件必须继承`Component`类, 组件的作用是拆分功能代码, 开发者可以将相同功能的代码放入同一个组件中, 与`Godot`的`Node`不同的是, 挂载到`ActivityObject`上的组件并不会生成一个`Node`节点, 它相比于`Node`更加轻量 自定义组件代码: @@ -156,7 +156,7 @@ ``` 注意: 一个`ActivityObject`上不允许挂载多个相同的组件 -#### 运动控制 +##### 运动控制 `ActivityObject`的移动由自身的`MoveController`组件控制, 非特殊情况下不要直接修改`ActivityObject`的位置, 而是使用`MoveController.AddConstantForce()`函数来添加外力 ```csharp //添加一个向右的外力, 速度为100 @@ -167,7 +167,7 @@ ``` 物体的运动方向就是所有外力总和的方向, 通过`MoveController.Velocity`可以获取当前运动速度 -#### 垂直方向运动 +##### 垂直方向运动 当游戏中需要制作飞行物体或者模拟投抛运动时, 就需要控制物体纵轴所处高度, `ActivityObject`中提供了一系列控制纵轴方向运动的属性和函数, 以下列举几个关键属性和函数: ```csharp /// @@ -249,7 +249,7 @@ ``` 调用示例, 模拟弹壳投抛落在地上弹跳的过程 ```csharp -var startPos = activityInstance.Master.GlobalPosition; +var startPos = GlobalPosition; var startHeight = 6; var direction = GlobalRotationDegrees + Utils.RandomRangeInt(-30, 30) + 180; var verticalSpeed = Utils.RandomRangeInt(60, 120); @@ -259,4 +259,63 @@ shell.Throw(startPos, startHeight, verticalSpeed, velocity, rotate); ``` -#### 协程 +##### 协程 +该功能与`Unity`的协程功能类似, 在协程函数中通过`yield`关键字暂停执行后面的代码, 并将控制权返还给`ActivityObject`, 协程常被用在动画处理和资源异步加载 +`ActivityObject`中协程相关函数: +```csharp +/// +/// 开启一个协程, 返回协程 id, 协程是在普通帧执行的, 支持: 协程嵌套, WaitForSeconds, WaitForFixedProcess +/// +public long StartCoroutine(IEnumerator able); + +/// +/// 根据协程 id 停止协程 +/// +public void StopCoroutine(long coroutineId); + +/// +/// 停止所有协程 +/// +public void StopAllCoroutine(); +``` +协程`yield return`返回特殊值类型如下: +* **WaitForSeconds**: 当前协程等待秒数 +* **WaitForFixedProcess**: 当前协程等待帧数 +* **IEnumerator**: 嵌套执行子协程, 等子协程执行完毕后才会继续执行后面的代码 + +协程`yield return`如果返回除以上数据类型以外的数据, 将忽略返回值 + +调用实例, 以下代码在`ActivityInstance`初始化时执行协程`StartRotation`, 协程在60帧内让物体每帧角度加1 +```csharp +public override void OnInit() +{ + StartCoroutine(StartRotation()); +} + +private IEnumerator StartRotation() +{ + for (int i = 0; i < 60; i++) + { + RotationDegrees += 1; + //结束这一帧, 返回0会被忽略返回值 + yield return 0; + } +} +``` + +### 3.3.地牢房间 +#### 3.3.1.地牢房间概述 + + +#### 3.3.2.地牢生成规则 + + +#### 3.3.3.创建模板房间 + + +### 3.4.UI系统 +#### 3.4.1.UI系统概述 + +#### 3.4.2.UI代码生器 + +#### 3.4.3.常用功能 \ No newline at end of file