클라이언트 : 영화를 찍는것과 유사
서버 : 본인의 식당을 운영하는것과 유사
Play상태에서 수정한것들은 다 사라진다
유니티의 중요한 철학
모든 코드를 부품화 한다.
큐브
빈오브젝트에 위와 같이 추가하면
동일한 큐브를 만들 수 있다.
OOP관점 클래스 설계시에
상속
을 이용할 것인지 아니면 컴포넌트
를 이용할 것인지 선택한다.
IS-A 관계면 상속
Has-A 관계면 컴포넌트
ex) 오크는 몬스터다(Orc Is-A Monster)
플레이어는 인벤토리를 갖고 있다(Player Has-A Inventory)
컴포넌트 : 기능들을 부품화해서, 코드의 의존성을 줄이고 재활용성을 줄인다.
꿀팁
컴포넌트 용도로 사용될 C#과 그냥 사용될 C#을 구분하자
Test.cs
Manager.cs
두개의 코드가 있고
Test.cs에서
Manager mg = new Manager();
하고 유니티 실행을 해보면 아래와 같은 오류가 뜬다
MonoBehaviour을 상속받아야 유니티에서 컴포넌트로 사용할 수 있다.
(부모)
Object
Component
Behaviour
MonoBehavior
(자식)
상속형태이다
오브젝트의 설명
Base class for everything attached to a GameObject.
Manager의 MonoBehaviour을 삭제하고나면 오류가 뜨지않지만 start, update는 컴포넌트로 들어가 있을때 실행되는 설계적인 문제 발생
빈 게임오브젝트에 MonoBehaviour 붙은 Manager을 넣으면 해결된다.
꿑팁
툴에서 그래고 드롭, UI를 클릭해서 이리저리 만드는 방식은 코드로 구현가능
Visual Studio위에 유니티에 연결을 클릭하고 브레이크 포인트를 잡는다.
Unity에서 play하면 브레이크 포인트 잡히는걸 볼 수 있다.
특정 클래스에 인스턴스 한개만 있기를 원할때 사용
static을 하나 만들어서 전역으로 사용할거 만듬
//Manager.cs
static Managers Instance; //유일성이 보장된다.
public static Managers GetInstance() { return Instance; } //유일한매니저를 갖고온다
//누군가는 가지고 와야한다
void Start()
{
Instance = this;
}
하지만 여기서 @Managers1,2,3,4 이렇게 여러개 있을경우 위와 같이 쓰면 자기 자신이 왕이라고 서로 덮어쓰는 문제가 생겨난다.
void Start()
{
GameObject go = GameObject.Find("@Managers");
Instance = go.GetComponent<Managers>();
}
이렇게 쓴다면 @Managers1,2,3,4 있더라도 @Managers만 받아오기 때문에 덮어쓰는 문제 해결
외부에서사용할때는 GetInstance()로 가져와서 사용한다.
//Player.cs
void Start()
{
Managers mg = Managers.GetInstance();
}
여기서 게임 오브젝트에 @Managers가 없다면 받아오는 mg의 값은 null이 되서 사용하려면 오류가 난다.
static void Init()
{
if (s_Instance == null)
{
GameObject go = GameObject.Find("@Managers");
if(go == null)
{
go = new GameObject { name = "@Managers" };
go.AddComponent<Managers>();
}
DontDestroyOnLoad(go); //삭제되지 않게 막아줌?
s_Instance = go.GetComponent<Managers>();
}
}
}
이런식으로 Init를 만들어서 Instance가 null이라면 @Managers를 찾아서 없다면 게임 오브젝트를 만들어서 Managers 컴포넌트를 추가해준다.
Manager.cs
public class Managers : MonoBehaviour
{
static Managers s_Instance; //유일성이 보장된다.
public static Managers Instance { get { Init(); return s_Instance; } }
// Start is called before the first frame update
void Start()
{
Init();
}
// Update is called once per frame
void Update()
{
}
static void Init()
{
if (s_Instance == null)
{
GameObject go = GameObject.Find("@Managers");
if(go == null)
{
go = new GameObject { name = "@Managers" };
go.AddComponent<Managers>();
}
DontDestroyOnLoad(go); //삭제되지 않게 막아줌?
s_Instance = go.GetComponent<Managers>();
}
}
}
Player.cs
public class Player : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Managers mg = Managers.Instance;
}
// Update is called once per frame
void Update()
{
}
}