Attack animation, colliders, triggering

This commit is contained in:
ThomasCharester committed 2026-10-25 19:14:56 +03:00
1 parent 3e631899ea
commit e61fcb78cf
94 files changed
+142319 -25861

No files matched your search

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 89ff9bb140304946a76896dd4b841601
timeCreated: 1792938702
@@ -0,0 +1,27 @@
using Code.Infrastructure.Generators;
using Code.OfficeGame.BattleMode.HitBoxes;
using UnityEngine;
namespace Code.OfficeGame.BattleMode.Actions.Attacks
{
[Config("Configs/AttackAction", true)]
[CreateAssetMenu(fileName = "AttackActionConfig", menuName = "Configs/AttackAction")]
public class AttackActionConfig : ScriptableObject
{
public BattleActionType ActionType;
public AnimationClip AnimationClip;
public int StateHash => Animator.StringToHash(AnimationClip.name);
public int TotalFrames;
public int HitboxStartFrame;
public int HitboxEndFrame;
public HitBoxPartType AttackingBodyPart;
public int Damage;
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 6d47fdf0c6f444c087bcc6f2492746af
timeCreated: 1792938807
@@ -0,0 +1,76 @@
using System.Linq;
using Code.Infrastructure.Utils;
using Code.OfficeGame.BattleMode.HitBoxes;
using Cysharp.Threading.Tasks;
using Reflex.Attributes;
using UnityEngine;
namespace Code.OfficeGame.BattleMode.Actions.Attacks
{
public class BattleActionPlayerAttackMMA : BattleAction
{
private Animator _animator;
private EntityHitBoxes _entityHitBoxes;
private AttackActionConfig _attackData;
public int EntryStateHash => Animator.StringToHash("WalkBlend");
private int _currentFrame;
[Inject]
public void Construct(MultipleConfig<AttackActionConfig> attackData)
{
_animator = GetComponentInChildren<Animator>();
_entityHitBoxes = GetComponent<EntityHitBoxes>();
_attackData = attackData.Configs.SingleOrDefault(x=>x.ActionType == ActionType);
}
public override async UniTask<BattleActionDecisionResultCode> DecideAction()
{
_currentFrame = 0;
Finished = false;
return BattleActionDecisionResultCode.Decided;
}
public override BattleActionType ActionType => BattleActionType.PlayerAttackMMA;
public override void Tick(float tickDelta)
{
if (Finished) return;
if (_currentFrame == 0)
{
_animator.Play(_attackData.StateHash, 0, 0f);
}
_currentFrame++;
if (_currentFrame >= _attackData.HitboxStartFrame && _currentFrame <= _attackData.HitboxEndFrame)
{
_entityHitBoxes.EnableHitbox(_attackData.AttackingBodyPart);
_entityHitBoxes.CheckHitsForCurrentFrame(OnEnemyHit);
}
else
{
_entityHitBoxes.DisableAllHitboxes();
}
if (_currentFrame >= _attackData.TotalFrames)
{
CompleteOrInterruptAction();
}
}
private void OnEnemyHit(Collider enemyCollider)
{
Debug.Log($"Попадание в {enemyCollider.name} на {_currentFrame}-м кадре! Урон: {_attackData.Damage}");
}
public void CompleteOrInterruptAction()
{
_animator.Play(EntryStateHash, 0, 0f); // Создать None State и кинуть эту штуку туда
_entityHitBoxes.DisableAllHitboxes();
Finished = true;
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: a1803413768b4cf990d25732721300ea
timeCreated: 1792938407
@@ -5,6 +5,6 @@ namespace Code.OfficeGame.BattleMode.Actions
None,
Wait,
Move,
Attack
PlayerAttackMMA
}
}
@@ -1,6 +1,7 @@
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using Unity.VisualScripting;
using UnityEngine;
namespace Code.OfficeGame.BattleMode.Actions
@@ -12,12 +13,14 @@ namespace Code.OfficeGame.BattleMode.Actions
public abstract UniTask DecideAction(CancellationToken ctx);
public Animator animator;
[DoNotSerialize] public Animator animator;
protected readonly Dictionary<BattleActionType, BattleAction> BattleActions = new();
private void Awake()
{
animator = GetComponentInChildren<Animator>();
foreach (var action in GetComponents<BattleAction>())
{
BattleActions.Add(action.ActionType, action);
@@ -12,8 +12,6 @@ namespace Code.OfficeGame.BattleMode.Actions.Player
public override async UniTask DecideAction(CancellationToken ctx)
{
BattleActionDecisionResultCode decision = BattleActionDecisionResultCode.Deciding;
_battleActionDecisionPanel.SetEntityInfo(BattleActions);
BattleActionType decidedAction = BattleActionType.None;
@@ -25,7 +23,8 @@ namespace Code.OfficeGame.BattleMode.Actions.Player
await _battleActionDecisionPanel.Open(ctx);
decidedAction = await _battleActionDecisionPanel.GetDecision(ctx);
var decision = BattleActionDecisionResultCode.Deciding;
while (decidedAction != BattleActionType.None
&& decision == BattleActionDecisionResultCode.Deciding
&& !ctx.IsCancellationRequested)
@@ -40,7 +39,6 @@ namespace Code.OfficeGame.BattleMode.Actions.Player
decidedAction = BattleActionType.None;
}
}
CurrentAction = BattleActions[decidedAction];
}
}