关于编码的我认为是属于强基础的内容,所以不会贴链接过来,因为这种基础需要多学,多写,多练,唐老狮有句话说得好,50万行有效代码,你就能成为该行业的专家
我深感认同,十分感谢麦扣老师与唐老狮
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.死亡动画
这些也都是轻车熟路了