111 lines
4.4 KiB
C#
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);
|
|
}
|
|
}
|
|
} |