2017-11-15 5 views
1

質問:プレイヤーの入力を元にして、プレイヤーの位置に基づいてC#コンソール上で方程式を実行するにはどうすればいいですか?ユニティの動きからのC#コンソールのプレイヤーの動き計算の方法

さらに説明すると、クライアントは1つに実行され、サーバーはC#コンソールアプリケーションです。プレイヤが移動キーexを押すと、 (w、魔法使いはプレーヤーを前方に移動させ、プレーヤーを常に前進させます)、プレーヤーがwを押したことをサーバーに送信し、サーバーが応答し、wを押したことをクライアントに伝えますboolをtrueにします。その後、キャラクターは動く。

私は本質的に、統一が何をするかを決める方法を理解しようとしていますが、変換がないか、または変換がどのように動作してサーバー側に適用できるかを理解しています。

private void Update() 
{ 
    SendKeysToServer(); 
    PlayerController(); 
    PlayerPositionUpdateChecker(); 
} 

public void PlayerController() 
{ 
    if (gameObject.name == ntwmng.Playername) 
    { 
     MovementControllerPlayer(); 
     JumpControllerPlayer(); 
     RotationControllerPlayer(); 
     MovementFinalizer(); 
    } 
    else 
    { 
     MovementControllerClones(); 
     JumpControllerClones(); 
     RotationControllerClones(); 
     MovementFinalizerClones(); 
    } 
} 

public void MovementControllerPlayer() 
{ 
    if (CharContr.isGrounded) 
    { 
     moveDirection = new Vector3(0, 0, 0); 

     if (wKeyDownPlayer) 
     { 
      moveDirection = moveDirection + new Vector3(0, 0, speed * Time.deltaTime); 
     } 
     if (sKeyDownPlayer) 
     { 
      moveDirection = moveDirection + new Vector3(0, 0, -speed * Time.deltaTime); 
     } 
     if (qKeyDownPlayer) 
     { 
      moveDirection = moveDirection + new Vector3(-speed * Time.deltaTime, 0, 0); 
     } 
     if (eKeyDownPlayer) 
     { 
      moveDirection = moveDirection + new Vector3(speed * Time.deltaTime, 0, 0); 
     } 

     moveDirection = transform.TransformDirection(moveDirection); 
     //moveDirection *= speed; 
    } 

} 

public void RotationControllerPlayer() 
{ 
    if (dKeyDownPlayer) 
    { 
     transform.Rotate(0, RotationSpeed * Time.deltaTime, 0); 
    } 
    if(aKeyDownPlayer) 
    { 
     transform.Rotate(0, -RotationSpeed * Time.deltaTime, 0); 
    } 
} 

public void JumpControllerPlayer() 
{ 
    if (CharContr.isGrounded) 
    { 

     if (SpaceKeyDownPlayer) 
     { 
      moveDirection.y = jumpSpeed * Time.deltaTime; 
     } 
    } 
} 

public void MovementFinalizer() 
{ 
    moveDirection.y -= gravity * Time.deltaTime; 
    CharContr.Move(moveDirection); 
} 

public void CameraAndListenerController() 
{ 
    if (gameObject.name == ntwmng.Playername) 
    { 
     if (playercam.enabled == false) 
     { 
      playercam.enabled = true; 
     } 
     if (AudioListener.enabled == false) 
     { 
      AudioListener.enabled = true; 
     } 
    } 
    else 
    { 
     if (playercam.enabled == true) 
     { 
      playercam.enabled = false; 
     } 
     if (AudioListener.enabled == true) 
     { 
      AudioListener.enabled = false; 
     } 
    } 
} 

public void SendKeysToServer() 
{ 
    NetworkStream NtwrkStrm = ServerConnection.GetStream(); 
    IFormatter Formatter = new BinaryFormatter(); 

    foreach (KeyCode kcode in Enum.GetValues(typeof(KeyCode))) 
    { 
     if(Input.GetKeyDown(kcode)) 
     { 
      string type = "Movement Update Key Down"; 
      string kycode = Convert.ToString(kcode); 
      //Debug.Log(kycode); 
      Formatter.Serialize(NtwrkStrm, type); 
      NtwrkStrm.Flush(); 
      Formatter.Serialize(NtwrkStrm, ntwmng.Playername); 
      NtwrkStrm.Flush(); 
      Formatter.Serialize(NtwrkStrm, kycode); 
      NtwrkStrm.Flush(); 
     }else 
     if(Input.GetKeyUp(kcode)) 
     { 
      string type = "Movement Update Key Up"; 
      string kycode = Convert.ToString(kcode); 
      //Debug.Log(kycode); 
      Formatter.Serialize(NtwrkStrm, type); 
      NtwrkStrm.Flush(); 
      Formatter.Serialize(NtwrkStrm, ntwmng.Playername); 
      NtwrkStrm.Flush(); 
      Formatter.Serialize(NtwrkStrm, kycode); 
      NtwrkStrm.Flush(); 
     } 
    } 
} 

public void MovementControllerClones() 
{ 
    if (CharContr.isGrounded) 
    { 
     moveDirection = new Vector3(0, 0, 0); 

     if (wKeyDownClone) 
     { 
      moveDirection = moveDirection + new Vector3(0, 0, speed * Time.deltaTime); 
     } 
     if (sKeyDownClone) 
     { 
      moveDirection = moveDirection + new Vector3(0, 0, -speed * Time.deltaTime); 
     } 
     if (qKeyDownClone) 
     { 
      moveDirection = moveDirection + new Vector3(-speed * Time.deltaTime, 0, 0); 
     } 
     if (eKeyDownClone) 
     { 
      moveDirection = moveDirection + new Vector3(speed * Time.deltaTime, 0, 0); 
     } 

     moveDirection = transform.TransformDirection(moveDirection); 
     //moveDirection *= speed; 
    } 

} 

public void RotationControllerClones() 
{ 
    if (dKeyDownClone) 
    { 
     transform.Rotate(0, RotationSpeed * Time.deltaTime, 0); 
    } 
    if (aKeyDownClone) 
    { 
     transform.Rotate(0, -RotationSpeed * Time.deltaTime, 0); 
    } 
} 

public void JumpControllerClones() 
{ 
    if (CharContr.isGrounded) 
    { 

     if (SpaceKeyDownClone) 
     { 
      moveDirection.y = jumpSpeed* Time.deltaTime; 
     } 
    } 
} 

public void MovementFinalizerClones() 
{ 
    moveDirection.y -= gravity * Time.deltaTime; 
    CharContr.Move(moveDirection); 
} 

public void CloneKeyUpdater(string type,string kcode) 
{ 
    //Debug.Log("Key " + kcode + " Clone Updating"); 
    if (type == "Movement Update Key Down") 
    { 
     if (kcode == "W") 
     { 
      wKeyDownClone = true; 
     } 
     if (kcode == "A") 
     { 
      aKeyDownClone = true; 
     } 
     if (kcode == "D") 
     { 
      dKeyDownClone = true; 
     } 
     if (kcode == "S") 
     { 
      sKeyDownClone = true; 
     } 
     if (kcode == "Q") 
     { 
      qKeyDownClone = true; 
     } 
     if (kcode == "E") 
     { 
      eKeyDownClone = true; 
     } 
     if (kcode == "Space") 
     { 
      SpaceKeyDownClone = true; 
     } 
    } 
    else if (type == "Movement Update Key Up") 
    { 
     if (kcode == "W") 
     { 
      wKeyDownClone = false; 
     } 
     if (kcode == "A") 
     { 
      aKeyDownClone = false; 
     } 
     if (kcode == "D") 
     { 
      dKeyDownClone = false; 
     } 
     if (kcode == "S") 
     { 
      sKeyDownClone = false; 
     } 
     if (kcode == "Q") 
     { 
      qKeyDownClone = false; 
     } 
     if (kcode == "E") 
     { 
      eKeyDownClone = false; 
     } 
     if (kcode == "Space") 
     { 
      SpaceKeyDownClone = false; 
     } 
    } 
} 

public void PlayerKeyUpdater(string type, string kcode) 
{ 
    //Debug.Log("Key down " + kcode + " Updating"); 
    if (type == "Movement Update Key Down") 
    { 
     if (kcode == "W") 
     { 
      wKeyDownPlayer = true; 
     } 
     if (kcode == "A") 
     { 
      aKeyDownPlayer = true; 
     } 
     if (kcode == "D") 
     { 
      dKeyDownPlayer = true; 
     } 
     if (kcode == "S") 
     { 
      sKeyDownPlayer = true; 
     } 
     if (kcode == "Q") 
     { 
      qKeyDownPlayer = true; 
     } 
     if (kcode == "E") 
     { 
      eKeyDownPlayer = true; 
     } 
     if (kcode == "Space") 
     { 
      SpaceKeyDownPlayer = true; 
     } 
    } 
    else if (type == "Movement Update Key Up") 
    { 
     if (kcode == "W") 
     { 
      wKeyDownPlayer = false; 
     } 
     if (kcode == "A") 
     { 
      aKeyDownPlayer = false; 
     } 
     if (kcode == "D") 
     { 
      dKeyDownPlayer = false; 
     } 
     if (kcode == "S") 
     { 
      sKeyDownPlayer = false; 
     } 
     if (kcode == "Q") 
     { 
      qKeyDownPlayer = false; 
     } 
     if (kcode == "E") 
     { 
      eKeyDownPlayer = false; 
     } 
     if (kcode == "Space") 
     { 
      SpaceKeyDownPlayer = false; 
     } 
    } 
} 

任意の助けがmuchly理解されるであろう。ここでは

は、クライアント側のコードです。 :)

編集: これは、私が試してプレイヤーの動きを模倣するために使用している方程式を計算したもので、今は0度と90度の間でしか動作しません。方程式は本当に近づいてきますが、ちょっとだけ離れています。助言がありますか?また、これはクライアント側で実行されており、サーバの影響はないため、正確に数学を得ることができます。数学は1秒あたり約1ユニット遅くなり、プレーヤーの現在の位置になります。基本的に= 20数学19に出てくると実際の位置はここ20

ある速度で1秒間wを押した後にコード

if (CharContr.velocity != Vector3.zero)//checks if the player is moving 
    { 
     if (rotation < 90f && rotation > 0f) // makes sure the rotation is 0-90 
     { 
      percent = (100/(90/rotation))/100; // gets the percent 
      x = x + (percent * speed * Time.deltaTime); //adds to current position multiplied by speed and delta time 
      invertPercent = 1 - percent; //gets the percent for z 
      z = z + (invertPercent * speed * Time.deltaTime); // adds and stuff again 
     } 

答えて

0

私はいくつかの検索を行い、解決策を考え出しました。これは、プレイヤーが前進し、プレーヤーの方向が0〜90の場合のみです。基本的には、文字を使用する代わりにtransform.translateを使用する必要がありますコントローラ。私がこれをやっている理由は、プレイヤーがwを押すとそれをサーバーに送信し、サーバーが同時にこれを実行できるようにするためです。その情報を使用して、プレイヤーがいなければならないことを伝えることができます。

if (rotation < 90f && rotation > 0f) 
     { 
      moveDirection = new Vector3(0, 0, 0); 
      percent = (100/(90/rotation))/100; 
      invertPercent = 1 - percent; 

      x = percent * speed; 
      z = invertPercent * speed; 
      transform.Translate(x * Time.deltaTime, 0, z * Time.deltaTime, Space.World); 
      newposition = newposition + new Vector3(x * Time.deltaTime, 0, z * Time.deltaTime); 
     } 
0

ブール値に基づいて、サーバとシンクロ位置にキーコードを送信するには最良ではありません練習。

x、y、z位置の3つの浮動小数点値をサーバーに送信し、それを他のプレーヤーにブロードキャストすることをお勧めします。 他のプレイヤーは近似なしで正確な位置を持っています

申し訳ありません私は間違った場所で答えると、コメントをするのに十分な担当者がいないためです。

+0

Endrik:私がキーストロークを使用しているのは、ベクターをサーバーに送信してから、毎秒プレーヤーがすべてのクライアントに送信したくないからです(おそらく、スムーズな)プログラマーが、私がやろうとしていることにもっと傾いています。私は仕事中ですが、私が降りると、私はその記事をさらに調べて、あなたに戻ってきます。 – PigStyle

+0

動きを滑らかにするには、位置にLerp(補間)を使用する必要があります。 currPos = Vector3.Lerp(currPos、TargetPos、Time.deltaTime)のようなものキーストロークを使用しても を使用してもスムーズにはなりません。 –

+0

私はあなたが私の質問を理解しているとは思わない、あるいは間違って言いました。私はすでに運動がうまく働いています。そのため、すべてTime.DeltaTimeで乗算されます。私はちょうどサーバー側でそれを模倣することができますし、クライアントがすべて正しい位置にいることを確認するために、または誰も不正をされていないことを確認するためにユニティ側の動きを行う方程式を把握する必要があります。私は適切な方程式を取った後、補正関数を実行するように作業します。サーバ側に正しい番号がなければ、訂正が役に立たなくなるからです。 – PigStyle

1

Unityの組み込みのNetworkTransformを使用する代わりに、これを自分で実装したいと思っている以上に、これは本当に複雑です。この"Client-Side Prediction and Server Reconciliation"の記事をお読みください。その記事の多くの部分がありますが、それはあなたに何が起こっているのか、これがどのように行われているのかを示しています。

しかし、新機能(Physics.Simulate)を提供することによってRigidbodyを使用している場合、Unityはこれの一部を単純化しました。 Physics.Simulate関数を使ってサーバー上のすべての剛体をシミュレートし、それぞれのトランスフォームをシリアル化してすべてのクライアントに送信します。

クライアントでは、データを受信して​​デシリアライズし、現在のトランスフォームから受け取ったデータに変換します。 Physics.Simulateを使用してリジッドボディの位置をx秒で判断する方法の例を見つけることができますhere

+0

私はその記事を見て、後者のために保存しました。その瞬間に、サーバ側を実装する前に方程式を完成させる方法を理解する必要があるからです。その後、私はそれを同期するために働くでしょう。 – PigStyle

関連する問題