Q&A :: 일반 클래스 내부에
MonoBehaviour 상속 클래스
멤버 변수 저장하기
유니티에서 JSON 사용하기(Unity JSON Utility) 글에 달아주신 psj님의 질문 댓글에 대한 답변입니다. 질문의 내용은 다음과 같습니다.
궁금한 게 하나 있는데요
public Class Aclass : MonoBehaviour {}
public Class Bclass
{
Aclass a;
}
이런 식으로 MonoBahaviour를 상속 받지 않은 순수 클래스 안에 멤버 변수로 MonoBehaviour를 상속 받은 클래스가 있을 경우에는
Bclass안에 Aclass를 어떤 식으로 저장해야하나요??
출처: https://wergia.tistory.com/164#comment15327425 [베르의 프로그래밍 노트]
궁금한 게 하나 있는데요
public Class Aclass : MonoBehaviour {}
public Class Bclass
{
Aclass a;
}
이런 식으로 MonoBahaviour를 상속 받지 않은 순수 클래스 안에 멤버 변수로 MonoBehaviour를 상속 받은 클래스가 있을 경우에는
Bclass안에 Aclass를 어떤 식으로 저장해야하나요??
출처: https://wergia.tistory.com/164#comment15327425 [베르의 프로그래밍 노트]
안녕하세요 올려주신 글 보고 잘 공부하고 갑니다.
궁금한 게 하나 있는데요
public class Aclass : MonoBehaviour {}
public class Bclass
{
Aclass a;
}
이런 식으로 MonoBahaviour를 상속 받지 않은 순수 클래스 안에 멤버 변수로 MonoBehaviour를 상속 받은 클래스가 있을 경우에는
Bclass안에 Aclass를 어떤 식으로 저장해야하나요??안녕하세요 올려주신 글 보고 잘 공부하고 갑니다.
궁금한 게 하나 있는데요
public Class Aclass : MonoBehaviour {}
public Class Bclass
{
Aclass a;
}
이런 식으로 MonoBahaviour를 상속 받지 않은 순수 클래스 안에 멤버 변수로 MonoBehaviour를 상속 받은 클래스가 있을 경우에는
Bclass안에 Aclass를 어떤 식으로 저장해야하나요??
출처: https://wergia.tistory.com/164#comment15327425 [베르의 프로그래밍 노트]
모노비헤이비어 클래스를 상속받지 않은 일반 클래스인 Bclass가 모노비헤이비어 클래스를 상속받은 Aclass를 멤버 변수로서 가질 때, 이 Bclass의 멤버 변수인 a에 어떻게 Aclass의 객체를 대입/할당 할 수 있는지에 대한 질문입니다.
우선 여기서 알아두어야 할 점은, Bclass는 앞서 말했듯이 모노비헤이비어 클래스를 상속받지 않았기 때문에 Awake(), Start(), Update() 등의 함수를 가지지 못했고, 유니티 엔진에 의해서 코드가 실행되지 않는다는 것입니다. 이 클래스에 속한 함수 등의 코드를 실행시키기 위해서는 유니티 엔진에 의해서 작동하는 모노비헤이비어 클래스를 상속받는 클래스의 동작을 통해서 간접적으로 실행되어야 할 것입니다.
이렇게 Bclass를 가지고 함수를 실행하기 위한 클래스를 다음과 같이 Cclass라고 정의하겠습니다.
public class Cclass : MonoBehaviour
{
private Bclass b;
private void Awake()
{
b = new Bclass();
}
}
그리고 다시 Bclass를 살펴보면 Bclass의 멤버 변수인 a는 private로 선언되어 있어서 접근 방법이 없음을 알 수 있습니다. 외부에서 이 a에 값을 저장하거나 볼 수 있는 경로를 제공해주어야 합니다. 이를 위한 방법은 여러가지가 있습니다.
첫 번째로는 멤버변수의 접근지정자를 public으로 선언하는 것입니다.
public class Bclass
{
public Aclass a;
}
접근지정자를 public으로 선언하면 아래의 예시와 같이 b아래의 a에 곧바로 접근하여 값을 대입할 수 있게 됩니다.
public class Cclass : MonoBehaviour
{
private Bclass b;
private void Awake()
{
b = new Bclass();
}
private void Start()
{
b.a = FindOfObject<Aclass>();
}
}
두 번째 방법은 private인 멤버 변수에 접근해서 값을 넣도록 해주는 기능을 가진 함수를 만드는 것입니다.
public class Bclass
{
private Aclass a;
public void SetA(Aclass a)
{
this.a = a;
}
public Aclass GetA()
{
return a;
}
}
private인 멤버 변수에 접근해서 값을 넣도록 해주는 함수를 만듬으로써 함수를 통해서 b안에 있는 a의 값을 수정할 수 있게 됩니다.
public class Cclass : MonoBehaviour
{
private Bclass b;
private void Awake()
{
b = new Bclass();
}
private void Start()
{
b.SetA(FindOfObject<Aclass>());
}
}
[유니티 어필리에이트 프로그램]
아래의 링크를 통해 에셋을 구매하시거나 유니티를 구독하시면 수익의 일부가 베르에게 수수료로 지급되어 채널의 운영에 도움이 됩니다.
[투네이션]
[Patreon]
[디스코드 채널]
'Q&A' 카테고리의 다른 글
[Q&A/Unity3D] 다른 cs 파일의 클래스 호출과 static (2) | 2019.08.31 |
---|---|
[Q&A/Unity3D] 싱글플레이 게임을 멀티플레이 게임으로 발전시켰을 때 적 AI가 플레이어를 인식하지 못하는 문제 (0) | 2019.08.19 |