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

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

ただいまの
回答率

88.61%

UNETでうまく攻撃できない(!isLocalPlayerがうまく機能しない)

解決済

回答 1

投稿

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

sinasinaEX

score 12

オンラインFPSゲームをUnityNetworkを用いて作成しています。
生成するプレイヤーにはNetworkIdnentity,NetworkTransform,NetworkAnimatorをつけて、その子要素にカメラがあるといった構成です。
実行するとある場所にプレイヤーが生成されます。
左クリックを押すと下に添付されているカメラのスクリプトのbulletInst()が実行されprefabの中の弾が生成されるようになるんですけど、何故か押しても発生されません。
カメラのスクリプトの
       //オンライン化         if(!isLocalPlayer){             return;         }
を消して実行すると生成された全てのプレイヤーから弾が発射されてしまいます。
どうすればいいでしょうか?

以下がプレイヤーについているスクリプト(長すぎるので一部抜粋)

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using UnityEngine.Networking;

public class MyChara : NetworkBehaviour {

    ...

    void Start () {
        //オンライン化
        if(!isLocalPlayer){
            //自分自身でないときカメラとキャンバスを消す
            GetComponentInChildren<Camera>().enabled = false;
            GetComponentInChildren<Canvas>().enabled = false;
        }


        //コントローラー取得
        cCon = GetComponent<CharacterController>();
        //アニメーター取得
        animator = GetComponent<Animator>();
        //キャラ視点カメラ取得
        myCamera = GetComponentInChildren<Camera>().transform;
        //キャラ視点カメラとキャラの角度取得
        initCameraRot = myCamera.localRotation;
        charaRotate = transform.localRotation;
        cameraRotate = myCamera.localRotation;

        damage = GetComponent<AudioSource>();
    }

    void Update () {
        //オンライン化
        if(!isLocalPlayer){
            return;
        }


        animator.SetBool("jump",false);
        //キャラクターの向きを変更
        RotateChara();

        //視点の向きを変える
        RotateCamera();

       ...


以下がカメラについているスクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using UnityEngine.Networking;

public class maincamera : NetworkBehaviour {


    //弾のプレハブ
    [SerializeField]
    private GameObject bullet;
    //レンズからのオフセット値
    [SerializeField]
    private float offset;
    //弾を飛ばす間隔
    [SerializeField]
    private float waitTime = 0.1f;
    //経過時間
    private float elapsedTime = 0f;
    //弾を飛ばす力
    [SerializeField]
    private float shotPower = 200f;
    //弾を消去する時間間隔
    [SerializeField]
    private float deleteTime = 2f;
    //弾薬管理
    private int armo = 40;
    [SerializeField]
    private Text text_armo;
    private float reload_time;
    //オーディオ
    private AudioSource[] aud;
    //銃を撃った時の音
    private AudioSource gunshoot;
    //リロード音
    private AudioSource gunreload;
    public int HP_flag = 0;
    //ダメージ管理
    public int HP = 100;
    [SerializeField]
    private Text text_HP;

    //オンライン化
    public int local_flag = 0;

    void Start () {
        //カーソルを非表示
        Cursor.visible = false;
        // カーソルをウィンドウから出さない
            Cursor.lockState = CursorLockMode.Confined;

        text_armo.text = armo.ToString();
        aud = GetComponents<AudioSource>();
        gunshoot = aud[0];
        gunreload = aud[1];

        text_HP.text = HP.ToString();
    }

    void Update(){
        //オンライン化
        if(!isLocalPlayer){
            return;
        }


        if(HP_flag==1){
            HP -= 20;
            if(HP==60){
                text_HP.color = new Color(255f / 255f, 255f / 255f, 0f / 255f);
            }
            if(HP==20){
                text_HP.color = new Color(255f / 255f, 0f / 255f, 0f / 255f);
            }
            text_HP.text = HP.ToString();
            HP_flag = 0;
        }

        //弾が0の時はリロードする
        if(gunreload.isPlaying){
            return;
        }
        if(armo == 0){
            reload();
        }
        if(Input.GetButton("Reload") && armo!=40){
            reload();
        }
        //一定間隔でしか撃てないようにする
        elapsedTime += Time.deltaTime;
        if(elapsedTime < waitTime){
            return;
        }
        //クリックされた時に弾を発射
        if(Input.GetButton("Fire1")){
            bulletInst();
            elapsedTime = 0f;
            armo --;
            text_armo.text = armo.ToString();
            gunshoot.Play();
        }

    }

    void reload(){
        gunreload.Play();
        armo = 40;
        text_armo.text = armo.ToString();
    }

    void bulletInst(){
        var bulletIns = Instantiate(bullet,transform.position + transform.forward * 0.5f,transform.rotation);
        bulletIns.GetComponent<Rigidbody>().AddForce(transform.forward * shotPower);
        Destroy(bulletIns,deleteTime);
    }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

検証していませんが、以下のようにするとどうなりますか?

        if(!GetComponentInParent<NetworkIdentity>().isLocalPlayer){
            return;
        }

気になる点として、このソースでは単純にInstantiate()をしただけになっておりますが、UNETで同期したいオブジェクトを生成するときはサーバー側でInstantiate()してNetworkServer.Spawn()するという手順を取ります(クライアント側では特に何もしなくてよい)。
意図的なら別に問題ないですが、そうでなければ再度調べ直したほうがいいでしょう。
古い情報ですが、こちらが参考になります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/09/12 08:47

    できました!ありがとうございます
    maincameraにNetworkIdentityをつけてやって(!isLocalPlayer)もできなかったのんですけど、これだとできました!
    とりあえずオフラインで完成させてから同期とかは考えようと思っていたので、このサイトを参考にしたいと思います。またなにかあったら力になってください!

    キャンセル

  • 2018/09/12 18:07

    bulletをNetworkManagerに登録してbulletInstのDestroyの下に
    NetworkServer.Spawn(bulletIns);
    としてみたのですが同期されません。どうすればいいでしょうか?

    キャンセル

  • 2018/09/12 19:06

    すいません。私もよく分からないです。
    とりあえず、新しく質問を投稿すれば、他の方が回答してくれるかもしれません。

    キャンセル

  • 2018/09/12 20:01

    了解しました。ありがとうございます。

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る