Files
Cielonos/Assets/Scripts/MainGame/AttackArea/Submodules/HitSubmodule.cs

125 lines
4.0 KiB
C#
Raw Normal View History

2025-11-25 08:19:33 -05:00
using System.Collections.Generic;
using Cielonos.MainGame.Characters;
using UnityEngine;
namespace Cielonos.MainGame
{
2026-07-18 03:16:20 -04:00
public partial class AttackAreaBase
2025-11-25 08:19:33 -05:00
{
2026-07-18 03:16:20 -04:00
public partial class HitSubmodule : AttackAreaSubmoduleBase
2025-11-25 08:19:33 -05:00
{
2026-07-18 03:16:20 -04:00
public int originalHitCount;
public int currentHitIndex;
public float hitInterval;
private float currentIntervalTime;
2025-11-25 08:19:33 -05:00
2026-07-18 03:16:20 -04:00
public List<GameObject> checkedObjects;
public bool isOverridingHitEffect;
public GameObject hitVFXPrefab;
public bool isAutoPlayHitSound;
public List<uint> hitSoundList;
2025-11-25 08:19:33 -05:00
2026-07-18 03:16:20 -04:00
public HitSubmodule(AttackAreaBase attackArea) : base(attackArea)
2026-02-13 09:22:11 -05:00
{
2026-07-18 03:16:20 -04:00
InitializeAsOnceHit();
CommonInitialize();
2026-02-13 09:22:11 -05:00
}
2026-07-18 03:16:20 -04:00
public HitSubmodule(AttackAreaBase attackArea, float hitInterval = -1, int hitCount = -1) : base(attackArea)
2025-12-08 05:27:53 -05:00
{
2026-07-18 03:16:20 -04:00
InitializeAsMultipleHit(hitInterval, hitCount);
CommonInitialize();
2025-12-08 05:27:53 -05:00
}
2026-07-18 03:16:20 -04:00
private void InitializeAsOnceHit()
2025-12-08 05:27:53 -05:00
{
2026-07-18 03:16:20 -04:00
this.originalHitCount = 1;
this.currentHitIndex = 0;
this.hitInterval = -1;
this.currentIntervalTime = 0;
2025-12-08 05:27:53 -05:00
}
2026-07-18 03:16:20 -04:00
private void InitializeAsMultipleHit(float hitInterval, int hitCount)
2025-12-08 05:27:53 -05:00
{
2026-07-18 03:16:20 -04:00
this.originalHitCount = hitCount;
this.currentHitIndex = 0;
this.hitInterval = hitInterval;
this.currentIntervalTime = 0;
}
2025-11-25 08:19:33 -05:00
2026-07-18 03:16:20 -04:00
private void CommonInitialize()
2025-12-22 18:36:29 -05:00
{
2026-07-18 03:16:20 -04:00
isAutoPlayHitSound = true;
checkedObjects = new List<GameObject>();
hitSoundList = new List<uint>();
2025-12-22 18:36:29 -05:00
}
2025-11-25 08:19:33 -05:00
}
2026-07-18 03:16:20 -04:00
public partial class HitSubmodule
2025-11-25 08:19:33 -05:00
{
2026-07-18 03:16:20 -04:00
public GameObject SpawnHitVFX(CharacterBase creator, Vector3 position, Vector3 direction = default)
2025-11-25 08:19:33 -05:00
{
2026-07-18 03:16:20 -04:00
if (isOverridingHitEffect) return null;
2025-11-25 08:19:33 -05:00
2026-07-18 03:16:20 -04:00
if (hitVFXPrefab != null)
2025-11-25 08:19:33 -05:00
{
2026-07-18 03:16:20 -04:00
direction = direction == default ? direction : Vector3.up;
GameObject hitEffect = VFXObject.Spawn(hitVFXPrefab, creator, position, Quaternion.LookRotation(direction),
timePolicy: owner.timePolicy);
return hitEffect;
2025-11-25 08:19:33 -05:00
}
2026-07-18 03:16:20 -04:00
return null;
2025-11-25 08:19:33 -05:00
}
2026-07-18 03:16:20 -04:00
public HitSubmodule AddHitSound(uint soundID, AK.Wwise.Event soundEvent = null)
2025-11-25 08:19:33 -05:00
{
2026-07-18 03:16:20 -04:00
hitSoundList.Add(soundID);
return this;
2025-11-25 08:19:33 -05:00
}
2026-07-18 03:16:20 -04:00
2025-11-25 08:19:33 -05:00
}
2026-07-18 03:16:20 -04:00
public partial class HitSubmodule
2025-11-25 08:19:33 -05:00
{
2026-07-18 03:16:20 -04:00
public void Update()
2025-11-25 08:19:33 -05:00
{
2026-07-18 03:16:20 -04:00
if (!isEnabling || currentHitIndex >= originalHitCount || attackArea.timeSm.delayTime > 0)
2025-11-25 08:19:33 -05:00
{
2026-07-18 03:16:20 -04:00
return;
2025-11-25 08:19:33 -05:00
}
2026-07-18 03:16:20 -04:00
if (hitInterval < 0) return;
currentIntervalTime += attackArea.DeltaTime;
if (currentIntervalTime >= hitInterval)
{
checkedObjects.Clear();
if (attackArea.attackSm != null)
{
//attackArea.attackSm.modifiedAttackValue = attackArea.attackSm.originalAttackValue;
}
currentIntervalTime -= hitInterval;
currentHitIndex++;
}
if (currentHitIndex >= originalHitCount)
2025-12-22 18:36:29 -05:00
{
2026-07-18 03:16:20 -04:00
attackArea.isEnabling = false;
2025-12-22 18:36:29 -05:00
}
2025-11-25 08:19:33 -05:00
}
2026-07-18 03:16:20 -04:00
public void AddCheckedObject(GameObject obj)
{
checkedObjects.Add(obj);
}
public void InvokeAllHitEvents(CharacterBase target, Vector3 hitPosition)
{
attackArea.eventSm?.InvokeHitEvents(target, hitPosition, currentHitIndex, attackArea.canTriggerHitEvent);
}
2025-11-25 08:19:33 -05:00
}
}
2026-07-18 03:16:20 -04:00
}