コード例 #1
0
 //执行创建物体
 private void CreateInternal(SeparateEntity data)
 {
     //加入已加载列表
     mLoadedEntityList.Add(data);
     //创建物体
     CreateEntity(data, mIsAsyn);
 }
コード例 #2
0
 /// <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
 }
コード例 #3
0
 /// <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
 }
コード例 #4
0
 /// <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());//开始协程执行异步任务
     }
 }
コード例 #5
0
 /// <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
     }
 }
コード例 #6
0
 /// <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
 }
コード例 #7
0
    /// <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);
        }
    }
コード例 #8
0
    /// <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);
        }
    }