0826_0830

Heejin Jo·2021년 9월 7일
0

Unity_C#

목록 보기
15/16

이거는 c#

질문: maxValue 는 대체 언제 쓰나...?
질문: 근데 인스턴스를 왜 새롭게 하나를 복사해서 쓸 필요가 있는가?...? 뭐에서 나온 질문이야

프라이빗으로 선언하면 어떻게 초기값을 할당할 것인가
클래스에는 생성자 메서드를 통해서 할당해

클래스랑 이름 똑같은 친구 이게 바로 생성자
이 생성자가 하는 일은 프로퍼티의 값을 초기화 하는 일
보이드, 리턴값도 없어

c#에서는 전역변수를 필드라고 부름
전역변수를 지역변수처럼 쓰려면 this를 붙여줌

클래스면 닷노테이션

기획자가 수정하려면 유니티 에디터 상에서 수정할 수 있어야겠죠?

0826
instantiate(cubePrefab, new Vector(0, 3, 0)
instantiate을 쓴다는 것은 해당큐브를 메모리 상에 만들어라~ 는 뜻
그러면 public class StaticCube라는 클래스에서 instantiate하는 순간 큡우브가 만들어질꼬야
근데 이게 지연시간이 있어서
qtyText.text = staticCube.GetTotalQty().ToString(): 이게 실행이 될 때 최초의 첫 번째는 0이 반환되버렷

이걸 막으려면
1. 스타트 함수가 호출되고 난다음에 GetTotalQty 값을 staticUImanager한테 전달해주는 방법

public class StaticUIManager : MonoBehaviour
{
public Text qtyText;
public GameObject cubePrefab;

public static StaticUIManager instance;
void Start()
{
	instance = this;
}

public void OnClickButton()
{
	Instantiate(cubePrefab, new Vector3(0, 3, 0), Quaternion.identity);	
}

public void SetCubeQty(int qty)
{
	qtyText.text = qty.ToString();
}

}

자 이렇게 StaticUImanager 를 만들었고 이렇게 되면 StaticCube 입장에서는
public class StaticCube : MonoBehaviour
{
static int totalCubeQty = 0;

void Start()
{
	totalCubeQty += 1
}

}

이제 나 +1 했어! 이걸 staticUImanager 한테 알려야지! 하면

public class StaticCube : MonoBehaviour
{
static int totalCubeQty = 0;

void Start()
{
	totalCubeQty += 1
	StaticUIManager.instance.SetCubeQty(totalCubeQty);
	//StaticUIManager 클래스명 적고 instance하면은 그 클래스로 만들어진 인스턴스에 대한 참조값을 가져올 수 있습니다. 
	//이 인스턴스에다가 . 찍고 SetCubeQty의 매개변수로 totalCubeQty를 받아 전달 할 수 있겠지
}

}

근데 하이라키에서 복붙하다가 보면 StaticUIManager가 여러개가 생길 수도 있어
그러면 나는 값을 보냈다고 생각했는데 1번 2번으로 나뉘어져서 2번에만(마지막으로 실행되는) 값이 적용되어버릴 수 있어
이를 방지 하기 위해
if(instance != null) //만약 인스턴스에 뭔가가 할당되어 있다면
{
Destory(instance.gameObject) //걔를 그냥 죽.여.
}
instance = this: //걔 죽였어? 그럼 이제 나를 할당해라!

자 저게 바로 그 유명한 싱글턴 패턴(여기서 패턴은 디자인 패턴을 의미하며, 어떤 문제를 해결하는 하나의 스타일! 을 디자인패턴이라고 해)

—위까지가 26일

0901

public class SpriteThree : MonoBehaviour
{
public GameObject spriteOne;
public GameObject spriteTwo;
public GameObject spriteThree;

이렇게 3개가 있을 때 SpriteThree의 인스턴스를 알면 코드상으로도 접근할 수 있어 근데 그게 싫으면! 코드로 잘못 접근해서 값 변경하게 만들기 싫으면
[SerializeField]를 이 때 쓰는거임

profile
core를 기르자

0개의 댓글