🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Unity

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

Q&A

解決済

1回答

973閲覧

Unity:インスタンスしたオブジェクトに命令を与えたい

zenobread

総合スコア44

C#

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

Unity

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

0グッド

0クリップ

投稿2019/09/06 09:53

やりたいこと

private GameObejct[] circlesにインスタンス化したcircle(Clone)を入れたい。
その配列に入れたcircle(Clone)をforeachとSetActiveをつかい、表示・非表示の状態を切り替えたい。

問題

circles[]に入れたと思われたcircle(Clone)が配列に入れることが出来ていない。
Active状態が切り替わるのが、生成したClone側ではなく、prehab化しているcircleの方が表示・非表示を繰り返してしまう。

やったこと

circleオブジェクト自身にscriptをつけ、this.gameObject.SetActiveで切り替えようと思ったが、やはり別のスクリプトの参照するオブジェクトがCloneではなく、prehabになってしまう

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class Manager_circle : MonoBehaviour 7{ 8 public GameObject circle; 9 public GameObject card; 10 11 12 private GameObject[] circles; 13 public Sprite card_white; 14 public Sprite card_red; 15 16 public int circle_count=1; 17 private float card_x; 18 private float card_y; 19 private GameObject circle_pre; 20 private float circle_x=1; 21 private float circle_y=1; 22 float circle_position_x_minus; 23 float circle_position_x_plus; 24 float circle_position_y_minus ; 25 float circle_position_y_plus ; 26 [SerializeField] 27 private Sprite sprite; 28 29 private void Awake() 30 { 31 sprite=circle.GetComponent<SpriteRenderer>().sprite; 32 circles = new GameObject[circle_count]; 33 var g=Instantiate(card, new Vector2(0, 0), Quaternion.identity); 34 g.GetComponent<SpriteRenderer>().sprite = card_white; 35 card_x = card.GetComponent<SpriteRenderer>().bounds.size.x; 36 card_y = card.GetComponent<SpriteRenderer>().bounds.size.y; 37 38 circle_x = circle.GetComponent<SpriteRenderer>().bounds.size.x; 39 circle_y = circle.GetComponent<SpriteRenderer>().bounds.size.y; 40 } 41 void Start() 42 { 43 44 circle_position_x_minus = card.transform.position.x - card_x / 2 + circle_x / 2; 45 circle_position_x_plus = card.transform.position.x + card_x / 2 - circle_x / 2; 46 circle_position_y_minus = card.transform.position.y; 47 circle_position_y_plus = card_y / 2 - circle_y / 2; 48//ここから問題のコード 49 for (var i = 0; i < circle_count; i++) 50 { 51 circles[i]= Instantiate(circle, new Vector2(UnityEngine.Random.Range(circle_position_x_minus, circle_position_x_plus), UnityEngine.Random.Range(circle_position_y_minus, circle_position_y_plus)), Quaternion.identity); 52 } 53 } 54 55 56 public void Switch(bool a) 57 { 58 Debug.Log(circles[0].transform.position); 59 if (a == false&&circle.activeSelf) 60 { 61 Debug.Log(circle.activeSelf==true); 62 foreach(GameObject cir in circles) 63 { 64 cir.SetActive(true); 65 } 66 } 67 else if(a==true&&!circle.activeSelf==false) 68 { 69 Debug.Log(circle.activeSelf); 70 foreach(GameObject cir in circles) 71 { 72 cir.SetActive(false); 73 } 74 } 75 } 76 77//--ここまで 78 // Update is called once per frame 79 void Update() 80 { 81 82 } 83} 84

今日一日繰り返していますが、解決できません。
どうかよろしくお願いします。

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

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

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

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

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

izmktr

2019/09/06 17:01

if (a == false&&circle.activeSelf) このcircle.activeSelf はなぜ付いているんですか?
zenobread

2019/09/07 01:03

ご返信ありがとうございます。 それはcircleオブジェクトがactiveなら非activeにし、元々非アクティブなら切り替えないようにするためです。
izmktr

2019/09/07 01:57 編集

質問の仕方が悪かったようなので変えます Switch(false)を呼び出したとき、cir.SetActive(true)を通過しているのにcirclesは表示されない、という意味でこの質問を投稿していますか? Yesなら… ・cir.SetActive(true) の通過はどのように確認しましたか? ・circlesの中身がcircleといっていますが、それはどのように確認しましたか?
zenobread

2019/09/08 02:20

YESですね。 それぞれ ・Debug.Log(cir.SetActive)で確認 ・ゲームをPlayさせてインスペクター上でクリックすることで確認→選択されているものがprehab ということです
simapiko

2019/09/09 03:00

>・ゲームをPlayさせてインスペクター上でクリックすることで確認→選択されているものがprehab 一応確認なのですがそれは、Manager_circleのインスペクターでしょうか。また、質問に出てくる"別のスクリプト"が原因の可能性もあるので、そちらのコードの提示もお願いします。
guest

回答1

0

ベストアンサー

インスタンス化したオブジェクトを配列に入れて、それを関数で処理しているということですよね?
最小構成にするために関係なさそうなメソッドはコメントアウトして、circleにPrefab化したCubeをアタッチして試してみましたが、指定した数だけCubeのクローンが作成されてpublicで見れるようにした配列の中身もクローンを参照しているようでした。

circle の Prefab がインスタンス化されて、circles の配列の中に入っており
Switch関数を実行すると、インスタンス化されたオブジェクト全てが表示or非表示になれば想定の動きということでいいんでしょうか?

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class Manager_circle : MonoBehaviour { 7 public GameObject circle; 8 public GameObject card; 9 10 11 public GameObject[] circles; 12 public Sprite card_white; 13 public Sprite card_red; 14 15 public int circle_count = 1; 16 private float card_x; 17 private float card_y; 18 private GameObject circle_pre; 19 private float circle_x = 1; 20 private float circle_y = 1; 21 float circle_position_x_minus; 22 float circle_position_x_plus; 23 float circle_position_y_minus; 24 float circle_position_y_plus; 25 [SerializeField] 26 private Sprite sprite; 27 28 private void Awake() { 29 circles = new GameObject[circle_count]; 30 //sprite = circle.GetComponent<SpriteRenderer>().sprite; 31 //var g = Instantiate(card, new Vector2(0, 0), Quaternion.identity); 32 //g.GetComponent<SpriteRenderer>().sprite = card_white; 33 //card_x = card.GetComponent<SpriteRenderer>().bounds.size.x; 34 //card_y = card.GetComponent<SpriteRenderer>().bounds.size.y; 35 36 //circle_x = circle.GetComponent<SpriteRenderer>().bounds.size.x; 37 //circle_y = circle.GetComponent<SpriteRenderer>().bounds.size.y; 38 } 39 void Start() { 40 41 //circle_position_x_minus = card.transform.position.x - card_x / 2 + circle_x / 2; 42 //circle_position_x_plus = card.transform.position.x + card_x / 2 - circle_x / 2; 43 //circle_position_y_minus = card.transform.position.y; 44 //circle_position_y_plus = card_y / 2 - circle_y / 2; 45 //ここから問題のコード 46 for (var i = 0; i < circle_count; i++) { 47 circles[i] = Instantiate(circle, new Vector2(UnityEngine.Random.Range(circle_position_x_minus, circle_position_x_plus), UnityEngine.Random.Range(circle_position_y_minus, circle_position_y_plus)), Quaternion.identity); 48 } 49 50 } 51 52 53 public void Switch(bool a) { 54 Debug.Log(circles[0].transform.position); 55 if (a == false && circle.activeSelf) { 56 Debug.Log(circle.activeSelf == true); 57 foreach (GameObject cir in circles) { 58 cir.SetActive(true); 59 } 60 } else if (a == true && !circle.activeSelf == false) { 61 Debug.Log(circle.activeSelf); 62 foreach (GameObject cir in circles) { 63 cir.SetActive(false); 64 } 65 } 66 } 67 68}

投稿2019/09/09 01:59

hogefugapiyo

総合スコア3302

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

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

zenobread

2019/09/09 08:00

昨日一度Unityを落として再起動したのち、プロジェクトを立ち上げ再生すると望み通りのうごきが実行されました。正直今でも原因は分からないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問