월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Instance 프로퍼티
Instance 프로퍼티를 이제 public으로 한다면 굳이 Instance프로퍼티를 남겨둘 필요가 있나요??? 혹시 public을 뺐음에도 프로퍼티를 남겨둔 이유가 있을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
KeyAction != null
InputManager의 OnUpdate함수에 if( KeyAction != null) 일때만 KeyAction.Invoke(); 를 해줬는데 KeyAction이 null일때 Invoke를 해주면 문제가 생겨서 저렇게 조건을 넣어주신건가요????
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Bind함수 질문있습니다
안녕하세요! 강의를 보면서 따라해보고 항상 이부분은 왜 이렇게 하지? 혹시 이렇게는 안되나? 하면서 이해하고 넘어가려고 하는 편인데요. Bind함수부분에서 궁금한점이 있어서 질문드립니다. 이 부분에서 굳이 Enum타입의 _type으로 저장을 하지않고 typeof(T)타입으로 저장하는 부분이 궁금합니다. 버튼이든 텍스트이든 하나의 캔버스 안에서 활용하려고 할 때, 용도에 따라 많이 달라질 것 같은데 모든 버튼을 enum - Buttons에 넣는게 아니라 분류별로 사용할 일도 있을 것 같은데 typeof(T)대신 그냥 Bind에서 매개변수로 받은 type을 넣어주면 enum타입으로 저장할 수 있어서 더 좋을 것 같은데 그렇게 하지 않는 이유가 따로 있나요? 위와 같이 버튼도 용도별로 구분하고싶어서 2번과 같이 구현하면 혹시 될까해서 해보았는데 Get 할때 Type만 넣어주면 될 것 같아서 그렇게 했구요 마지막으로 브레이크포인트를 잡고 확인해보니 mybt3,4번에 정상적으로 들어갔습니다. Dictionary인 _objects에도 정상적으로 들어갔구요. 강의가 실무중심의 강의라서 분명 강의내용에서 알려주시는것들은 그만한 이유가 있을 거라고 생각되어서 곰곰히 생각해보았는데 아무래도 잘 모르겠어서 질문드립니다. 그리고 이유가 있다고해도 혹시 아래처럼 typeof(T)가 아닌 Type _type로 넣어서 enum으로 한번 더 분류를 해서 사용을 해도 별 문제가 없을까요? 마지막으로 강의 정말 잘 듣고있습니다. 이정도 수준높은 강의를 들을 수 있게 해주셔서 정말 감사할 따름입니다 !!
- 미해결[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으로 고정이 됩니다. 이러한 것들은 유니티와 연결해서 멈추고 확인해봤습니다! 그런데 플레이어는 문제 없이 계속 작동하고 있습니다..