Unity 麦扣 x 勇士传说 全解析 之 玩家与怪物交互(附各模块知识的链接,零基础也包学会的牢弟)(案例难度:★★☆☆☆)

关于编码的我认为是属于强基础的内容,所以不会贴链接过来,因为这种基础需要多学,多写,多练,唐老狮有句话说得好,50万行有效代码,你就能成为该行业的专家

我深感认同,十分感谢麦扣老师与唐老狮

Unity物理模块 之 ​2D碰撞器-CSDN博客 

1.怪物的碰撞器和触发器

 

大圈为触发器,小圈为碰撞器

剔除碰撞器的检测

2.碰撞检测与处理

估计这个攻击脚本需要被继承重写,因为多态省事嘛,等后面需要代码重写的时候再贴链接

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Attack : MonoBehaviour
{
    [Header("伤害")]
    //攻击伤害
    public float damage;
    //攻击范围
    public float damageRange;
    //攻击频率
    public float damageRate;

    //触发受击
    private void OnTriggerStay2D(Collider2D collision) {

        //如果传入的是玩家的碰撞器,那么受到伤害的就是玩家;如果传入的是怪物的碰撞器,那么受到伤害的就是怪物
        collision.GetComponent<Character>()?.TakeDamage(this);
    }

}

3.扣血与无敌帧机制

怪物,玩家身上都挂着该脚本的话会不会显得冗长了一点,可以将血量等写到抽象类中继承

注意:无敌时间是固定(只改数值),需要减少的是无敌计时,需要判断的是无敌状态 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Character : MonoBehaviour
{
    [Header("血量")]
    //最大血量
    public float maxHp;
    //当前血量
    public float currentHp;

    //无敌帧
    public float wudiTime;//固定的无敌时间
    public float wudiClock;//无敌计时
    public bool wudiState;//无敌状态

    private void Start() {
        wudiTime = 1.5f;
        maxHp = 100;
        currentHp = maxHp;
    }
    private void Update() {

        //无敌计时的递减
      if(wudiState==true)
        {
            wudiClock -= Time.deltaTime;
            if(wudiClock<=0)
               { wudiClock = 0;
                wudiState = false; }
        }
    }
    //减血方法
    public void TakeDamage(Attack attack)
        {
        //如果无敌状态直接返回
        if (wudiState==true)
            return;
        //反之则减血触发无敌,如果血量不够则扣血到0后直接死亡
        if (currentHp - attack.damage > 0){
           currentHp -= attack.damage;
            TriggerWuDi(); 
        }        
        else
           { currentHp = 0; 
            //触发死亡逻辑
        }
    }
    private void TriggerWuDi()
        { 
    if(wudiState==false)
            { 
            wudiClock =wudiTime;
            wudiState=true;
        }
    }
}

这里我忘了剔除碰撞体的检测了,已在标题1的内容中补充 

4.受伤动画

可以用叠加层动画,也可以直接在第一层中用Anysate进入

这里设置了触发切换条件 

 

可视化事件监听的方式订阅该事件

   public void IsHurt()
       {
       animator.SetTrigger("IsHurt");   
   }
    public UnityEvent<Transform> OnHurt;
OnHurt?.Invoke(attacked.transform);

 受伤反弹

这里我debug了,还是做不到反弹效果,不知道为什么

 //受伤反弹函数
 public void HurtRedbound(Transform attacked)
     {
     Debug.Log("Attacker: " + attacked.name);
     //受伤状态
     isHurt = true;
     //速度设置为0
     rb.velocity= Vector2.zero;
     //通过向量找到位置在左还是右
     Vector2 dirction = new Vector2((this.transform.position.x- attacked.transform.position.x),0).normalized;
     Debug.Log("Direction: " + dirction);
     //实现反弹
     rb.AddForce(dirction* hurtForce,ForceMode2D.Impulse);
     Debug.Log("HurtRedbound called");
 }

 这个我没见过,查了一下是unity官方的动画状态机脚本,触发什么的都写好了拿来就用

 

5.死亡动画

这些也都是轻车熟路了

  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值