2016-06-18 1 views
1

공용을 어떻게 만들 수 있습니까? 사전에서 유니티의 다른 스크립트와 객체에서 사용하는 것은 무엇입니까? 내가 사전 개체 및 스크립트에서 그리고 나는이 사전에 명령으로 스크립트/개체 B 값을 추가하고 싶습니다. 예를 들어유니티의 공용 사전

* 한 개체에서 스크립트 *

public Dictionary<string, GameObject> dictio = new Dictionary<string, GameObject>(); 

* B 개체 예 B 스크립트 *

A :

public Dictionary<string, GameObject> obstacleDictionary; 

GameObject gob; 

void Start() 
{ 
    obstacleDictionary = new Dictionary<string, GameObject>(); 
    pos = transform.position; 

} 

B :

Vector3 pos; 
    public string openSide; 
    GameObject player; 
    string posString; 
void Start() 
{ 
    player = GameObject.FindGameObjectWithTag("Player"); 
    pos = transform.position; 
    posString = pos.x + "_" + pos.y; 


    player.GetComponent<PlayerMove>().obstacleDictionary.Add(posString, gameObject); //warning 

    //print(player.GetComponent<PlayerMove>().obstacleDictionary.ContainsKey("3_0")); 
} 

A.GetComponent<AScript>().dictio.Add("aaa", gameObject); 

도와 주시겠습니까? 고마워요 :)

+0

그래서, 문제는 무엇인가? – Valentin

+0

그것은 작동하지 않습니다. – Adam

+0

코드가 컴파일되지 않거나 런타임 오류가 있습니까? – Valentin

답변

1

작동하지 않는 것이 무엇인지 언급하지 않았기 때문에 어떤 것이 작동하지 않는지 알 수 없습니다.

귀하의 ScriptA 공공 사전에 : 여기에 완벽한 예입니다

public class ScriptA : MonoBehaviour{ 
    public Dictionary<string, GameObject> dictio = new Dictionary<string, GameObject>(); 
} 

당신이 ScriptB에서 액세스 할 수 있는지 확인

public class ScriptB : MonoBehaviour{ 

    ScriptA scriptInstance = null; 

    void Start() 
    { 
     GameObject tempObj = GameObject.Find("NameOfGameObjectScriptAIsAttachedTo"); 
     scriptInstance = tempObj.GetComponent<ScriptA>(); 

     //Access dictio variable from ScriptA 
     scriptInstance.dictio.Add("aaa", gameObject); 
    } 
} 

ScriptA는 게임 오브젝트의 이름으로 NameOfGameObjectScriptAIsAttachedTo을 교체해야 부착.

편집 :

은 당신의 프로젝트를 쳐다 보면서 문제를 발견했다.

.Replace public Dictionary<string, GameObject> obstacleDictionary; 당신의 PlayerMove.cs에서

,

1 : obstacleDictionary이 있습니다 .. Start() 기능에서 초기화되기 전에 다른 스크립트에서

세이 문제를 해결하는 방법을 사용하고 있습니다

public Dictionary<string, GameObject> obstacleDictionary = new Dictionary<string, GameObject>();.

Start() 기능에서 obstacleDictionary = new Dictionary<string, GameObject>();을 제거하십시오.

처음 대답을 따라 갔지만 제대로하지 않으면 작동했을 것입니다. Start() 함수 외부에 새 인스턴스를 작성하기 만하면됩니다.

2 우선은이 Awake() 함수에 Start() 함수에서 obstacleDictionary = new Dictionary<string, GameObject>();를 이동할 수 있으며, 그것은 여전히 ​​작동합니다.

새 코드 :

public class PlayerMove : MonoBehaviour 
{ 

    Vector3 pos; 
    public float speed; 
    public static bool inside; 
    public Dictionary<string, GameObject> obstacleDictionary; 

    GameObject gob; 

    void Awake() 
    { 
     obstacleDictionary = new Dictionary<string, GameObject>(); 
    } 

    void Start() 
    { 
     pos = transform.position; 
    } 

    void Update() 
    { 
     gob = GetObjectAt(transform.position); 
     if (gob == null) inside = false; 
     else inside = true; 
     print(inside); 


     #region Control 
     if (Input.GetKeyDown(KeyCode.LeftArrow)) 
     { 
      GameObject go = GetObjectAt(transform.position - new Vector3(speed, 0, 0)); 
      if (go == null || go.GetComponent<ObstacleMove>().openSide == "right") 
      { 
       if (inside && gob.GetComponent<ObstacleMove>().openSide == "left") inside = false; 
       /*if(inside && gob.CompareTag("BigRed") && go.CompareTag("BigRed")) { } 
       else */ 
       pos.x -= speed; 
      } 
     } 

     else if (Input.GetKeyDown(KeyCode.RightArrow)) 
     { 
      GameObject go = GetObjectAt(transform.position + new Vector3(speed, 0, 0)); 
      if (go == null || go.GetComponent<ObstacleMove>().openSide == "left") 
      { 
       if (inside && gob.GetComponent<ObstacleMove>().openSide == "right") inside = false; 
       pos.x += speed; 
      } 
     } 

     else if (Input.GetKeyDown(KeyCode.DownArrow)) 
     { 
      GameObject go = GetObjectAt(transform.position - new Vector3(0, speed, 0)); 
      if (go == null || go.GetComponent<ObstacleMove>().openSide == "up") 
      { 
       if (inside && gob.GetComponent<ObstacleMove>().openSide == "down") inside = false; 
       pos.y -= speed; 
      } 
     } 

     else if (Input.GetKeyDown(KeyCode.UpArrow)) 
     { 
      GameObject go = GetObjectAt(transform.position + new Vector3(0, speed, 0)); 
      if (go == null || go.GetComponent<ObstacleMove>().openSide == "down") 
      { 
       if (inside && gob.GetComponent<ObstacleMove>().openSide == "up") inside = false; 
       pos.y += speed; 
      } 
     } 
     #endregion 

     transform.position = pos; 

     if (inside && gob.transform.position != transform.position) 
     { 
      print("change"); 
      ChangeObstacleDictionary(gob.transform.position, transform.position); 
      gob.transform.position = transform.position; 

     } 
    } 

    public GameObject GetObjectAt(Vector3 position) 
    { 
     string pos = position.x + "_" + position.y; 
     if (obstacleDictionary.ContainsKey(pos) == true) 
     { 
      print(obstacleDictionary[pos]); 
      return obstacleDictionary[pos]; 
     } 

     else return null; 
    } 

    public void ChangeObstacleDictionary(Vector3 lastPosition, Vector3 newPos) 
    { 

     string lastPosString = lastPosition.x + "_" + lastPosition.y; 
     string newPosString = newPos.x + "_" + newPos.y; 

     //print("test" + lastPosString + " " + newPosString); 
     if (lastPosString != newPosString) 
     { 
      obstacleDictionary.Remove(lastPosString); 
      obstacleDictionary.Add(newPosString, gob); 
     } 
    } 

} 

3 .Change 실행 순서 스크립트의 및 확인 PlayerMove 다른 사람보다 먼저 실행합니다. enter image description here

다음

enter image description here

+0

이것은 작동하지 않습니다. 내 프로젝트가 있습니다. https://1drv.ms를 확인하십시오./u/s! AsCxyl5DQ6LHnXch-oX8HW2OaIx9 – Adam

+0

@ Adam 1 분 안에 내 솔루션을 사용해 보셨습니까? 큰! 추가 도움을 얻기 위해 노력하십시오. 시도 해봐! – Programmer

+0

나는 당신 앞에서 그것을 시도했기 때문에. 모두 내 프로젝트에있다 – Adam