示例#1
0
        public override void OnEnter(TankEternalGameState prevState, object parameter)
        {
            if (playerPawn == null)
            {
                playerPawn             = Context.PlayerPawn;
                playerPawnStateMachine = playerPawn.StateMachine;
            }

            Context.CameraHolder.Follow(playerPawn.transform);

            Context.UiController.StateMachine.SetState <PlayTankEternalUiState>();
        }
        private void Awake()
        {
            var levelSettings = SettingsSet.LevelSettings;


            // Input manager setup
            GameInputManager = new TankEternalGameInputManager
            {
                InputEnabled          = true,
                StandaloneInputModule = StandaloneInputModule,
                GameInputHandler      = StateMachine,
                Camera               = CameraHolder.Camera,
                CameraDistance       = levelSettings.CameraDistance,
                FireButtonName       = this.FireButtonName,
                NextWeaponButtonName = this.NextWeaponButtonName,
                PrevWeaponButtonName = this.PrevWeaponButtonName
            };
            GameInputManager.Init();

            // State Machine setup
            StateMachine.Init();

            // Level setup // todo Move to a separate class and call it each time Game Begins
            float levelWidth  = Random.Range(levelSettings.LevelMinWidth, levelSettings.LevelMaxWidth);
            float levelHeight = Random.Range(levelSettings.LevelMinHeight, levelSettings.LevelMaxHeight);

            LevelLeftBorder   = -levelWidth / 2f;
            LevelRightBorder  = levelWidth / 2f;
            LevelBottomBorder = -levelHeight / 2f;
            LevelTopBorder    = levelHeight / 2f;

            BackgroundRectangleSpawner.CuboidArea.Size.x = levelWidth * 1.5f;
            BackgroundRectangleSpawner.CuboidArea.Size.z = levelHeight * 1.5f;
            BackgroundRectangleSpawner.ObjectNumber      = (int)(levelWidth + levelHeight);

            BackgroundRectangleSpawner.Spawn(); // todo Rework Spawner so it will have ability to Shuffle Rectangles positions without recreating them
            Destroy(BackgroundRectangleSpawner);

            int obstaclesSpawnAmount = levelSettings.ObstaclesSpawnAmount;

            var obstaclePrefabs = levelSettings.ObstaclePrefabs;

            for (int index = 0; index < obstaclesSpawnAmount; index++)
            {
                var obstaclePrefab = obstaclePrefabs[Random.Range(0, obstaclePrefabs.Length)];
                var obstacle       = Instantiate(obstaclePrefab);

                var spawnPosition = new Vector3(Random.Range(LevelLeftBorder, LevelRightBorder), 0f,
                                                Random.Range(LevelBottomBorder, LevelTopBorder));

                obstacle.transform.localPosition = spawnPosition;
            }
            LevelNavMeshQuadTransform.localScale = new Vector3(levelWidth, levelHeight, 1f);
            NavMeshSurface.BuildNavMesh();

            // PlayerBullet Pawn setup
            PlayerPawn = Instantiate(playerPawnPrefab);

            PlayerPawn.GameController = this;

            PlayerPawn.Init();

            // Enemy Pawns setup
            var enemySettings = SettingsSet.EnemySettings;

            EnemyPawnObjectPool.InitialSize  = enemySettings.MaxEnemyAmount;
            EnemyPawnObjectPool.AbleToExpand = false;
            EnemyPawnObjectPool.Init();

            var enemies = EnemyPawnObjectPool.AvailableObjects;

            for (int index = 0; index < enemies.Count; index++)
            {
                var enemy = (TankEternalEnemyPawn)enemies[index];
                enemy.PlayerPawn = PlayerPawn;
                enemy.Init();
            }

            enemySpawnDelay        = enemySettings.SpawnDelay;
            enemySpawnCurrentDelay = enemySpawnDelay;

            var screenWorldBorders = GameInputManager.ScreenToWorldPoint(new Vector2(Screen.width, Screen.height));

            ScreenWorldHalfWidth  = screenWorldBorders.x;
            ScreenWorldHalfHeight = -screenWorldBorders.y;

            // Camera setup
            CameraHolder.CameraOffset = new Vector3(0.0f, levelSettings.CameraDistance, 0.0f);

            CameraHolder.Init();

            // Ui setup
            UiController.GameController = this;

            UiController.Init();
        }