using Thousandto.Core.Asset; using Thousandto.Core.Base; using System; using UnityEngine; using Thousandto.Cfg.Data; using Thousandto.Code.Center; using Thousandto.Core.RootSystem; using Thousandto.Plugins.Common.UniScene; namespace Thousandto.Code.Logic { //技能对象 public class DropGold : Entity { #region//私有变量 //是否已经发送了删除消息 private bool _postDelete = false; //动画播放器 private DropGoldAnimPlayer _animPlayer = null; //移动方向 private Vector2 _moveDir = Vector2.zero; //等待时间 private float _waitTime = -1f; //生存时间 private float _lifeTimer = 0f; //最大生存时间 private const float MaxLifeTime = 10f; #endregion #region//初始化,加载Skin,卸载处理 protected override FSkinBase OnSetupSkin() { //Skin.SetActive(false); FSkinModel skin = GameCenter.LuaSystem.Adaptor.CreateFSkinModel(FSkinTypeCode.Custom); skin.SetLayer(LayerUtils.SummonObj); skin.SetOnSkinPartChangedHandler((x, y) => { if (y == FSkinPartCode.Body) { // _waitTime = UnityEngine.Random.Range(0.01f, 0.3f); _waitTime = 0f;//UnityEngine.Random.Range(0.01f, 0.3f); } }); return skin; } protected override bool OnInitializeAfter(EntityInitInfo baseInfo) { base.OnInitializeAfter(baseInfo); var info = baseInfo as DropGoldInitInfo; SyncInfo(info); return true; } protected override void OnUninitializeBefore() { base.OnUninitializeBefore(); } public void SyncInfo(DropGoldInitInfo info) { _lifeTimer = 0f; _moveDir = new Vector2(UnityEngine.Random.Range(-1f, 1f), UnityEngine.Random.Range(-1f, 1f)); ((FSkinModel)Skin).SetSkinPartFromCfgID(FSkinPartCode.Body, 699996); _waitTime = -1f; SetDirection2d(-_moveDir, false, false); } private void PostDelete() { if (!_postDelete) { var baseScene = Scene as BaseScene; if(baseScene != null) { baseScene.DeleteEntity(ID); } _postDelete = true; } } protected override void OnUpdate(float dt) { base.OnUpdate(dt); //更新生存时间 _lifeTimer += dt; if (_lifeTimer >= MaxLifeTime) { PostDelete(); } if (_waitTime < 0f && _animPlayer == null) return; if (_waitTime >= 0f) { _waitTime -= dt; if (_waitTime < 0f) { //开始播放动画 //Skin.SetActive(true); var targetPos = Position2d + _moveDir.normalized * UnityEngine.Random.Range(3, 5); _animPlayer = new DropGoldAnimPlayer(this, targetPos); } } if (_animPlayer != null) { _animPlayer.Update(); if (_animPlayer.IsFinish) { PostDelete(); } } } #endregion #region//私有类 //掉落物品的动画播发器 private class DropGoldAnimPlayer { #region//私有变量 private DropGold _host = null; private Vector2 _targetPos = Vector2.zero; private DropAnimState _curState = DropAnimState.DropDown; private Vector3[] _animCurve = null; private float _animTimer = 0f; private float _endFlySpeed = 0f; private const float DropTime = 0.3f; private const float WaitTime = 0.3f; private const float FlyToPlayerTime = 0.5f; private const float EndFlyStartSpeed = 20f; private const float EndFlyAddSpeed = 30f; #endregion #region//属性 public bool IsFinish { get { return _curState == DropAnimState.Finish; } } #endregion #region//构造函数 //初始并且开始播放动画 public DropGoldAnimPlayer(DropGold host, Vector2 targetPos) { _host = host; _targetPos = targetPos; ChangeState(DropAnimState.DropDown); } #endregion #region//公有函数 //更新 public void Update() { var euler = _host.ModelTransform.eulerAngles; euler.y += Time.deltaTime * 180f; _host.ModelTransform.eulerAngles = euler; switch (_curState) { case DropAnimState.DropDown: { _animTimer += Time.deltaTime; if (_animTimer <= DropTime) { _host.SetPosition(iTween.Interp(_animCurve, _animTimer / DropTime)); } else { _host.RayCastToGroundXOZ(_targetPos); ChangeState(DropAnimState.Wait); } } break; case DropAnimState.Wait: { _animTimer += Time.deltaTime; if (_animTimer > WaitTime) { ChangeState(DropAnimState.FlyUP); } } break; case DropAnimState.FlyUP: { _animTimer += Time.deltaTime; if (_animTimer <= FlyToPlayerTime) { _host.SetPosition(Vector3.Lerp(_animCurve[0], _animCurve[1], _animTimer / FlyToPlayerTime)); } else { ChangeState(DropAnimState.EndFly); } } break; case DropAnimState.EndFly: { var owner = GameCenter.GameSceneSystem.GetLocalPlayer(); if (owner == null) { ChangeState(DropAnimState.Finish); break; } if (Vector2.Distance(_host.Position2d, owner.Position2d) <= 0.5f) { ChangeState(DropAnimState.Finish); } else { var endPos = owner.Position; endPos.y += 1f; var dir = (endPos - _host.Position).normalized; var pos = _host.Position + dir * _endFlySpeed * Time.deltaTime; _host.SetPosition(pos); var newDir = endPos - pos; if (dir.x * newDir.x <= 0f || dir.y * newDir.y <= 0f || dir.z * newDir.z <= 0f) { ChangeState(DropAnimState.Finish); } _endFlySpeed += EndFlyAddSpeed * Time.deltaTime; } } break; case DropAnimState.Finish: break; } } //释放 public void Destory() { } #endregion #region//私有函数 private void ChangeState(DropAnimState state) { _curState = state; switch (_curState) { case DropAnimState.DropDown: { _animTimer = 0f; var pots = new Vector3[3]; pots[0] = _host.Position; pots[2] = _host.GetTerrainPosition(_targetPos.x, _targetPos.y); pots[1] = Vector3.Lerp(pots[0], pots[2], 0.5f); pots[1].y += 1.5f; _animCurve = iTween.PathControlPointGenerator(pots); } break; case DropAnimState.Wait: { _animTimer = 0f; } break; case DropAnimState.FlyUP: { _animTimer = 0f; _animCurve = new Vector3[2]; _animCurve[0] = _host.Position; _animCurve[1] = _host.Position; _animCurve[1].y += 1f; } break; case DropAnimState.EndFly: { _endFlySpeed = EndFlyStartSpeed; } break; case DropAnimState.Finish: break; } } #endregion #region//私有枚举 private enum DropAnimState { DropDown, Wait, FlyUP, EndFly, Finish, } #endregion } #endregion } }