前提・実現したいこと
UnityでオンラインFPSのゲーム制作を行っています。
Photon Cloudを用いて行っています。
RPCで生成同期をしたのですが正面に立っているときしかうまく衝突判定がされません。
発生している問題・エラーメッセージ
キャラクターにCharacter Controllerがついていて、そのキャラクターの子要素にメインカメラがあります。 メインカメラの中心から弾を生成するようにしています。 衝突判定がキャラクター同士が正面に向かい合っている時しか衝突判定してくれません。 後ろから弾がくると当たる側のwindowからは通り抜けてしまいます。 以下のURLから実行可能です。 https://unityroom.com/games/space_fps_byunity
該当のソースコード
キャラクターについているスクリプトの一部を抜粋します。 startの中に if(!myPV.isMine){ //自分自身でないときカメラとキャンバスを消す GetComponentInChildren<Camera>().enabled = false; GetComponentInChildren<Canvas>().enabled = false; } 衝突判定部分 void OnCollisionEnter(Collision col){ //オンライン化 if(!myPV.isMine){ return; } //弾に当たった時の処理 if(col.gameObject.tag == "bullet"){ maincamera.HP_flag = 1; damage.Play(); } } 以下が問題のメインカメラ using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class maincamera : MonoBehaviour { //オンライン化 [SerializeField] private PhotonView myPV; //弾のプレハブ [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; //ダメージ管理 private int HP = 100; [SerializeField] private Text text_HP; 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(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; } if(HP==0){ SceneManager.LoadScene("Launcher"); } //弾が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")){ myPV.RPC("bulletInst",PhotonTargets.AllViaServer); elapsedTime = 0f; armo --; text_armo.text = armo.ToString(); gunshoot.Play(); } } void reload(){ gunreload.Play(); armo = 40; text_armo.text = armo.ToString(); } [PunRPC] void bulletInst(){ var bulletIns = Instantiate(bullet,transform.position + transform.forward * 0.5f,transform.rotation); bulletIns.GetComponent<Rigidbody>().AddForce(transform.forward * shotPower); Destroy(bulletIns,deleteTime); } }
試したこと
bulletInstでtransform.position等だとそれぞれのtransfoemの値になってしまうかと思い新しいVector3,Quaternionの変数を作りそこに生成場所のtransformを入れて試してみましたが、正面の時も衝突判定が起こらずうまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー