using Fie.Manager; using Fie.Object; using Fie.Utility; using PigeonCoopToolkit.Effects.Trails; using UnityEngine; namespace Fie.Enemies.HoovesRaces.Changeling { [FiePrefabInfo("Prefabs/Enemies/ChangelingForces/Changeling/Power/ChangelingShot")] public class FieEmitObjectChangelingShot : FieEmittableObjectBase { [SerializeField] private float CHANGELING_SINGLE_SHOT_DURATION = 2f; [SerializeField] private float CHANGELING_SINGLE_SHOT_VELOCITY_MAX = 2f; [SerializeField] private float CHANGELING_SINGLE_SHOT_VELOCITY_ACCEL_TIME = 2f; [SerializeField] private float CHANGELING_SINGLE_SHOT_DESTORY_DURATION = 0.7f; [SerializeField] private GameObject cilinder; [SerializeField] private SmoothTrail trail; private const float HORMING_DISTANCE_MAX = 10f; private Tweener _velocityTweener = new Tweener(); private Tweener _scaleTweener = new Tweener(); private Vector3 _velocityVec = Vector3.zero; private Vector3 _scale = Vector3.zero; private Vector3 _additionalVelocity = Vector3.zero; private Vector3 _initDirectionalVec = Vector3.zero; private float _lifeTimeCount; private bool _isEndUpdate; private Vector3 _initEffectModelScale = Vector3.zero; public void Awake() { _initEffectModelScale = cilinder.transform.localScale; } public override void awakeEmitObject() { _velocityTweener.InitTweener(CHANGELING_SINGLE_SHOT_VELOCITY_ACCEL_TIME, 0f, CHANGELING_SINGLE_SHOT_VELOCITY_MAX); _scaleTweener.InitTweener(CHANGELING_SINGLE_SHOT_VELOCITY_ACCEL_TIME, Vector3.zero, Vector3.one); _initDirectionalVec = directionalVec; if (targetTransform != null) { _initDirectionalVec = (targetTransform.position - base.transform.position).normalized; } directionalVec = _initDirectionalVec; cilinder.transform.localScale = _initEffectModelScale; trail.ClearSystem(emitState: true); } public void setAdditionalVelocity(Vector3 additionalVelocity) { _additionalVelocity = additionalVelocity; } public void Update() { if (!_isEndUpdate) { Vector3 vector = directionalVec * _velocityTweener.UpdateParameterFloat(Time.deltaTime); base.transform.position += vector; base.transform.localScale = _scaleTweener.UpdateParameterVec3(Time.deltaTime); _lifeTimeCount += Time.deltaTime; if (_lifeTimeCount >= CHANGELING_SINGLE_SHOT_DURATION) { destoryEmitObject(CHANGELING_SINGLE_SHOT_DESTORY_DURATION); trail.Emit = false; trail.ClearSystem(emitState: false); cilinder.transform.localScale = Vector3.zero; _isEndUpdate = true; } base.transform.rotation = Quaternion.LookRotation(vector); } } private void OnTriggerEnter(Collider collider) { if (!_isEndUpdate && (collider.gameObject.tag == getHostileTagString() || collider.gameObject.tag == "Floor")) { FieManagerBehaviour.I.EmitObject(base.transform, Vector3.zero); addDamageToCollisionCharacter(collider, getDefaultDamageObject()); trail.Emit = false; destoryEmitObject(CHANGELING_SINGLE_SHOT_DESTORY_DURATION); cilinder.transform.localScale = Vector3.zero; _isEndUpdate = true; } } private void OnDisable() { if (trail != null) { trail.ClearSystem(emitState: false); } } } }