前方网络网站建设合同,南宁做网站费用,快速优化官网,团购网站建设敌人的创建
1.敌人添加与组件设置
1#xff09;添加敌人后#xff0c;刚体添加#xff0c;碰撞体添加#xff08;一个碰撞体使猪在地上走#xff0c;不接触人#xff0c;另一个碰撞体组件使人和猪碰在一起产生伤害#xff09;
①刚体
②碰撞体一
设置的只在脚下添加敌人后刚体添加碰撞体添加一个碰撞体使猪在地上走不接触人另一个碰撞体组件使人和猪碰在一起产生伤害
①刚体
②碰撞体一
设置的只在脚下只需要敌人可以站在场景中就可以 但存在添加碰撞体积后会和其他移动的人物或敌人产生碰撞使得无法擦肩而过的效果通过组件中的layer overrides解决敌人与player碰撞问题通过触发器trigger解决人物碰到猪以后掉血的情况 layer overrides
注意低版本譬如2022.1.24unity编辑器在box collider组件中没有layer overrides需要安装新的editor重新打开项目。版本可能不适应换了许多版本editor用最新的。
1.图层重载是指在layer中可以剔除掉不想发生碰撞的角色 2.添加两种图层类型
不需要与player和enemy产生碰撞则增加这两种图层类型
3.选中敌人赋值同理选中玩家 4.给猪剔除这两种图层 trigger
③ 碰撞体二
猪是触发器成为触发器后猪就没有碰撞体积了 可以触发到猪的不包含enemy防止敌人之间相互碰撞产生伤害 添加代码测试触发器的触发
用方法OnTriggerStay2D private void OnTriggerStay2D(Collider2D collision)
{Debug.Log(collision.name);
}可见触发器在接触到没有被屏蔽的碰撞体时被触发了 解决报错
Screen position out of view frustum
方法
增大摄像机的size 人物属性设置、遇敌掉血
1.代码创建
在人物与敌人身上都需要挂这个代码用于记录人物最大血量与当前血量等属性
例如
public class Character : MonoBehaviour
{[Header(基本属性)]public float maxHealth;public float currentHealth;
}2.在每一次触发攻击时减少character中的当前血量
创建attack脚本 攻击属性一般包括伤害、攻击范围、攻击频率等此次添加猪给人的接触伤害挂在猪身上
猪的攻击每次接触到人就会持续被触发触发后对触发者中扣血函数进行调用
public class Attack : MonoBehaviour
{public int damage;public float attackRange;public float attackRate;//作为触发器被别的碰撞体collition触发后collition会扣血private void OnTriggerStay2D(Collider2D collision){collision.GetComponentCharacter().TakeDamage(this); }
}
player的受伤代码
public class Character : MonoBehaviour
{[Header(基本属性)]public float maxHealth;public float currentHealth;private void Start(){currentHealth maxHealth;}//受伤public void TakeDamage(Attack attacker){currentHealth currentHealth - attacker.damage;}
}3.扣血过多计时器 设置一次受伤后触发无敌状态
Time.deltaTime 时间的修正完成上一帧所用的时间s
触发伤害过程触发检测是否为无敌状态 无敌状态直接返回 不是无敌状态触发一次伤害进入无敌状态无敌状态计时器开始倒数倒数到0脱离无敌状态此时又可以受伤害了。
public class Character : MonoBehaviour
{[Header(基本属性)]public float maxHealth;public float currentHealth;[Header(无敌状态)]//无敌时间public float invulnerableTime;//计时器private float invulnerableCounter;//状态public bool invulnerable;private void Start(){currentHealth maxHealth;}//每次update都检测是否为无敌状态private void Update(){if (invulnerable){invulnerableCounter - Time.deltaTime;if (invulnerableCounter 0){invulnerable false;}}}//受伤public void TakeDamage(Attack attacker){//如果无敌则直接返回if (invulnerable){return;}//Debug.Log(attacker.damage);currentHealth currentHealth - attacker.damage;//触发一次伤害就变成无敌triggerInvulnerable();}//触发无敌状态函数private void triggerInvulnerable(){if (!invulnerable){invulnerable true;invulnerableCounter invulnerableTime;}}
}对于以下代码需要确定触发触发器的碰撞体上含有组件脚本Character 如果对方没有这个脚本在被触发时会报错
private void OnTriggerStay2D(Collider2D collision)
{collision.GetComponentCharacter().TakeDamage(this);
}解决方法
添加对对方是否存在该组件的判断 检测血量扣血不要减到0还在减少 增加判断如果血量大于一次伤害则扣血如果不大于则归零
public void TakeDamage(Attack attacker)
{//如果无敌则直接返回if (invulnerable){return;}if (currentHealth - attacker.damage 0){currentHealth - attacker.damage;}elsecurrentHealth 0;//触发一次伤害就变成无敌TriggerInvulnerable();
}