編集
カプセルに剛体コンポーネントを追加することで、問題を部分的に解決しました。サーバー上を移動するには、明らかにそれが必要であるとどこかで読みました。
問題 2
私が抱えている次の問題は、クライアントによってスポーンされたカプセルを正常に移動できるようになり、ホストはそれを好きなだけ何度でも移動できることです。私が今得ている問題は、ホストがカプセルをスポーンするときに、クライアントがそれをまったく動かすことができず、クライアント側で一種のグリッチ効果が発生し、カプセルがまだホスト側で動かないことです。一方向にしか機能せず、逆方向には機能しない理由はありますか? 最初は Spawn と SpawnWithClientAuthority に関係があるのではないかと思っていましたが、違いはないようです。
プロジェクトの概要
私は非常に単純なマルチプレイヤー プロジェクトを持っています。私がやりたいのは、1 つのプレイヤー ホストを持ち、もう 1 つをクライアントとして参加させることだけです。それらが結合されると、2 人のプレイヤーがカプセルをスポーンし、ユーザーがカプセルをクリックすると、カプセルがスポーンされます。彼らはそれを拾ってシーン内を移動できる必要があり、他のプレイヤーはこのアクションを見ることができる必要があります. 両方のプレイヤーをサーバーに接続して独自のカプセルをスポーンさせることができ、両方のプレイヤーがこれを見ることができます。モーションスクリプトも同様に実行されます。ただし、ホスト側でのみ送信されます。クライアントがオブジェクトを取得しても、サーバー上では更新されません。
問題
少しデバッグを行ったところ、クライアントでコマンドを呼び出したときに、改行や単純なデバッグ ステートメントによってコマンドがまったく実行されていないことがわかりました。
コード
public void OnInputClicked(InputClickedEventData eventData)
{
Debug.Log("clicked");
if (isLocalPlayer)
{
if (Physics.Raycast(transform.position, direction: transform.forward, hitInfo: out hit, maxDistance: range))
{
Debug.Log("Hit capsule");
objectID = GameObject.Find(hit.transform.name);
objNetId = objectID.GetComponent<NetworkIdentity>();
CmdAssignAuthority(objNetId);
Debug.Log("Cmd done");
}
else
{
//else if the player is releasing the object we want to release authority
if (objNetId != null)
{
CmdAssignAuthority(objNetId);
}
}
}
[Command]
void CmdAssignAuthority(NetworkIdentity target)
{
Debug.Log("inside cmd");
NetworkConnection current = target.clientAuthorityOwner;
if (current != null && current != connectionToClient)
{
target.RemoveClientAuthority(current);
target.AssignClientAuthority(connectionToClient);
}
else
{
if (current != null)
{
target.RemoveClientAuthority(current);
}
if (current == null)
{
target.AssignClientAuthority(connectionToClient);
}
}
}
質問
このコマンドを正しく呼び出していますか? スクリプトはプレーヤー プレハブにアタッチされ、カプセル プレハブにはネットワーク ID とネットワーク トランスフォームが含まれます。私は Unet にかなり慣れていないので、これは初歩的なミスのように感じます。