重构清理敌人类
This commit is contained in:
@@ -1,61 +1,124 @@
|
||||
using Cysharp.Threading.Tasks;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using SepCore.AsyncTask;
|
||||
using SepCore.Components;
|
||||
using SepCore.Definition;
|
||||
using SepCore.Entity;
|
||||
using UnityEngine;
|
||||
using UnityGameFramework.Runtime;
|
||||
|
||||
public abstract class EnemyBase : TargetableObject
|
||||
namespace SepCore.Entity
|
||||
{
|
||||
protected Transform _target;
|
||||
|
||||
public abstract override ImpactData GetImpactData();
|
||||
public virtual float AttackRange => 1f;
|
||||
|
||||
public virtual void SetTarget(Transform target) => _target = target;
|
||||
|
||||
protected EnemyData _enemyData;
|
||||
|
||||
protected override void OnShow(object userData)
|
||||
public abstract class EnemyBase : TargetableObject
|
||||
{
|
||||
base.OnShow(userData);
|
||||
protected Transform _target;
|
||||
|
||||
if (userData is EnemyData enemyData)
|
||||
public EnemyData EnemyData { get; private set; }
|
||||
|
||||
public MovementComponent Movement { get; private set; }
|
||||
|
||||
protected override TargetableObjectData _targetableObjectData => EnemyData;
|
||||
|
||||
public virtual float AttackRange => EnemyData.AttackRange;
|
||||
|
||||
public float AttackCooldown => EnemyData.AttackCooldown;
|
||||
|
||||
public int AttackDamage => EnemyData.AttackDamage;
|
||||
|
||||
public override ImpactData GetImpactData()
|
||||
{
|
||||
ApplyVisualParams(enemyData);
|
||||
return new ImpactData(EnemyData.Camp, EnemyData.AttackDamage);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnDead(EntityBase attacker)
|
||||
{
|
||||
if (Random.value < _enemyData.DropPercent)
|
||||
public virtual void SetTarget(Transform target) => _target = target;
|
||||
|
||||
#region Lifecycle
|
||||
|
||||
protected override void OnInit(object userData)
|
||||
{
|
||||
var data = new CoinData(_enemyData.DropCoin, GameEntry.Entity.NextId())
|
||||
base.OnInit(userData);
|
||||
|
||||
Movement = GetComponent<MovementComponent>();
|
||||
_healthComponent = GetComponent<HealthComponent>();
|
||||
}
|
||||
|
||||
protected override void OnShow(object userData)
|
||||
{
|
||||
base.OnShow(userData);
|
||||
|
||||
if (userData is EnemyData enemyData)
|
||||
{
|
||||
Position = this.CachedTransform.position
|
||||
};
|
||||
GameEntry.Entity.ShowCoinAsync(data).Forget();
|
||||
}
|
||||
EnemyData = enemyData;
|
||||
_healthComponent.OnInit(enemyData.MaxHealthBase);
|
||||
Movement.OnInit(enemyData.SpeedBase, CachedTransform, null, true);
|
||||
Movement.SetMove(true);
|
||||
|
||||
if (Random.value < _enemyData.DropPercent)
|
||||
{
|
||||
var data = new ExpData(_enemyData.DropExp, GameEntry.Entity.NextId())
|
||||
StartAttackCooldown(enemyData.AttackCooldown);
|
||||
CachedTransform.position = enemyData.Position;
|
||||
ApplyVisualParams(enemyData);
|
||||
}
|
||||
else
|
||||
{
|
||||
Position = this.CachedTransform.position
|
||||
};
|
||||
GameEntry.Entity.ShowExpAsync(data).Forget();
|
||||
Log.Error("Invalid enemy data type: {0}", userData?.GetType());
|
||||
}
|
||||
}
|
||||
|
||||
base.OnDead(attacker);
|
||||
}
|
||||
protected override void OnHide(bool isShutdown, object userData)
|
||||
{
|
||||
Movement.OnReset();
|
||||
_healthComponent.OnReset();
|
||||
CancelAttackCooldown();
|
||||
_target = null;
|
||||
|
||||
private void ApplyVisualParams(EnemyData data)
|
||||
{
|
||||
CachedTransform.localScale = Vector3.one * Mathf.Max(0.1f, data.Scale);
|
||||
base.OnHide(isShutdown, userData);
|
||||
}
|
||||
|
||||
var renderer = GetComponentInChildren<Renderer>();
|
||||
var block = new MaterialPropertyBlock();
|
||||
block.SetColor("_BaseColor", data.Color);
|
||||
renderer.SetPropertyBlock(block);
|
||||
protected override void OnDead(EntityBase attacker)
|
||||
{
|
||||
if (Random.value < EnemyData.DropPercent)
|
||||
{
|
||||
var data = new CoinData(EnemyData.DropCoin, GameEntry.Entity.NextId())
|
||||
{
|
||||
Position = CachedTransform.position
|
||||
};
|
||||
GameEntry.Entity.ShowCoinAsync(data).Forget();
|
||||
}
|
||||
|
||||
if (Random.value < EnemyData.DropPercent)
|
||||
{
|
||||
var data = new ExpData(EnemyData.DropExp, GameEntry.Entity.NextId())
|
||||
{
|
||||
Position = CachedTransform.position
|
||||
};
|
||||
GameEntry.Entity.ShowExpAsync(data).Forget();
|
||||
}
|
||||
|
||||
base.OnDead(attacker);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
protected Vector3 GetTargetDirection()
|
||||
{
|
||||
if (_target == null)
|
||||
{
|
||||
return Vector3.zero;
|
||||
}
|
||||
|
||||
return new Vector3(
|
||||
_target.position.x - CachedTransform.position.x,
|
||||
0f,
|
||||
_target.position.z - CachedTransform.position.z
|
||||
).normalized;
|
||||
}
|
||||
|
||||
private void ApplyVisualParams(EnemyData data)
|
||||
{
|
||||
CachedTransform.localScale = Vector3.one * data.Scale;
|
||||
|
||||
var renderer = GetComponentInChildren<Renderer>();
|
||||
var block = new MaterialPropertyBlock();
|
||||
block.SetColor("_BaseColor", data.Color);
|
||||
renderer.SetPropertyBlock(block);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user