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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

1129閲覧

unity3D スクリプトのboolが全ての複数オブジェクトに反映されてしまう。

hikaaaaaaaa

総合スコア19

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2020/04/17 03:40

編集2020/04/20 15:11

unity3dでの鬼ごっこゲームを作成しております。

プレイヤーと鬼を2対ずつ用意をしているのですが、鬼が1対のプレイヤーを捕まえた際にプレイヤーが二体とも捕まってしまうようになってしまいます。
プレイヤーごとにboolの判定を分けたい場合どのようにすれば良いかアドバイスをいただけますと幸いです。

下記にスクリプトを追加させていただきました。
PlayerController,OniControllerでの実装をしております。
鬼がプレイヤーに近付いたらそのプレイヤーが捕獲されるにしたいと考えております。(実際は他のプレイヤーも所定の場所に飛ばされてしまいます。)

PlayerScripts

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class PlayerController : MonoBehaviour 7{ 8 [SerializeField] public OniController anotherScript1; 9 10   void Start() 11 { 12 13 14 anotherScript = GetComponent<UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter>(); 15 16 GameObject anotherObject = GameObject.FindWithTag("Oni"); 17 anotherScript1 = anotherObject.GetComponent<OniController>(); 18 19 20 } 21 22 void Update() 23 { 24 if (anotherScript1.isRouya == true) 25 { 26 float rouya_y = 1.5f; 27 28 transform.position = new Vector3(65, rouya_y, 65); 29 30 } 31 } 32 33 34 35 36} 37

OniController

C#

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6 7public class OniController : MonoBehaviour 8{ 9 //プレイヤーの取得 10 List<GameObject> Players = new List<GameObject>(); 11 12 public bool isRouya; 13 14 15 16 [SerializeField] private Oni.UnityStandardAssets.Characters.ThirdPerson.Oni_ThirdPersonCharacter anotherScript; 17 18 19 20 void Start() 21 { 22 //プレイヤーの取得 23 Players.AddRange(GameObject.FindGameObjectsWithTag("Player")); 24 25 anotherScript = GetComponent<Oni.UnityStandardAssets.Characters.ThirdPerson.Oni_ThirdPersonCharacter>(); 26 27 28 29 30 } 31 32 33 public void OnCollisionStay(Collision hit) 34 { 35 // 接触対象はPlayerタグですか? 36 if (hit.gameObject.tag == "Player") 37 { 38 //Debug.Log("プレイヤーと接触している"); 39 40 OnButtonHokaku(); 41 42 } 43 44 } 45 46 public void OnButtonHokaku() 47 { 48 49 50 51 52 Invoke("Rouya", 0.7f); 53 anotherScript.TouchStart(); 54 Invoke("OnTouchEnd", 0.5f); 55 56 57 58 59 60 61 62 } 63 public void Rouya() 64 { 65 66 67 isRouya = true; 68 69 70 71 } 72 //アニメーションです。 73 public void OnTouchEnd() 74 { 75 anotherScript.TouchEnd(); 76 } 77 78 79 80 81} 82 83 84

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

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

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

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

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

Yukirr4_

2020/04/18 09:05 編集

状況があまりわかんないのですが、つまり「捕まったプレイヤーは牢屋に移動され、他の逃げているプレイヤーが外からカギを開けてくれる」ということであってますか?そこで「内側のプレイヤーはそのカギをいじれない」ようにしたいんですよね?
hikaaaaaaaa

2020/04/18 10:24

username様 質問がわかりずらくて申し訳ございません。 username様に記載していただいた内容で間違いございません。。
Yukirr4_

2020/04/18 10:49

了解しました。こちらの理解力が乏しくてすみません…すぐに回答します。
guest

回答1

0

ベストアンサー

まずプレイヤーのスクリプトに以下を加えます。
以下のスクリプトの名前を仮に「PlayerController」としておきます(自分で作った名前に置き換えてください)

C#

1bool isCaptured = false; //捕まっている状態なのか 2 3//捕まったらこれを実行 4void Captured() 5{ 6 isCaptured = true; 7}

牢屋の判定ボックスのスクリプト

C#

1void OnCollisionEnter(Collision collision){ 2 if(collision.gameObjrct.compareTag("Player")) 3 if(collision.GetComponent<PlayerController>().isCaptured == false) 4{ 5 //開放する処理 6} 7}

つまり、捕まったプレイヤーはisCapturedをtrueにされ、牢屋の検査で引っかかるようにしています。

わからないことがあれば返信ください。

コードが見づらくてすみません。今スマホで書いてるので整理することができません。

###追加

複数のゲームオブジェクトを取得する場合、List<GameObject>もしくはGameObject[]を利用します。
これらはGameObjectの集合です。今回はList<>を使用します。

コードの関係があるところだけを書いています。関係のある個所を当てはめていってください。
GameObject Playerは削除しています。

C#

1 public class GameController : MonoBehaviour 2 { 3//プレイヤーオブジェクトの宣言&初期化 4 List<GameObject> Players = new List<GameObject>(); 5 6 void Start() 7 { 8 //PlayersにPlayerタグが付いているオブジェクトをすべて入れる(FindGameObjectWithTagではないので注意) 9 Players.AddRange(GameObject.FindGameObjectsWithTag("Player")); 10 } 11 12 public void OnButtonKaiho() 13 { 14 Rouya.SetActive(false); 15 Debug.Log("牢屋消えた"); 16 17 //foreachによりPlayersに入っているオブジェクトの数だけ処理を実行 18 foreach(GameObject player in Players) 19 { 20 player.GetComponent<PlayerController>().isCaptured = false; 21 Debug.Log("プレイヤー捕まってない状態"); 22 } 23 24 Rouya.GetComponent<RouyaScript>().ishelp = false; 25 Debug.Log("助ける状態のリセット"); 26 } 27}

複数のオブジェクトを管理する場合、このようにList<>、foreachなどを利用することが多いです。

###追加2

鬼でPlayersリストを作成しておく必要はないです。
ただ触れた一つのPlayerオブジェクトを移動させるだけなのですから。

C#

1public class PlayerController : MonoBehaviour 2{ 3 public bool isHokaku = false; 4 5 //捕獲されたら呼び出す 6 public void Hokaku() 7 { 8 isHokaku = true; 9 10 /*牢屋に移動*/ 11 } 12}

C#

1public class OniController : MonoBehaviour 2{ 3 void OnCollisionEnter(Collision hit) 4 { 5 if (hit.gameObject.tag == "Player") 6 { 7 //Debug.Log("プレイヤーと接触している"); 8 9 //鬼コントローラーからPlayerのHokaku()を実行 10 hit.gameObject.GetComponent<PlayerController>().Hokaku(); 11 12 13 OnButtonHokaku(); 14 15 16 } 17 } 18}

###追記3

触れたときにボタンを表示し、離れたときにボタンを非表示にする。

C#

1//鬼コントローラ 2 3//インスペクターから代入する 4[SerializeField] 5Button Botan; 6 7void OnCollisionEnter(Collision hit) 8{ 9 //表示 10 Botan.gameObject.SetActive(true); 11} 12 13void OnCollisionExit(Collision hit) 14{ 15 //非表示 16 Botan.gameObject.SetActive(false); 17}

ただしこれでは鬼が何百体もいたらいちいちボタンを設定することになるので、
それが面倒ならGameControllerからpublicなボタンを一回取得するやり方でいいと思います↓

C#

1//GameController.cs 2 3public Button Botan;

C#

1//鬼コントローラー 2 3Button Botan; 4GameController gameController; 5void Start() 6{ 7 this.Botan = gameController.Botan; 8}

もしくは検索させることで取得できます↓

C#

1//鬼コントローラ 2 3Button Botan; 4 5void Start() 6{ 7 //Botanという名前のオブジェクトを取得し、その中のButtonコンポーネントを代入 8 Botan = GameObject.Find("Botan").GetComponent<Button>(); 9}

投稿2020/04/18 11:00

編集2020/04/21 06:00
Yukirr4_

総合スコア728

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

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

hikaaaaaaaa

2020/04/18 11:21

この前に引き続きご回答ありがとうございます。。 上記の方法で行ってみます。 ありがとうございます。。
Yukirr4_

2020/04/18 11:49 編集

実際に解決するまでベストアンサーを選ぶのは控えたほうがいいですよ。 もし分かんないことがあれば答えられる範囲なら答えられるので追加コメントください。最近暇なんで…
hikaaaaaaaa

2020/04/19 07:24

ご丁寧にありがとうございます。 ちなみにご教示いただいたスクリプトで試したところ、プレイヤーを複数にした際にできませんでした。。 PlayerControllerとRouyaScrptとGameControllerでの実装をしたのですがプレイヤーを複数にした際のオブジェクトの取得のやり方がわからず悩んでおります。複数のプレイヤーの名前をPlayerで統一させることで解決させようとしましたがダメでした。。 上記にスクリプトを追加させていただいたのですがお手すきの際にアドバイスをいただけますと幸いです。。
Yukirr4_

2020/04/19 12:26

複数のプレイヤー(ゲームオブジェクト)を扱う場合、List<GameObject>を利用することをお勧めします。 回答を編集して詳しく書きたいと思います。
hikaaaaaaaa

2020/04/20 01:45

ありがとうございます。。
hikaaaaaaaa

2020/04/20 01:49

実装をしたところ、プレーヤーではできるのですが、鬼も複数作成したいためGameObject内にusername_様にご教示いただいたスクリプトを実装したところ、boolで判断をしているところにエラーがでてしまいました。。子要素の一つでもboolがtrueになったら処理を実装したいのですが、大変お手数をおかけしますがアドバイスいただけますでしょうか。。
Yukirr4_

2020/04/20 08:14

どのようなエラーが発生しているのかログを入力していただけますか。 PoliceControllerというのがどういうものかわかりません。
hikaaaaaaaa

2020/04/20 10:04

様々なスクリプトを参照していてごちゃごちゃになっていました。 PoliceControllerはOniControllerです。こちら本文でも訂正をさせていただきました。 申し訳ございません。 List<Gameobject>にGetcomponentの定義が含まれていませんと表示されます。。
Yukirr4_

2020/04/20 10:50

>List<Gameobject>にGetcomponentの定義が含まれていませんと表示されます。 List<gameObject>はGameObjectの集合なので、List<>自体がGetComponentの内容を持つことはできません。 どこの部分のことをおっしゃっているのかわかりづらいので、 エラーがどのスクリプトのどの部分で起きているのかを記入していただけますか. また、GameControllerのOniをforeach()している部分のエラーは 「GetComponent」ではなく「GetComponents」と書いてるからではないでしょうか?
hikaaaaaaaa

2020/04/20 13:39

こちらその間違いでした、、 ありがとうございます。。
hikaaaaaaaa

2020/04/20 14:05

ちなみにこちらで鬼がプレイヤーを捕まえるスクリプトは実装できたのですが、その際にプレイヤーが二体いた場合どちらも牢屋に入ってしまうという現象が起きてしまっているのですが、切り離す方法はあるのでしょうか。。
Yukirr4_

2020/04/20 14:17 編集

当たり判定で当たったオブジェクトだけを移動させることで実装させることは不可能でしょうか。 Police.UnityStandardAssets.Characters.ThirdPerson.Oni_ThirdPersonCharacter.TouchStart() がどんな処理してるのかを教えていただけますか?
hikaaaaaaaa

2020/04/20 14:22

ご返信ありがとうございます。 o_m_Animator.SetBool("Touch", true) の処理を行い、鬼のタッチするアニメーションのスタートを行なっております。。
Yukirr4_

2020/04/20 14:31

どこで鬼が捕獲処理を行っているのか教えてください。 僕はてっきりPolice.UnityStandardAssets.Characters.ThirdPerson.Oni_ThirdPersonCharacter.TouchStart()内にあるのかと思っていました。
hikaaaaaaaa

2020/04/20 15:06

本文を編集し、スクリプトと捕獲箇所のスクリプトを追加させていただきました。 プレイヤー全てに反応がされてしまいます。。
hikaaaaaaaa

2020/04/20 15:07

鬼が捕まえた際にプレイヤーが二体とも移動してしまうのが現状です。
Yukirr4_

2020/04/21 05:55 編集

OniにisHokakuをつけるより、PlayerにisHokakuをつけたほうがいいと思います。 そのプレイヤーがisHokakuなのかわかりづらいので。 おそらく鬼にisHokakuがあるのでそれをtrueにしてしまったら全てのプレイヤーで実行されてしまいます。 詳しくは回答を編集して書きます。追記2
hikaaaaaaaa

2020/04/21 04:41

ありがとうございます・・。こちらでプレイヤーを別で判定することができました。。 ちなみに色々試したのですが、プレイヤーに鬼が当たった際に鬼の画面にボタンが出てきて鬼に当たったプレイヤーだけを所定の位置に飛ばすことはできるのでしょうか。。 現在の場合ですと鬼がプレイヤーに当たった瞬間にプレイヤーが牢屋に転送されてしまうので鬼のボタンでそれを操作したいと考えているのですが、、
Yukirr4_

2020/04/21 05:55 編集

当たった時にボタンを表示し、離れたときにボタンを非表示にすればできると思います。 回答に追記します。追記3
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問