Files
Main/Assets/Code/Logic/_Required/Entity/Object/DropGold.cs
2025-01-25 04:38:09 +08:00

302 lines
10 KiB
C#

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
}
}