월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
파트 3 완강 이후 진행 방향에 대해
안녕하세요 강사님.인디게임 개발에 대해 관심이 많아 수강하게 되었습니다.아직 초보이다보니 언제부터 혼자 이것저것 게임을 만들어봐야할지에 대한 고민이 많습니다.다른 유니티 강의를 여러개 들어왔고 강사님 강의를 통해 기본기에서 부족했던 부분을 채우는 중인데, 강사님이 말씀해주신 것처럼 책을 읽고 강의를 들어도 처음 게임을 만들어보려하면 막막한 마음이 앞서는 것 같습니다.강의를 들을수록 제가 부족한 점, 미숙한 점이 보입니다. 이걸 계속 강의를 들으면서 극복해야하는 부분인지 아니면 다른 강의를 또 들어야할지, 아니면 게임을 만들어봐야할지 고민이 됩니다. 사실 마음같아서는 파트3가 끝나고 그동안 배운 걸 총망라해서 게임을 만들어보고 싶은데, 너무 맨땅에 헤딩하는게 될지 걱정입니다. 원래는 다른 개발을 할 때에도 무작정 부딪혀가며 짜깁기식으로라도 코드를 짜면서 실력을 늘리는 방식을 택했지만, 그렇게 하다보면 스파게티 코드 투성이가 되어버리면서 강사님 말씀처럼 "폭탄 해체"처럼 되버리는데 한계를 느꼈습니다. 그러지 않기 위해 차근차근 단계를 밟고 있다보니 지금 마음이 조금 조급해진 것 같습니다.질문이 너무 애매해서 명확한 답을 기대하기는 어렵겠지만 그래도 막막한 마음에 추천해주십사 글을 남깁니다. 파트1~3 강의를 완강했다는 전제하에 어느 시점에 게임을 만들어보면 좋을까요? 그리고 어떤식으로 만들어보는게 좋을까요? 강사님은 어떤식으로 실력을 늘리셨는지도 여쭙고 싶어요. 항상 좋은 강의 감사드립니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
유니티 reload script
유니티 버전 : 2021.3.14f1유니티 허브 : 2.4.4 어느날 갑자기 스크립트 저장하고 에디터로 돌아오면 위와 같이 창이 하나 뜨고 무한로딩이 발생합니다. 작업관리자를 열어보면 '응답없음'인 상태로 나오며 강제종료 밖에 할 수 없습니다.컴퓨터 재부팅과 Library, Log, obj, UserSetting 폴더 삭제도 해보았으며 유니티 경로에 한글도 일절 들어가있지 않습니다.Preferences->General에서 Stop Playing And Recompile과 Recompile and continue playing 옵션도 테스트 해 보았고 Enter play mode options도 체크했으나 여전히 같은 문제가 발생합니다.ㅜㅜ 어떻게 하면 좋을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
언리얼엔진과의 비교
안녕하세요 강사님.흥미롭게 강의를 듣는 중인데 언리얼 엔진과 가끔 비교해주실 때가 있더라구요.듣다보면 유니티보다 더 복잡하다는 느낌을 지울수가 없는데 그럼에도 불구하고 언리얼 엔진이 유니티보다 조금 더 주목을 받는 이유가 무엇인지 궁금합니다. 게임 시장에서도 언리얼 엔진에 좀 더 주목하는 분위기라고 하시는 분들도 있어서요.이미 검색은 해보았지만 실무를 해보신 입장에서의 답이 궁금해 고민하다가 질문합니다. 언리얼 엔진이 유니티에 비해 엔진이 좀 무겁고 구현 폭이 넓은 그런 느낌이라서 많이들 사용하는 건가요? 좋은 강의 감사드립니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
풀링부분에서 푸쉬가 잘 안됩니다
2024/1/18오브젝트를 풀링을 만들어 보았는데풀링은 되는데 자식 오브젝트들이 모두 사라집니다아래 사진은 1번 씬에 배치한 유닛사진이고그 아래는 1번씬의 유닛을 푸쉬하고 2번씬에 팝한 모습입니다.같은 씬에서 팝한 다음 푸쉬를 진행했을 때6마리를 팝하고 푸쉬했는데 6마리 모두 자식오브젝트가 사라진 모습입니다. 바닥 타일도 모두 풀링을 사용하고 있는데 타일은 풀링이 잘됩니다 타일안에 자식오브젝트를 넣어놔도 같이 풀링되는데유닛 오브젝트만 풀링이 이상하게 되는 이유를 모르겠어요. 디버그 해볼려고 노력해본 내용도 추가합니다팝후 디버그화면에서 마우스로 하위오브젝트를 모두 비활성화 시키고 삭제하면 하위 오브젝트는 삭제되지않는다하지만 코드로 할 경우 삭제된다.팝하고 위치나 로테이션을 변환하지 않아도 하위 오브젝트가 사라진다.씬 clear를 거치지 않고 수동으로 푸쉬시에도 하위 오브젝트가 사라진다.푸쉬할때 활성화된 하위 오브젝트만 사라진다. 2024.1.19해결은 했는데 원인은 모르겠습니다.제가 사용하는 건 씬에 오브젝트 하나를 만들고 풀링된 오브젝트들을 한 오브젝트의 자식으로 모두 보내고삭제시 상위 오브젝트에서 자식 오브젝트를 모두 삭제하는 방법을 사용 했었고 강의 내용을 보면서 이 부분을리스트를 통한 저장 삭제 방식을 하였더니 해결 되었습니다.해결은 했는데 왜 해결되었는지 궁금하네요
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
애니메이션 만드는데 자꾸 경고가 뜹니다
To Debug, run app with -diag-job-temp-memory-leak-validation cmd line argument. This will output the callstacks of the leaked allocations. Internal: JobTempAlloc has allocations that are more than the maximum lifespan of 4 frames old - this is not allowed and likely a leak 2D로 여러 이미지를 만들고 애니메이션으로 움직이게하는데 위의 두 오류가 계속 떠서 처음엔 이미지 용량이 커서 그런가해서 최소 60 최대 130px로 줄였습니다. 근데 저 경고가 뜨는 타이밍도 일관적이지 않고, 인터넷에 쳐봐도 뭔가 해결책을 정확히 모르겠어서 질문해봅니다.일반적으로 하는 방법대로 png 하나하나 끌어왔는데 왜그럴까유..?움직이게 하기 위해 사용하는 이미지가 다 다르면 안되는걸까요..?한 캐릭터가 여러 행동을 하도록 여러 개의 애니메이션을 만들고 있는거라 파악하기가 어렵네요
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
지형별로 원하는 영역을 전개하고 싶습니다.
안녕하세요. 제 포트폴리오를 만듦에 있어서 어떻게 설정해야 할 지 모르는 문제가 있어서 질문합니다. 제가 구현하고자 하는 포트폴리오에서 바다 영역을 설정하고 싶은데어떤 식으로 설정하면 될 지 잘 모르겠어서 질문드립니다.바다 부분에서 수영을 하도록 하고 싶은데 박스 형태도 아니고 구역이 겹치는 부분이 있어서구역을 어떤 식으로 설정한 다음에 나눠서 해야 할지 감이 안 옵니다. 어떻게 설정하는 게 가장 좋은 걸까요?답변 부탁드립니다. 감사합니다. 추가 정보 => Terrain이 아래 사진에 보이는 영역입니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
같은 위치를 눌렀을 때 idle에서 run으로 애니메이션만 바뀌는 문제에 대해 질문합니다.
안녕하세요.강의를 다 듣고 이리저리 만져보고 있는 학생입니다. 그런데 포인팅 된 터레인으로 이동한 뒤, 같은 위치를 한번 더 클릭하면 애니메이션이 RUN 상태로 바뀝니다. 해당 문제를 해결해 보고 싶어 디버깅을 해 봤습니다.마우스가 클릭 된 이벤트에서 State를 Moving으로 바꿔 줍니다. 하지만 UpdateMoving 함수에서는 다시 State를 Idle로 바꿈에도 불구하고 애니메이션만 RUN을 유지하고 있습니다. 혹시나 싶어 선생님 프로젝트를 열어 실행해 봐도 같은 문제가 있어 어느 부분을 수정하면 좋을지 여쭤봅니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
ui 생성 오류
unity 버전을 2022.3.15를 사용 중입니다.강의에서의 버튼 및 텍스트 UI가 없어 Legacy라는 태그가 달린 UI를 추가해서 사용 중인데 사진과 같은 오류가 나오며 버튼 및 텍스트가 사라지는 문제가 나타나고 있습니다.어떻게 해결해야할까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
비동기 씬로딩관련해서 질문있습니다.
예제에서는 매니저들을 관리하기위해서 모노비헤비어를 상속하지않은상태에서 매니저들을 받아서 관리하게 돼있는데 씬매니저를 만들면서 비동기 씬이동을 구현해보고 싶어서 해보고있는데 모노비헤비어가 상속되지않은 클래스에서는 코루틴을 사용할수가없다보니까 어떻게 해야할지 막혔습니다...기존의 씬매니저에서 IEnumerator LoadAsynchronouslytime(string name) { AsyncOperation operation = SceneManager.LoadSceneAsync(name); operation.allowSceneActivation = false; float elapsedTime = 0f; while (!operation.isDone) { elapsedTime += Time.deltaTime; Debug.Log(elapsedTime); slider.value = elapsedTime / 10f; if (elapsedTime > 10f) { operation.allowSceneActivation = true; } yield return null; } }이런식으로 비동기 코드를 작성했는데요..코루틴을 사용하면 정상작동을 하긴하는데 모노비헤비어를 상속받지않은 상태에서 어떻게 사용하는지 감이 안잡힙니다.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
UI_Button 클론이 무한생성
UI_Button 클론이 무한생성됩니다. public class Test : MonoBehaviour { GameObject er; void Update() { if (Input.GetMouseButtonDown(0)) { Managers.UI.ShowPopupUI<UI_Button>(); } } }아래 코드로 문제가 있어서 화면을 클릭했을 때만 팝업이 뜨도록 위의 코드로 Test 스크립트를 일부 바꿔 봤습니다.그러고나서 보니까public static UIManager UI{get{return instance._ui;}} 이 지점에서 계속 다시 Test 파일의if (Input.GetMouseButtonDown(0)) { Managers.UI.ShowPopupUI<UI_Button>(); }이 부분으로 가는 것 같습니다. 늘어나는 갯수로 처음엔 한번 클릭했을 때는 한번으로 잘 늘어나는데 그 다음엔 2개가 생기고 그 다음엔 5개..? 규칙을 알 수 없게 늘어납니다저 요즘 질문 너무 많이하죠..ㅜㅜ 그치만 미워하지 말아주세요 다 기본 3시간은 고민고민하며 노려보다가 보내는거긴해유..하핳..using System.Collections; using System.Collections.Generic; using UnityEngine; public class Test : MonoBehaviour { GameObject er ; void Start() { Managers.UI.ShowPopupUI<UI_Button>(); } void Update() { } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class ResourceManager { public T Load<T>(string path) where T:Object { return Resources.Load<T>(path); } public GameObject Instantiate(string path, Transform parent = null) { GameObject prefab = Load<GameObject>($"Prefabs/{path}"); if (prefab == null) { Debug.Log($"Failed to load prefab : {path}"); return null; } return Object.Instantiate(prefab, parent);//Object붙이는 이유는 리소스메니저에 있는 Instantiate를 또 호출하려고 할까봐. } public void Destroy(GameObject go) { if(go == null) return; Object.Destroy(go); } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class Managers : MonoBehaviour { static Managers s_Instance; //유일성이 보장된다 static Managers instance { get { Init(); return s_Instance; } } // 유일한 매니저를 갖고온다 ResourceManager _resource = new ResourceManager(); UIManager _ui = new UIManager(); public static UIManager UI{get{return instance._ui;}} public static ResourceManager Resource{get{return instance._resource;}} // 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>(); } } }using System.Collections; using System.Collections.Generic; using UnityEngine; public class UIManager { int _order = 0; //팝업 목록을 들고있어야함. 스택 구조으로 관리하기 가장 마지막에 띄운 팝업이 가장 먼저 삭제돼야하니까. Stack<UI_Popup> _popupStack = new Stack<UI_Popup>(); public T ShowPopupUI<T>(string name = null) where T : UI_Popup//T에는 UI버튼이라는 스크립트를 건네고 name에는 팝업프리펩을 건네줄거임. { if(string.IsNullOrEmpty(name))//이름이 비어있으면 T타입의 이름과 똑같은걸로 넣겠다. name = typeof(T).Name; GameObject go = Managers.Resource.Instantiate($"UI/Popup/{name}"); T popup = Util.GetOrAddComponent<T>(go); _popupStack.Push(popup); return popup; } public void ClosePopupUI() { if (_popupStack.Count == 0) //stack을 건드릴 떈 항상 카운트를 체크하는걸 습관화하기 return; UI_Popup popup = _popupStack.Pop(); Managers.Resource.Destroy(popup.gameObject); popup = null; _order--; } } using System.Collections; using System.Collections.Generic; using UnityEngine; public class Util { public static T GetOrAddComponent<T>(GameObject go) where T : UnityEngine.Component { T component = go.GetComponent<T>(); if (component == null) component = go.AddComponent<T>(); return component; } public static GameObject FindChild(GameObject go, string name = null, bool recursive = false) { Transform transform = FindChild<Transform>(go, name, recursive);//<Transform>을 사용하면 FindChild 메서드가 호출될 때 해당 메서드는 Transform 타입의 자식을 찾도록 약속됩니다. 이는 제네릭을 사용하여 메서드를 특정 타입에 제한하는 방법 중 하나입니다. if (transform == null) return null; return transform.gameObject; } public static T FindChild<T>(GameObject go, string name = null, bool recursive = false) where T : UnityEngine.Object { if (go == null) return null; if (recursive == false) { for (int i = 0; i < go.transform.childCount; i++) { Transform childTransform = go.transform.GetChild(i); if (string.IsNullOrEmpty(name) || childTransform.name == name) { T component = childTransform.GetComponent<T>(); if (component != null) return component; } } } else { foreach (T component in go.GetComponentsInChildren<T>(true)) { if (string.IsNullOrEmpty(name) || component.name == name) return component; } } return null; } }
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
return Object.Instantiate(prefab, parent); 여기서 값이 Null로 바뀌어요
ResourceManager 스크립트 코드 중 일부입니다. public GameObject Instantiate(string path, Transform parent = null){GameObject prefab = Load<GameObject>($"Prefabs/{path}");if (prefab = null){Debug.Log($"Failed to load prefab : {path}");return null;}return Object.Instantiate(prefab, parent);} 여기서 prefab에 로드로 경로 잘 찾아서 오브젝트가 잘 들어가는데요return Object.Instantiate(prefab, parent);이 부분에서 아래의 오류가 뜹니다 ㅠㅠ 어딜 다시 봐야할까요?? System.ArgumentException: The Object you want to instantiate is null.at UnityEngine.Object.CheckNullArgument (System.Object arg, System.String message) [0x00009] in <30adf90198bc4c4b83910c6fb1877998>:0
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
드래그가 안되는데 어디서 잘못된건지 도저히 모르겠습니다
EventHandler를 자동으로 만드는 과정에서 여러 스크립트가 관여하다보니 헷갈립니다. 드래그하려는 이미지들을 포함한 캔버스에 스크립트 파일을 넣어야하는거 맞나요?스크립트 파일은 MonoBehavior을 상속받는 애들이라면 다 넣어야하는건지..? 넣는 기준이 헷갈려요. 그리고 뭔가 잘못했는지 한 이미지는 드래그 하면 움직이고 다른 이미지는 안움직였는데, 뭐가 다른지 확인해보려고 움직이는 이미지를 복붙해서 확인해보니 갑자기 다 안 움직입니다..ㅇㅁㅇ ㅎㅎ.....너무 모르겠어서 이메일 보내보겠습니다 ㅠㅠ 감사합니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
싱글톤 및 인스턴스, C#파일간의 호출관계 질문
static Managers s_Instance; //유일성이 보장된다 public static Managers instance { get { Init(); return s_Instance; } } // 유일한 매니저를 갖고온다 InputManager _input = new InputManager(); ResourceManager _resource = new ResourceManager(); public static InputManager input { get { return instance._input; } } public static ResourceManager resource { get { return instance._resource; } } c#파일간에 어떤식으로 호출되고 연관되는지 이해가 어렵습니다 질문이 모호해서 죄송합니다. 순서가 어떻게 되는지 잘모르겠습니다. 제일처음 start로 시작하는게 playerController.cs에서 시작해서 void start()안에 Managers.input.KeyAction += OnKeyboard; 로 inputManager.cs에 public Action KeyAction = null; 널로 되어있는 이 값에 OnKeyboard 가 저장되게하고 이 뒤부터 순서를 잘모르겠습니다. Managers.cs InputManager _input = new InputManager();public static InputManager input { get { return instance._input; } } _input 생성자 input메서드 이거 두개가 어떻게 사용되는지 모르겠습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
GetComponentInChildren<T>() 메소드 오류
UI 자동화 #1 강의 중 FIndChild 유틸함수를 만드는 과정에서 SC1579 오류가 발생합니다. "T에는 'GetEnumerator'의 공개 인스턴스 또는 확장 정의가 없다"라고 하면서 실행이 되지 않는데 이 부분이 이해가 되지 않아 질문글을 작성하게 되었습니다..
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
질문있습니다@!!
안녕하세요 강의를 듣다 enum으로 하나씩 넣는게 제 개인적인 생각으로는 귀찮다라는 생각을 받았어요 그래서 이걸 오브젝트의 이름만 받아서 사용할 수 있게 해보자 해서 짜봤는데 강의에서 소개해주신 enum으로 관리하는 것과 제 코드와 비교해서 enum으로 관리할 때의 장점이 있을까요? 그리고 아래 코드에서 개선할만한 부분도 있다면 알려주시면 감사하겠습니다private Dictionary<Type, UnityEngine.Object[]> _componentDictionary = new Dictionary<Type, UnityEngine.Object[]>(); private void Start() { Bind<Button>(); Bind<TextMeshProUGUI>(); Bind<Image>(); Bind<GameObject>(); Debug.Log(Get<GameObject>("ddd").transform.position.x); } void Bind<T>() where T : UnityEngine.Object { //필터 해줄 타입 추가 if (typeof(T) != typeof(Button) && typeof(T) != typeof(TextMeshProUGUI) && typeof(T) != typeof(Image) && typeof(T) != typeof(GameObject)) return; if (typeof(T) == typeof(GameObject)) { Transform[] transforms = Util.FindChild<Transform>(transform, true); GameObject[] gameObjects = new GameObject[transforms.Length]; for (int i = 0; i < transforms.Length; i++) { gameObjects[i] = transforms[i].gameObject; } _componentDictionary.Add(typeof(GameObject), gameObjects); return; } T[] objects = Util.FindChild<T>(transform, true); _componentDictionary.Add(typeof(T), objects); } T Get<T>(string name) where T : UnityEngine.Object { UnityEngine.Object[] objects = null; if (_componentDictionary.TryGetValue(typeof(T), out objects) == false) return null; foreach (UnityEngine.Object obj in objects) { if (obj.name == name) return obj as T; } return null; } public static T[] FindChild<T>(UnityEngine.Transform transform, bool recursive = false) where T : UnityEngine.Object { if (transform == null) return null; if (recursive == false) { T[] dd = new T[transform.childCount]; for (int i = 0; i < transform.childCount; i++) { dd[i] = transform.GetChild(i).GetComponent<T>(); } return dd; } else { return transform.GetComponentsInChildren<T>(); } }
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
FindChild 사용시 원치 않은 것에 대한 컴포넌트 반환
안녕하세요 Util에서 FindChild를 정의하는 부분의 recursive가 true일 때 최상위 계층 gameobject 안에이름과 컴포넌트 타입은 같지만 계층이 다른? gameobject가 있다면ex)최상위 부모ㄴTest(name) - Text(컴포넌트) (1)ㄴTest2ㄴㄴTest(name) - Text(컴포넌트) (2)내가 찾고자 하는 오브젝트의 컴포넌트는 예제에서의 2번인데GetComponentsInChilderen에서 1번이 반환 될 수 있지 않나요?만약 그렇다면 해당 구조를 사용할때의 제약조건이같은 이름이면서 같은 컴포넌트를 갖는 오브젝트는 사용할 수 없다 정도일까요?(물론 같은이름이면서 같은 컴포넌트를 갖어야만하는 경우는 없을테지만요)
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
저는 왜 강의랑 다르게 될까요?
각 연결선에 has exit time도 모두 체크되어있는데 RUN의 Transitions 순서에는 WAIT으로 애니메이션이 실행되어야하는데 왜 저는 JUMP가 실행될까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
질문 물어본거 말고 다른거에 대한 답변이 AI로 달리는데...
유니티에서 bake를 해도 해당영역이 어디인지 보이지가 않고(NavmeshDisplay가 뜨지 않습니다)검색을 해도 도저히 못찾겠습니다...라고 질문했는데안녕하세요, 인프런 AI 인턴입니다.NavMesh가 제대로 표시되지 않을 때 문제 해결을 위하여 다음과 같은 몇 가지를 확인해 볼 수 있습니다.NavMesh Agent:해당 게임 오브젝트에 NavMesh Agent 컴포넌트가 추가되었는지 확인해주세요.NavMesh Bake 설정:Navigation 패널을 열고, Bake 탭에서 올바른 옵션으로 베이킹을 진행했는지 점검해보세요.레이어 설정:베이킹 과정에서 Navigation Static이 체크된 레이어를 대상으로 하고 있는지 확인래주세요.NavMesh Display 옵션:Unity 에디터 상단의 Navigation 창을 열고, Scene 뷰에서 ‘Show NavMesh’가 활성화되어 있는지 확인해보세요.에디터 버그 여부:때때로 Unity 에디터가 제대로 상태를 업데이트하지 못하는 경우가 있습니다. 에디터를 재시작하여 문제가 해결되는지 확인해보세요.위 단계를 모두 확인하셨는데도 문제가 해결되지 않으면, 유니티 환경 설정의 문제일 수 있으므로 유니티 커뮤니티나 포럼에 질문을 올려 도움을 요청하시는 것이 좋습니다.강좌에 대한 자세한 지원이 필요하시면, ‘문의하기’ 옵션을 통해 직접 문의하실 수도 있습니다.인프런 강의 내용과 관련하여 강의 FAQ를 참조하시면 도움을 받으실 수 있습니다.라고 답변이 달렸습니다.그리고 그에 대한 질문을 다시 답변으로 달았는데 답변이 달리지 않고,다른 질문들에도 이미 해보고 안된다고 물어보는 질문을 남겼는데 또 이거 해봤냐고 물어보는 AI 답변이 달리는데(그리고 코드와 자료를 첨부한 질문도 AI는 보지도 않고 다른 답변을 답니다)어떤식으로 질문해야 제대로된 답변을 받을수 있나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
State Machine #2 에 대해서 질문드립니다.
anim.SetFloat("speed", _speed); anim.SetFloat("speed", 0); 이 두 가지를 통해서 애니메이션의 파라미터값을 변경하는 것 까지는 완료했습니다.그런데 속도가 10이 되어도 웨이트의 애니메이션이 다 완료가 되어야 런으로 넘어갑니다. 파라미터가 바뀌면 바로 애니메이션도 바뀌게 하고 싶은데 어떤 옵션을 건드려야 할까요?<speed가 10이 되어도 WAIT가 재생되고, 계속이면 WAIT가 끝난 후에 RUN으로 넘어갑니다.>
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
질문있습니다
몬스터 anim이 WAIT 에서 RUN으로 animator에서는 변경이 되는데 몬스터 자체 내에서 계속 Idle 상태입니다.--> WAIT 일 때도 모션이 Idle , RUN 일 때도 Idle 입니다using System.Collections; using System.Collections.Generic; using UnityEngine; public abstract class BaseController : MonoBehaviour { [SerializeField] protected Vector3 _destPos; [SerializeField] protected Define.State _state = Define.State.Idle; [SerializeField] protected GameObject _lockTarget; public virtual Define.State State { get { return _state; } set { _state = value; Animator anim = GetComponent<Animator>(); switch (_state) { case Define.State.Idle: anim.CrossFade("WAIT", 0.1f); break; case Define.State.Moving: anim.CrossFade("RUN", 0.1f); break; case Define.State.Skill: anim.CrossFade("ATTACK", 0.1f, -1, 0); break; case Define.State.Die: break; } } } private void Start() { Init(); } void Update() { switch (State) { case Define.State.Idle: UpdateIdle(); break; case Define.State.Moving: UpdateMoving(); break; case Define.State.Die: UpdateDie(); break; case Define.State.Skill: UpdateSkill(); break; } } public abstract void Init(); protected virtual void UpdateDie() { } protected virtual void UpdateIdle() { } protected virtual void UpdateMoving() { } protected virtual void UpdateSkill() { } } using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI; public class MonsterController : BaseController { Stat _stat; [SerializeField] float _sacnRange = 10; [SerializeField] float _attackRange = 2; public override void Init() { _stat = gameObject.GetComponent<Stat>(); if (gameObject.GetComponentInChildren<UI_HPBar>() == null) Managers.UI.MakeWorldSpaceUI<UI_HPBar>(transform); } protected override void UpdateIdle() { Debug.Log("Monster UpdateIdle"); GameObject player = GameObject.FindGameObjectWithTag("Player"); if (player == null) return; float distance = (player.transform.position - transform.position).magnitude; if (distance <= _sacnRange) { _lockTarget = player; State = Define.State.Moving; return; } } protected override void UpdateMoving() { Debug.Log("Monster UpdateMoving"); // 플레이어가 내 사정거리보다 가까우면 공격 if (_lockTarget != null) { _destPos = _lockTarget.transform.position; float distance = (_destPos - transform.position).magnitude; if (distance <= _attackRange) { State = Define.State.Skill; return; } } // 이동 Vector3 dir = _destPos - transform.position; if (dir.magnitude < 0.1f) { State = Define.State.Idle; } else { // TODO NavMeshAgent nma = gameObject.GetComponent<NavMeshAgent>(); nma.SetDestination(_destPos); nma.speed = _stat.MoveSpeed; transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(dir), 20 * Time.deltaTime); } } protected override void UpdateSkill() { Debug.Log("Monster UpdateSkill"); } void OnHitEvent() { Debug.Log("Monster onHitEvent"); } } 선생님이 올리신 Prefab의 knight 가 아닌 asset store에서 다운 받은 (Warrior Pack Bundle 2 FREE) 입니다.Unity Chan으로 실행시 잘 움직이고 선생님 자료로 Knight를 만들어서 작동시 잘 움직이지만다운받은 Asset으로는 작동이 안되는데 이유를 잘 모르겠습니다.https://drive.google.com/file/d/1bV4QnQceT30opv8t34qPgKt4bfctjut8/view?usp=drive_link