2014-12-12 6 views
0

임 매우 프로그래밍에 새로운 나는 발생하는 문제를 해결하는 데 도움이 필요합니다. 다른 스크립트의 배열에 액세스하려고하는데 일반적으로 문제가 없습니다. 그러나이 IST 내 상황 : 예를 들어변수 이름을 가진 다른 스크립트의 배열에 액세스합니까?

:

스크립트 A는 다른 숫자 이외의 이름으로 몇 가지 배열이 포함되어 있습니다.

using UnityEngine; 
    using System.Collections; 
    using System.Collections.Generic; 

    public class ScriptA : MonoBehaviour { 
    public int[] keys = new int[4]; 
    public int[] screws= new int[4]; 
    public int[] nails= new int[4]; 
    public int[] iron= new int[4]; 
    .... 
    } 

이제 스크립트 B에서 변수를 사용하여 이러한 배열에 액세스해야합니다. 내가 어떻게 할 수 있니? 예를 들어

: 아이디어와 솔루션

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 

public class ScriptB: MonoBehaviour { 
    ScriptA scriptA; 
    public string arrayName; // Here user could type in the name of an array 



    void Start() 
    { 
     scriptA = GameObject.Find("Object").GetComponent<ScriptA>(); 

     // This try to access the array of course not works. But how? 
     scriptA.arrayname; 
    } 

감사합니다. 나는 그 어려운 문제는 아니라고 생각한다. 그러나 나는 그것을 해결할 생각이 없다.

+1

예를 들어'keys'에 액세스하려면'scriptA.keys' 또는 개별 요소'scriptA.keys [0]'을 사용하십시오. –

+0

그래,하지만 난 ScriptB에서 문자열 변수 "arrayName"로 배열에 액세스해야합니다 – ToboTheRibbler

답변

1

당신 중 하나는 반사 (추한)가 필요하거나 같은 ScriptA에서 Dictionary<string, int[]> 정의 할 수 있습니다 :

public class ScriptA : MonoBehaviour 
{ 
    public int[] keys = new int[4]; 
    public int[] screws = new int[4]; 
    public int[] nails = new int[4]; 
    public int[] iron = new int[4]; 
    public Dictionary<string, int[]> arrays; 

    void Start() 
    { 
     arrays = new Dictionary<string, int[]> 
     { 
      { "keys", keys }, 
      { "screws", screws }, 
      { "nails", nails }, 
      { "iron", iron } 
     }; 
    } 
} 

을 그리고 당신은이 같은 ScriptB에서 사용 : scriptA.arrays[arrayName].

+0

그게 뭐야 메신저. 고맙습니다. :) – ToboTheRibbler

+0

사전을 사전에 구현하려면 배열을 정적으로해야합니까? 이것은 좋지 않을 것이다. – ToboTheRibbler

+0

내가 아는 한, 그들은 정적 일 필요가 없습니다. 컴파일러 오류가 발생합니까? –

0

당신이 뭘하고있는 건 아니지만 (내가 추론 한 것에서) 뭘 하려는지 컴파일러는 알려지지 않은 유형의 클래스에 동적 속성을 추가하게합니다. 지금까지 C#에 대해 알고 있었지만 이것이 불가능합니다. 당신이 캡슐화 경우 : 당신이이 문제를 해결하기 위해 할 수있는 것은 기본적으로 다음과 같은 내부 기능

public object GetPropertyValue(string propName){ 
    switch (propName){ 
     case: "keys" 
      //do whatever you need to do with keys 
     //and so on 
    } 
} 

또는

(A)의 하나에 문자열 매개 변수를 받아들이는 당신의 소위 스크립의 방법을 가질 수있다 당신이 다음을 캡슐화하지 않으려면

public object GetFieldValue(string fieldName){ 
     System.Reflection.FieldInfo fi= (typeof(ScriptA)).GetField(fieldName); 
     fi.GetValue(this,null); 
} 
,369 : 속성 다음

public object GetPropertyValue(string propName){ 
     System.Reflection.PropertyInfo pi= (typeof(ScriptA)).GetProperty(propName); 
     pi.GetValue(this,null); 
} 

B 내부의 해당 필드

MSDN의 PropertyInfoFieldInfo에 대한 자세한 내용을 읽어보십시오.

+0

속성 대신'keys','screws','nails' 및'iron' 필드가 있습니까? 'PropertyInfo'도 그것들과 함께 작동합니까? –

+0

음, 그래, 정말로. 어떻게 든 나는 이것에 대해 잊었다. 고마워. 나는 그 질문을 편집했다. 하지만 어쨌든, C#의 관습은 필드를 공개하지 않고 대신 사적으로 사용하고 다른 사람들이 속성을 통해 액세스 할 수있게하는 것입니다. –

+0

Unity (이 질문에서 사용하는)는 모든 C# 규칙을 따르지 않는 것 같습니다. –

관련 문제