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

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

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

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

Unity

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

Q&A

解決済

4回答

5699閲覧

【Unity】GetComopnent<スクリプト名>().enabled = false; を使わずにスクリプトを停止させたいです

kosho206

総合スコア41

C#

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

Unity

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

0グッド

0クリップ

投稿2020/10/28 10:38

編集2020/10/29 10:19

Unityでゲームを作っています。

GetComponent<スクリプト名>().enabled = false;

と書けば、指定したスクリプトを停止させることができます。

ですが、自身のスクリプトを停止させたい時(enabled = falseを書いたスクリプト自体を停止させたい時)は、わざわざGetComponentする必要はないような気がします。
なので、スクリプト名.enabled = false と書いてみたのですがうまくいきませんでした。
GetComponent<自身のスクリプト>().enabled = false;のような処理を、GetComponentを使わずに書く方法はありませんか?

※単純に「enabled = false」と書くとその関数を停止させられますが、それだと一つの関数が停止するだけでスクリプトファイル全体が停止するわけではないので少し違います。

追記
教えていただいた回答を参考にしてInvokeを使ってコードを停止させる方法を試してみました。

public UnityEvent invoke; void Awake() { if (photonView.IsMine == true) { invoke.Invoke(); Debug.Log("ああああああ"); }

Dbug.Logは出力されていたので、このif文は動いています。
ですが、コードが停止しません。
イメージ説明

enable = false と書くだけでもコードは停止すると教えていただいたのですが、試しに書いてみたところ停止しませんでした。
一応、停止させたいコードの全文を載せます。
Awake関数の中に、
enabled = false;
Invoke()
をどちらも書いています。
ですが、実行してみたところこの2つが実行された後もコードの処理が行われました。
このスクリプトファイルは、3D空間でキャラクターを操作するためのコードが書かれたファイルです。
Awake関数内で上記2つのコードが呼ばれ、スクリプトファイルが停止しているならばキャラクターの操作はできなくなるはずなのですが、キャラクターは全く問題なく操作できてしまいました。

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using Photon.Pun; using Photon.Realtime; namespace CSharpScript { public class UnkomanControl : MonoBehaviourPunCallbacks { Vector3 playerPos; float InputX; float InputZ; Vector3 cameraForward; Vector3 cameraRight; Vector3 moveForward; float runVelocity; Vector3 translation; Vector3 diff; Quaternion Look; Quaternion nageLook; Animator anim; Camera Camera; Rigidbody rb; Vector3 inputVector; Vector3 normalVector; Vector3 onPlane; public Vector3 Translation { get; private set; } public int unkomanActorNumber { get; private set; } public int UnkomanInstanceID { get; private set; } public UnityEvent invoke; void Awake() { if (photonView.IsMine == true) { invoke.Invoke(); enabled = false; Debug.Log("ああああああ"); } playerPos = GetComponent<Transform>().position; Camera = Camera.main; anim = GetComponent<Animator>(); rb = GetComponent<Rigidbody>(); unkomanActorNumber = (int)photonView.InstantiationData[0]; UnkomanInstanceID = this.gameObject.GetInstanceID(); if (photonView.IsMine == true) Debug.Log(UnkomanInstanceID); } void OnCollisionStay(Collision collision) { normalVector = collision.contacts[0].normal; } bool hoge = true; void Update() { if (!photonView.IsMine) return; if (hoge == true) { Camera = Camera.main; hoge = false; } InputX = Input.GetAxis("Horizontal"); InputZ = Input.GetAxis("Vertical"); cameraForward = Vector3.Scale(Camera.transform.forward, new Vector3(1, 0, 1)).normalized; cameraRight = Vector3.Scale(Camera.transform.right, new Vector3(1, 0, 1)).normalized; moveForward = cameraForward * InputZ + cameraRight * InputX; runVelocity = 10.0f; if (anim.GetCurrentAnimatorStateInfo(0).IsName("Untiburi") || anim.GetCurrentAnimatorStateInfo(0).IsName("GoldUntiburi")) { runVelocity = 0f; } if (Input.GetMouseButton(0)) { runVelocity -= 7f; } if (anim.GetCurrentAnimatorStateInfo(0).IsName("UnkoNage") || anim.GetCurrentAnimatorStateInfo(0).IsName("GoldUnkoNage")) { runVelocity -= 7f; } translation = moveForward * runVelocity * Time.deltaTime; translation = Vector3.ProjectOnPlane(translation, normalVector); transform.Translate(translation, Space.World); diff = new Vector3(transform.position.x - playerPos.x, 0f, transform.position.z - playerPos.z); Look = Quaternion.LookRotation(diff, Vector3.up); nageLook = Quaternion.LookRotation(cameraForward, Vector3.up); if (!anim.GetCurrentAnimatorStateInfo(0).IsName("Untiburi") && !anim.GetCurrentAnimatorStateInfo(0).IsName("UnkoNage") && !anim.GetCurrentAnimatorStateInfo(0).IsName("GoldUntiburi") && !anim.GetCurrentAnimatorStateInfo(0).IsName("GoldUnkoNage")) { if (InputX != 0f) { transform.rotation = Look; } if (InputZ != 0f) { transform.rotation = Look; } if (Input.GetMouseButton(0)) { transform.rotation = nageLook; } if (Input.GetMouseButtonUp(0)) { transform.rotation = nageLook; } } playerPos = transform.position; } } }

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

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

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

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

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

Tto777

2020/10/28 12:36

enabled = falseで良いんじゃないでしょうか? これを行った後にインスペクターからスクリプトのチェックがどうなっているか教えて欲しいです。
kosho206

2020/10/29 10:32

インスペクターからスクリプトのチェックというのは、対象のスクリプトのコンポーネントのチェックボックスに、チェックが入っているかどうかということでしょうか? もしそうでしたら、チェックは入ったままでした。
guest

回答4

0

GetComponent<スクリプト名>().enabled = false;
enabled = false;
invoke.Invoke();

全てスクリプト止まると思うのですが上記どう違うのでしょうか?

どれでもそのフレームの処理はおこなわれるので後の処理をおこなわない場合はreturn;をすぐ下に書いて処理を終了して下さい。

投稿2020/10/29 09:42

編集2020/10/29 09:54
mimi_no_naka

総合スコア44

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

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

kosho206

2020/10/29 10:23

回答ありがとうございます。 enabled = false と書いても処理が行われてしまいます。 詳細はこの質問投稿に追記しました。 もしかすると、スクリプトの停止に対する僕の認識が間違っていますか?
kosho206

2020/10/29 10:29

今、試しに GetComopnent<スクリプト名>().enabled = false; も書いてみたのですがそれでもコードは停止せず、質問投稿に追記した事と同じ挙動をしました。
mimi_no_naka

2020/10/29 10:40 編集

何でこんな後出しするのですか? enabled = falseでスクリプトが非アクティブになるかどうかは最小構成のコードでテストして下さい。 他の部分の詳細は元の質問に無かったので見る気になりません。 質問への追記·修正もスルーしていたり答えた時間無駄にした気分です。
mimi_no_naka

2020/10/29 11:47 編集

まぁ少し厳しい書き方でした。 こうなってしまいがちなのでROM専だった訳ですが...。 今後も大変かと思いますが気を付けながら頑張って下さい。
guest

0

自己解決

GetComponent<対象のスクリプト>().enabled = true;
を、別のスクリプトで行っていたのが原因でした。

別のスクリプトでenabledをtrueにしてしまっていたので、今回「enabled = false」と書いてもコードが停止しない挙動になってしまっていました。

今回このようなミスに付き合わせてしまってごめんなさい。
回答をしてくださった方本当にありがとうございました。

投稿2020/10/29 10:46

kosho206

総合スコア41

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

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

0

参照を取っておけば良いだけです。
よくあるのがStartやAwakeで参照をとってそれを使うやり方です。

cs

1 Collider col; 2 3 void Start() { 4 col = GetComponent<Collider>(); 5 } 6 7 void DisableCollider() { 8 col.enabled = false; 9 } 10

投稿2020/10/29 00:34

hogefugapiyo

総合スコア3302

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

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

0

enabled = false するにはそのスクリプトのインスタンスを何らかの手段で取得する必要があります。
その方法に GetComponent<Foo>() がありますが他には以下のような手段もあります。

  • publicフィールドやSerializeFiled属性をつけたフィールドを用意してInspectorから設定しておく
  • Find系関数で探す
  • UnityEventフィールドを用意してスクリプトを止めたい所で Invoke() を呼ぶ。
    Inspectorでは該当スクリプトのenabledのチェックを外した状態にしておく

csharp

1using UnityEngine; 2using UnityEngine.Events; 3 4public class NewBehaviourScript : MonoBehaviour 5{ 6 public UnityEvent invoke; 7 8 public void Start() 9 { 10 invoke.Invoke(); 11 } 12}

イメージ説明

投稿2020/10/28 11:36

shiena

総合スコア1827

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

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

kosho206

2020/10/29 08:56

ありごとうございます。 Invokeを呼ぶ方法を自分でやってみたのですが、コードを停止させることができませんでした。 Invokeを使った部分のコードとInspectorをこの質問投稿に追記しました。 これだけではまだコードを停止させることができないのでしょうか? それとも、本来ならばこれだけで停止させられるはずなのですか? 1つ気がかりなのが、この停止させたいスクリプトがアタッチされているオブジェクトが、Sceneに最初から配置されているオブジェクトではなく、Photonの「PhotonNetwork.Instantiate」を使って後から生成するネットワークオブジェクトであるということです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問