SetSkillFrame함수에서 먼저 frame들을 다 삭제시키고 다시 생성하고있는데요 frame내에서 saveCooltime도 다 삭제가되니 레벨업을하고 다시 UI가 초기화될때 쿨타임도 아예 초기화가 되버리는 것같은데 제가 놓친부분이 있나요? 그리고 SetSkillFrame함수는 MANAGER.SESSION.onSelectedCard 델리게이트에 바인딩 시켜놓으면 되는건가요?
public void lock() { while (!owner.compareAndSet(false, true)) LockSupport.parkNanos(1); } 강의에서 직접 구현하신 스핀락에서 LockSupport.parkNanos() 를 사용하셨을 때, 컨텍스트 스위칭이 발생하지 않는다고 설명해주셨는데요. 실제로 예제 코드에서 Thread.getState() 로 스레드 상태를 확인해보니, parkNanos() 호출 시 스레드가 TIMED_WAITING 상태로 전환되었다가 지정한 시간이 지나면 RUNNABLE 상태로 바뀌는 것을 확인했습니다. 그렇다면 지정한 시간이 지난 후 RUNNABLE 상태가 되었을 때, 해당 스레드에 대해 컨텍스트 스위칭이 발생하는 것이 아닌지 궁금합니다. 또한 강의에서는 parkNanos() 가 실제로 블로킹되는 것이 아니라 내부적으로 스피닝한다고 설명해주셨는데, 만약 그렇다면 스레드 상태가 RUNNABLE 이어야 하지 않을까 하는 의문도 들었습니다. 이 부분이 조금 혼란스러워 이렇게 질문드리게 되었습니다.
강의 중에 사용하신 init 관련 코드에서 하나 궁금한 점이 있습니다. BaseController 의 Awake() 안에서 _init = true 를 먼저 설정한 다음 init() 을 호출하게 되면, init() 안에서는 이미 _init == true 상태라서 실제 초기화 로직이 수행되지 않고 false 만 반환하게 되는 것 같습니다. 그런데 MonsterController 에서는 base.init() 이 true일 때 return 하도록 돼 있어서, 결과적으로 자식 클래스의 초기화 로직이 실행되지 않을 수도 있어 보인다 는 생각이 들었습니다. 혹시 의도된 흐름이 맞는지, 아니면 _init = true 설정 위치나 분기 조건 쪽에 조정이 필요한 부분이 있는지 궁금합니다.
bagPtr -> year =2021; 이렇게 포인터 변수에서 멤버변수에 접근할때 -> 이거 사용하는건 이해가 되는데 , 출력함수에서 매개변수가 bag의 포인터 변수인거 같고.. 근데 printf 에서 %s에 들어가는 가는 값을 왜 bag->brand 라고 적어두신지 이해가 잘 안가요..
안녕하세요 강의 공부하다가 궁금증이 생겨서 질문합니다. 강의에서는 .csv를 사용해서 레벨 데이터를 저장하고 가져오는 방법을 사용하셨는데 서드파티 데이터베이스로 구현을 해놓고 넣었다 빼는 방식을 사용해도 괜찮을까요? 그러면 앱 업데이트를 할 필요없이 DB상의 값을 바꾸는 것만으로도 난이도를 조정할 수 있을 것 같아서요. 현직에서는 어떻게 구현하는지 궁금해서 질문합니다.
========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예 [질문 내용] 여기에 질문 내용을 남겨주세요. 섹션2 배열도입 11:42부분 그림을 보고 궁금증이 생겼습니다. 왜 student1,student2 객체를 따로 만들어서 students배열에 대입하는 건가요? for(int i=0;i<students.length;i++) students[i]=new students(); 이렇게 객체를 생성하는것이 메모리 낭비가 없기 때문에 더 효율적인 것 아닌가요?
EXAM 배열 예시에서 *p++는 p 주소의 주소값이 증가되었는데, ++*p는 왜 포인터 변수가 가르키는 값의 아스키코드 값이 증가되는 건가요?.. 너무 헷갈려요 ㅠ 제가 혼자 풀어보기로는 ++*p도 주소값이 전위연산되서 M을 가르키고 출력할 줄 알았는데.. ++*p가 아스키코드 값을 증가시키는 거면 *p++는 왜 아스키코드 값을 후위연산으로 증가시키지 않는 건지 .. 실전에 풀 때 안 헷갈릴 정도로 이해하고 싶어요 ㅠ
9:10초대 질문이 있습니다. 다른 수강생 분의 질문과 답변을 봤는데도 이해가 가질 않아서요! printf("%c\n, ++ *p); 이 순간에 포인터 변수 p가 가리키고 있는 것은 msg의 A였고, 전위 연산(++)으로 B가 답이라는 것까지는 알겠습니다. printf("%s\n", msg); 에서 포인터 변수 p와 msg가 별개의 변수라면, msg를 출력했을때, 기존의 EXAM이 정답이라고 생각했습니다. p는 포인터 변수로, msg와 따로 작동하는 것 아닌가요..? p가 바뀐 것이지 배열 자체가 바뀐 것은 아니니까요..! 왜 msg도 EXBM으로, 즉 A->B로 바뀌게 되는건지 궁금합니다!
[질문 템플릿] 1. 강의 내용과 관련된 질문인가요? 예 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예 3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예 [질문 내용] 회원가입 프로그램 작성의 File에 저장하는 단계에서 저는 예외 처리하라고 뜹니다. 어떻게 보면 당연한건데 영한님의 IDE에서는 Main에서 예외 처리 오류가 뜨지 않는데 이 부분이 궁금합니다! + 코드를 똑같이 옮겨도 제 프로젝트에선 예외 처리 오류가 뜨네요.
강의는 printf("%s\n", tbl[2]);로 되어있고 학습 자료 pdf파일은 printf("%c\n", *(*pp)[2]);라고 되어 있습니다. 만약 pdf 파일처럼 printf("%c\n", *(*pp)[2]); 라면 N이 출력되는 건가요? 아래 이 문제 관련 질문 주신 다른 분의 답변도 봤는 데 printf("%s\n", tbl[2]);여기서 W가 출력되는 게 잘 이해가 되지 않습니다. 더 쉽게 설명이 가능할까요?
각 상황에 맞는 사운드를 플레이하도록 구현하고 있는데요. Interaction 함수 안에서 사운드 출력 코드를 추가했는데 소리가 제대로 나오지 않고 계속 반복되서 출력되는 것처럼 치지지직 하다가 끝나버립니다. void OnMoneyInteraction(WorkerController wc) { if (!wc.Tray.IsPlayer || _moneyPile.ObjectCount == 0) return; _moneyPile.DeSpawnObjectWithJump(wc.transform.position, () => { GameManager.Instance.AddMoney(Define.MONEY_PER_BURGER); GameManager.Instance.AddExp(1f); SoundManager.Instance.PlaySFX("SFX_Money_Get"); }); } 그래서 제대로 한번만 사운드가 출력되도록 하기 위해 bool형 예외처리를 해서 코드를 수정했더니 0.1초만에 소리가 났다가 사라집니다. audioSource 제대로 부착했고 loop 체크x, PlayOnAwake 체크 등 기본적인 것들은 다 제대로 세팅했습니다. 어떻게 해야 제대로 된 소리를 출력할 수 있나요? public class SoundManager : Singleton<SoundManager> { [Header("BGM")] public AudioSource bgmSource; [Header("SFX")] public AudioSource sfxSource; [Header("SFX Clips")] public List<AudioClip> sfxClips; [Header("BGM Clips")] public List<AudioClip> bgmClips; public void PlaySFX(string clipName) { AudioClip clip = sfxClips.Find(c => c.name == clipName); if (clip != null) { sfxSource.volume = 1f; sfxSource.PlayOneShot(clip); } else { Debug.LogError($"SFX clip not found: {clipName}"); } }