public LayerMask wallsLayer;
bool HasPathFreeOfWalls(Transform player, Transform enemy, float reticleRadius)
{
Vector2 direction = enemy.position - player.position;
Vector2 origin = player.position + (direction.normalized) * reticleRadius;
float distance = direction.magnitude - reticleRadius;
RaycastHit2D rayHit = Physics2D.Raycast( origin , direction, distance, wallsLayer);
return rayHit.transform == null; // if does not hit anything, it means that the path is free of walls
}
2条答案
按热度按时间ttvkxqim1#
你可以使用光线投射的方法。你可以从玩家的位置向敌人的位置投射一条光线,如果它探测到中间有一堵墙,你就不允许他们射击。
编辑以匹配游戏描述
一种方法是将所有碰撞器偏移到各自gameObject的枢轴点上方,如this。
然后你在十字线周围投射一个CircleCast来检测那里的所有对象,并检查哪个对象具有最低的Y位置,这意味着那个对象在前面。像这样:
IsGameObjectEnemy()函数必须由你以一种你可以分辨它是敌人还是墙的方式来实现
1mrurvl12#
我评论了这一点,但我认为,因为它可能会解决你的问题,我会提供它作为一个答案。
在检查碰撞的功能上,把障碍检查放在敌人检查之前。例如:
这样它会先检查自己是否撞到了结界,如果撞到了结界,敌人就不会被夺走生命。
希望这对你有帮助。编码快乐!