2017-05-05 3 views
-1

J'ai un problème plutôt difficile. Je fais un jeu 2D topdown. Et j'ai décidé de faire un contrôle de caractère omnidirectionnel comme le royaume du dieu fou (vidéo montre à la deuxième 16 ce que cela signifie). Je l'ai tout fonctionne bien et j'ai réussi à résoudre presque tous les problèmes de ce type de caméra, mais une chose reste.Détermination de la direction à prendre sur un réseau avec une caméra omnidirectionnelle

(si vous ne savez pas quel effet je cherche vous créez pouvez voir un exemple hee à la marque 16 secondes: https://youtu.be/N2q6aXkvIiI?t=12s)

Lorsque l'appareil photo du principal client obtient une rotation plus de 180 degrés à gauche devient droite et de droite devient à gauche et mes messages au serveur à propos de retourner le personnage donné quand il est censé être inversé. J'ai quelque peu corrigé cela en faisant une instruction if qui envoie une requête inversée lorsque votre monde est complètement retourné.

Cependant, le haut et le bas deviennent également un facteur car ils n'envoient pas de requêtes pour retourner le caractère. Ce que j'essaie d'obtenir, c'est que j'ai trop compliqué ce script que je crois en essayant d'obtenir les bons messages à travers tous les clients.

Je me demande si quelqu'un a une solution logique pour s'assurer que tous les caractères sur le réseau font toujours face à la bonne direction à tout moment. J'utilise socket.io et Node.js pour parler au serveur.

Toute contribution serait appréciée.

TL; DR

Comment iriez-vous de faire du style royaume de rotation des dieux en colère de la caméra lorsque tous les clients ont besoin de savoir ce que chacun fait face à façon. (voir vidéo 0:16)

merci.

Répondre

0

J'ai corrigé quelque peu ce problème avec un peu de réécriture de ma logique et j'ai réussi à faire toute la magie sur le client et à en faire complètement sortir le serveur. Je ne sais pas si ce que j'ai fait est super efficace car je suis plutôt novice en codage. La logique est que j'ai créé un cercle collider2D qui représente le champ de vision des joueurs. donc les choses légèrement en dehors de la vue de la caméra sont incluses. Toute collision avec un objet étiqueté "otherPlayer" les ajoutera à une liste. Je passe ensuite en revue la liste, si elle n'est pas vide, et je détermine si l'objet s'éloigne ou vient vers moi. (merci à HigherScriptingAuthority pour une partie du code pour ceci: https://forum.unity3d.com/threads/left-right-test-function.31420/). Une fois que je le sais, tout ce que j'ai à faire est de saisir la transformation de cet objet et de le retourner en conséquence. Boom tourne maintenant correctement l'objet ou le joueur, peu importe ce que la rotation du client principal est

Hope this sens et il aide à quelqu'un.

private float lastDist = 0; 
public float dirNum; 

void CheckArea() 
{ 
    if (listOfPlayers.Count != 0) 
    { 
     foreach(var otherPlayer in listOfPlayers) 
     { 
      float distance = (transform.position - otherPlayer.transform.position).magnitude; 
      if (distance < lastDist) 
      { 
       Vector3 heading = otherPlayer.transform.position - transform.position; 
       dirNum = AngleDir(transform.forward, heading, transform.up); 
       var objectDirection = AngleDir(transform.forward, heading, transform.up); 

       if (objectDirection > 0) 
       { 
        var nav = otherPlayer.GetComponent<Navigator>(); 
        nav.Left(); 
       } 
       if (objectDirection < 0) 
       { 
        var nav = otherPlayer.GetComponent<Navigator>(); 
        nav.Right(); 
       } 

      } 
      if (distance > lastDist) 
      { 
       Vector3 heading = otherPlayer.transform.position - transform.position; 
       dirNum = AngleDir(transform.forward, heading, transform.up); 
       var objectDirection = AngleDir(transform.forward, heading, transform.up); 

       if (objectDirection > 0) 
       { 
        var nav = otherPlayer.GetComponent<Navigator>(); 
        nav.Right(); 
       } 
       if (objectDirection < 0) 
       { 
        var nav = otherPlayer.GetComponent<Navigator>(); 
        nav.Left(); 
       } 

      } 
      lastDist = distance; 
     } 
    } 
}