增加功能:扔出的剑命中第一个怪物后在怪直接互相弹
思路:当剑碰到敌人后探测附近敌人并且记录下来(数组记录),如果有就用移动过去不断重复这步移动(i++ % enemyAmount)直到完成弹射次数。

第一步,剑到达目的(检测到碰撞)后搜索附近敌人
[Header("Bounce info")]
private float bounceDistance;
private float bounceSpeed;
private bool isBouncing;
private int bounceAmount;
[SerializeField] private List<Transform> enemyTarget;
private int targetIndex;
public void OnTriggerEnter2D(Collider2D collision)
{
if (isReturningSword)
return;
if (isSpinning)
{
StopWhenSpinning(); //碰到敌人或者超出距离时都停止移动
return;
}
if (isBouncing && enemyTarget.Count <= 0)
{
//一个圆的碰撞体 (数组)
Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, 10);
foreach (var hit in colliders)
{
if (hit.GetComponent<Enemy>() != null)
{
enemyTarget.Add(hit.transform);
}
}
}
}
第二步:弹跳逻辑,当符合弹跳条件时(敌人数不为0)和有弹跳资格(技能树)可弹跳。
逻辑:移动到敌人+计算距离(为下一次做准备)。当移动后敌人数组要后移(数组循环)。如果弹跳次数完成自动返回,让返回的bool设置为真。
//弹跳逻辑
private void BounceLogic()
{
if (isBouncing && enemyTarget.Count > 0)
{
transform.position = Vector2.MoveTowards(transform.position,
enemyTarget[targetIndex].position, bounceSpeed * Time.deltaTime);
if (Vector2.Distance(transform.position, enemyTarget[targetIndex].position) < bounceDistance)
{
enemyTarget[targetIndex].GetComponent<Enemy>().DamageEffect(); //第一次伤害判定是碰撞体触发,后续弹的伤害是这里触发
targetIndex++; //找下一个
bounceAmount--; //弹跳次数-1;
if (bounceAmount <= 0) //弹完了就返回
{
isBouncing = false;
isReturningSword = true;
}
if (targetIndex >= enemyTarget.Count)
targetIndex = 0; //回到第一个目标
}
}
}
第三步:返回剑的思路为:当返回的bool设置为真,让剑move到玩家位置,当玩家与剑的distance小于多少时执行清理剑对象。
//update:
if (isReturningSword)
{
transform.position = Vector2.MoveTowards(
transform.position, player.transform.position, swordRerurningSpeed * Time.deltaTime);
if (Vector2.Distance(transform.position, player.transform.position) < 1)
//sword.CreatSword(); 写错,bug,哈哈
sword.ClearAndCatchTheSword(); //破坏掉剑
}
p72 增加剑技能的切换状态(如从Regular->Bounce),做清理工作
后续还要为剑添加其他功能:已实现和普通投掷(Regular),怪之间互相弹(Bounce),刺穿(Pierce),锯子(spin)
enum变量:

public enum SwordType
{
Regular, // 常规直射剑
Bounce, // 弹跳剑(可攻击多个目标)
Pierce, // 穿刺剑(穿透障碍)
Spin // 旋转剑(持续伤害)
}
//update
if (Input.GetKeyUp(KeyCode.Z))
{
swordType = SwordType.Bounce;
}
if (Input.GetKeyUp(KeyCode.X))
{
swordType = SwordType.Pierce;
}
if (Input.GetKeyUp(KeyCode.C))
{
swordType = SwordType.Spin;
}
public void SetupGravity()
{
if (swordType == SwordType.Bounce)
{
swordGravity = bounceGravity;
}
else if (swordType == SwordType.Pierce)
{
swordGravity = pierceGravaty;
}
else if (swordType == SwordType.Spin)
{
swordGravity = spinGravity;
}
}
//上述给了参数,当创剑时调用函数传入上述参数:
public void CreatSword()
{
newSword = Instantiate(swordPrefab, player.transform.position, transform.rotation);
newSwordScript = newSword.GetComponent<Sword_Skill_Controller>();
//调用剑的脚本ConTroller,在里面设置到组件上面
SetupGravity();
if (swordType == SwordType.Bounce)
{
newSwordScript.SetupBounce(true, bounceAmount, bounceSpeed, bounceDistance);
}
else if (swordType == SwordType.Pierce)
{
newSwordScript.SetupPierce(pierceAmount);
}
else if (swordType == SwordType.Spin)
{
newSwordScript.SetupSpin(true, maxTravelDistance, spinDuration, hitCooldown);
}
newSwordScript.SetupSword(finaDir, swordGravity);
DotsAtive(false); //开始扔剑时就把辅助线关了
}

487

被折叠的 条评论
为什么被折叠?



