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

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

新規登録して質問してみよう
ただいま回答率
85.51%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

393閲覧

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

sinasinaEX

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/09/11 09:03

オンライン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); } }

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

C#

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

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

投稿2018/09/11 10:04

fiveHundred

総合スコア9739

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sinasinaEX

2018/09/11 23:47

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

2018/09/12 09:07

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

2018/09/12 10:06

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

2018/09/12 11:01

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問