//执行创建物体 private void CreateInternal(SeparateEntity data) { //加入已加载列表 mLoadedEntityList.Add(data); //创建物体 CreateEntity(data, mIsAsyn); }
/// <summary> /// 同步方式销毁物体 /// </summary> /// <param name="obj"></param> private void DestroyEntitySync(SeparateEntity entity) { if (entity.processFlag == SeparateEntity.CreatingProcessFlag.IsPrepareCreate)//如果物体标记为IsPrepareCreate表示物体未创建并正在等待创建,则直接设为None并放回 { entity.processFlag = SeparateEntity.CreatingProcessFlag.None; return; } entity.OnHide();//执行OnHide }
/// <summary> /// 同步方式创建物体 /// </summary> /// <param name="obj"></param> private void CreateEntitySync(SeparateEntity entity) { if (entity.processFlag == SeparateEntity.CreatingProcessFlag.IsPrepareDestroy)//如果标记为IsPrepareDestroy表示物体已经创建并正在等待删除,则直接设为None并返回 { entity.processFlag = SeparateEntity.CreatingProcessFlag.None; return; } entity.OnShow();//执行OnShow }
/// <summary> /// 异步处理 /// </summary> /// <param name="obj"></param> /// <param name="create"></param> private void ProcessEntityAsyn(SeparateEntity entity, bool create) { if (create) { if (entity.processFlag == SeparateEntity.CreatingProcessFlag.IsPrepareDestroy)//表示物体已经创建并等待销毁,则设置为None并跳过 { entity.processFlag = SeparateEntity.CreatingProcessFlag.None; return; } if (entity.processFlag == SeparateEntity.CreatingProcessFlag.IsPrepareCreate)//已经开始等待创建,则跳过 { return; } entity.processFlag = SeparateEntity.CreatingProcessFlag.IsPrepareCreate;//设置为等待开始创建 } else { if (entity.processFlag == SeparateEntity.CreatingProcessFlag.IsPrepareCreate)//表示物体未创建并等待创建,则设置为None并跳过 { entity.processFlag = SeparateEntity.CreatingProcessFlag.None; return; } if (entity.processFlag == SeparateEntity.CreatingProcessFlag.IsPrepareDestroy)//已经开始等待销毁,则跳过 { return; } entity.processFlag = SeparateEntity.CreatingProcessFlag.IsPrepareDestroy;//设置为等待开始销毁 } if (mProcessTaskQueue == null) { mProcessTaskQueue = new Queue <SeparateEntity>(); } mProcessTaskQueue.Enqueue(entity);//加入 if (!mIsTaskRunning) { StartCoroutine(AsynTaskProcess());//开始协程执行异步任务 } }
/// <summary> /// 创建物体 /// </summary> /// <param name="obj"></param> /// <param name="asyn"></param> private void CreateEntity(SeparateEntity entity, bool asyn) { if (entity == null) { return; } if (entity.targetEntity == null) { return; } if (entity.createFlag == SeparateEntity.CreateFlag.None) { if (!asyn) { CreateEntitySync(entity); } else { ProcessEntityAsyn(entity, true); } entity.createFlag = SeparateEntity.CreateFlag.New;//被创建的物体标记为New } }
/// <summary> /// 删除物体 /// </summary> /// <param name="obj"></param> /// <param name="asyn"></param> private void DestroyEntity(SeparateEntity entity, bool asyn) { if (entity == null) { return; } if (entity.createFlag == SeparateEntity.CreateFlag.None) { return; } if (entity.targetEntity == null) { return; } if (!asyn) { DestroyEntitySync(entity); } else { ProcessEntityAsyn(entity, false); } entity.createFlag = SeparateEntity.CreateFlag.None;//被删除的物体标记为None }
/// <summary> /// 四叉树触发处理函数 /// </summary> /// <param name="data">与当前包围盒发生触发的场景物体</param> void OnTrigger(IEntity data) { if (data == null) { return; } SeparateEntity entity = data as SeparateEntity; if (entity.createFlag == SeparateEntity.CreateFlag.Old) //如果发生触发的物体已经被创建则标记为新物体,以确保不会被删掉 { entity.weight++; entity.createFlag = SeparateEntity.CreateFlag.New; } else if (entity.createFlag == SeparateEntity.CreateFlag.OutofBounds)//如果发生触发的物体已经被标记为超出区域,则从待删除列表移除该物体,并标记为新物体 { entity.createFlag = SeparateEntity.CreateFlag.New; mLoadedEntityList.Add(entity); } else if (entity.createFlag == SeparateEntity.CreateFlag.None) //如果发生触发的物体未创建则创建该物体并加入已加载的物体列表 { CreateInternal(entity); } }
/// <summary> /// 添加场景物体 /// </summary> /// <param name="obj"></param> public void AddSceneEntity(IEntity entity) { if (!mIsInitialized) { return; } if (mSeparateTree == null) { return; } if (entity == null) { return; } //使用SeparateEntity包装 SeparateEntity se = new SeparateEntity(entity); mSeparateTree.Add(se); //如果当前触发器存在,直接物体是否可触发,如果可触发,则创建物体 if (mDetector != null && mDetector.IsDetected(se.bounds)) { CreateInternal(se); } }