web-dev-qa-db-ja.com

別のスクリプトから変数にアクセスするC#

別のスクリプトからスクリプトの変数にアクセスする方法を教えてください。 Unityのウェブサイトですべてを読んだことがありますが、それでも読むことができません。別のオブジェクトにアクセスする方法は知っていますが、別の変数にはアクセスできません。

これが状況です:私はスクリプトを使用しています[〜#〜] b [〜#〜]そしてスクリプトから変数Xにアクセスしたい[〜# 〜] a [〜#〜]。変数Xbooleanです。手伝って頂けますか ?

ところで、スクリプトでXの値をコストのかかる方法で更新する必要があります[〜#〜] b [〜#〜]、どうすればよいですか? Update関数でアクセスしてください。これらの文字を使って例を挙げていただければ幸いです。

ありがとうございました

7
Lorenzo Spoleti

最初に変数のスクリプトコンポーネントを取得する必要があります。それらが異なるゲームオブジェクトにある場合は、インスペクターで参照としてゲームオブジェクトを渡す必要があります。

たとえば、私はscriptA.cs in GameObject AおよびscriptB.cs in GameObject B

scriptA.cs

// make sure its type is public so you can access it later on
public bool X = false;

scriptB.cs

public GameObject a; // you will need this if scriptB is in another GameObject
                     // if not, you can omit this
                     // you'll realize in the inspector a field GameObject will appear
                     // assign it just by dragging the game object there
public scriptA script; // this will be the container of the script

void Start(){
    // first you need to get the script component from game object A
    // getComponent can get any components, rigidbody, collider, etc from a game object
    // giving it <scriptA> meaning you want to get a component with type scriptA
    // note that if your script is not from another game object, you don't need "a."
    // script = a.gameObject.getComponent<scriptA>(); <-- this is a bit wrong, thanks to user2320445 for spotting that
    // don't need .gameObject because a itself is already a gameObject
    script = a.getComponent<scriptA>();
}

void Update(){
    // and you can access the variable like this
    // even modifying it works
    script.X = true;
}
17
Jay Kazama

ここでstaticを使用できます。

ここに例があります:

ScriptA.cs

Class ScriptA : MonoBehaviour{
 public static bool X = false;
}

ScriptB.cs

Class ScriptB : MonoBehaviour{
 void Update() {
   bool AccesingX = ScriptA.X;
   // or you can do this also 
   ScriptA.X = true;
 }
}

OR

ScriptA.cs

Class ScriptA : MonoBehaviour{

//you are actually creating instance of this class to access variable.
 public static ScriptA instance;

 void Awake(){

     // give reference to created object.
     instance = this;

 }

 // by this way you can access non-static members also.
 public bool X = false;


}

ScriptB.cs

Class ScriptB : MonoBehaviour{
 void Update() {
   bool AccesingX = ScriptA.instance.X;
   // or you can do this also 
   ScriptA.instance.X = true;
 }
}

詳細については、シングルトンクラスを参照できます。

1
Kartik Shah

最初の答えを完了するためだけに

の必要はありません

a.gameObject.getComponent<scriptA>();

aはすでにGameObjectなので、

a.getComponent<scriptA>();

アクセスしようとしている変数がGameObjectの子にある場合は、次を使用する必要があります。

a.GetComponentInChildren<scriptA>();

変数やメソッドが必要な場合は、次のようにアクセスできます

a.GetComponentInChildren<scriptA>().nameofyourvar;
a.GetComponentInChildren<scriptA>().nameofyourmethod(Methodparams);
1
Milad Qasemi