Comment savoir si mon ennemi peut voir mon joueur?

15

Étant donné un joueur et un ennemi avec position, et étant donné le vecteur de direction de chacun, comment savoir si l'un peut "voir" l'autre?

En d'autres termes, comment puis-je tester si une position avec direction est devant ou derrière une autre position avec direction?

Pour mes besoins, «devant» signifie directement devant ou à 90 degrés de chaque côté.

izb
la source
11
De toute évidence, la solution consiste à créer une autre caméra et à restituer la scène du point de vue de l'ennemi, puis à effectuer une reconnaissance d'image sur le résultat pour le personnage du joueur.
Riking
le prix de la réponse la plus simpliste revient à ...
OganM
3
Alors que le commentaire de Riking a probablement été conçu comme une blague, c'est la réelle juste façon de le faire - donnant OBNL le même accès à l'état du jeu qu'un joueur aurait plutôt que de leur permettre d'accéder à l'état interne du jeu.
R .. GitHub STOP HELPING ICE
5
@R .. Oui, mais où tracez-vous la ligne? En amenant ce raisonnement à son point de terminaison logique, les PNJ finissent par devenir sensibles à la capacité de jouer et de penser comme un être humain ... à ce moment-là, ils décideraient probablement rationnellement de recommencer le wallhacking de toute façon: p
Thomas
@Thomas: Dans la pratique, je pense que vous pouvez faire une sorte de compromis, en se rapprochant du niveau d'information qu'ils auraient en tant que joueur sans avoir la peine de le mettre en œuvre de cette façon. Des mesures simples telles que des tests corrects pour la ligne de vue, limitant la capacité d'identifier un objet au-delà d'une certaine distance, etc. pourraient aller très loin.
R .. GitHub STOP HELPING ICE

Réponses:

17

Le produit scalaire de deux vecteurs peut vous dire s'ils se font face ou non. Le premier vecteur peut probablement être la direction de vue des ennemis, le second doit être un vecteur pointant de la position du joueur vers la position des ennemis.

https://www.youtube.com/watch?v=Q9FZllr6-wY

Shittypeete
la source
Ah ouais, j'y pensais trop. Je jonglais avec 4 vecteurs, mais je veux vraiment le vecteur d'un joueur à l'autre. La vidéo a été très utile, merci.
izb
Un détail crucial que je pense devrait être ajouté à cette réponse est que le jeu devrait également faire un raycast ou quelque chose pour s'assurer qu'ils peuvent en fait voir le joueur (pas bloqué par les murs, etc.)
T. Kiley
1
@ T.Kiley: cela a en fait été suggéré par Riking dans le commentaire de la question. Non, je ne pense pas que ce soit une blague. Si votre jeu est en 3D, le raycasting est en fait un moyen équitable de le faire. Rendez simplement la scène avec tous les objets en texture noire, du point de vue de l'ennemi, sauf que les joueurs et autres objets importants doivent être rendus dans d'autres couleurs. Assurez-vous de désactiver l'éclairage et l'ombrage. Si le tampon résultant n'est pas entièrement noir, alors vous savez que quelqu'un est dans la ligne de vue de l'ennemi et vous pouvez utiliser la couleur pour identifier de quels objets il s'agit.
Lie Ryan