검사기에서 필드를 표시 (연결 가능)하지만 코드 (비공개)를 통해 액세스 할 수 없도록 만드는 방법은 무엇입니까?


9

물론 buttontype 이라는 이름 의 변수가 있다고 가정 해 봅시다 .ButtonSystem.Serializable

그 변수를 인스펙터를 통해 할당 할 수 있기를 원합니다 public.

public class SomeScript : MonoBehaviour{
    public Button button;
}

그것은 나에게 그것을 준다 :

여기에 이미지 설명을 입력하십시오

이제 코드를 깨끗하고 안전하게 유지하고 싶습니다. 캡슐화를 유지 해야하는 이유가 있습니다.

런타임에서 구성 요소를 검색하는 여러 가지 방법이 있다는 것을 알고 transform.Find("Some/Genius/TypeUnsafe/Path")있거나 GameObject.Find("3 seconds scene iteration").GetComponent(...).피하고 싶습니다.

인스펙터에 있는 변수 private access와 변수 를 어떻게 혼합 public access합니까?


이 필드를 "안전한"것으로 만들고 싶은 이유 는 무엇입니까? 코드가 클라이언트 컴퓨터에서 실행되면 클라이언트는 원하는대로 무엇이든 할 수 있기 때문에 따옴표로 묶었습니다. private실제로 제 3자가 필드에 접근하는 것을 막기위한 것이 아니라 "내가하고있는 일을 막지 말고"라고 말하는 방법을 제공하는 것입니다. 당신 이 그것에 접근 하지 못하게 하십시오.
Clockwork-Muse

예, 캡슐화가 무엇인지 알고 있습니다! : DI 는 거대한 응용 프로그램 (실제로 게임 클라이언트)을 위해 일종의 UI/ API MVC/ MVVM패턴을 빌드 하고와를 분리해야 UI했습니다 API. 단순히 검사원 원인을 통해 값을 할당해야했습니다. 다른 방법은 없습니다. Find()메서드는 형식이 안전하지 않으므로 끌어서 놓아 항목을 정리하는 것이 더 쉽습니다. 고전적인 OOP 프레임 워크를 구축하는 것은 정말 어렵고, Unity이와 같은 해킹을 찾아야합니다.
Jacob

private은 변수를 다른 스크립트로부터 안전하게 유지하지 않습니다. 당신은 택시 akways 반사 또는 일부 포인터 속임수에 도달
Bálint

답변:


19

당신은 SerializeField 속성을 찾고 있습니다

문서에서 :

Unity가 프라이빗 필드를 직렬화하도록합니다.

거의 필요하지 않을 것입니다. Unity가 스크립트를 직렬화하면 공용 필드 만 직렬화됩니다. 그 외에도 Unity가 개인 필드 중 하나를 직렬화하도록하려면 SerializeField 속성을 필드에 추가 할 수 있습니다.

그러면 코드는 다음과 같습니다.

public class SomeScript : MonoBehaviour{
    [SerializeField]
    private Button button;
}

6
가독성을 위해 일반적으로 한 줄에 모두 씁니다 [SerializeField] private Button button; . 행에 많은 필드가있을 때 쉽게 스캔 할 수 있습니다. 또한, "당신은 이것을 거의 필요로하지 않을 것"이라는 문서를 조이십시오. 나는 항상 이것을 완전히한다.
jhocking

1

변수 앞에 SerializeField 속성 을 추가하여 개인 변수를 표시 할 수 있습니다 . 이 같은

[SerializeField]
private Button button;

위 변수는 관리자에게 표시되지만 다른 클래스는이를 가져올 수 없습니다. 반대로 HideInInspector 속성을 통해 관리자에게 공개 된 공개를 숨길 수도 있습니다 . 이 같은

[HideInInspector]
public Button button;

위의 변수는 다른 스크립트에서 액세스 할 수 있지만 검사자에게는 표시되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.