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

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

ただいまの
回答率

89.64%

PUNを利用したキャラクターの操作

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 215

Higawind

score 10

問題の概要

PUN(Photon Unity Networking)を使って、オンラインマルチプレイのゲームを制作しています。
同期の確認のためにビルドして、Unityのプロジェクト上とビルドしたexeファイルでそれぞれルームに入ったのですが
どちらの画面でも後に入ったほうのプレイヤーしか操作できず、カメラのターゲットは動かせないほうのプレイヤーに照準が向いています。

実現したいことは、「3人のキャラクターをマルチプレイ環境で、別々にコントロールしたい(カメラもそれぞれにちゃんと追従する)」です。

下記のスクリプト中に問題のある箇所があったり、上述の問題が発生している
原因などがほかにありましたら、お教えいただければ幸いです。
よろしくお願いいたします…!

該当のソースコード

using System.Collections.Generic;
using UnityEngine;

public class gameManage : MonoBehaviour
{
    //誰かがログインする度に生成するプレイヤーPrefab
    public GameObject playerPrefab;

    void Start()
    {

        if (!PhotonNetwork.connected)   //Phootnに接続されていなければ
        {
            Application.LoadLevel("Launcher"); //ログイン画面に戻る
            return;
        }
        //Photonに接続していれば自プレイヤーを生成

        GameObject Player = PhotonNetwork.Instantiate(this.playerPrefab.name, new Vector3(0f, 3f, -9f), Quaternion.identity, 0);




        characterMove characterMove = Player.GetComponent<characterMove>();
        characterMove.enabled = true;
        Attack attack = Player.GetComponent<Attack>();
        attack.enabled = true;

    }

    // Update is called once per frame
    void Update()
    {

    }


}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class characterMove : MonoBehaviour
{
    public PhotonView myPV;
    public PhotonTransformView myPTV;
    public Camera mainCam;

    // このスクリプトで使う変数一覧
    public CharacterController charaCon;       // キャラクターコンポーネント用の変数
    public Animator animCon;  //  アニメーションするための変数
    public float idoSpeed = 5.0f;         // 移動速度(Public=インスペクタで調整可能)
    public float kaitenSpeed = 1200.0f;   // プレイヤーの回転速度(Public=インスペクタで調整可能)

    private Vector3 movePower = Vector3.zero;    // キャラクター移動量(未使用)
    private float jumpPower = 10.0f;        // キャラクター跳躍力(未使用)
    private const float gravityPower = 9.8f;         // キャラクター重力(未使用)
    private Vector3 moveDirection;


    public void Hit()        // ヒット時のアニメーションイベント(今のところからっぽ。ないとエラーが出る)
    {

    }


    // ■最初に1回だけ実行する処理
    void Start()
    {
        //charaCon = GetComponent<CharacterController>(); // キャラクターコントローラーのコンポーネントを参照する
        //animCon = GetComponent<Animator>(); // アニメーターのコンポーネントを参照する
        if (myPV.isMine)    //自キャラであれば実行
        {
            //MainCameraのtargetにこのゲームオブジェクトを設定
            mainCam.GetComponent<FollowingCamera>().target = this.gameObject.transform;
        }
    }


    // ■毎フレーム常に実行する処理
    void Update()
    {
        /*
        if (!myPV.isMine)    //自キャラであれば実行
        {
            return;
        }
        */
            //スムーズな同期のためにPhotonTransformViewに速度値を渡す
            Vector3 velocity = charaCon.velocity;
            myPTV.SetSynchronizedValues(velocity, 0);


            float holizontal = Input.GetAxis("Horizontal");
            float vertical = Input.GetAxis("Vertical");
            Rigidbody rigid = GetComponent<Rigidbody>();
            moveDirection = transform.transform.forward * idoSpeed * Input.GetAxis("Vertical");
            moveDirection.y -= 10f * Time.deltaTime;

            if (Input.GetKeyDown(KeyCode.Space))
            {
                //上にジャンプする。
                //Debug.Log(moveDirection);
                charaCon.Move(moveDirection * Time.deltaTime);
                //rigid.AddForce(Vector3.down * 80, ForceMode.Acceleration);
            }

            // ▼▼▼移動処理▼▼▼
            if (animCon.GetBool("Attack") == true || animCon.GetBool("SPAttack") == true || animCon.GetBool("Dead") == true)
            {
                if (animCon.GetBool("SPAttack") == true)
                {
                    Invoke("SPReset", 1.3f);
                }
                return;
            }

            if (Input.GetAxis("Vertical") == 0 && Input.GetAxis("Horizontal") == 0)  //  テンキーや3Dスティックの入力(GetAxis)がゼロの時の動作
            {

                animCon.SetBool("Run", false);  //  Runモーションしない
            }

            else//  テンキーや3Dスティックの入力(GetAxis)がゼロではない時の動作
            {

                var cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized;  //  カメラが追従するための動作
                Vector3 direction = cameraForward * Input.GetAxis("Vertical") + Camera.main.transform.right * Input.GetAxis("Horizontal");  //  テンキーや3Dスティックの入力(GetAxis)があるとdirectionに値を返す
                animCon.SetBool("Run", true);  //  Runモーションする

                MukiWoKaeru(direction);  //  向きを変える動作の処理を実行する(後述)
                IdoSuru(direction);  //  移動する動作の処理を実行する(後述)
            }


            // ▼▼▼アクション処理▼▼▼
            animCon.SetBool("Attack", Input.GetKey("j") || Input.GetButtonDown("Attack"));  //  キーorボタンを押したらアクションを実行
            animCon.SetBool("Guard", Input.GetKey("l") || Input.GetButtonDown("Guard"));  //  キーorボタンを押したらアクション2を実行
            animCon.SetBool("SPAttack", Input.GetKey("k") || Input.GetButtonDown("SPAttack"));  //  キーorボタンを押したらアクション3を実行
            animCon.SetBool("Jump", Input.GetKey("space") || Input.GetButtonDown("Jump"));  //  キーorボタンを押したらジャンプを実行(仮)

            if (LocalVariables.currentHP <= 0)
            {
                Debug.Log("死亡");
                animCon.SetBool("Dead", true);
                Invoke("DeadReset", 8.0f);
            }

    }

    private void SPReset()
    {
        animCon.SetBool("SPAttack", false);
    }

    private void DeadReset()
    {
        Destroy(this.gameObject);
        animCon.SetBool("Dead", false);
    }

    // ■向きを変える動作の処理
    void MukiWoKaeru(Vector3 mukitaiHoukou)
    {

            Quaternion q = Quaternion.LookRotation(mukitaiHoukou);          // 向きたい方角をQuaternion型に直す
            transform.rotation = Quaternion.RotateTowards(transform.rotation, q, kaitenSpeed * Time.deltaTime);   // 向きを q に向けてじわ~っと変化させる.


    }


    // ■移動する動作の処理
    void IdoSuru(Vector3 idosuruKyori)
    {
            charaCon.Move(idosuruKyori * Time.deltaTime * idoSpeed);   // プレイヤーの移動距離は時間×移動スピードの値

    }

    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {

    }


}

補足情報(FW/ツールのバージョンなど)

Unity 2019.2.3f1 (64-bit) です。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • kureha413

    2019/10/26 22:00

    プレイヤーの生成自体には問題がないのですよね?
    上記のコードを見る限り確実にアウトだと思われる点はありません。
    「カメラが追従する対象が違う」「操作できるプレーヤーが違う」という問題は操作に関するスクリプト側に主に問題があると思われますので、一部でいいのでそちらの方のスクリプトを提示していただけると助かります。

    キャンセル

  • Higawind

    2019/10/27 11:56

    お返事ありがとうございます!
    承知いたしました!すぐに追加いたします!

    キャンセル

まだ回答がついていません

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

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