geometry-tower-defense/Assets/GameMain/Scripts/Entity/EntityLogic/Enemy.cs

69 lines
2.1 KiB
C#

using Components;
using GeometryTD.Entity.EntityData;
using UnityEngine;
namespace GeometryTD.Entity
{
public class Enemy : EntityBase
{
private Transform _target;
private float _speed;
private MovementComponent _movementComponent;
private float _attackRange = 1f;
private float _attackRangeSquared;
protected override void OnInit(object userData)
{
base.OnInit(userData);
_movementComponent = GetComponent<MovementComponent>();
}
protected override void OnShow(object userData)
{
base.OnShow(userData);
if (userData is EnemyData enemyData)
{
_speed = enemyData.Speed;
_target = enemyData.Player;
}
_movementComponent.OnInit(_speed, this.CachedTransform);
_movementComponent.SetMove(true);
_attackRangeSquared = _attackRange * _attackRange;
}
protected override void OnUpdate(float elapseSeconds, float realElapseSeconds)
{
base.OnUpdate(elapseSeconds, realElapseSeconds);
float distanceSquared = (this.CachedTransform.position - _target.position).sqrMagnitude;
if (distanceSquared < _attackRangeSquared)
{
// 攻击
_movementComponent.SetMove(false);
}
else
{
_movementComponent.SetMove(true);
_movementComponent.SetDirection(GetTargetDirection());
}
_movementComponent.OnUpdate(elapseSeconds, realElapseSeconds);
}
protected override void OnHide(bool isShutdown, object userData)
{
_movementComponent.SetMove(false);
base.OnHide(isShutdown, userData);
}
private Vector3 GetTargetDirection()
{
return new Vector3(_target.position.x - this.CachedTransform.position.x, 0f,
_target.position.z - this.CachedTransform.position.z).normalized;
}
}
}