在做一款简单的rpg游戏时,肯定会遇到检测敌人是否被击中,检测的方法可以用下面两种。
1. 通过主角与场景中的所有敌人比较
void AtkCondition1(float _range, float _angle)
{
//搜索所有的敌人列表(在动态创建敌人时生成的)
//列表存储的敌人并非敌人的GameObject而是自定义的Enemy类
//Enemy类的一个变量mGameObject则用来存储实例出来的敌人实例
foreach (var item in GameManager.instance.gMonsterDict)
{
//敌人的坐标向量减去Player的坐标向量的长度(使用magnitude)
float tempDis1 = (item.Value.mGameObject.transform.position - player.transform.position).magnitude;
//敌人向量减去Player向量就能得到Player指向敌人的一个向量
Vector3 v3 = item.Value.mGameObject.transform.position - player.transform.position;
//求出Player指向敌人和Player指向正前方两向量的夹角,其实就是Player和敌人的夹角(不分左右)
float angle = Vector3.Angle(v3, player.transform.forward);
if (tempDis1 < _range && angle < _angle)
{
//距离和角度都满足了
//--------------------------------------
}
}
}
2. 通过主角和射线检测的敌人比较
void AtkCondition2(float _range, float _angle)
{
//球形射线检测周围怪物,不用循环所有怪物列表,我发获取“Enemy”类
Collider[] colliderArr = Physics.OverlapSphere(player.transform.position, _range, LayerMask.GetMask("Enemy"));
for (int i = 0; i < colliderArr.Length; i++)
{
Vector3 v3 = colliderArr[i].gameObject.transform.position - player.transform.position;
float angle = Vector3.Angle(v3, player.transform.forward);
if (angle<_angle)
{
//距离和角度都满足了
//---------------------------------------
}
}
}
当然还有别的方法去检测战斗,例如: 在主角前方放置一个隐藏的碰撞盒改成触发器,当进行攻击动作的时候,让触发器显示。触发器与敌人身上的碰撞盒接触时,消灭敌人,1551;
还有另外一个老哥写的,https://www.jianshu.com/p/068705534e07。