Unity のバージョンは 5.2.3f1 です。子ゲーム オブジェクトの回転を同期しようとしています。ローカルでは問題なく動作しますが、他のクライアントには表示されません。私は見つけることができるすべてを試しましたが、何もしませんでした。
この理由は、FPS ボディを回転させるためです。そのため、Spine2 を回転させようとしています (カメラを回転させることは私の最善の解決策ではありません)。私は Mixamo キャラクターを使用してテストしています。最終的には、Mixamo の自動リグ キャラクターを使用するので、ここで作成したものはすべて互換性があります。
Network Transform Rigidbody 3D を使用しようとしましたが、Spine2 ではなくキャラクター自体のみが同期されました。Network Transform Child と公式のスケルトン同期を試しました。
スクリプトの部分で、私は多くのことを試しましたが、最も有望なものはこれでした:
[SyncVar]
private Quaternion syncPlayerRotation;
[SerializeField]
private Transform playerTransform;
[SerializeField]
private float lerpRate = 15f;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void LateUpdate () {
TransmitRotations();
LerpRotations();
}
void LerpRotations()
{
if (!isLocalPlayer)
playerTransform.localRotation = Quaternion.Lerp(playerTransform.localRotation, syncPlayerRotation, Time.deltaTime * lerpRate);
}
[Command]
void CmdProvideRotationsToServer(Quaternion playerRot)
{
syncPlayerRotation = playerRot;
}
[Client]
void TransmitRotations()
{
if (isLocalPlayer)
{
CmdProvideRotationsToServer(playerTransform.localRotation);
}
}
YouTube の UNET チュートリアル シリーズ、Gamer To Game Developer ユーザーからのものです。
Spine2に付けても動かないのですが、主人公に付けたら動きました。
これも試しました:
void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)
{
Vector3 syncPosition = Vector3.zero;
if (stream.isWriting)
{
syncPosition = Spine.GetComponent<Rigidbody>().position;
stream.Serialize(ref syncPosition);
}
else
{
stream.Serialize(ref syncPosition);
Spine.GetComponent<Rigidbody>().position = syncPosition;
}
}
しかし、それはUnityの古いバージョン用だったと思います。
回転させるには、A Free Simple Smooth Mouselookを使用しています
私はそれを編集しました、この行:
if (Input.GetMouseButton(1))
{
var xRotation = Quaternion.AngleAxis(-_mouseAbsolute.y, targetOrientation * Vector3.forward);
transform.localRotation = xRotation;
}
else
{
var xRotation = Quaternion.AngleAxis(-_mouseAbsolute.y, targetOrientation * Vector3.right);
transform.localRotation = xRotation;
}
基本的に、Vector3.right を Vector3.forward に変更し、マウスの右ボタンが押されていない場合のみ Vector3.right を変換しました。スクリプトは Spine2 にアタッチされ、開始時にスクリプトによって if(isLocalPlayer) がアクティブ化されます。
現在の階層の写真があります:
(一部のカメラはテスト専用です。メイン カメラは、標準アセットから抽出された FirstPersonCamera です)
Spine2 の回転をデバッグ ログに記録すると、0 から 1 までの値しか得られないことに気付きました。