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",