122
社区成员




在unity中攻击的判断有多种的方式,本文中攻击通常的ARPG中的攻击和释放技能,通过产生对应的Prefab,利用Prefab的collider来进行碰撞判断,并触发Prefab上的攻击方法,对受碰撞体进行伤害判断,通过修改Prefab上Mesh来优化的攻击的判断范围,实现攻击特效和判断的分离
首先是在触发攻击时在合适的位置产生对应的攻击组件,如刀光,火球,并让其有正确的速度和生命周期。
public void CastBoss1Atk()
{
// 获取角色当前位置和朝向
Vector3 spawnPosition = transform.position + transform.forward * 2.0f + Vector3.up;
Quaternion spawnRotation = transform.rotation; // 角色当前朝向
// 实例化预制件
StartCoroutine(CreateAfterDelay(Atk, 0.8f, spawnPosition, spawnRotation));
StartCoroutine(DestroyAfterDelay(Atk, 1f)); //
}
IEnumerator CreateAfterDelay(GameObject obj, float delay, Vector3 spawnPosition, Quaternion spawnRotation)
{
yield return new WaitForSeconds(delay);
obj = Instantiate(Boss1AtkPrefab, spawnPosition, spawnRotation);
}
IEnumerator DestroyAfterDelay(GameObject obj, float delay)
{
yield return new WaitForSeconds(delay);
Destroy(obj);
}
之后是碰撞到指定类型的对象时,触发OnTriggerEnter()来进行攻击判断
if (Time.time - lastAttackTime >= attackInterval && collider.gameObject.tag.Equals("Player"))
{
// 进行攻击交互
Debug.Log(collider.gameObject.name);
attackCtl.DoAttack(collider.gameObject, 1);
lastAttackTime = Time.time;
}
同时可以在这个阶段加入火球爆炸等二次伤害,使用Physics.OverlapSphere()来进行球形的范围判断,也可以进行伤害延迟触发,保证与动画同步,以此来保证游玩的手感
有时碰撞后无法造成伤害,解决过程:确保一设置敌方的tag和layer属性,同时要避免重复设置layer属性;
这种攻击触发的判断方式优点在于对单次攻击的资源消耗较少,也可以通过提前加载Prefab的方式进行优化,但对与持续伤害的判断,由于collider始终处于触发阶段,资源占有率较高,要合理选择不同的攻击判断方式