2017-05-05 11 views
-1

私はかなり難しい問題があります。私はトップダウンの2Dゲームを作っています。そして、私は怒っている神の領域のような無指向性のキャラクターコントロールを作ることに決めました。私はそれがすべて正常に動作しており、この種のカメラのほとんどすべての不具合を解決することができましたが、1つのことが残っています。 全方位カメラでネットワーク上のどの方向を向けるか決定する

(あなたが見ると16秒のマークの例熙することができます作成​​探してどのような効果イム知らない場合: https://youtu.be/N2q6aXkvIiI?t=12s)メインクライアントのカメラは、よりその180度回転します左、右、右となり

彼が逆さまになっていると思われるときに、与えられたキャラクターをひっくり返すことについてサーバーに残しています。あなたの世界が完全に反転したときに反対のフリップ要求を送るif文を作成することによって、これをやや修正しました。

しかし、彼らは文字を反転する要求を送信しないので、上下にも要因になります。

私は何を得ようとしていますが、私はこのスクリプトを過度に複雑にしています。

誰かがネットワーク上のすべての魔法使いがいつも正しい方向に向いていることを確認する論理的な解決策があるのだろうかと思います。

私は、サーバーに話すためにsocket.ioとNode.jsを使用しています。

任意の入力が優先されます。

TL; DR

はどのようにして、すべてのクライアントは誰もが直面しているどのような方法を知る必要があるときに怒っ神々のカメラの回転スタイルのレルムを作って行くでしょう。 (ビデオ0:16参照)

ありがとうございました。

答えて

0

私はロジックの書き換えを少し修正してこの問題を解決し、すべての魔法をクライアント上で行い、サーバーを完全にその状態から外しました。私がやったことがスーパーエフェクティブであるかどうかはわかりません。

ロジックは、プレーヤーの視野を表すcircle collider2Dを作成したことです。カメラビューの少し外側のものが含まれています。 「otherPlayer」というタグが付けられたオブジェクトとの衝突により、それらがリストに追加されます。

次に、リストが空でない場合は反復処理を行い、オブジェクトが離れるか、私に向かってくるかどうかを判断します。 (HigherScriptingAuthorityには、このコードの一部として:: https://forum.unity3d.com/threads/left-right-test-function.31420/に感謝します)。

私が知っている限り、私がしなければならないことは、そのオブジェクトの変形をつかんでそれに応じて反転させることだけです。ブーム、それは正しく関係なく、メインクライアントが何であるかを回転オブジェクトやプレイヤーを回転させない

希望、これは理にかなって、それが誰かに役立ちます。

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; 
     } 
    } 
} 
関連する問題