オンラインFPSゲームをUnityNetworkを用いて作成しています。
生成するプレイヤーにはNetworkIdnentity,NetworkTransform,NetworkAnimatorをつけて、その子要素にカメラがあるといった構成です。弾はprefab化して、NetworkManagerに登録してます。
実行するとある場所にプレイヤーが生成されます。
左クリックを押すと下に添付されているカメラのスクリプトのbulletInst()(カメラスクリプトの一番下の関数)が実行されprefabの中の弾が生成されるようになるんですけど、ローカルでは弾が生成されるのですがその弾が同期されません。
どうすればいいでしょうか?
以下がプレイヤーについているスクリプト(長すぎるので一部抜粋)
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); NetworkServer.Spawn(bulletIns); Destroy(bulletIns,deleteTime); } }
あなたの回答
tips
プレビュー