Part55:Moving crystal(P84)
1:效果和操作
操作:水晶可以自动找到最靠近的enemy并能对目标敌人打击效果
效果:当按下F键时,触发skill.crystal.CanUseSkill(),进而创造水晶预知键为实体,进而Crystal_Skill脚本用SetupCrystal用FIndClosestEnemy()(利用了父脚本Skill脚本的FIndClosestEnemy方法)将所得到的最近敌人作为构造方法参数传递给Crystal_Skill_Controller,进而使用Update中的MoveTowards将水晶移动至最近敌人所在位置,且在距离达到设定距离后FinishCrystal水晶进行爆炸操作(该方法绑定在动画的爆炸帧节点上),与此同时,Crystal_Skill在UseSkill还设定了水晶检测,只有在非canMoveToEnemy情况下才能使用水晶和player位置互换方法

2:代码改变
private void AttackTrigger()
{
Collider2D[] colliders = Physics2D.OverlapCircleAll(attackCheck.position, attackCheckRadius);
foreach (var hit in colliders)
{
if (hit.GetComponent<Enemy>() != null)
{
player.stats.DoDamage(hit.GetComponent<CharacterStats>());
}
}
}
newClone.GetComponent<Clone_Skill_Controller>().SetupClone(_clonePosition,cloneDuration,canAttack,_offset,FIndClosestEnemy(newClone.transform),player);
public void SetupCrystal(float _crystalDuration, bool _canExplode, bool _canMove, float _moveSpeed, Transform _closetTarget)
{
crystalExitTimer = _crystalDuration;
canExplode = _canExplode;
canMove = _canMove;
moveSpeed = _moveSpeed;
closestTarget = _closetTarget;
}
private void Update()
{
if (canMove)
{
transform.position = Vector2.MoveTowards(transform.position, closestTarget.position, moveSpeed * Time.deltaTime);
if (Vector2.Distance(transform.position, closestTarget.position) < 1)
{
FinishCrystal();
canMove = false;
}
}
}
public override void UseSkill()
{
base.UseSkill();
if (currentCrystal == null)
{
....
}
else
{
if (canMoveToEnemy)
return;
....
}
protected virtual Transform FIndClosestEnemy(Transform _checkTransform)
{
Collider2D[] colliders = Physics2D.OverlapCircleAll(_checkTransform.position, 25);
float closestDistance = Mathf.Infinity;
Transform closestEnemy = null;
foreach (var hit in colliders)
{
if (hit.GetComponent<Enemy>() != null)
{
float distanceToEnemy = Vector2.Distance(_checkTransform.position, hit.transform.position);
if (distanceToEnemy < closestDistance)/
{
closestDistance = distanceToEnemy;
closestEnemy = hit.transform;
}
}
}
return closestEnemy;
}
3:效果图
