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

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

詳細はこちら
Unity3D

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

Q&A

解決済

1回答

1996閲覧

Unity3D ボタンでスクリプトコンポーネントのオンオフを切り替える

911RSR

総合スコア13

Unity3D

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

0グッド

0クリップ

投稿2020/12/22 10:58

編集2020/12/23 02:29

Unity3Dでゲームを開発しております。

HintButtonをクリックすることで、ゲームオブジェクトにアタッチされたOutline Effectコンポーネント(スクリプト)のオン/オフを切り替えたいです。

この際、シーンごとにOutline Effectをアタッチするゲームオブジェクトは異なるので、ボタンのインスペクター上からゲームオブジェクトを指定できるようにしたいです。

以下のスクリプトを書きましたが、errorCS0246, errorCS0103が表示され、うまく起動しません。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class HintButton : MonoBehaviour 7{ 8 public GameObject gameObject; 9 10 // Start is called before the first frame update 11 void Start() 12 { 13 bool outlineEffect= gameObject.GetComponent<OutlineEffect > (); 14 } 15 16 // Update is called once per frame 17 void Update() 18 { 19 20 } 21 22 void OnClick() 23 { 24 if (outlineEffect.enabled = false) 25 { 26 outlineEffect.enabled = true; 27 } 28 29 if (outlineEffect.enabled = true) 30 { 31 outlineEffect.enabled = false; 32 } 33 } 34} 35

添付の画像の通り、Outline Effectはオブジェクトの輪郭表示をするスクリプトで、オブジェクトのコンポーネントとしてクリック/unclickできるので、スクリプトからアクセスできればenableでオンオフは切り替えられると思っております。

Outline Effect

ご教示よろしくお願い申し上げます。

12/23追記
ご指導ありがとうございます!
scriptをご教示通りに、下記に変更しました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class HintButton : MonoBehaviour 7{ 8 public GameObject targetObject; 9 10 private OutlineEffect outlineEffect; 11 12 // Start is called before the first frame update 13 void Start() 14 { 15 outlineEffect = targetObject.GetComponent<OutlineEffect>(); 16 } 17 18 // Update is called once per frame 19 void Update() 20 { 21 22 } 23 24 public void OnClick() 25 { 26 outlineEffect.enabled = !outlineEffect.enabled; 27 } 28} 29

しかしまたerrorCS0246が出てしまいました。。
エラーメッセージ

VisualStudio

どうやらOutlineEffectというnamespaceがうまく認識されていない??
ようなのですが、何か問題がありますでしょうか。。

ちなみにOutline effectは
https://baba-s.hatenablog.com/entry/2019/05/10/082000

こちらのrickomaxさんのgithubからスクリプト、シェーダーをダウンロードし、unityのプロジェクトウィンドウにドラッグ&ドロップして取得しました。

HintButtonの押下で輪郭表示のオンオフを切り替えたいという魂胆です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

問題がありそうだと思った部分について、下記のように変更してみました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class HintButton : MonoBehaviour 7{ 8 // フィールド名が「gameObject」だと、元々持っている同名のプロパティ 9 // https://docs.unity3d.com/ja/current/ScriptReference/Component-gameObject.html 10 // と名前かぶりしてしまい、余計な混乱の原因になるかもしれません 11 // 念のため名前を変更しました 12 public GameObject targetObject; 13 14 // 下記Start内のコメントで申し上げた理由から、この位置でoutlineEffectを宣言します 15 private OutlineEffect outlineEffect; 16 17 // Start is called before the first frame update 18 void Start() 19 { 20 // 下記のような記述だと「bool型変数のoutlineEffectを宣言、gameObjectからOutlineEffectを取得し、 21 // 取得されたオブジェクトをboolに変換(存在すればtrue、しなければfalse)して初期化」といった 22 // 動作になってしまうでしょう 23 // しかもoutlineEffectをここで宣言したのではローカル変数になってしまい、Start内でしか 24 // 使用できなくなるはずです 25 // bool outlineEffect= gameObject.GetComponent<OutlineEffect > (); 26 27 // そこで、下記のように変更しました 28 outlineEffect = targetObject.GetComponent<OutlineEffect>(); 29 } 30 31 // Update is called once per frame 32 void Update() 33 { 34 35 } 36 37 // publicに変更して、外部からアクセスできるようにしました 38 public void OnClick() 39 { 40 // ifの条件をよくご覧いただきたいのですが、「enabledがtrue(またはfalse)と等しいか比較」 41 // ではなく「true(またはfalse)をenabledに代入」となってしまっています 42 /* 43 if (outlineEffect.enabled = false) 44 { 45 outlineEffect.enabled = true; 46 } 47 48 if (outlineEffect.enabled = true) 49 { 50 outlineEffect.enabled = false; 51 } 52 */ 53 54 // ここは単純に下記のような形でいいんじゃないでしょうか 55 outlineEffect.enabled = !outlineEffect.enabled; 56 } 57}

ですがまだエラーが出てしまうかもしれません。たぶんCS0103は解消できるかと思うのですが、私の試した限りではCS0246は発生せず、原因が不確かなんですよね...

エラーメッセージにはエラー番号以外にも、エラーについての説明やエラーが発生しているファイル名、行番号だとかが記載されているかと思います。それらをご提示いただけると手がかりになるかもしれません。

##追記

globaloutline/OutlineEffect.cs at master · rickomax/globaloutline · GitHubをご覧いただきたいのですが、OutlineEffectGlobalOutlineというネームスペースにあるようです。
ですので、

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6// usingディレクティブを追加 7using GlobalOutline; 8 9public class HintButton : MonoBehaviour 10{ 11 public GameObject targetObject; 12 13 private OutlineEffect outlineEffect; 14 15 // Start is called before the first frame update 16 void Start() 17 { 18 outlineEffect = targetObject.GetComponent<OutlineEffect>(); 19 } 20 21 // Update is called once per frame 22 void Update() 23 { 24 25 } 26 27 public void OnClick() 28 { 29 outlineEffect.enabled = !outlineEffect.enabled; 30 } 31}

ならばどうでしょうか。

投稿2020/12/22 19:07

編集2020/12/23 03:23
Bongo

総合スコア10811

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

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

911RSR

2020/12/23 02:30

Bongoさん、いつもいつも本当にありがとうございます! さすが、ご予想された通りエラーが出てしまいました。。質問内容に詳細を追記させて頂いております。 いつも本当にありがとうございます。大変勉強になります。
Bongo

2020/12/23 03:23

どうやらOutlineEffectは独自のネームスペースにあるようですね。修正案を追記しましたが、これならどうでしょうか?
911RSR

2020/12/23 03:37

Bongoさん、完璧です!いつも本当にありがとうございます。 個人的にお礼をさせて頂きたいです。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問