302 lines
10 KiB
C#
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
|
|
}
|
|
}
|