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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Unity3D

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

Q&A

0回答

229閲覧

正面からしか衝突判定がされない

sinasinaEX

総合スコア13

Unity3D

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

0グッド

1クリップ

投稿2018/08/18 09:12

編集2022/01/12 10:55

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

sakura_hana

2018/08/20 07:02

衝突判定をしている部分のソースコードも提示してもらえると解決出来るかもしれません。
sinasinaEX

2018/08/20 07:45 編集

編集しておきます。よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問