Пример #1
0
 public SubSceneJob(RegionBase region, eSubSceneMode subSceneMode, eSubSceneType subSceneType, eSubSceneJobType jobType, Action <SubSceneJob> callback)
 {
     Region       = region;
     SubSceneMode = subSceneMode;
     SubSceneType = subSceneType;
     JobType      = jobType;
     Callback     = callback;
 }
Пример #2
0
        private void Update()
        {
            if (!isInitialized)
            {
                Debug.Log("d");
                return;
            }

            var cameraTransform = Camera.main.transform;
            var cameraPos = cameraTransform.position;
            var teleportPositions = new List<Vector3>();
            var halfSize = worldSize * 0.5f;

            //***********************************************
            //identifying teleport positions
            if (cameraPos.y > halfSize.y - preTeleportOffset)
            {
                teleportPositions.Add(cameraPos + new Vector3(0, -worldSize.y, 0));
            }
            else if (cameraPos.y < -halfSize.y + preTeleportOffset)
            {
                teleportPositions.Add(cameraPos + new Vector3(0, worldSize.y, 0));
            }

            if (cameraPos.z > halfSize.z - preTeleportOffset)
            {
                teleportPositions.Add(cameraPos + new Vector3(0, 0, -worldSize.z));
            }
            else if (cameraPos.z < -halfSize.z + preTeleportOffset)
            {
                teleportPositions.Add(cameraPos + new Vector3(0, 0, worldSize.z));
            }

            //***********************************************
            //updating one super region, getting a list of new jobs
            var newJobs = superRegionsList[currentSuperRegionIndex].UpdateSuperRegion(cameraTransform, teleportPositions);

            currentSuperRegionIndex++;
            if (currentSuperRegionIndex == superRegionsList.Count)
            {
                currentSuperRegionIndex = 0;
            }

            //***********************************************
            //cleaning and updating the list of SubSceneJobs
            foreach (var job in newJobs)
            {
                eSubSceneJobType oppositeJobType = job.JobType == eSubSceneJobType.Load ? eSubSceneJobType.Unload : eSubSceneJobType.Load;

                int indexOfOppositeJob = subSceneJobsList.FindIndex(
                    item => item.Region.Id == job.Region.Id
                    && item.JobType == oppositeJobType
                    && item.SubSceneMode == job.SubSceneMode
                    && item.SubSceneType == job.SubSceneType
                );

                if (indexOfOppositeJob >= 0)
                {
                    subSceneJobsList.RemoveAt(indexOfOppositeJob);
                }
            }

            foreach (var job in newJobs) //this is temporarily in its own loop, will change when/if priorities are added
            {
                subSceneJobsList.Add(job);
            }

            //***********************************************
            //executing jobs
            if (!isJobRunning && subSceneJobsList.Count != 0)
            {
                var newJob = subSceneJobsList[0];
                subSceneJobsList.RemoveAt(0);

                switch (newJob.JobType)
                {
                    case eSubSceneJobType.Load:
                        StartCoroutine(LoadSubSceneCR(newJob));
                        break;
                    case eSubSceneJobType.Unload:
                        StartCoroutine(UnloadSubSceneCR(newJob));
                        break;
                }
            }
        } //end of Update()