diff --git "a/Book/3.3\344\270\200\345\210\207\347\232\206\347\273\204\344\273\266.md" "b/Book/3.3\344\270\200\345\210\207\347\232\206\347\273\204\344\273\266.md" index 3432240b4868acfa0848fcffcbf4e23815a8c277..0f13f5428b6ba75a4bedc0542e890d503f21686c 100644 --- "a/Book/3.3\344\270\200\345\210\207\347\232\206\347\273\204\344\273\266.md" +++ "b/Book/3.3\344\270\200\345\210\207\347\232\206\347\273\204\344\273\266.md" @@ -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 diff --git "a/Book/3.4\344\272\213\344\273\266\346\234\272\345\210\266EventSystem.md" "b/Book/3.4\344\272\213\344\273\266\346\234\272\345\210\266EventSystem.md" index bc66ac5235d37aec348f1801999b9abb15960369..78472b7c6fad2906a157bd95f7c3803799bbf4af 100644 --- "a/Book/3.4\344\272\213\344\273\266\346\234\272\345\210\266EventSystem.md" +++ "b/Book/3.4\344\272\213\344\273\266\346\234\272\345\210\266EventSystem.md" @@ -51,9 +51,9 @@ ET提供了多种事件,事件都是可以多次订阅的: 5. ChangeSystem,组件内容改变时抛出,需要开发者手动触发 ```csharp // 订阅Player的Destroy事件 - public class PlayerDestroySystem: DestroySystem + public class PlayerChangeSystem: ChangeSystem { - public override void Destroy(Player self) + public override void Change(Player self) { } } diff --git a/Unity/Assets/Model/Component/SceneChangeComponent.cs b/Unity/Assets/Model/Component/SceneChangeComponent.cs index ed1a9cde59043512bfcbd09df9c7a47d5f38c75e..a9c5b6fa46104c73ee7a242d910ebe0c7749707e 100644 --- a/Unity/Assets/Model/Component/SceneChangeComponent.cs +++ b/Unity/Assets/Model/Component/SceneChangeComponent.cs @@ -56,10 +56,12 @@ namespace ETModel if (this.Entity.IsDisposed) { - this.Entity.RemoveComponent(); + return; } - + base.Dispose(); + + this.Entity.RemoveComponent(); } } } \ No newline at end of file diff --git a/Unity/ProjectSettings/ProjectVersion.txt b/Unity/ProjectSettings/ProjectVersion.txt index 6128d74131bbd72512d8b9eff713fc53c1d39f7d..1b2cd94c5b98f6cdc98491abf302a47cbf9df92e 100644 --- a/Unity/ProjectSettings/ProjectVersion.txt +++ b/Unity/ProjectSettings/ProjectVersion.txt @@ -1 +1 @@ -m_EditorVersion: 2018.3.5f1 +m_EditorVersion: 2018.3.6f1