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


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.