using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ServerCore { class SpinLock { volatile int _locked = 0; // true: 잠겨있음, false: 잠겨있지 않음 public void Acquire() { while(true) { ////Interlocked.Exchange의 반환값은 원래값이다. //int original = Interlocked.Exchange(ref _locked, 1); ////original == 0이면 잠금 성공, original == 1이면 잠금 실패 //if (original == 0) //{ // //내꺼 // break; //} //CAS (Compare-And-Swap) 함수라고 한다. int expected = 0; int desired = 1; if(Interlocked.CompareExchange(ref _locked, desired, expected) == expected) { break; } } } public void Release() { //잠김을 푼다. _locked = 0; } } class Program { static int _num = 0; static SpinLock _lock = new SpinLock(); static void Thread_1() { for (int i = 0; i < 1000000; i++) { _lock.Acquire(); _num++; _lock.Release(); } } static void Thread_2() { for (int i = 0; i < 1000000; i++) { _lock.Acquire(); _num--; _lock.Release(); } } static void Main(string[] args) { Task task = new Task(Thread_1); Task task2 = new Task(Thread_2); task.Start(); task2.Start(); task.Wait(); Console.WriteLine(_num); } } } 다음과 같이 작업 후 디버깅해보았는데 결과값이 때로는 맛이 간 값을 출력합니다. 제시된 코드와 같은 것 같은데 이유를 모르겠습니다! 그리고 다음과 같은 상황일 때 어떻게 브레이크포인트를 잡아서 버그수정을 시도해야 할 지 감이 안잡힙니다ㅠㅠ
GameObject Instantiate(string key, Transform parent = null, bool pooling = false) 함수에서 GameObject prefab = Load<GameObject>($"{key}"); 이 부분에 Load<GameObject>(key)가 계속 null이 반환 되는데 왜 그런걸까요 나머진 전부 똑같이 했고 어드레서블에 넣은 프리팹만 제가 아무 오브젝트나 이름만 바꿔서 프리팹으로 만든 뒤에 넣은거 말곤 차이가 없는데 이게 차이가 있는걸까요
강의를 보던 중 궁금한 점이 생겼습니다. 몬스터의 체력변경을 수동으로 ServerRpc,ClientRpc를 사용했는데, NetworkVariable<>을 사용하지 않으신 이유가 있으실까요? NetworkVariable<int> 같은 형식으로 해당 변수를 선언하면 그 변수가 알아서 다른 클라이언트에게 전파되어 동기화 된다고 배웠습니다. ugs 패키지를 임포트하고나면 오브젝트에 ClientNetworkTransform 컴포넌트를 부착할 수 있더라구요. 이걸 추가하면 그 오브젝트의 TRS(이동,회전,크기) 모두 자동으로 동기화를 해주는 듯 하던데 이것을 사용하지 않으신 이유가 있으실까요? 처음 배우는 입장에서 동기화를 신경쓰기가 제일 까다로운 부분인데 이 컴포넌트를 사용하면 적어도 트랜스폼에 한정해서는 동기화에서 도움을 받을 수 있는 것처럼 보입니다.
SelectLevelController 컴포넌트를 우클릭해서, Reset Data 하는 것의 의미가 무엇이죠? 해당 스크립트를 다시 로드하는 건가요? 무슨 원리인지 궁금해요. 추가로, 그렇다면 만약 앞서처럼 레벨구성을 바꾸게 되면, 항상 이렇게 해주어야 각각의 레벨들이 제대로 반영되게 되는 거죠?
https://unity.com/kr/releases/editor/archive 안녕하세요 강사님 ! 현재 유니티 공식 홈페이지에서 지원하는 유니티 LTS의 경우 2022.3.51이 최신으로 나와있고 이후에는 2023으로 넘어가는것 같습니다. 구글링을 통해 찾아보니 유니티 공식 홈페이지가 아니라 다른 깃허브나 외부 링크를 통해 다운로드를 받을 수는 있지만 안정성 면에서 공식 홈페이지를 통해 다운로드를 하는 것이 좋아보여서 질문을 남깁니다. 혹시 2022.3.6f1 버전을 공식 홈페이지가 아니라 다른 경로로 설치를 해야 할까요? 아니면 최신 2022인 3.5를 통해 프로젝트를 진행해도 괜찮을까요??
Combat 시스템에 effect만 따로 사용하고 싶은데 아래처럼 그냥 사용하면 [SerializeField] private Effect stunEffect; playerEntity.SkillSystem.Apply(stunEffect); Effect.cs var stackActions = StackActions.Where(x => x.Stack <= currentStack && !aplliedStackActions.Contains(x) && x.IsApplicable); 위의 블록에서 ArgumentNullException: Value cannot be null 오류가 뜨더라구요 아마 StackActions값이 null이라 뜨는 것 같은데 Skill을 사용 안하고 Effect를 사용하니 초기화 과정에서 문제가 있는 것 같습니다. 아니면 혹시 다르게 사용할 방법이 있을까 싶어서 질문드려봅니다.
로비씬 마지막에 Fade 구현 파트에서 UIManager에 CloseUI 함수에서 lastchild 가져오는 부분을 var lastChild = UICanvasTrs.GetChild(UICanvasTrs.childCount - 3); 빼기 숫자를 FadeImg 추가했으니 3으로 수정하는 부분이요. 강의에서도 유니티 창에서 추가 설명해주시긴 했는데 약간 헷갈려서요 이 코드 이후에 설명해 주실때 lastChild가 true면 겟 컴포넌트로 BaseUI 컴포넌트 가져오는데 이게 위 코드에서 -3으로 하면 null이 되니까 ... 대략 이런 방식으로 설명 주셨는데 이 부분도 잘 이해가 안돼서요 추가로 더 설명해 주실 수 있을까요
강의들이나 블로그를 보아도 소켓의 연결을 유지해주는 경우는 Receive 부분이나 Send 부분에서 ByteTransferred <= 0 이거나 SocketError != SocketError.Success가 아닐 경우에 Disconnect를 하게 되어있는데 온라인 서버에서는 원래 이렇게 구성을 해주는건가요? 이 경우엔 계속 패킷을 보내고 받지 않으면 연결이 끊기는거같아서 ..
Session#2 내용까지 보고 질문드립니다. Send 요청이 동시 다발적으로 발생할 경우 send 순서, 처리가 완료 되기 전 buffer를 건드리는 문제, sendAysnc의 동시다발적 발생으로 인한 부하 문제로 Queue를 사용하여 처리를 한다고 이해를 하였습니다 이런 경우를 Receive 쪽에서도 생각해볼 때 한 클라이언트에서 동시 다발적으로 send를 보낸다면 어쨌든 OnCompleteReceive릉 통해 처리될 것이고 그럼 그 요청만큼 다시 RegisterReceive가 실행이 될 것이라고 생각하고 있습니다. 그렇다면 또 그 요청만큼 recvAysnc가 실행될 것으로 예상되는데 이때는 sendAysnc가 동시 다발적으로 실행되는 것과 같이 생기는 부하 문제, 혹은 야기되는 다른 문제점은 없을까요? 아니면 비동기로 받아주는게 많은 만큼 recv가 쉬워진다던가..
star 아이템을 획득했을 경우, 단 하나의 아이템이라면 star를 획득했는지 여부로, 무언가를 할 지 여부를 결정할 수 있을 것 같은데... bool 값을 배열형태로 갖고 있어서 어떤 방식으로 이것을 활용할 건지 저는 상상이 잘 안되요. 그래서 강사님께서 의도하신 용도를 알고 싶어요.
혹시 저처럼 공이 빨리 사라지는 경우가 있는 분들을 위해 글을 남깁니다. 공을 생성해서 던질때, 공이 지면과 충돌하면서(공이 수평으로 이동하는 것이 아니라, 대각선으로 이동하면서 충돌) 약간의 x방향 속도가 줄어들 수 있습니다. 아마도 그런 이유 때문인지, 제가 실습해보니, 지면에 닿자마자 공 오브젝트가 모두 사라집니다. 그래서 다음 코드를 이렇게 고쳤어요. void Update (){ if ( movement . IsGrounded ) movement . Jump (); if ( Mathf . Abs ( movement . Velocity . x ) < ( originSpeed - some ) ){ Destroy ( gameObject ); } } movement.Velocity.x < originSpeed 대신에, originSpeed에서 약간의 값을 빼주는 식으로 했습니다. 시험해 보니 0.1f 만 빼줘도 되더라구요. some 대신에 직접적으로 0.1f를 넣으시면 됩니다.