ClientServer/Client/Assets/Scripts/Util/Effects/MineEffectorTypingObject.cs
TG9six 03a642d635 first push
first push
2025-09-06 17:17:39 +04:00

111 lines
4.4 KiB
C#

using System.Threading.Tasks;
using NaughtyAttributes;
using UnityEngine;
using Weapons;
namespace Util
{
public class MineEffectorTypingObject : MonoBehaviour
{
[BoxGroup("Effect Type ")] public string type;
[BoxGroup("Effect Type ")] public OreItemType typeAxe = OreItemType.DEFULT;
[BoxGroup("Effect Type ")]
[SerializeField] private MeshCollider objectMeshCollider;
[BoxGroup("Effect Type ")]
[SerializeField] private MeshFilter objectMesh;
[BoxGroup("Effect Type ")]
[SerializeField] private bool hasParticleEffector = false;
[BoxGroup("Effect Type ")]
[ShowIf(nameof(hasParticleEffector))]
[SerializeField] private EffectorParticle weapon;
[BoxGroup("Effect Type ")] public Effect baseEffect;
public EffectorParticle Get => weapon;
public void CreateEffectByRayHit(RaycastHit hit)
{
if (baseEffect == null || baseEffect.effect == null) return;
var hitPoint = hit.point;
var offset = hit.normal * 0.09f;
var effectPosition = hitPoint + offset;
PlayEffectAtPosition(TryGetEffectByName(type), effectPosition);
}
public void PlayEffectByIndex(int effect) =>
PlayEffect(TryGetEffect(effect),TryGetTarget());
public void PlayEffectByIndexAtPosition(int effect, Vector3 position) =>
PlayEffectAtPosition(TryGetEffect(effect),position);
public void PlayEffectByIndexAtTransform(int effect, Transform targetExtern) =>
PlayEffectAtTransform(TryGetEffect(effect), targetExtern);
public void PlayEffectByIndexAtPositionAndRotation(int effect, Vector3 position, Quaternion rotation) =>
PlayEffectAtPositionAndRotation(TryGetEffect(effect),position, rotation);
public Effect TryGetEffectByName(string effectName)
{
var index = -1;
if (hasParticleEffector)
index = weapon.effectsTyping.IndexOf(effectName);
return index == -1 ? TryGetEffect(index, true) : TryGetEffect(index, false);
}
private Effect TryGetEffect(int index, bool isBaseEffect = false)
{
if (hasParticleEffector && !isBaseEffect)
return Get.effects[index];
return baseEffect;
}
private Transform TryGetTarget()
{
return this.transform;
}
private static async void PlayEffect(Effect effect, Transform selfTransform)
{
if (effect == null || effect.effect == null) return;
var spawnedEffect = selfTransform != null ? Instantiate(effect.effect, selfTransform.position, selfTransform.rotation) : Instantiate(effect.effect);
await AwaitToEffectRunTime(effect, spawnedEffect);
}
private static async void PlayEffectAtPosition(Effect effect, Vector3 position)
{
if (effect == null || effect.effect == null) return;
GameObject spawnedEffect = Instantiate(effect.effect, position, Quaternion.identity);
await AwaitToEffectRunTime(effect, spawnedEffect);
}
private static async void PlayEffectAtPositionAndRotation(Effect effect, Vector3 position, Quaternion rotation)
{
if (effect == null || effect.effect == null) return;
GameObject spawnedEffect = Instantiate(effect.effect, position, rotation);
await AwaitToEffectRunTime(effect, spawnedEffect);
}
private static async void PlayEffectAtTransform(Effect effect, Transform target)
{
if (effect == null || effect.effect == null) return;
GameObject spawnedEffect = Instantiate(effect.effect, target.position, target.rotation);
await AwaitToEffectRunTime(effect, spawnedEffect);
}
private static async Task AwaitToEffectRunTime(Effect effect, GameObject spawnedEffect)
{
if (effect.autoDestroy)
{
await Task.Delay((int)(effect.liveTime * 1000));
ObjectDestroyer(spawnedEffect);
}
}
private static void ObjectDestroyer(GameObject spawnedEffect)
{
if (spawnedEffect.gameObject != null)
Destroy(spawnedEffect);
}
}
}