Explorar o código

1.修复SceneChangeComopent Dispose一个bug
2.修复Book中两处错误

tanghai %!s(int64=7) %!d(string=hai) anos
pai
achega
00ec24d595

+ 14 - 15
Book/3.3一切皆组件.md

@@ -28,22 +28,21 @@ ET的这种设计数据是一种树状的结构,非常有层次,能够非常
 
 
 # 组件的一些细节
 # 组件的一些细节
 ### 1.组件的创建
 ### 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.组件的释放
 ### 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的作用
 ### 3.InstanceId的作用
-任何Component都带有一个InstanceId字段,这个字段会在组件构造,或者组件从对象池取出的时候重新设置,这个InstanceId标识这个组件的身份。为什么需要这么一个字段呢?有以下几个原因
-1.对象池的存在,组件未必会释放,而是回到对象池中。在异步调用中,很可能这个组件已经被释放了,然后又被重新利用了起来,这样我们需要一种方式能区分之前的组件对象是否已经被释放,例如下面这段代码:
+任何Component都带有一个InstanceId字段,这个字段会在组件构造,或者组件从对象池取出的时候重新设置,这个InstanceId标识这个组件的身份。为什么需要这么一个字段呢?有以下几个原因  
+1. 对象池的存在,组件未必会释放,而是回到对象池中。在异步调用中,很可能这个组件已经被释放了,然后又被重新利用了起来,这样我们需要一种方式能区分之前的组件对象是否已经被释放,例如下面这段代码:
 ```csharp
 ```csharp
 		public static async ETVoid UpdateAsync(this ActorLocationSender self)
 		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消息中利用到。这里暂时就不讲了。
+while (true)中是段异步方法,await self.GetAsync()之后很可能ActorLocationSender对象已经被释放了,甚至有可能这个对象又被其它逻辑从对象池中再次利用了起来。我们这时候可以通过InstanceId的变化来判断这个对象是否已经被释放掉。  
+2. InstanceId是全局唯一的,并且带有位置信息,可以通过InstanceId来找到对象的位置,将消息发给对象。这个设计将会Actor消息中利用到。这里暂时就不讲了。

+ 2 - 2
Book/3.4事件机制EventSystem.md

@@ -51,9 +51,9 @@ ET提供了多种事件,事件都是可以多次订阅的:
 5. ChangeSystem,组件内容改变时抛出,需要开发者手动触发
 5. ChangeSystem,组件内容改变时抛出,需要开发者手动触发
 ```csharp
 ```csharp
     // 订阅Player的Destroy事件
     // 订阅Player的Destroy事件
-    public class PlayerDestroySystem: DestroySystem<Player>
+    public class PlayerChangeSystem: ChangeSystem<Player>
     {
     {
-        public override void Destroy(Player self)
+        public override void Change(Player self)
         {
         {
         }
         }
     }
     }

+ 4 - 2
Unity/Assets/Model/Component/SceneChangeComponent.cs

@@ -56,10 +56,12 @@ namespace ETModel
 
 
 			if (this.Entity.IsDisposed)
 			if (this.Entity.IsDisposed)
 			{
 			{
-				this.Entity.RemoveComponent<SceneChangeComponent>();
+				return;
 			}
 			}
-
+			
 			base.Dispose();
 			base.Dispose();
+			
+			this.Entity.RemoveComponent<SceneChangeComponent>();
 		}
 		}
 	}
 	}
 }
 }

+ 1 - 1
Unity/ProjectSettings/ProjectVersion.txt

@@ -1 +1 @@
-m_EditorVersion: 2018.3.5f1
+m_EditorVersion: 2018.3.6f1