Инишиал мобы

This commit is contained in:
MrTorex committed 2025-11-17 14:45:51 +03:00
1 parent d3fbd4c5c3
commit 020934e07f
28 files changed
+793 -1310

No files matched your search

@@ -37,9 +37,9 @@ namespace Code.App.AppStates
Context.UIService.LoadingScreen.Show();
_playerMoney = Context.PlayerFactory.CreatePlayerMoney();
_playerHealth = Context.PlayerFactory.CreatePlayerHealth();
_playerHealth.OnDeath += EndGame;
//_playerHealth = Context.PlayerProvider.Health;
//_playerHealth.OnDeath += EndGame;
Context.AudioService.TransitToSnapshot(AudioSnapshotState.Peaceful);
@@ -69,6 +69,9 @@ namespace Code.App.AppStates
WaitForPlayerCharacterLoad()
);
_playerHealth = Context.PlayerProvider.Health;
_playerHealth.OnDeath += EndGame;
Context.AudioService.PlayRandomMusicUntilHumanityWillBeDestroyedForTheySins(MusicType.Peaceful);
Context.AudioService.PlayRandomMusicUntilHumanityWillBeDestroyedForTheySins(MusicType.Action);
@@ -27,6 +27,7 @@ namespace Code.App
containerBuilder.AddSingleton(typeof(InputService), typeof(IInputService));
containerBuilder.AddSingleton(typeof(PlayerFactory), typeof(IPlayerFactory));
containerBuilder.AddSingleton(typeof(PlayerProvider), typeof(IPlayerProvider));
InitializeCamera(containerBuilder, staticDataService);
containerBuilder.AddSingleton(typeof(UIFactory), typeof(IUIFactory));
@@ -16,6 +16,7 @@ namespace Code.App.StateMachine
[Inject] public CameraStateMachine CameraStateMachine { get; private set; }
[Inject] public IUIService UIService { get; private set; }
[Inject] public IPlayerFactory PlayerFactory { get; private set; }
[Inject] public IPlayerProvider PlayerProvider { get; private set; }
[Inject] public IAudioFactory AudioFactory { get; private set; }
[Inject] public IAudioService AudioService { get; private set; }
}
@@ -33,6 +33,11 @@ namespace Code.Gameplay.Character.Controller
private GroundMovementSystem _groundMovement;
private AirMovementSystem _airMovement;
public bool IsSliding => _slideMechanic.IsSliding;
private float abilityBlockTimer;
private bool isAbilitiesBlocked;
public void SetPosition(Vector3 position) => motor.SetPosition(position);
public void SetRotation(Quaternion rotation) => motor.SetRotation(rotation);
@@ -135,6 +140,20 @@ namespace Code.Gameplay.Character.Controller
// Сохраняем текущий режим камеры
_currentCameraMode = inputs.CameraMode;
if (isAbilitiesBlocked)
{
abilityBlockTimer -= Time.deltaTime;
if (abilityBlockTimer <= 0)
{
isAbilitiesBlocked = false;
}
else
{
inputs.SprintPressed = false;
inputs.SlidePressed = false;
}
}
// Обработка слайда
_slideMechanic.RequestSlide(inputs.SlidePressed);
@@ -221,6 +240,12 @@ namespace Code.Gameplay.Character.Controller
_groundMovement.CancelJumpRequest();
}
}
public void BlockAbilities(float duration)
{
isAbilitiesBlocked = true;
abilityBlockTimer = duration;
}
// Метод вызывается перед обновлением персонажа (можно использовать для подготовки)
public void BeforeCharacterUpdate(float deltaTime)
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 3b36108558824d748620db29707cd2b1
timeCreated: 1763228467
@@ -0,0 +1,138 @@
using UnityEngine;
using UnityEngine.AI;
using Code.Gameplay.Player;
using Code.Gameplay.Character.Controller;
using Code.Gameplay.Character.Core;
using Reflex.Attributes;
using Reflex.Core;
using Reflex.Injectors;
namespace Code.Gameplay.Enemies
{
public abstract class BaseEnemy : MonoBehaviour
{
[Header("Base enemy configs")]
public int collisionDamage = 1;
public int attackDamage = 3;
public float detectionRange = 10f;
public float attackRange = 5f;
public float speed = 3f;
public float stunDuration = 3f;
public float attackCooldown = 1.5f;
[SerializeField] protected NavMeshAgent agent;
[SerializeField] protected Collider enemyCollider;
[Inject] private IPlayerProvider _playerProvider;
protected CharacterProvider Player => _playerProvider?.Character;
protected PlayerHealth PlayerHealth => _playerProvider?.Health;
protected CustomCharacterController PlayerController => Player?.CustomCharacterController;
protected bool IsStunned;
protected float CurrentStunTimer;
protected bool CanAttack = true;
protected float AttackCooldownTimer;
protected virtual void Awake()
{
if (_playerProvider == null)
{
AttributeInjector.Inject(this, Container.ProjectContainer);
}
}
protected virtual void Update()
{
if (!Player) return;
HandleStun();
HandleAttackCooldown();
if (IsStunned) return;
HandleMovement();
HandleAttack();
}
protected virtual void HandleMovement()
{
if (!Player || !agent) return;
var distanceToPlayer = Vector3.Distance(transform.position, Player.transform.position);
if (distanceToPlayer <= detectionRange)
{
agent.isStopped = false;
agent.SetDestination(Player.transform.position);
}
else
{
agent.isStopped = true;
}
}
protected virtual void HandleAttack() { }
protected virtual void HandleStun()
{
if (!IsStunned) return;
CurrentStunTimer -= Time.deltaTime;
if (!(CurrentStunTimer <= 0)) return;
IsStunned = false;
agent.isStopped = false;
enemyCollider.enabled = true;
}
protected virtual void ApplyStun()
{
IsStunned = true;
CurrentStunTimer = stunDuration;
agent.isStopped = true;
enemyCollider.enabled = false;
}
protected virtual void HandleAttackCooldown()
{
if (!CanAttack)
{
AttackCooldownTimer -= Time.deltaTime;
if (AttackCooldownTimer <= 0)
{
CanAttack = true;
}
}
}
protected virtual void DealDamage()
{
if (!CanAttack || PlayerHealth == null) return;
PlayerHealth.GetDamage(collisionDamage);
ApplyEffectsToPlayer();
CanAttack = false;
AttackCooldownTimer = attackCooldown;
}
protected virtual void ApplyEffectsToPlayer()
{
PlayerController.BlockAbilities(3f);
}
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, detectionRange);
Gizmos.color = new Color(0.3f, 0.3f, 0.8f, 0.4f);
Gizmos.DrawSphere(transform.position, attackRange);
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 691006ba0f69448787db8f350ecf32f4
timeCreated: 1763228480
Whitespace-only changes.
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 119c0b675c944ed7ada6cdc8db4b04aa
timeCreated: 1763228933
@@ -0,0 +1,32 @@
using UnityEngine;
using UnityEngine.AI;
namespace Code.Gameplay.Enemies
{
public class DrunkenGrandpa : BaseEnemy
{
protected override void Awake()
{
base.Awake();
if (agent == null) return;
var walkableArea = NavMesh.GetAreaFromName("Walkable");
agent.areaMask = 1 << walkableArea;
}
protected override void HandleAttack()
{
if (!Player) return;
var distance = Vector3.Distance(transform.position, Player.transform.position);
if (!(distance <= attackRange)) return;
if (Player.CustomCharacterController.IsSliding)
ApplyStun();
else
DealDamage();
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 5e77164596e249bca15e09cdfc9ddac2
timeCreated: 1763228910
@@ -0,0 +1,42 @@
using UnityEngine;
namespace Code.Gameplay.Enemies
{
public class FogEnemy : BaseEnemy
{
protected override void Awake()
{
base.Awake();
if (agent == null) return;
agent.enabled = false;
Destroy(agent);
}
protected override void HandleMovement()
{
if (!Player) return;
var direction = (Player.transform.position - transform.position).normalized;
transform.position += direction * (speed * Time.deltaTime);
}
protected override void HandleAttack()
{
if (!Player || PlayerHealth == null) return;
var distance = Vector3.Distance(transform.position, Player.transform.position);
if (!(distance < attackRange)) return;
PlayerHealth.GetDamage(PlayerHealth.MaxHealthPoints);
base.ApplyEffectsToPlayer();
}
private void OnDrawGizmosSelected()
{
Gizmos.color = new Color(0.3f, 0.3f, 0.8f, 0.4f);
Gizmos.DrawSphere(transform.position, attackRange);
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 4c70370426e4457aa9a56c77689158ff
timeCreated: 1763228955
@@ -0,0 +1,11 @@
using Code.Gameplay.Character.Core;
namespace Code.Gameplay.Player
{
public interface IPlayerProvider
{
CharacterProvider Character { get; }
PlayerHealth Health { get; }
bool IsSpawned { get; }
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 8fdfaa773e8645d5a2d400c0317b9894
timeCreated: 1763237368
@@ -14,6 +14,7 @@ namespace Code.Gameplay.Player
public class PlayerFactory : IPlayerFactory
{
[Inject] PlayerConfig _playerConfig;
[Inject] private IPlayerProvider _playerProvider;
public PlayerHealth CreatePlayerHealth(int count = -1)
{
@@ -25,14 +26,20 @@ namespace Code.Gameplay.Player
public async UniTask<CharacterProvider> CreatePlayer()
{
CharacterProvider characterProvider = (await Addressables.InstantiateAsync(_playerConfig.characterPrefab).ToUniTask()).GetComponent<CharacterProvider>();
AttributeInjector.Inject(characterProvider, Container.ProjectContainer);
AttributeInjector.Inject(characterProvider.CustomCharacterController, Container.ProjectContainer);
return characterProvider;
var go = await Addressables.InstantiateAsync(_playerConfig.characterPrefab).ToUniTask();
var provider = go.GetComponent<CharacterProvider>();
AttributeInjector.Inject(provider, Container.ProjectContainer);
AttributeInjector.Inject(provider.CustomCharacterController, Container.ProjectContainer);
((PlayerProvider)_playerProvider).SetPlayer(provider, _playerConfig);
return provider;
}
public void ReleasePlayer(CharacterProvider characterProvider)
{
((PlayerProvider)_playerProvider).ClearPlayer();
Addressables.ReleaseInstance(characterProvider.gameObject);
}
}
@@ -0,0 +1,26 @@
using Code.Configs;
using Code.Gameplay.Character.Core;
namespace Code.Gameplay.Player
{
public class PlayerProvider : IPlayerProvider
{
public CharacterProvider Character { get; private set; }
public PlayerHealth Health { get; private set; }
public bool IsSpawned => Character != null;
internal void SetPlayer(CharacterProvider character, PlayerConfig config)
{
Character = character;
Health = new PlayerHealth(config.maxHealth);
}
internal void ClearPlayer()
{
Character = null;
Health = null;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 0dbe29c5f0e9431db8c8da25eeb8fa95
timeCreated: 1763237388