묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[C#/.NET 8.0]어서와, Blazor Server는 처음이지?
? 코딩하는 이유
int? 나 <string, object>? 뒤에 ?를 넣는 이유가 뭔가요?
-
미해결C# WPF .NET Core(7.0)
MVVM 2강
안녕하세요MVVM2강에서 4:19초 실행화면에서 버튼이 활성화 안되는데.. 왜 그런지 못찾겠습니다.항목클릭시 TextBox에 이름,나이는 들어오는데.. txt.Lenght가 값이 안들어 와서 false만 되네요혹시 닷넷 버전과 관련이 있을까요??? public class PersonModel : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }================================<TextBox x:Name="tbox1" Width="150" Text="{Binding ElementName=lv,Path=SelectedItem.Name, Mode = TwoWay, UpdateSourceTrigger=PropertyChanged}"/><TextBox Width="150" Text="{Binding ElementName=lv, Path=SelectedItem.Age, Mode = TwoWay, UpdateSourceTrigger=PropertyChanged}"/>================================= public bool CheckMsg(string txt){if(txt.Length > 0){return true;}else{return false; //글자가 없으면 false}=====================================
-
해결됨Backend 멀티쓰레드 이해하고 통찰력 키우기
코틀린으로 해당 C# 예제를 비슷하게 만들어봤는데, 제가 잘못 작성한 걸까요?
<상황>지식 공유자님께서 작성해주신 C# 코드 예제를 코틀린으로 비슷하게 작성해서 시도해보았지만 같은 상황이 재현되지 않습니다. <질문 의도>제가 지식 공유자님의 코드를 잘못 이해하고 작성한 것인지, 아니면 JVM의 의도치 않은 최적화 때문에 의도와 다르게 동작하는 것인지 궁금합니다. <작성한 코드>fun main (args: Array<String>) { Example().startUp() } class Example() { private var shouldStop = false fun startUp() { println("process start") val thread = Thread(Runnable { doWork() }) thread.start() Thread.sleep(1000) shouldStop = true thread.join() println("process end") } // shouldStop에 @Volatile을 붙이지 않으면 무한 루프를 돌 것이라고 생각했으나 // graceful shutdown이 잘 되어버림 private fun doWork() { while (!shouldStop) { println("doWork..") Thread.sleep(1000) } } } 좋은 강의 만들어주셔서 감사합니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
ui 생성 오류
unity 버전을 2022.3.15를 사용 중입니다.강의에서의 버튼 및 텍스트 UI가 없어 Legacy라는 태그가 달린 UI를 추가해서 사용 중인데 사진과 같은 오류가 나오며 버튼 및 텍스트가 사라지는 문제가 나타나고 있습니다.어떻게 해결해야할까요?
-
해결됨[C#/.NET 8.0]어서와, Blazor Server는 처음이지?
BackUp DB > Failed
PostgreSQL 여러번 지우고 재설치 하여 backup DB restore 결과가 Failed 나오네요 문제가 뭘까요?
-
해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라의 패킷 조작 방어(범위 내일 때)
루키스님 안녕하세요?본 강의 17:00분대에this.playerId = BitConverter.ToInt64(new ReadOnlySpan<byte>(s.Array, s.Offset + count, s.Count - count));로 범위를 초과하는 패킷에 대해서 클라의 패킷 조작을 방어하는 예시를 들어주셨습니다. 저는 여기서 궁금한게, 클라의 패킷 조작 중 범위를 벗어나지 않는 패킷 공격은 어떤 아이디어로 방어를 할지 궁금합니다. 예를 들어 보스의 체력을 10000 -> 1로 조작한 패킷 같은 경우 아이디어가 궁금합니다.
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
강의는 유니티 버전 몇으로 진행하시나요?
안녕하세요이번에 진행하시는 강의는 유니티 버전 몇으로 진행하시나요?
-
미해결[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; } }이런식으로 비동기 코드를 작성했는데요..코루틴을 사용하면 정상작동을 하긴하는데 모노비헤비어를 상속받지않은 상태에서 어떻게 사용하는지 감이 안잡힙니다.
-
해결됨WPF (.NET Core, C#, 자막제공)
3강 .NET 이미지 삽입 방법도 알려주세요
안녕하세요.3강 .NET 이미지 삽입 방법도 알려주세요..
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티 스레드 환경에서의 캐시 효율
멀티 스레드 환경에서 A,B 2개의 쓰레드가 있다고 가정했을때프로세스에서 어떤 전역 Data number를 +1 해달라는 주문이 들어 왔을때 A쓰레드에서 해당 주문을 받고 동시에 B도 해당 주문을 받는다면 문제가 되기때문에 동기화를 해줘야한다고 말씀 주셨는데요 그렇게 되면 A가 주문을 받고 다시 Ram에 동기화 그다음 B가 주문을 받고 Ram에서 수정된 값을 가져와서 다시 Ram에 동기화 이런식이라면 멀티 쓰레드 환경에서는 캐시의 의미가 없는건가요?캐시라는게 결국엔 프로세서와 Ram간의 거리가 멀기 때문에 이걸 완하해주는게 캐시로 알고 있는데 멀티 환경에서 주문이 들어올때마다 Ram에서 최신화 정보 가져오고 다시 동기화 한다면 캐시의 의미가 없어지는게 아닌가 해서 이렇게 질문 남기게 됩니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
선생님처럼 이동못할때도 정상적으로 애니메이션이 작동을 안합니다
void UpdateIsMoving() { if (State != Define.CreatureState.Moving && Dir != Define.Dir.None) { Vector3Int destPos = CellPos; State = Define.CreatureState.Moving; switch (Dir) { case Define.Dir.Up: destPos += Vector3Int.up; break; case Define.Dir.Down: destPos += Vector3Int.down; break; case Define.Dir.Left: destPos += Vector3Int.left; break; case Define.Dir.Right: destPos += Vector3Int.right; break; } if (Managers.Map.CanGo(destPos)) { if (Managers.Object.Find(destPos) == null) CellPos = destPos; } } } void UpdatePosition() { if (State != Define.CreatureState.Moving) { return; } Vector3 destPos = Managers.Map.currentGrid.CellToWorld(CellPos) + new Vector3(0.5f, 0.5f, 0); Vector3 moveDir = destPos - transform.position; float dist = moveDir.magnitude; if (dist < _speed * Time.deltaTime) { transform.position = destPos; State = Define.CreatureState.Idle; } else { transform.position += moveDir.normalized * _speed * Time.deltaTime; State = Define.CreatureState.Moving; } } 이동할 수 없는 구역에 가려고할때 애니메이션이 IDLE과 WALK를 번갈아가면서 부들부들거립니다.UpdateIsMoving에서 State를 Moving으로 바꾸더라도 실제 CellPos에는 적용이 안되어있다 보니 State가 곧 바로 IDLE로 바뀌기 때문인것 같은데 어떻게 해결할 수 있을까요?
-
해결됨WPF (.NET Core, C#, 자막제공)
버튼 클릭시 progressBar가 100으로 채워지지 않는 현상
MainViewModel.csusing System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; namespace WpfApp2.ViewModels { internal class MainViewModel { private int progressValue; public int ProgressValue { get { return progressValue; } set { progressValue = value; NotifyPropertyChanged(nameof(ProgressValue)); } } public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged([CallerMemberName] String propertyName = "") { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } } MainWindow.xaml<Window x:Class="WpfApp2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApp2" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Window.Resources> <Style x:Key="testStyle"> <Setter Property="Button.Background"> <Setter.Value> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="Black"/> <GradientStop Color="#FF16CEA8" Offset="1"/> <GradientStop Color="#FF0C735E" Offset="0.563"/> <GradientStop Color="#FF0B6C58" Offset="0.533"/> </LinearGradientBrush> </Setter.Value> </Setter> <Style.Triggers> <!--progressBar1의 value가 100이면 동작--> <DataTrigger Binding="{Binding ElementName=progressBar1,Path=Value}" Value="100"> <Setter Property="Control.Visibility" Value="Hidden"></Setter> </DataTrigger> </Style.Triggers> </Style> </Window.Resources> <Grid> <Label Content="제목" Style="{StaticResource testStyle}" Width="100" Height="40" VerticalAlignment="Top"/> <Button Content="버튼" Width="200" Height="50" HorizontalAlignment="Left" Style="{StaticResource testStyle}" Click="Button_Click"/> <CheckBox x:Name="check1" Content="체크박스" Width="100" Height="40" Margin="23,125,677,269"></CheckBox> <ProgressBar x:Name="progressBar1" Width="200" Height="20" Value="{Binding ProgressValue}" /> </Grid> </Window> MainWindow.csusing System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using WpfApp2.ViewModels; namespace WpfApp2 { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { MainViewModel viewModel; public MainWindow() { InitializeComponent(); viewModel = new MainViewModel(); viewModel.ProgressValue = 30; DataContext = viewModel; } private void Button_Click(object sender, RoutedEventArgs e) { viewModel.ProgressValue = 100; } } } 실행을 하면 처음 30은 채워져있는데 버튼을 클릭했을 때 100으로 채워지지 않습니다. 물론 100으로 채워지지 않으니 라벨과 버튼이 사라지는 이벤트도 작동하지 않구요. 어떤부분이 잘못 되었는지 몰라서 질문합니다
-
미해결[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
멘토링 한자리 남겨주실수 있을까요?
혹시 가능하다면 멘토링 한자리 남겨주심 안될까요?회사에서 지원하는 금액이 넘어가서 멘토링은 담달초에 등록할려고 합니다. 2인 개발을 목표로 하고 있는데 한명은 그래픽이고 제가 기획이랑 프로그래밍을 할 예정이라 꼭 듣고 싶습니다
-
해결됨[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 게임 개발 시리즈] Part4: 게임 서버
SocketAsyncEventArgs 가 연속된 패킷을 모으는 역할을 하나요?
[테스트1]아래 처럼 클라이언트에서 Send를 5번 하는데for (int i = 0; i < 5; i++) { byte[] sendBuffer = Encoding.UTF8.GetBytes($"Hello World! {i} "); int sendByte = socket.Send(sendBuffer); } 강의 결과 화면처럼 서버에서는 5번의 Send 패킷을 모았다가 출력하는 모습을 볼 수 있습니다. [테스트2]아래에서도 마찬가지로 Send를 5번 하는데,1초 딜레이를 주고 실행했습니다.for (int i = 0; i < 5; i++) { byte[] sendBuffer = Encoding.UTF8.GetBytes($"{i} "); int sendByte = socket.Send(sendBuffer); Thread.Sleep(1000); } 이때는 서버에서 패킷을 모을 시간이 없었던건지,Send 패킷을 안모으고 출력하는 모습을 볼 수 있습니다. [질문]서버에서 패킷을 모으는 역할을 하는 것이 무엇인가요?SocketAsyncEventArgs 인가요?그리고 패킷을 모으는 기준이 무엇인지 궁금합니다.시간인가요? 아니면 끊임 없이 연속적으로 보내지는 패킷인가요? 아니면 다른 무엇인가요?SocketAsyncEventArgs recvArgs = new SocketAsyncEventArgs(); recvArgs.Completed += new EventHandler<SocketAsyncEventArgs>(OnRecvCompleted); recvArgs.SetBuffer(new byte[1024], 0, 1024);
-
미해결[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
not exist in the namespace 에러가 납니다
error CS0234: The type or namespace name 'AddressableAssets' does not exist in the namespace 'UnityEngine' (are you missing an assembly reference?) error CS0234: The type or namespace name 'ResourceManagement' does not exist in the namespace 'UnityEngine' (are you missing an assembly reference?) 이 두 부분에서 에러가 뜨는데 어떻게 해결해야 하나요?
-
해결됨무작정 따라하기! TPS 게임 만들기.
27:46 4강) 콘솔 에러가 발생했습니다
NullReferenceException: Object reference not set to an instance of an objectGameManager.Update () (at Assets/_My/Scripts/GameManager.cs:50) 콘솔에 출력된 에러 내용입니다.cs:50 은 bulletText.text = currentBullet + " / " + maxBullet; 부분입니다. 오브젝트를 못찾는거같은데 어떻게 해결할 수 있을까요
-
해결됨[켠김에 출시까지] 유니티 방치형 키우기 게임 (M1 + C1)
강의 내용에 대해서 궁금한점이 있습니다.
안녕하세요. 질문이 있어서 글을 남기게 되었습니다.루키스님의 지난 강의 유니티로 MMORPG만들기에서 데이터베이스를 mssql, entity framework로 만드셨는데 이번에도 같은 것으로 진행 하는것인지 궁금합니다.인디, 또는 개인개발자를 대상으로 진행하는 교육인 만큼 리눅스 서버에서 돌아가는 mysql, 또는 mariaDB와 같은 비용이 최소화되는 환경으로 진행되었으면 하는데 여기에 대해서 답변 주실 수 있을까요?이미 강의를 구입하였는데 저 또 한 개인개발을 목표로 하고 있어서 강의내용에 대해서 궁금합니다.!!