学习游戏制作记录(实现克隆攻击的克隆复制和水晶代替克隆)8.3

发布于:2025-08-04 ⋅ 阅读:(15) ⋅ 点赞:(0)

1.实现克隆攻击的克隆复制

Clone_Skill脚本:

    [Header("Can Duplicate Clone")]
    [SerializeField]private bool canDuplicateClone;//是否可以进行复制
    [SerializeField] private float chanceToDuplicateClone;//克隆的概率

    public void  CreatClone(Transform newtransform,Vector3 offset)
    {
        GameObject newclone= GameObject.Instantiate(ClonePrefab,newtransform.position,Quaternion.identity);

        newclone.GetComponent<Clone_Skill_Control>().SetupClone(newtransform, cloneDuration, canAttack,offset,FindClosetEnemy(newclone.transform),canDuplicateClone,chanceToDuplicateClone);
    }

//传入参数到Clone_Skill_Control脚本中

Clone_Skill_Control脚本:

    private bool canDuplicateClone;
    private float chanceToDuplicateClone;

    private float facingDir=1;//朝向

    private void FacingClosestEnemy()
    {

        if(closestEnemy!=null)
        {
            if(transform.position.x>closestEnemy.position.x)
            {
                facingDir = -1;//翻转时克隆朝向为-1
            transform.Rotate(0, 180, 0);
                
            }

        }
    }

    private void AttackTrigger()
    {
        Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(attackCheck.position, attackCheckRadius);

        foreach (var hit in collider2Ds)
        {
            if (hit.GetComponent<Enemy>() != null)
            {
                hit.GetComponent<Enemy>().Damage();


                if(canDuplicateClone)//如果可以复制
                {
                    if(Random.Range(0,100)<chanceToDuplicateClone)
                    {
                       SkillManage.instance.clone.CreatClone(hit.transform,new Vector3(.5f*facingDir,0));//在克隆的朝向偏移位置处重新生成克隆
                    }
                }
            }
        }
    }

这样可以形成一种两面夹击的效果

2.实现水晶代替克隆

Crystal_Skill脚本:

    public void CreateCrystal()//创建水晶的函数,从已有代码中提取出来
    {
        currentCrystal = Instantiate(crystalPrefab, player.transform.position, Quaternion.identity);

        Crystal_Skill_Control newcrystalScript = currentCrystal.GetComponent<Crystal_Skill_Control>();

        newcrystalScript.SetupCrystal(crystalDuration, canExplode, canMoveToEnemy, moveSpeed, FindClosetEnemy(currentCrystal.transform));
    }

Clone_Skill脚本:

  [Header("Crystal Instead Clone")]
  [SerializeField] private bool canCrystalInsteadClone;

    public void  CreatClone(Transform newtransform,Vector3 offset)
    {
        if(canCrystalInsteadClone)//如果可以替换则只执行创建水晶的功能
        {
            SkillManage.instance.crystal.CreateCrystal();
            return;
        }


        GameObject newclone= GameObject.Instantiate(ClonePrefab,newtransform.position,Quaternion.identity);

        newclone.GetComponent<Clone_Skill_Control>().SetupClone(newtransform, cloneDuration, canAttack,offset,FindClosetEnemy(newclone.transform),canDuplicateClone,chanceToDuplicateClone);
    }

3.实现黑洞技能里克隆水晶并向随机敌人射击

Blackhole_Skill_Control脚本:

    public float GetBlackholeRedius()//返回水晶的检测范围,与黑洞半径保持一致
    {
        return maxSize / 2;
    }

Crystal_Skill_Control脚本:

   [SerializeField] private LayerMask WhatIsEnemy;//敌人图层

    public void ChooseRandomEnemy()
    {
        float radius = SkillManage.instance.blackhole.GetBlackholeRedius();//检测范围内敌人
        Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(transform.position,radius,WhatIsEnemy);


        if(collider2Ds.Length > 0 )
        {
        closestTarget = collider2Ds[Random.Range(0,collider2Ds.Length)].transform;//随机选取

        }
    }

Crystal_Skill脚本:

 public void CurrentCystalChooseRandomEnemy() => currentCrystal.GetComponent<Crystal_Skill_Control>().ChooseRandomEnemy();//其它技能中可以调用的函数

Blackhole_Skill_Control脚本:
        if(SkillManage.instance.clone.canCrystalInsteadClone)//SetupBlackhole()函数中
        {
            playerCanDisper = false;//设置发射水晶时玩家不消失
        }

            if (SkillManage.instance.clone.canCrystalInsteadClone)//AttackLogic()函数中
            {
                SkillManage.instance.crystal.CreateCrystal();
                SkillManage.instance.crystal.CurrentCystalChooseRandomEnemy();//创建水晶并选取随机敌人
            }
            else
            {

            SkillManage.instance.clone.CreatClone(EnemyTarget[randomIndex], new Vector3(xoffest, 0));

            }


网站公告

今日签到

点亮在社区的每一天
去签到