>

캔버스에서 요소를 찾고 있습니다 (텍스트 필드 및 슬라이더). 값을 검색하여 함수에 전달할 수 있습니다.

그러나 지금까지 나는 그것들에 접근하는 방법을 알 수 없다. 캔버스 자체의 메소드는 볼 수 있지만 캔버스에 추가 한 요소의 이름은 볼 수 없습니다.

캔버스를 공용 변수에 저장했습니다. 그런 다음 텍스트 레이블에 연결된 슬라이더와 텍스트 필드를 배치했습니다. 레이블이나 슬라이더 또는 텍스트 필드에 액세스 할 수 없습니다.

Canvas --
        |___ Text
        |        |_____ InputField
        |
        |___ Text
                 |_____ Slider

canvas.text.inputfield.text와 같은 작업을 수행하는 입력 필드의 텍스트 값에 액세스하려고했지만 점 표기법을 사용할 때 텍스트 필드의 이름을 볼 수 없으므로 작동하지 않습니다. 슬라이더도 마찬가지입니다.

public Canvas mainmenu;
void Start() {
    mainmenu = mainmenu.Getomponent<Canvas>();
}
public RetrieveData(){
    // dot notation does not find sub elements of mainmenu canvas
    // only the properties and methods of the canvas itself.
}

다른 요소의 부모 인 경우에도 직접 볼 수없는 경우 실제로 UI 캔버스의 요소에 어떻게 액세스합니까?

  • 답변 # 1

    이름으로 게임 오브젝트를 찾지 않는 것이 좋습니다 ( GameObject.Find 사용)  또는 transform.Find  피할 수있을 때마다 기존 답변에서 제안한대로)

    내 경험상 이것은 실수로 깨지기 쉬운 스크립트와 다른 이국적인 버그 사이의 취성 관계를 초래하는 경향이 있습니다

    특정 InputField 를 사용해야하는 스크립트가있는 경우 가장 안정적인 방법  그리고 Slider 이러한 유형의 공개/직렬화 된 필드 제공:

    public class MyUIForm : MonoBehaviour
    {
        public InputField inputField;
        public Slider slider;
        ...
    
    

    ... 검사관에 연결하십시오.

    이것은 에디터를 사용하는 모든 사람에게이 객체들 사이의 의존성을명시 적합니다-이 스크립트를 첨부하자마자 인스펙터가 필요한 것을 알려줍니다

    이 의존성은 Unity에서도 볼 수 있으므로 모든 장면 오브젝트가 아닌 경우 빌드에 어떤 자산을 함께 포함해야하는지 알고 있습니다. 이러한 참조는 객체가로드 될 때 즉시 채워 지므로 한 스크립트가 Start() 할 시간이없는 다른 스크립트의 필드에 액세스하려고 할 때 일반적인 실행 순서 문제를 피합니다.  아직.

    동일한 유형이나 같은 이름의 다른 개체를 추가하거나 육아 계층을 변경해도 개체에 직접적인 참조가 있기 때문에 실수로이를 중단하지 않습니다. 비슷한 이름의 기능을하는 100 개의 물체가있는 장면에서도 원하는 것을 정확하게 지정할 수 있습니다.

    이러한 객체가 같은 장면에 존재하지 않으면이 참조를 보유하는 중간 스크립트를 만들 수도 있습니다. 예. Wyzwyz   MainMenu 와 같은 각 하위 페이지에 대해 알고있는 스크립트  그리고 HighScoresMenuSettingsMenu  입력 값에 대한 참조 보유  그리고 SettingsMenu . 그런 다음 다른 스크립트가이 필드에 액세스해야하는 경우 (이유를 모르겠습니다. 스크립트를 사용하는 스크립트는 아마도 PlayerNameField 에 있어야합니다 그러나 정당한 이유가 있다고 가정 해 봅시다)- GammaSlider 에 대한 참조를 얻을 수 있습니다.  인스턴스 및 SettingsMenu 사용 . 이러한 중간 스크립트는 저렴하며 메뉴에서 계층 구조로 구성되는 방법에 대한 정보를 얻을 필요가 없으며 검사기에서 스크립트 배선 작업을 중앙 집중화 할 필요가 없도록 나머지 코드를 절약 할 수 있습니다.

    <시간>

    보다 자동으로 연결하려면 GetComponentInChildren을 사용할 수도 있습니다 :

    MainMenu
    
    

    mainMenu.settingsMenu.gammaSlider 의 하위 계층을 검색합니다. public Canvas mainMenu; private InputField _inputField; void Start() { _inputField = mainMenu.GetComponentInChildren<InputField>(); } 로 무언가를 찾을 때까지 손자 등을 포함하여  구성 요소를 반환하십시오. (GetComponentsInChildren을 사용하여 모든 일치 항목의 배열을 가져올 수도 있습니다)

    이름으로 객체를 찾는 것과 같은 문제가 있습니다 ( mainMenu 이동).  새로운 부모에게 우리가 그것을 놓칠 수 있습니다. 관련없는 다른 InputField 추가  우리는 잘못된 것을 잡을 수 있습니다), 그러나 우리는 우리가 올바른 유형을 되찾고 있음을 알고 있습니다. 또한 "InputField"라는 이름의 개체를 "PlayerNameInput"으로 변경하거나 오타/자본을 수정하여 가독성을 향상시키려는 사람도 문제를 일으키지 않습니다.

    InputField 와 같이 자신의 유형에 대해 명시 적으로 사용하는 경우  위의 예에서 이러한 위험은 크게 사라집니다. 두 개의 InputField 를 사용하여 양식을 작성할 수 있습니다. s, 그러나 당신은 SettingsMenu 의 두 사본을 사용하지 않을 것입니다 따라서 InputField  스크립트 사용 SettingsMenu  직접 참조 대신 찾을 수는 있지만 실수로 망가지지는 않습니다.

  • 답변 # 2

    여러 가지 가능성이 있습니다

    정적 함수GameObject.Find ()를 사용하여 게임 객체를 찾을 수 있습니다 전체 장면에서 이름. 그러나이 기능은 약간 느리므로 시도하십시오. 한 번만 호출합니다.

    검색 만하는 비 정적 함수Transform.Find ()를 사용할 수도 있습니다. 변환의 아이들. Transform.FindChild는 더 이상 사용되지 않습니다. Transform.Find ()와 동일합니다.

  • 답변 # 3

    Canvas 자체를 가져와 gameObject의 속성에 액세스하려고하기 때문입니다. 그러니 시도 해봐요

    MainMenu
    
    

    GetComponentInChildren

  • 이전 Unity - 통일 - 인스턴스화 된 프리 팹이 ui 레이아웃에 적응하지 않습니다
  • 다음 unity - 스크립트에서 2 개의 트리거를 어떻게 구별 할 수 있습니까?