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

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

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

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

Unity3D

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

Q&A

解決済

3回答

1508閲覧

[Unity]非アクティブのオブジェクトをSetActiveでアクティブにできない

Asagiri

総合スコア9

C#

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

Unity3D

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

0グッド

0クリップ

投稿2021/01/06 17:28

編集2021/01/06 18:23

Unityで電球をボタンでオンオフするものを作っています。理想はこんな感じです。
Unityのバージョンは2018.4.19f1です。
イメージ説明
PointLightを使い、最初は非アクティブの状態にし、スクリプトでSetActiveを使いアクティブにしようとしました。

動かしたところPointLightがアクティブ状態にならないです。
もしかしたら使い方が間違っているのかもしれませんがわかりません。

イメージ説明

スクリプトは親オブジェクトのLamp2につけています。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Light_onoff : MonoBehaviour 6{ 7 public Material[] _material; // 割り当てるマテリアル. 8 public GameObject[] _light; // 割り当てるライト 9 public GameObject[] _Battery; // 乾電池 10 public GameObject _lamp; // 電球 11 12 13 // Start is called before the first frame update 14 void Start() 15 { 16 _light[0] = transform.Find("Point Light1").gameObject; 17 _light[1] = transform.Find("Point Light2").gameObject; 18 _light[0].SetActive(false); 19 _light[1].SetActive(false); 20 21 _Battery[0].SetActive(true); 22 _Battery[1].SetActive(false); 23 _Battery[2].SetActive(false); 24 25 } 26 27 // Update is called once per frame 28 void Update() 29 { 30 31 } 32 33 public void Click_Light() 34 { 35 _lamp = GameObject.Find("Light"); 36 37 _light[0] = transform.Find("Point Light1").gameObject; //ここでPoint Light1 38 _light[1] = transform.Find("Point Light2").gameObject; //ここでPoint Light2 39 40 if (_light[0].activeSelf == true || _light[1].activeSelf == true) 41 { 42 43 _light[0].SetActive(false); 44 _light[1].SetActive(false); 45 _lamp.GetComponent<Renderer>().material = _material[0]; 46 47 } 48 else 49 { 50 if(_Battery[0].activeSelf == true || _Battery[2].activeSelf == true) 51 { 52 _light[0].SetActive(true); //何故かここがつかない 53 _lamp.GetComponent<Renderer>().material = _material[1]; //ここは動いてる 54 55 } 56 else if(_Battery[1].activeSelf == true) 57 { 58 _light[1].SetActive(true); 59 _lamp.GetComponent<Renderer>().material = _material[1]; 60 61 } 62 63 } 64 } 65}

[追記]
後々にはARに移行させたいため、アタッチせずに探し出せた方が嬉しいです。

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

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

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

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

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

guest

回答3

0

自己解決

1から作ったらなぜかいけました。解決法はよくわかりません

投稿2021/01/08 08:41

Asagiri

総合スコア9

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

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

0

エラーは出ていないのでしょうか?
今のままですとnullになっているような気がするのですが。。

スクリプトは親オブジェクトのLamp2についているのであれば
こんな感じではないでしょうか。。

c#

1 public GameObject parent; 2 public GameObject[] _light; 3 4 void Start() 5 { 6 7 parent = this.gameObject; 8 _light[0] = parent.transform.Find("Point Light1").gameObject; 9 _light[0].SetActive(false); 10 11 }

投稿2021/01/06 19:01

Qoo

総合スコア1249

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

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

0

public で指定しているのであれば、インスペクタでアタッチした方が間違いないと思います。
いちいちfindする必要もないと思うので。。

Find使うなら
GameObject.Find("Point Light1");
のような気がします

ここを参考にすると良いかと思います
https://marunouchi-tech.i-studio.co.jp/2266/

投稿2021/01/06 17:53

Qoo

総合スコア1249

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

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

Asagiri

2021/01/06 18:22

最終的にはARで実装したいため、アタッチせずに探した方が都合がいいのでFindを使っています。 また、私も最初はGameObject.Find()を使っていましたが、どこかの記事で非アクティブのものは見つけられないと書いていたため、transform.Find().gameObjectを使っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問