p71-p72,Sword Bounce (让剑在怪区域内互相弹),准备阶段 ;类恶魔城Demo学习(记录)

增加功能:扔出的剑命中第一个怪物后在怪直接互相弹
思路:当剑碰到敌人后探测附近敌人并且记录下来(数组记录),如果有就用移动过去不断重复这步移动(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);  //开始扔剑时就把辅助线关了
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值