월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
저는 왜 설명에 갯수가 한가지만 뜨는지 모르겠습니다
이런식으로 강의하실때 10가지가 뜬다고 하는데 전 한가지만 뜨고 있고 맨마지막에 +9 오버로드 라고 나와 있는데 이거 다른걸 보려면 어떻게 해야 하는지 알려주시면 안될까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
UI_Base의 Start()
안녕하세요 항상 강의 잘 듣고 있습니다. 8:40초 부분에서 UI_Base 클래스에서 Start()함수로 Init()을 호출 하고 나머지 다른 클래스에서는 Start()함수를 지우는 이유가 뭔지 다시 설명을 들을 수 있을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
static에 관해서 질문이 있습니다.
강의를 보면서 C#에 대한 이해를 최대한 하면서 공부를 하고있는데요. 마이크로소프트 공식 문서와 기타 책들도 참고하면서 하고 있는데 static 한정자가 유니티에서 쓰일 때 좀 다른점이 있는 것 같아서 질문드립니다. 이것저것 테스트해보았는데도 의문점이 풀리지 않는 부분들이 있어서요.. 첫번째 질문은 - Part1,2에서 진행했던 콘솔앱같은경우, 다른 클래스에서 static한정자를 사용해서 필드변수등을 만들었을 때, 그냥 program의 Main에서 타클래스에서 선언한 static 필드변수를 new 키워드도 사용하지 않고 그대로 가져다가 사용할 수 있었습니다. 실제로 결과는 0, 100이 찍힌걸로 보아 new Class1을 하지 않았음에도 분명 어딘가에 메모리상에 Class1 클래스가 만들어져서 존재하고 myValue라는 값도 존재한다는 의미로 받아들였는데 일단 이부분의 이해가 맞는지 궁금합니다. 두번째로 - 위와 같은 방법으로 유니티에서도 실험을 해보았는데, 일단 디버그 안에서 TestManager.Instance로 바로 접근이 가능했지만, a의 값을 가져오는거에는 실패를 한게 어째서인지 모르겠고 그다음에 위에 Instance.a가 널래퍼런스 오류라서 TestManager를 새로 만든 뒤에 tm에서 a를 가져왔지만 그값이 100이 아닌 0인 이유도 모르겠습니다. (왜 TestManager의 Start안에서 초기화하는 부분이 실행이 안됐는지) a 자체를 static으로 하지 않아서 그런가 싶어서 int a에도 static을 붙여보았는데 그렇게하면 TestManaget.Instance.a가 아닌 TestManager.a로 바로 접근이 가능했습니다만, 싱글톤 패턴을 사용하는 방법에선 Instance를 사용해서 접근하는게 목적인 것 같아서 의미가 없는게 아닌가요? 세번째로 강의를 보면 Init()함수에서 Instance가 null이라면 찾아서 넣어주는 작업을 하는데, 애초에 new키워드를 쓰지 않고도 이미 Managers.Instance에 접근이 가능하다는 것 자체가 이미 Managers라는 어딘가에 존재하는 클래스를 가져왔다고 생각되는데, 왜 Instance = 자기자신으로 바로 가져오지 못하고 null상태로 존재할 수 있는지가 궁금합니다. 메모리상에 존재하지 않는다면 애초에 Managers.Instance에 접근자체를 할 수 없던가, 그렇지않다면 Instance를 찾은시점에 Instance타입자체가 Managers이므로 자기자신을 선택할 수 있어야하는게 아닌가요? 마지막으로 static키워드 자체가 유일성을 보장받는다는게 핵심이고, 그것덕분에 그냥 Managers.~~~방식으로 접근할 수 있다는부분에서, 결국 Managers 스크립트가 컴포넌트의 형태로 씬 어딘가에 존재해야만 가져다가 쓸 수 있다면 반대로 Managers 스크립트가 붙은 오브젝트가 하나가 아닌 여러개 존재할 때, Managers안의 Instance의 유일성은 보장받지 않는게 아닌가요? 만약 Managers를 가지고있는 복수의 게임오브젝트가 존재할 경우, Managers.Instance로 뭔가에 접근한다면 어떤 게임오브젝트의 Managers에 접근하는건가요? 그리고 Managers 자체가 복수로 존재하는거 자체가 가능한게 잘못 된 것 같은데 정작 Managers를 가진 게임오브젝트를 복제하고 실행해봐도 아무 문제가 없어보여서 질문드립니다. 혼자 공부하느라 최대한 이것저것 다 찾아보고 하면서 공부하고 있는데 static과 싱글톤 개념이 약간 이해가 어려워서 염치불구하고 질문드립니다...ㅜㅜ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
null에서 걸립니다..
윗칸에있는 NULL부분을 해결하려고 했는데 브레이크 포인트를 잡아도 모르겠습니다..
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Bind 함수 관련 질문드립니다.
Bind 함수에서 _objects.Add로 딕셔너리에 컴포넌트 타입과 오브젝트를 추가하려는 부분에서 질문이 있습니다. 코드만 보면 실제로 추가하려는 objects는 선언만 되어있는 상태고 아래 for문에서 Util.FindChild로 컴포넌트를 가져와 저장하게끔 되어있는데 이 경우엔 딕셔너리에는 null 값으로 저장되는게 맞는건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
마우스클릭 시, 자동으로 마우스만 따라옵니다
코드 상 문제가 없다고 나오긴 하는데, 어디가 잘못된 곳인지 못 찾겠습니다. 클릭하고 계속 마우스만 따라오는데 여기를 어떻게 고쳐야 할까요? public class PlayerController : MonoBehaviour { [SerializeField] float _speed = 10.0f; bool _moveToDest = false; Vector3 _destPos; void Start() { Managers.Input.KeyAction -= OnkeyBoard; Managers.Input.KeyAction += OnkeyBoard; Managers.Input.MouseAction -= OnMouseClicked; Managers.Input.MouseAction += OnMouseClicked; } void Update() { if (_moveToDest) { Vector3 dir = _destPos - transform.position; if (dir .magnitude < 0.0001f) { _moveToDest = false; } else { float moveDist = Mathf.Clamp(_speed * Time.deltaTime, 0, dir.magnitude); transform.position += dir.normalized * _speed * Time.deltaTime; transform.LookAt(_destPos); } } } void OnkeyBoard() { //+-delta //transform.Rotate(new Vector3(0.0f, Time.deltaTime * 100.0f, 0.0f)); //transform.rotation = Quaternion.Euler(new Vector3(0.0f, _yAngle, 0.0f)); if (Input.GetKey(KeyCode.W)) { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.forward), 0.2f); transform.position += Vector3.forward * Time.deltaTime * _speed; } if (Input.GetKey(KeyCode.S)) { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.back), 0.2f); transform.position += Vector3.back * Time.deltaTime * _speed; } if (Input.GetKey(KeyCode.A)) { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.left), 0.2f); transform.position += Vector3.left * Time.deltaTime * _speed; } if (Input.GetKey(KeyCode.D)) { transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Vector3.right), 0.2f); transform.position += Vector3.right * Time.deltaTime * _speed; } _moveToDest = false; } void OnMouseClicked(Define.MouseEvent evt) { if (evt != Define.MouseEvent.Click) return; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); Debug.DrawRay(Camera.main.transform.position, ray.direction * 100.0f, Color.red, 1.0f); RaycastHit hit; if (Physics.Raycast(ray, out hit, 100.0f, LayerMask.GetMask("Wall"))) { _destPos = hit.point; _moveToDest = true; //Debug.Log($"Raycast Camera @ {hit.collider.gameObject.tag}"); } } }
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Managers::Init 의 호출 시점 관련
안녕하세요, Prefab #1 강의에서 유니티짱 대신에 탱크 모형을 만들어서 PlayerController 스크립트 붙이기를 했더니 이런 에러가 발생했습니다. NullReferenceException: Object reference not set to an instance of an object Managers.get_Input () (at Assets/Scripts/Managers/Managers.cs:11) PlayerController.Start () (at Assets/Scripts/PlayerController.cs:12) 유니티짱을 썼을 때는 잘 되었던 코드라서 이상하다고 생각했습니다. 확인해 보니, Managers의 Init 함수가 호출되기 전이라서 발생한 NPE 인데요. Managers::Init 함수가 Start() 에서 호출되고 있었기 때문에, 어쩌다보니 탱크에 붙어있는 Start() 함수가 Managers의 Start()보다 먼저 호출되어 발생한 문제였습니다. 그래서 Managers의 초기화는 Managers를 접근하는 다른 함수들이 호출되기 전에 반드시 끝나 있어야 할 것 같아서 Managers에서 Start() 대신 Awake() 에서 Init을 호출하게 했더니 문제가 일단 해결되었는데요, 대신 이런 warning 이 뜨네요. The referenced script (Unknown) on this Behaviour is missing! 이 warning은 무시해도 괜찮은 걸까요? 그리고 Awake를 쓰는 것이 올바른 방법인지도 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
팝업을 풀링 하고싶습니다
자주쓰는 팝업 같은경우 풀링을 하고싶습니다. 해당프리팹에 poolable 컴포넌트 추가해서 하긴했는데 풀오브젝트가 transform이라서 경고가 뜹니다.! UI같은 경우 오브젝트풀링을 어떻게해야할까요?. 상점을 팝업식으로 하려는데 계속 껏다키면 데이터를 다시불러와야 하니깐 풀링을 사용해야 맞는것인지.. 그냥 생성,파괴로 해야하는지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
컴포넌트 질문
안녕하세요 이 두개의 컴포넌트는 차이가 있는걸까요?? 실제로 스크립트를 작성해서 붙여넣으면 스크립트 모양이 생성되는데 두 개의 차이가 뭔지 모르겠습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
vr게임은 에셋스토어에서 3d용으로 사면되는건가요?
안녕하세요 저가 이번에 vr게임을 만들고 싶은데 c# 유니티 경험이 없어서 강의듣고있습니다. vr 게임도 assest store에서 3d 게임용으로 asset들을 사면 되나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
도착지 관련 로직
if(_moveToDest) { Vector3 dir = (_destPos - transform.position); if(dir.magnitude < _speed * Time.deltaTime) { _moveToDest = false; transform.position = _destPos; } else { transform.position += dir.normalized * _speed * Time.deltaTime; transform.LookAt(_destPos); } } 이렇게 많이 써왔는데, 수업중 작성하신 코드와 비교해서 단점이 있나요? 아니면 그냥 써도 되는 로직인가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
컨트롤 + 스패이스를 눌렀을때 나오는 항목들이 유니티용 코드들이 나오지 않아요
인텔리센스 항목이 나오질 않고 있습니다. 혹시 어떤방법으로 이걸 추가해야 되는건지 알수 있을까요 하라는대로 다 했는데 이항목이 나오질 않고 있어서 약간 제한이 있습니다 ㅠㅠ 도와주시면 감사하겠습니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Events 항목 수정이 안 돼요.
위 이미지에서 Events의 항목을 수정하고 하는데 수정이 안 됩니다. 클릭이 안 되는데 무슨 문제인가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
이해가 안 되는 부분이 있어요.
public class InputManager { public Action<Define.MouseEvent> MouseAction = null; public void OnUpdate() { if(MouseAction != null) { if (Input.GetMouseButton(0)) { MouseAction.Invoke(Define.MouseEvent.Press); _pressed = true; } else { if (_pressed) { MouseAction.Invoke(Define.MouseEvent.Click); _pressed = false; } } } } } 위 코드에서 if(MouseAction != null) 이 잘 이해되지 않습니다. 제일 위에서 public Action<Define.MouseEvent> MouseAction = null;로 MouseAction을 null로 초기화 했으니 if(MouseAction != null) 는 작동하지 않아야 하는 거 아닌가요..?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
gridPanel에서 UI_Inven_Item Destory 중 오류 발생
안녕하세요 루키즈님. 오류가 발생했는데, 해결되지 않아 질문 드립니다. NullReferenceException: Object reference not set to an instance of an object UI_Inven.Init () (at Assets/Scripts/UI/Scene/UI_Inven.cs:26) UI_Inven.Start () (at Assets/Scripts/UI/Scene/UI_Inven.cs:14) 현재 아래와 같은 오류가 발생했고, 디버그 모드를 통해 기존에 있던 UI_Inven_Item을 Destory 하는 중에 발생하고 있다는 것을 알게 되었습니다. public override void Init() { base.Init(); Bind<GameObject>(typeof(GameObjects)); GameObject gridPanel = Get<GameObject>( (int)GameObjects.GridPanel); // 있던 거 삭제 foreach (Transform child in gridPanel.transform) { // 내 트랜스 폼이 들고 있는 모든 자식들을 순회를 하는 코드 Managers.Resource.Destroy(child.gameObject); } //// 실제 인벤토리 정보를 참고해서 //for(int i =0; i< 8; i++) //{ // GameObject item = Managers.Resource.Instantiate("UI/Scene/UI_Inven_Item"); // item.transform.SetParent(gridPanel.transform); // 부모님 지정 // UI_Inven_Item invenitem = Util.GetOrAddComponent<UI_Inven_Item>(item); // invenitem.SetInfo("Bind"); //} } 혹시 원인을 알 수 있을 까요 ? 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
비용? ,UI 자동화 질문이요!
UI 자동화 부분에서 바인딩부분이 편하던데요!! 하다보니 궁금증이 생겨서 질문드립니다. 속도나 비용쪽인 측면에서 보통의 인스펙터창에서 끌어서 쓰는 것이 더빠르지는 않은지 궁금합니다.! 자주 사용되는 사운드나 총알발사 처럼 자주쓰는것도 오브젝트를 오브젝트 풀링에서 꺼내어 쓸떄 stirng으로 접근해서 꺼내어쓰면 비용이 많이드는게아닌지..아니면 총알을 계속발사한다면 그냥 _pool.PopBulltet() , 이런식으로 하는게 더빠른지.. 궁금합니다!
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
_destPos가 계속 0인 상태입니다.
(이전에 오류 해결해서 글 수정합니다!) (질문)첫 감지를 통해 몬스터가 이동하면 플레이어가 어디에 있던 0,0,0으로 이동합니다. 몬스터가 움직이기 전에는 _destPos가 정상적으로 변하는데, 움직이기 시작하면 0으로 고정이 됩니다. 이러한 것들은 유니티와 연결해서 멈추고 확인해봤습니다! 그런데 플레이어는 문제 없이 계속 작동하고 있습니다..
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
궁금한 점이 있어서 여쭤봅니다!
_stat = transform.parent.GetComponent<Stat>(); 이 부분에서 parent를 받아오는데, 어떻게 작동해서 누구의 parent를 받아오는지 잘 이해가 안갑니다 이해가 잘 안되어서 아마 질문도 이상할 거라고 생각이 되는데 이 점 감안해서 답변해주시면 감사하겠습니다..ㅎㅎ 간략히 하자면 저 줄의 코드가 이해가 안갑니다!
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
몇 가지 질문이 있습니다.
1. public GameObject Instantiate(string path, Translate parent = null)에서 Translate 밑에 오류가 뜹니다. 형식 또는 네임스페이스 이름을 찾을 수 없다고 하는데, 왜 이런 건가요? 2. Instantiate의 경우 그냥 곧바로 prefab을 넣어서 사용했는데 왜 Destroy는 tank에 Instantiate를 넣은 뒤 tank를 넣어서 삭제해야 하나요? 3. public GameObject Instantiate(string path, Transform parent = null)에서 parent의 의미는 무엇인가요? 4. GameObject prefab = Load<GameObject>($"Prefabs/{path}");의 작동 원리를 모르겠습니다. 경로를 입력하는 것까진 알겠는데 경로에서 'Tank' 프리팹을 불러오려면 불러올 프리팹의 이름도 입력해 주어야 하는 게 아닌가요? 5. public GameObject Instantiate(string path, Transform parent = null)를 보면 Instantiate의 파라미터가 두 개인데 어째서 Managers.Resource.Instantiate에서 불러올 땐 Managers.Resource.Instantiate("Tank");로 파라미터가 하나만 들어가나요? 제가 모자라서 질문이 너무 많네요ㅠ 매번 친절히 답변해 주셔서 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Scene 전환시 데이터 유지와 설계 질문
안녕하세요 ㅎㅎ 강의를 들으며 토이프로젝트로 조그마한 게임을 하나 만들고 있습니다. 몇 가지 궁금한 점이 생겨 질문드립니다. Q1.1) 아래 사진은 루카노르 백작 이라는 게임입니다. 캐릭터가 위의 문을 열고 들어가면 빌런인 염소가 존재합니다. 문제는 이 방을 나갔다 새로 들어와도 염소의 자리는 그대로 방을 나갈 당시 위치에 있습니다. 게임을 해본 추억을 되짚어 보니 두 가지로 나뉘더군요 1) 방을 나갔다 다시 들어오면 몹이 초기 젠 자리로 가있는 경우 2) 방을 나갔다 들어와도 아래와 같이 몹이 그자리 그대로 있는경우 1)번의 경우 모든걸 초기화하고 새로 만들면 될 것 같은데 2)번의 경우 기존의 정보를 어떤 방식으로 관리하는지 궁금합니다. 만약 던전의 방도 Scene으로 관리한다면 본 강의의 예제에서는 Scene간의 전환시 Manager를 통해 clear하는데 어떤식으로 코드를 수정해야할지 여쭙고싶습니다. 횡설수설하지만 정리해서 말씀드리면.. Scene전환시 이전 Scene으로 돌아갈때 이전 Scene의 상태를 그대로 유지한상태로 돌아가는 방법은 무엇인가요? Q2) 또 한가지 의문은, 리니지나 디아블로의 경우 던전의 한 층 자체를 Scene으로 관리할 것 같은데 아래와 같이 던전 내에 여러개의 문이 있고, 문에 입장하면 장면이 전환되는 경우 던전 내의 방들은 Scene으로 관리하나요? 설계는 개발자 마음대로라지만 Rookiss님이 게임을 만드신다면 어떻게 설계하실지 궁금합니다.