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(); } 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; } } }