質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

UnityNetwork アニメーションの同期について

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 442

Kei0206

score 6

今Unityで2dのマルチプレイヤーゲームを作っています
そこで質問です
isLocalPlayerでDashのアニメーションを止めているんですがその時に一緒に書いてある画像の反転(左向きに進んでいる時はlocalScale.xを-1にし画像を左向きに、右向きに進んでいる時は1にし画像を右向きにするもの)までが止まってしまいます
どうにかして画像を反転させる方法はありませんか?

void FixedUpdate ()
    {



        if (!gameClear) {
            if (!isLocalPlayer) {
                return;
            }
            float x = Input.GetAxisRaw ("Horizontal");
            if (x != 0) {
                rigidbody2D.velocity = new Vector2 (x * speed, rigidbody2D.velocity.y);
                Vector2 temp = transform.localScale;
                temp.x = x;
                transform.localScale = temp;

                anim.SetBool ("Dash", true);
                if (transform.position.x > mainCamera.transform.position.x - 4) {
                    Vector3 cameraPos = mainCamera.transform.position;
                    cameraPos.x = transform.position.x + 4;
                    mainCamera.transform.position = cameraPos;
                }
                Vector2 min = Camera.main.ViewportToWorldPoint (new Vector2 (0, 0));
                Vector2 max = Camera.main.ViewportToWorldPoint (new Vector2 (1, 1));
                Vector2 pos = transform.position;
                pos.x = Mathf.Clamp (pos.x, min.x + 0.5f, max.x);
                transform.position = pos;
            } else {
                rigidbody2D.velocity = new Vector2 (0, rigidbody2D.velocity.y);
                anim.SetBool ("Dash", false);

            }


一応全てのコードを載せときます

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;


using UnityEngine.UI;



public class PlayerScript :NetworkBehaviour
{

    public float speed = 4f;
    public float jumpPower = 700;
    public LayerMask groundLayer;
    public GameObject mainCamera;
    public GameObject bullet;
    public LifeScript lifeScript;

    private Rigidbody2D rigidbody2D;
    private Animator anim;
    private NetworkAnimator netAnim;
    private bool isGrounded;
    private Renderer renderer;

    private bool gameClear = false;
    //ゲームクリアーしたら操作を無効にする
    public Text clearText;
    //ゲームクリアー時に表示するテキスト


    void Start ()
    {
        anim = GetComponent<Animator> ();
        netAnim = GetComponent<NetworkAnimator> ();
        rigidbody2D = GetComponent<Rigidbody2D> ();
        renderer = GetComponent<Renderer> ();
    }

    void Update ()
    {
        if (!isLocalPlayer) {
            return;
        }

        isGrounded = Physics2D.Linecast (
            transform.position + transform.up * 1,
            transform.position - transform.up * 0.05f,
            groundLayer);

        //ジャンプさせない
        if (!gameClear) {

            if (Input.GetKeyDown ("space")) {
                if (isGrounded) {
                    netAnim.SetTrigger ("Jump");
                    isGrounded = false;
                    rigidbody2D.AddForce (Vector2.up * jumpPower);
                }
            }


        }


        float velY = rigidbody2D.velocity.y;
        bool isJumping = velY > 0.1f ? true : false;
        bool isFalling = velY < -0.1f ? true : false;
        anim.SetBool ("isJumping", isJumping);
        anim.SetBool ("isFalling", isFalling);

        //弾を打たせない、ゲームオーバーにさせない
        if (!gameClear) {

            if (Input.GetKeyDown ("left ctrl")) {
                netAnim.SetTrigger ("Shot");
                Instantiate (bullet, transform.position + new Vector3 (0f, 1.2f, 0f), Quaternion.identity);
            }

            if (gameObject.transform.position.y < Camera.main.transform.position.y - 8) {
                lifeScript.GameOver ();
            }

        }

    }

    void FixedUpdate ()
    {



        //左右に移動させない MainCameraを動かさない
        if (!gameClear) {

            if (!isLocalPlayer) {
                return;
            }
            float x = Input.GetAxisRaw ("Horizontal");
            if (x != 0) {
                rigidbody2D.velocity = new Vector2 (x * speed, rigidbody2D.velocity.y);
                Vector2 temp = transform.localScale;
                temp.x = x;
                transform.localScale = temp;

                anim.SetBool ("Dash", true);
                if (transform.position.x > mainCamera.transform.position.x - 4) {
                    Vector3 cameraPos = mainCamera.transform.position;
                    cameraPos.x = transform.position.x + 4;
                    mainCamera.transform.position = cameraPos;
                }
                Vector2 min = Camera.main.ViewportToWorldPoint (new Vector2 (0, 0));
                Vector2 max = Camera.main.ViewportToWorldPoint (new Vector2 (1, 1));
                Vector2 pos = transform.position;
                pos.x = Mathf.Clamp (pos.x, min.x + 0.5f, max.x);
                transform.position = pos;
            } else {
                rigidbody2D.velocity = new Vector2 (0, rigidbody2D.velocity.y);
                anim.SetBool ("Dash", false);

            }

        } else {
            //クリアーテキストを表示
            clearText.enabled = true;
            //アニメーションは走り
            anim.SetBool ("Dash", true);
            //右に進み続ける
            rigidbody2D.velocity = new Vector2 (speed, rigidbody2D.velocity.y);
            //5秒後にタイトル画面へ戻るCallTitleメソッドを呼び出す
            Invoke ("CallTitle", 5);
        }

    }

    void OnCollisionEnter2D (Collision2D col)
    {
        if (!gameClear) {
            if (col.gameObject.tag == "Enemy") {
                StartCoroutine ("Damage");
            }
        }
    }

    IEnumerator Damage ()
    {
        gameObject.layer = LayerMask.NameToLayer ("PlayerDamage");
        int count = 10;
        while (count > 0) {
            renderer.material.color = new Color (1, 1, 1, 0);
            yield return new WaitForSeconds (0.05f);
            renderer.material.color = new Color (1, 1, 1, 1);
            yield return new WaitForSeconds (0.05f);
            count--;
        }
        gameObject.layer = LayerMask.NameToLayer ("Player");
    }

    void OnTriggerEnter2D (Collider2D col)
    {
        //タグがClearZoneであるTriggerにぶつかったら
        if (col.tag == "ClearZone") {
            //ゲームクリアー
            gameClear = true;
        }
    }

    void CallTitle ()
    {
        //タイトル画面へ
        Application.LoadLevel ("Title");
    }

}


状況がわかりやすいよう画像を追加しました
イメージ説明
このような感じで右の画面はキャラクターが左に走っていますが左の画面だとキャラクターが左を向いて走らなくなります
つまりクライアント側でホスト側のキャラの向きが反映されないということです(ホスト側でもそうなります)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sakura_hana

    2018/03/15 14:35

    状況がよくわかりません。このソースだけだと「自キャラが移動中は画像反転する、停止中は反転処理は行われない」「相手キャラは何もしない(移動も画像反転もしない)」と挙動します。あとは他のコンポーネントで何のパラメータを伝えているか(通信しているか)により見え方が変わります。この辺りを再確認してみてください。

    キャンセル

回答 1

checkベストアンサー

+1

transform.localScaleが同期されていないのだと思います。
(NetworkTransformが付いていても恐らく対象外になっている)

左右が切り替わったタイミングでRPCをコールするのがスマートかと思います。
参考:How To Sync Scale in UNET - Unity Answers

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/15 19:59

    解決しました、ありがとうございました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる