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; } } }
回答4件
あなたの回答
tips
プレビュー