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

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

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

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

Unity

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

Q&A

解決済

1回答

418閲覧

ゲームオブジェクトの指定の方法

visualize

総合スコア13

C#

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

Unity

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

0グッド

0クリップ

投稿2023/06/10 00:21

実現したいこと

複数のオブジェクトに同じスクリプトをつけ、一つのスクリプト内でオブジェクトそれぞれのrigidbodyやboxcolliderを変更、コンポーネントを停止させたい。

前提

プレイヤーがオブジェクト内にいる際に特定のキーを押すと、そのオブジェクトはOntriggerstayやexitなどの判定が出なくなるようにしたいです。また、上記と同じオブジェクトを複数個作りたいです。
最初にspriteでobjectを作成した後にコントロールキー + d で新しく3個複製しました。それぞれのオブジェクトはtagで管理しています。

発生している問題・エラーメッセージ

this/this.gameobject/gameobjectの使い分けができていないのか、最初に作成したobjectのみがコンポーネントを停止し、複製したほかのオブジェクトはそのまま判定が出ている状態です。
エラーメッセージはなし

該当のソースコード

public class Chimney : MonoBehaviour
{
public GameManager gameManager;
Rigidbody2D rb;

// Start is called before the first frame update private void Start() { rb = GetComponent<Rigidbody2D>(); } private void OnTriggerEnter2D(Collider2D collision) { if (collision.gameObject.CompareTag("Player")) { collision.GetComponent<Player>().isOk = true; gameManager.showWinScreen = true; } } public void OnTriggerExit2D(Collider2D collision) { if (collision.gameObject.CompareTag("Player")) { collision.GetComponent<Player>().isOk = false; gameManager.showWinScreen = false; } } public void RoofFunction()//コンポーネントを停止 { Debug.Log("Stop"); this.GetComponent<Chimney>().enabled = false; rb.simulated = false ; rb.bodyType = RigidbodyType2D.Static; this.GetComponent<BoxCollider2D>().enabled = false; Debug.Log("Complete"); } public void Roof1Function()//コンポーネントを停止 { Debug.Log("Stop"); this.GetComponent<Chimney>().enabled = false; rb.simulated = false; // rb.bodyType = RigidbodyType2D.Static; this.GetComponent<BoxCollider2D>().enabled = false; Debug.Log("Complete"); }

}

試したこと

全く同じスクリプトをもう一つ作成し、アタッチし、試してみたところ思うような仕様ができました。しかし、同じ内容のスクリプトを複数個作成するのはいかがなものかと思い現在のやり方を試しています。
説明が拙く申し訳ございません。よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

共通の機能は子オブジェクトに持たせ、取得する系は親オブジェクトで管理すると良いでしょう。
この機能を実現するためには、管理するスクリプトがある親オブジェクトの子階層に取得したいコンポーネントをまとめるという考え方が良いと思います。
FindGameObjectsWithTagをStart()で使い、foreachで全ての子オブジェクトのコンポーネントにアクセスします。
以下はその例です。

C#

1public class Chimney : MonoBehaviour 2{ 3 public Game game; 4 5 private void OnTriggerEnter2D(Collider2D collision) 6 { 7 if (collision.gameObject.CompareTag("Player")) 8 { 9 collision.GetComponent<Player>().isOk = true; 10 game.showWinScreen = true; 11 } 12 } 13 14 15 public void OnTriggerExit2D(Collider2D collision) 16 { 17 if (collision.gameObject.CompareTag("Player")) 18 { 19 collision.GetComponent<Player>().isOk = false; 20 game.showWinScreen = false; 21 } 22 } 23}

C#

1public class ChimneyManager : MonoBehaviour 2{ 3 GameObject[] g; 4 [SerializeField] Player player; 5 6 private void Start() 7 { 8 g = GameObject.FindGameObjectsWithTag("Enemy"); 9 10 foreach (var obj in g) 11 { 12 obj.GetComponent<Rigidbody2D>(); 13 obj.GetComponent<BoxCollider2D>(); 14 obj.GetComponent<Chimney>(); 15 } 16 } 17 18 private void Update() 19 { 20 if (player.isOk) 21 { 22 OnKeyDownMethod(); 23 } 24 } 25 26 private void RoofFunction()//コンポーネントを停止 27 { 28 foreach (var obj in g) 29 { 30 Rigidbody2D rb = obj.GetComponent<Rigidbody2D>(); 31 BoxCollider2D box = obj.GetComponent<BoxCollider2D>(); 32 Chimney chimney = obj.GetComponent<Chimney>(); 33 34 Debug.Log("Stop"); 35 chimney.GetComponent<Chimney>().enabled = false; 36 rb.simulated = false; 37 rb.bodyType = RigidbodyType2D.Static; 38 box.GetComponent<BoxCollider2D>().enabled = false; 39 Debug.Log("Complete"); 40 } 41 } 42 43 void OnKeyDownMethod() 44 { 45 if (Input.GetKeyDown(KeyCode.Space)) 46 { 47 RoofFunction(); 48 } 49 } 50}

投稿2023/06/10 07:10

編集2023/06/10 07:14
isimasa

総合スコア295

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問