Инишиал мобы
This commit is contained in:
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; }
|
||||
}
|
||||
|
||||
+25
@@ -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
|
||||
Reference in new issue
Block a user