当前位置: 首页 > news >正文

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

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

            }

http://www.dtcms.com/a/312698.html

相关文章:

  • 机器学习——下采样(UnderSampling),解决类别不平衡问题,案例:逻辑回归 信用卡欺诈检测
  • LangChain缓冲记忆组件的使用与解析
  • 决策树学习全解析:从理论到实战
  • 数据结构:在链表中插入节点(Inserting in a Linked List)
  • 回归的wry
  • 浅谈Python中的os.environ:环境变量交互机制
  • Uniapp一根数据线实现真机调试运行【uniapp如何把项目运行在手机上】
  • io_submit系统调用及示例
  • 基于springboot的在线考试系统/考试信息管理平台
  • Suno的100个高质量歌词元标签(MetaTags)详解与使用指南
  • SpringBoot3.x入门到精通系列:2.4 RESTful API设计
  • 电脑声音标志显示红叉的原因
  • Spring Batch的2种STEP定义方式
  • spring-ai-alibaba 学习(二十)——graph之检查点
  • VUE2 学习笔记16 插槽、Vuex
  • 大屏项目展示
  • python学智能算法(三十一)|SVM-Slater条件理解
  • 【MySQL进阶】------MySQL程序
  • 全排列二(回溯算法)
  • 位图:用bit改变存储格局
  • Linux 文件与目录操作命令宝典
  • Apache Shenyu 本地启动及快速入门
  • 【Bluetooth】【基础篇】第二章 关于蓝牙协议栈架构与其硬件方案架构大致概述
  • 【JS】JavaScript中的this详解
  • Android 优化 - 日志 Log
  • LeetCode513:找树最左下角的值(bfs+dfs)
  • 【鸿蒙高级】
  • [硬件电路-148]:数字电路 - 什么是CMOS电平、TTL电平?还有哪些其他电平标准?发展历史?
  • 动感按钮:如何打造交互感十足的点击动画效果
  • 【1】WPF界面开发入门—— 图书馆程序:登录界面设计