diff --git a/data/FirstPersonShooter.world b/data/FirstPersonShooter.world index d7bcd7a..5923890 100644 --- a/data/FirstPersonShooter.world +++ b/data/FirstPersonShooter.world @@ -2557,7 +2557,9 @@ guid://89640b0d7ffa9f7f02a1a97753abc138ef6e3f24 - + + 30 + 1 -7.1054274e-15 2.9611872e-16 0.0 7.1054274e-15 1 2.4335929e-08 0.0 -2.9611893e-16 -2.4335929e-08 1 0.0 5.5368699e-21 3.765877e-14 0 1.0 @@ -2577,9 +2579,31 @@ 3 1 0 0 0.0 0 1 0 0.0 0 0 1 0.0 0 0 0 1.0 - - guid://1052eb5f16b3c132e06baee99e58ab34533a5d03 - 1 0 0 0.0 0 1 0 0.0 0 0 1 0.0 0.075533859 5.9413724 1.5 1.0 + + + + 0 + 472769653 + 577391737 + guid://1052eb5f16b3c132e06baee99e58ab34533a5d03 + 3 + + + 1 0 0 0.0 0 1 0 0.0 0 0 1 0.0 0 0 0 1.0 + + + 1 0 0 0.0 0 1 0 0.0 0 0 1 0.0 -5.45014 -1.9063964 0.99999994 1.0 + + + 75 + 0.300000012 + 100000 + 0 0 -1 0 + 0 + 0 + 1 + 1 + -0.8171438 -0.57643408 4.1443864e-06 0.0 0.038207922 -0.054155827 0.99780136 0.0 -0.57516634 0.81534731 0.066277385 0.0 -4.7989421 17.581108 4.3357677 1.0 diff --git a/data/csharp_template/FP_controller/components/Bullet.cs b/data/csharp_template/FP_controller/components/Bullet.cs index 9e7f0d4..4551807 100644 --- a/data/csharp_template/FP_controller/components/Bullet.cs +++ b/data/csharp_template/FP_controller/components/Bullet.cs @@ -48,6 +48,16 @@ private void Update() hitEffect.WorldPosition = hitInfo.Point; hitEffect.SetWorldDirection(hitInfo.Normal, vec3.UP, MathLib.AXIS.Y); + // проверяем объект, в который попали (hitObject), игрок ли это и есть ли у него компонента Health + Health health = hitObject.GetComponent(); + if (health && hitObject.GetComponentInParent()) + { + // применяем ущерб от пули + health.TakeDamage(damage); + + // обновляем информацию о здоровье игрока в HUD + ComponentSystem.FindComponentInWorld().UpdateHealthInfo(health.health); + } // удаляем пулю node.DeleteLater(); } diff --git a/data/csharp_template/FP_controller/components/EnemyLogic.cs b/data/csharp_template/FP_controller/components/EnemyLogic.cs index 1ffe387..81878fb 100644 --- a/data/csharp_template/FP_controller/components/EnemyLogic.cs +++ b/data/csharp_template/FP_controller/components/EnemyLogic.cs @@ -39,6 +39,8 @@ public class EnemyLogic : Component private Health health = null; + private GameController gameController = null; + private bool targetIsVisible; private Vec3 lastSeenPosition; private vec3 lastSeenDirection; @@ -83,6 +85,9 @@ private void Init() // берем компонент EnemyFireController fireController = node.GetComponent(); + // находим компонент GameController + gameController = ComponentSystem.FindComponentInWorld(); + health = node.GetComponentInChildren(); shouldUpdateRoute = true; @@ -92,6 +97,15 @@ private void Init() private void Update() { + // Проверяем текущее состояние, если игровой процесс остановлен, то враг не выполняет никаких действий + if (gameController.state != GameState.Gameplay) + return; + + // проверяем, выставлен ли флаг IsDead + if (health && health.IsDead) + // удаляем врага со сцены, если он убит (IsDead) + node.DeleteLater(); + UpdateTargetState(); UpdateOrientation(); UpdateRoute(); @@ -113,11 +127,6 @@ private void Update() case EnemyLogicState.Attack: color = vec4.RED; break; } - // проверяем, выставлен ли флаг IsDead - if (health && health.IsDead) - // удаляем врага со сцены, если он убит (IsDead) - node.DeleteLater(); - // визуализируем состояния врага Visualizer.RenderPoint3D(node.WorldPosition + vec3.UP * 2.0f, 0.25f, color); Visualizer.RenderPoint3D(node.WorldPosition + vec3.UP * 3.0f, 0.25f, IsTargetVisible() ? vec4.GREEN : vec4.RED); diff --git a/data/csharp_template/FP_controller/components/EnemyLogic.cs.meta b/data/csharp_template/FP_controller/components/EnemyLogic.cs.meta index 8d88520..200fd15 100644 --- a/data/csharp_template/FP_controller/components/EnemyLogic.cs.meta +++ b/data/csharp_template/FP_controller/components/EnemyLogic.cs.meta @@ -2,7 +2,7 @@ 5158593f996ef01aae4f3a2a8ce7a21d539470f6 component - 0bbb0373 + a4eb51e5 diff --git a/data/csharp_template/FP_controller/components/GameController.cs b/data/csharp_template/FP_controller/components/GameController.cs new file mode 100644 index 0000000..8a40649 --- /dev/null +++ b/data/csharp_template/FP_controller/components/GameController.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Unigine; + +public enum GameState +{ + Gameplay, + Win, + Lose, +} + +[Component(PropertyGuid = "aa9f1fea1e56f7a6da31878c2789e44171c877b4")] +public class GameController : Component +{ + public GameState state; + public Player EndCamera = null; // Камера для финала игры + + public NodeDummy SpawnPoint = null; + + [ParameterFile] + public AssetLink enemyPrefab = null; + public int NumEnemies = 10; + + private int spawned_enemy_counter = 0; + public float spawnInterval = 2.0f; + private float currentTime = 0.0f; + + private void Init() + { + // Задаем начальное состояние игрового процесса + state = GameState.Gameplay; + } + + private void Update() + { + // если игра окончена + if (state != GameState.Gameplay) + { + // переключаемся на камеру для финала игры + Game.Player = EndCamera; + // показываем сообщение об итоге игры в HUD + ComponentSystem.FindComponentInWorld().DisplayStateMessage(state); + } + else + { + // если врагов больше не осталось, переходим в состояние “Победа” (Win) + Log.MessageLine(spawned_enemy_counter + NumEnemies); + if (!ComponentSystem.FindComponentInWorld() && spawned_enemy_counter == NumEnemies) + state = GameState.Win; + // генерируем новых врагов (enemyPrefab) в заданной точке (SpawnPoint) + // с заданным интервалом времени (spawnInterval) + if (spawned_enemy_counter < NumEnemies) + { + currentTime += Game.IFps; + + if (currentTime > spawnInterval) + { + currentTime -= spawnInterval; + spawned_enemy_counter++; + Node enemy = World.LoadNode(enemyPrefab.AbsolutePath); + enemy.WorldTransform = SpawnPoint.WorldTransform; + } + } + } + } +} \ No newline at end of file diff --git a/data/csharp_template/FP_controller/components/GameController.cs.meta b/data/csharp_template/FP_controller/components/GameController.cs.meta new file mode 100644 index 0000000..ccae09d --- /dev/null +++ b/data/csharp_template/FP_controller/components/GameController.cs.meta @@ -0,0 +1,10 @@ + + + 15d59b2cd4cb06278395d79e61d6ece3cb0bdf06 + component + 344bfb97 + + + + + diff --git a/data/csharp_template/FP_controller/components/HUD.cs b/data/csharp_template/FP_controller/components/HUD.cs index 310d240..dffd604 100644 --- a/data/csharp_template/FP_controller/components/HUD.cs +++ b/data/csharp_template/FP_controller/components/HUD.cs @@ -60,4 +60,19 @@ public void UpdateHealthInfo(int health) { label.Text = "Health: " + health.ToString(); } + + // обновление текущего уровня здоровья игрока + public void DisplayStateMessage(GameState state) + { + // добавляем виджет WidgetLabel для отображения финального сообщение о результате игры, устанавливаем размер и цвет шрифта + WidgetLabel end_message = new WidgetLabel(screenGui, (state == GameState.Win) ? "ПОБЕДА!" : "ВЫ ПРОИГРАЛИ!"); + end_message.FontSize = 100; + end_message.FontColor = vec4.RED; + screenGui.AddChild(end_message, Gui.ALIGN_CENTER | Gui.ALIGN_OVERLAP); + // привязываем время жизни виджета к миру + end_message.Lifetime = Widget.LIFETIME.WORLD; + + // завершаем процесс + ComponentSystem.FindComponentInWorld().Enabled = false; + } } \ No newline at end of file diff --git a/data/csharp_template/FP_controller/components/HUD.cs.meta b/data/csharp_template/FP_controller/components/HUD.cs.meta index 5fced05..5ba20de 100644 --- a/data/csharp_template/FP_controller/components/HUD.cs.meta +++ b/data/csharp_template/FP_controller/components/HUD.cs.meta @@ -2,7 +2,7 @@ 5faca71f8446cfac3ee60b883c3368aef60d5fab component - 3964a462 + 5c80a8e7 diff --git a/data/csharp_template/FP_controller/components/PlayerLogic.cs b/data/csharp_template/FP_controller/components/PlayerLogic.cs index 2b817b1..3dc68e5 100644 --- a/data/csharp_template/FP_controller/components/PlayerLogic.cs +++ b/data/csharp_template/FP_controller/components/PlayerLogic.cs @@ -7,23 +7,36 @@ public class PlayerLogic : Component { private Health health = null; + private GameController gameController = null; + private void Init() { // берем у ноды компонент Health health = node.GetComponentInChildren(); // обновляем информацию об исходном здоровье игрока ComponentSystem.FindComponentInWorld().UpdateHealthInfo(health.health); + + // находим компонент GameController + gameController = ComponentSystem.FindComponentInWorld(); } private void Update() { - // проверяем выставлен ли флаг IsDead if (health && health.IsDead) { // обездвиживаем игрока, отключая компоненты node.GetComponent().Enabled = false; node.GetComponent().Enabled = false; node.GetComponent().Enabled = false; + + // удаляем игрока + node.DeleteLater(); + + // меняем состояние игрового процесса на (Lose - поражение) + gameController.state = GameState.Lose; } + // проверяем состояние игры, если она окончена, удаляем игрока + else if (gameController.state != GameState.Gameplay) + node.DeleteLater(); } } \ No newline at end of file diff --git a/data/csharp_template/FP_controller/components/PlayerLogic.cs.meta b/data/csharp_template/FP_controller/components/PlayerLogic.cs.meta index af33bab..a11e695 100644 --- a/data/csharp_template/FP_controller/components/PlayerLogic.cs.meta +++ b/data/csharp_template/FP_controller/components/PlayerLogic.cs.meta @@ -2,7 +2,7 @@ c70564d6d805b75f7c23b858d839b1091b4f9c80 component - 8602d67f + e6f4e5f9 diff --git a/data/guids.db b/data/guids.db index decbd2d..2ce2524 100644 --- a/data/guids.db +++ b/data/guids.db @@ -270,6 +270,7 @@ "cb3839fe5ac15e0145621fbc772e1e9caa5a4247": "fps/components/Lifetime.cs.meta", "2ecdc69731f9baff81a29a3d4f3df1ea5db785af": "csharp_template/FP_controller/components/Health.cs.meta", "b27eae5f554475bb72d78fc8446f0ebec0ed12eb": "csharp_template/FP_controller/components/VFXController.cs.meta", + "9795643eab874b2a460ce200bc73663ce99c8c28": "csharp_template/FP_controller/components/GameController.cs.meta", "250dcf5fc4592814fceeb4c89d5c69e19dd8a3eb": "csharp_template/FP_controller/components/EnemyFireController.cs.meta", "117116973d68f9d5d633e5a255fb6f67627b61ee": "csharp_template/FP_controller/components/HandAnimationController.cs.meta", "1e9d3c93b8b196fb5847ecccb5871f542bef2adf": "csharp_template/FP_controller/components/WeaponController.cs.meta", @@ -2056,6 +2057,7 @@ "4aed6f037c03c8869f9b862d692fb1a8ee0be8e7": "fps/components/Lifetime.cs", "6629c61dbcf5668c3f0966d3e2f41c71b0b5b1b5": "csharp_template/FP_controller/components/Health.cs", "b23baaa53cabf948b0118226ccc00803ae73be91": "csharp_template/FP_controller/components/VFXController.cs", + "15d59b2cd4cb06278395d79e61d6ece3cb0bdf06": "csharp_template/FP_controller/components/GameController.cs", "4b3823a5c4fc24a3c73f5f268369b30430346791": "csharp_template/FP_controller/components/EnemyFireController.cs", "4e28861d843434e837504ef0429bf99b43420c5c": "csharp_template/FP_controller/components/HandAnimationController.cs", "1005e2b9f814eb840a73c08a2aabf58cc6fbbb65": "csharp_template/FP_controller/components/WeaponController.cs",