>

한 스크립트에서 다른 스크립트로 gameobject 배열 값에 액세스하려고합니다. 아래 그림과 같이 편집기에서 특정 게임 오브젝트 캡슐을 배열에 연결했으며 배열 값을 다른 스크립트에 액세스하려고합니다. 그러나 값을 전달하려고하면 null 값이 나타납니다. 런타임 중에 gameobject를 활성화 및 비활성화해야하므로 gameobject 태그를 사용하고 싶지 않습니다.

PinsScript.cs

public class PinsScript : MonoBehaviour {
        // Use this for initialization
        public GameObject[] pins;
        void Start () {
        }
        // Update is called once per frame
        void Update () {
        }
}

MovingBall.cs

PinsScript p = GetComponent<PinsScript>();
        foreach (GameObject pin in p.pins)
        {
             pin.SetActive(false);

        }

  • 답변 # 1

    각 핀에 PinScript를 부착하십시오. 깨어있을 때 배열에서 각 핀에 대한 참조를 유지하십시오. PinScript가 비어있을 수 있습니다. 그런 다음 원하는대로 켜거나 끄는 참조가 있습니다. 스크립트는 다음과 같습니다.

    PinScript.cs

    public class PinsScript : MonoBehaviour { }
    
    

    MovingBall.cs

    public class MovingBall : MonoBehaviour
    {
        private PinsScript[] pinScripts;
        private void Awake()
        {
            pinScripts = FindObjectsOfType<PinsScript>();
        }
        public void SetPinActivity(bool active)
        {
            foreach (var pin in pinScripts)
            {
                pin.gameObject.SetActive(active);
            }
        }
    }
    
    

    그러면 다음을 호출하여 비활성화 할 수 있습니다 :

    myMovingBall.SetPinActivity(false);
    
    

    그러나 이것은 훌륭한 아키텍처가 아닙니다. 그러나 간단한 해결책입니다.

    나는 당신이 얼마나 많은 핀을 가지고 있는지 모른다고 가정합니다. 핀을 미리 알고 있다면 알려 주시면 더 최적화 된 솔루션을 제안하겠습니다. 그러나 이것은 어느 쪽이든 작동합니다.

  • 답변 # 2

    여기서 문제는PinsScript에 액세스하려는

    새로운 MovingBall을 체결 할 때마다 PinsScript를 어딘가에서참조해야합니다. 나는 보통 MonoBehavior에 코드의 작은 부분을 추가하여 MovingBall을 만듭니다.

    public PinsScript pinsScript;
    
    

    그런 다음 PinsScript를 보유한 GameObject를 해당 변수로 드래그하기 만하면됩니다. 다른 방법은 GameObject에 이름으로 접근하는 것입니다 :

    PinsScript p = GameObject.Find("TheNameOfTheGameObjectHoldingThePinsScript").GetComponent<PinsScript>();
    
    

관련 자료

  • 이전 game mechanics - 내 전투 시스템을 개선하는 방법?
  • 다음 unity - Terraria와 같은 게임을위한 2D 조명 달성