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

学习游戏制作记录(克隆技能)7.25

1.实现冲刺后在原角色位置留下克隆体的功能

我们需要在玩家进入冲刺状态时创建一个对象,这可以使用预制体来实现

首先创建一个玩家的预制体,并给它装载动画控制器,拖入待机和攻击动画,最后把整个拖入你的预制体文件夹。

修改Player脚本:


public SkillManage skill {  get; private set; }

skill = SkillManage.instance;//简化代码,后面只需要写skill.即可

创建Clone_Skill_Control脚本:

    private SpriteRenderer sr;

    [SerializeField] private float CloneTimer;//克隆计时器
[SerializeField] private float colorloosingSpeed;//克隆体消失的速度


    private void Awake()
{
sr = GetComponent<SpriteRenderer>();
}

    private void Update()
{
CloneTimer -= Time.deltaTime;

        if(CloneTimer < 0 )
{
sr.color=new Color(1,1,1,sr.color.a-Time.deltaTime*colorloosingSpeed);//更改透明度
}

                if(sr.color.a<=0 )
{
Destroy(gameObject);//透明度消失则删除克隆体
}
}

    public void SetupClone(Transform newtransform,float clonduration)
{
transform.position = newtransform.position;//更改克隆体的位置,确保在玩家的位置
CloneTimer = clonduration;
}

创建Clone_Skill脚本并在SkillManage脚本中初始化:

    [Header("Clone info")]
[SerializeField] private GameObject ClonePrefab;//预制体
[SerializeField] private float cloneDuration;//克隆持续时间

    public void  CreatClone(Transform newtransform)
{
GameObject newclone= GameObject.Instantiate(ClonePrefab);//创建预制体对象

        newclone.GetComponent<Clone_Skill_Control>().SetupClone(newtransform, cloneDuration);//更改位置和冷却时间
}

PlayerDashState脚本:

Enter中:

_Player.skill.clone.CreatClone(_Player.transform);//进入时调用创建预制体函数

演示:

 

2.实现克隆体的攻击功能

首先创建动画参数AttackNumber,大于0时进入空状态,等于1,2,3时分别播放攻击动画123

Clone_Skill脚本:

[SerializeField] private bool canAttack;//克隆体是否可以攻击

 newclone.GetComponent<Clone_Skill_Control>().SetupClone(newtransform, cloneDuration, canAttack);//传入上面参数

Clone_Skill_Control脚本:

private Animator anim;//动画组件

 [SerializeField] private Transform attackCheck;//克隆体的攻击检测,需要自行修改预制体,添加攻击检测的子对象
[SerializeField] private float attackCheckRadius = .8f;

 private Transform closestEnemy;//检测最近的敌人

  private void AnimationTrigger()//攻击动画结束时调用的函数,克隆体删除
{
CloneTimer = -1f;
}

  private void AttackTrigger()//攻击动画中的一帧调用的函数
{
Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(attackCheck.position, attackCheckRadius);

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

  private void FacingClosestEnemy()//克隆体转向的函数,在SetupClone()中调用
{
Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(transform.position,25);
float closestEnemyDistance = Mathf.Infinity;//设置最小距离
foreach (var hit in collider2Ds)
{

if (hit.GetComponent<Enemy>() != null)
{
float distanceToEnemy=Vector2.Distance(transform.position,hit.transform.position);//计算与每个敌人的距离

              if(distanceToEnemy < closestEnemyDistance) 

closestEnemyDistance = distanceToEnemy;//更新最小距离
closestEnemy = hit.transform;//记录最近的敌人的组件
}
}
}
if(closestEnemy!=null)
{
if(transform.position.x>closestEnemy.position.x)//实现翻转
{
transform.Rotate(0, 180, 0);
}

      }
}

演示:

http://www.xdnf.cn/news/16373.html

相关文章:

  • 秋招Day19 - 分布式 - 分布式锁
  • 初识决策树-理论部分
  • 肺癌预测模型实战案例
  • 【自动化运维神器Ansible】Ansible常用模块之Copy模块详解
  • 文件包含学习总结
  • 滑动窗口-7
  • 主要分布在背侧海马体(dHPC)CA1区域(dCA1)的时空联合细胞对NLP中的深层语义分析的积极影响和启示
  • ClickHouse 常用的使用场景
  • AWS WebRTC:我们的业务模式
  • [python][flask]flask蓝图使用方法
  • 【软件工程】构建软件合规防护网:双阶段检查机制的实践之道
  • Android studio自带的Android模拟器都是x86架构的吗,需要把arm架构的app翻译成x86指令?
  • FP16 和 BF16
  • 函数-变量的作用域和生命周期
  • 老题新解|奇偶数判断
  • 从Taro的Dialog.open出发,学习远程控制组件之【事件驱动】
  • OAuth 2.0 安全最佳实践 (RFC 9700) password 授权类型已经不推荐使用了,将在计划中移除
  • JS与Go:编程语言双星的碰撞与共生
  • vue2+node+express+MongoDB项目安装启动启动
  • go语言基础教程:【2】基础语法:基本数据类型(整形和浮点型)
  • js实现宫格布局图片放大交互动画
  • android app适配Android 15可以在Android studio自带的模拟器上进行吗,还是说必须在真机上进行
  • 无人机视觉模块技术解析
  • 【LeetCode Solutions】LeetCode 热题 100 题解(1 ~ 5)
  • [CSS]让overflow不用按shift可以滚轮水平滚动(纯CSS)
  • 【数据库】AI驱动未来:电科金仓新一代数据库一体机如何重构性能边界?
  • 半相合 - 脐血联合移植
  • Kingbasepostgis 安装实践
  • Go 官方 Elasticsearch 客户端 v9 快速上手与进阶实践*
  • R 语言绘制六种精美热图:转录组数据可视化实践(基于 pheatmap 包)