Skip to content

Commit 804dfa0

Browse files
committed
更新实体预制件说明
1 parent e7e7bb0 commit 804dfa0

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ G-Framework 不仅提供了优秀的实体组件系统(ECS)核心,还结
3636
- [输入管理器](docs/input-manager.md) 管理游戏输入,如键盘、鼠标和触摸事件,并在合适的时机同步输入状态
3737
- [游戏同步策略](docs/sync-strategy.md) 针对游戏同步提供了多种策略,如状态插值、状态压缩等,按需选择使用。
3838
- [对象池](docs/object-pool.md) 提供了一种高效的对象管理方式,通过重用对象来避免频繁的对象创建和销毁,可以用于管理游戏中的实体,如子弹、角色等。
39+
- [实体预制件](docs/entity-prefab.md) 提供了对预制体的管理功能,包括注册、注销以及从预制体创建新实体等功能。它是一个事先配置好的实体模板,我们可以从中快速复制(实例化)出新的实体
3940

4041
G-Framework 通过提供这些实用模块,让您在游戏开发过程中专注于逻辑实现,更快速地满足项目需求。这些模块针对帧同步做了大量优化,确保您的项目在采用帧同步时获得较佳的性能表现。
4142

docs/entity-prefab.md

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# 实体预制件
2+
在g-framework中,我们知道游戏中的许多对象(例如:敌人,道具,特效等)可能需要反复创建和销毁。如果每次需要这些对象时都手动创建一个全新的实例,这不仅编程繁琐,而且可能对性能产生负面影响,特别是在大量对象频繁创建和销毁的情况下。
3+
4+
实体预制体(Entity Prefabs)提供了一个高效的方式来解决这个问题。预制体是一个事先配置好的实体模板,我们可以从中快速复制(实例化)出新的实体,这样,我们只需要在游戏初始化的时候创建并配置好预制体,之后就可以快速地从预制体创建新的实体,这不仅简化了代码,也提高了性能。
5+
6+
EntityManager类提供了对预制体的管理功能,包括注册、注销以及从预制体创建新实体等功能。
7+
8+
## createEntityFromPrefab
9+
从预制件创建实体。
10+
11+
```typescript
12+
public createEntityFromPrefab(name: string, deepCopy: boolean = false): Entity | null;
13+
```
14+
参数
15+
- name - 预制件的名称。
16+
- deepCopy - 是否进行深复制,默认为 false。
17+
18+
返回值
19+
- 如果找到预制件,返回新创建的实体;
20+
- 如果没有找到对应名称的预制件,返回 null。
21+
22+
### 使用示例
23+
```typescript
24+
let entityManager = gs.Core.instnace.entityManager;
25+
let entity = entityManager.createEntityFromPrefab("monster", true);
26+
```
27+
28+
## registerPrefab
29+
注册预制件。
30+
31+
```typescript
32+
public registerPrefab(name: string, entity: Entity): void;
33+
```
34+
35+
参数
36+
- name - 预制件的名称。
37+
- entity - 实体对象。
38+
使用示例
39+
```typescript
40+
let entityManager = gs.Core.instnace.entityManager;
41+
let monster = new gs.Entity();
42+
entityManager.registerPrefab("monster", monster);
43+
```
44+
45+
### unregisterPrefab
46+
注销预制件。
47+
48+
```typescript
49+
public unregisterPrefab(name: string): void;
50+
```
51+
52+
参数
53+
- name - 预制件的名称。
54+
55+
使用示例
56+
```typescript
57+
let entityManager = gs.Core.instnace.entityManager;
58+
entityManager.unregisterPrefab("monster");
59+
```
60+
61+
## 为什么要使用预制体
62+
63+
预制体的一个主要优点是可以将实体的创建和配置从使用它的地方分离出来。如果不使用预制体,每次需要一个新的实体,都需要创建一个新的实体,并对其进行一系列的配置,这不仅使得代码冗余,而且降低了效率。
64+
65+
使用预制体,你只需要创建并配置一次实体,之后就可以多次从预制体创建新的实体,这极大地简化了代码,提高了代码的复用性,同时也提高了运行时的性能。
66+
67+
除此之外,预制体还支持深复制和浅复制两种方式。浅复制是共享同一份资源,这意味着所有的实体都会共享同样的属性和状态,
68+
69+
## 示例
70+
71+
首先,我们假设有一个基础的Entity类,它可以是一个游戏中的角色,敌人,道具等,每个实体都有自己的特性和属性。为了示例的目的,我们简单定义一个带有名字的Entity类。
72+
73+
我们的游戏需要大量的“monster”实体。手动创建大量相同的实体会非常繁琐且效率低下,因此我们会创建一个“monster”实体的预制件,并将其注册到EntityManager中。
74+
75+
```typescript
76+
let entityManager = gs.Core.instnace.entityManager;
77+
let monsterPrefab = entityManager.createEntity();
78+
// 你可以再这里添加一些组件给这个实体,例如:
79+
// monsterPrefab.addComponent(PositionComponent);
80+
entityManager.registerPrefab("monster", monsterPrefab);
81+
```
82+
83+
在这个阶段,我们创建了一个monster的实体,并注册为预制件。接下来,我们想创建更多的monster实体,我们就可以通过预制件来创建:
84+
85+
```typescript
86+
let monster1 = entityManager.createEntityFromPrefab("monster");
87+
let monster2 = entityManager.createEntityFromPrefab("monster");
88+
```
89+
90+
在这个阶段,我们成功创建了两个新的monster实体,它们都是基于monster预制件创建的。如果我们不再需要monster预制件,我们可以将其从EntityManager中注销:
91+
92+
```typescript
93+
entityManager.unregisterPrefab("monster");
94+
```
95+
96+
这样一来,monster预制件就被成功移除了。如果我们再尝试从这个预制件创建实体,将会返回null,因为没有找到monster预制件:
97+
98+
```typescript
99+
let monster3 = entityManager.createEntityFromPrefab("monster");
100+
```

0 commit comments

Comments
 (0)