Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
guo450212436
et
提交
00ec24d5
E
et
项目概览
guo450212436
/
et
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
E
et
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
00ec24d5
编写于
2月 19, 2019
作者:
T
tanghai
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
1.修复SceneChangeComopent Dispose一个bug
2.修复Book中两处错误
上级
f393b8c2
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
22 addition
and
21 deletion
+22
-21
Book/3.3一切皆组件.md
Book/3.3一切皆组件.md
+15
-16
Book/3.4事件机制EventSystem.md
Book/3.4事件机制EventSystem.md
+2
-2
Unity/Assets/Model/Component/SceneChangeComponent.cs
Unity/Assets/Model/Component/SceneChangeComponent.cs
+4
-2
Unity/ProjectSettings/ProjectVersion.txt
Unity/ProjectSettings/ProjectVersion.txt
+1
-1
未找到文件。
Book/3.3一切皆组件.md
浏览文件 @
00ec24d5
...
...
@@ -28,22 +28,21 @@ ET的这种设计数据是一种树状的结构,非常有层次,能够非常
# 组件的一些细节
### 1.组件的创建
组件的创建不要自己去new,应该统一使用ComponentFactory创建。ComponentFactory提供了三组方法用来创建组件Create,CreateWithParent,CreateWithId。Create是最简单的创建方式,它做了几个处理
a. 根据组件类型构造一个组件
b. 将组件加入事件系统,并且抛出一个AwakeSystem
c. 是否启用对象池
CreateWithParent在Create的基础上提供了一个Parent对象,设置到Component.Parent字段上。CreateWithId是用来创建ComponentWithId或者其子类的,在Create的基础上可以自己设置一个Id
Component在创建的时候可以选择是否使用对象池。三类工厂方法都带有一个fromPool的参数,默认是true。
组件的创建不要自己去new,应该统一使用ComponentFactory创建。ComponentFactory提供了三组方法用来创建组件Create,CreateWithParent,CreateWithId。Create是最简单的创建方式,它做了几个处理
a. 根据组件类型构造一个组件
b. 将组件加入事件系统,并且抛出一个AwakeSystem
c. 是否启用对象池
CreateWithParent在Create的基础上提供了一个Parent对象,设置到Component.Parent字段上。CreateWithId是用来创建ComponentWithId或者其子类的,在Create的基础上可以自己设置一个Id, Component在创建的时候可以选择是否使用对象池。三类工厂方法都带有一个fromPool的参数,默认是true。
### 2.组件的释放
Component都继承了一个IDisposable接口,需要注意,Component有非托管资源,删除一个Component必须调用该接口。该接口做了如下的操作
a. 抛出Destroy System
b. 如果组件是使用对象池创建的,那么在这里会放回对象池
c. 从全局事件系统(EventSystem)中删除该组件,并且将InstanceId设为0
如果组件挂载Entity身上,那么Entity调用Dispose的时候会自动调用身上所有Component的Dispose方法。
Component都继承了一个IDisposable接口,需要注意,Component有非托管资源,删除一个Component必须调用该接口。该接口做了如下的操作
a. 抛出Destroy System
b. 如果组件是使用对象池创建的,那么在这里会放回对象池
c. 从全局事件系统(EventSystem)中删除该组件,并且将InstanceId设为0
如果组件挂载Entity身上,那么Entity调用Dispose的时候会自动调用身上所有Component的Dispose方法。
### 3.InstanceId的作用
任何Component都带有一个InstanceId字段,这个字段会在组件构造,或者组件从对象池取出的时候重新设置,这个InstanceId标识这个组件的身份。为什么需要这么一个字段呢?有以下几个原因
1.
对象池的存在,组件未必会释放,而是回到对象池中。在异步调用中,很可能这个组件已经被释放了,然后又被重新利用了起来,这样我们需要一种方式能区分之前的组件对象是否已经被释放,例如下面这段代码:
任何Component都带有一个InstanceId字段,这个字段会在组件构造,或者组件从对象池取出的时候重新设置,这个InstanceId标识这个组件的身份。为什么需要这么一个字段呢?有以下几个原因
1.
对象池的存在,组件未必会释放,而是回到对象池中。在异步调用中,很可能这个组件已经被释放了,然后又被重新利用了起来,这样我们需要一种方式能区分之前的组件对象是否已经被释放,例如下面这段代码:
```
csharp
public
static
async
ETVoid
UpdateAsync
(
this
ActorLocationSender
self
)
{
...
...
@@ -76,5 +75,5 @@ c. 从全局事件系统(EventSystem)中删除该组件,并且将InstanceId设
}
}
```
while (true)中是段异步方法,await self.GetAsync()之后很可能ActorLocationSender对象已经被释放了,甚至有可能这个对象又被其它逻辑从对象池中再次利用了起来。我们这时候可以通过InstanceId的变化来判断这个对象是否已经被释放掉。
2.
InstanceId是全局唯一的,并且带有位置信息,可以通过InstanceId来找到对象的位置,将消息发给对象。这个设计将会Actor消息中利用到。这里暂时就不讲了。
\ No newline at end of file
while (true)中是段异步方法,await self.GetAsync()之后很可能ActorLocationSender对象已经被释放了,甚至有可能这个对象又被其它逻辑从对象池中再次利用了起来。我们这时候可以通过InstanceId的变化来判断这个对象是否已经被释放掉。
2.
InstanceId是全局唯一的,并且带有位置信息,可以通过InstanceId来找到对象的位置,将消息发给对象。这个设计将会Actor消息中利用到。这里暂时就不讲了。
\ No newline at end of file
Book/3.4事件机制EventSystem.md
浏览文件 @
00ec24d5
...
...
@@ -51,9 +51,9 @@ ET提供了多种事件,事件都是可以多次订阅的:
5.
ChangeSystem,组件内容改变时抛出,需要开发者手动触发
```
csharp
// 订阅Player的Destroy事件
public
class
Player
DestroySystem
:
Destroy
System
<
Player
>
public
class
Player
ChangeSystem
:
Change
System
<
Player
>
{
public
override
void
Destroy
(
Player
self
)
public
override
void
Change
(
Player
self
)
{
}
}
...
...
Unity/Assets/Model/Component/SceneChangeComponent.cs
浏览文件 @
00ec24d5
...
...
@@ -56,10 +56,12 @@ namespace ETModel
if
(
this
.
Entity
.
IsDisposed
)
{
this
.
Entity
.
RemoveComponent
<
SceneChangeComponent
>()
;
return
;
}
base
.
Dispose
();
this
.
Entity
.
RemoveComponent
<
SceneChangeComponent
>();
}
}
}
\ No newline at end of file
Unity/ProjectSettings/ProjectVersion.txt
浏览文件 @
00ec24d5
m_EditorVersion: 2018.3.
5
f1
m_EditorVersion: 2018.3.
6
f1
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录