묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
비주얼스튜디오 질문있습니다
강좌에서는 코드에 빨간줄이 그였을때 잠재적수정사항 표시란게 뜨는데요. 제 비쥬얼스튜디오에서는 잠재적수정사항 표시가 안뜨는데 어떻게 해결해야할지 궁금합니다
-
해결됨[켠김에 출시까지] 유니티 캐주얼 모바일 MMORPG (M2)
스포닝풀 작업하는거 질문드려요
제가 강의를 놓친걸수도 있는데 질문드려서 죄송합니다.스포닝풀을 스크립터블 오브젝트로 관리하는데 (M1 에서는 타일맵에 찍어서 관리 했었던걸로 기억합니다)스크립터블 오브젝트로 Pivot PosX , Pivot PosY 를 어떻게 직관적으로 보고 작업 할수 있나요? 그냥 찍어서 좌표 확인하는건지 아니면 더 편한 방법이 있는건지 궁금해서 질문남겨요
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초)
안녕하세요. 일전에 질문 드린 포폴 준비 관련 질문의 추가 질문입니다!
루키스님 안녕하세요. 한 달 전에 올린 질문에 추가 질문드립니다.서버는 C++, 클라이언트는 유니티 조합으로 준비하고 있다는 질문이었고,루키스님이 답변을 해주셨었습니다. 그 답변 이후로 열심히 C++ 서버 공부하고 있어요.오늘 들어와서 답변을 다시 살펴보니까, C# 강의에서 들어야 할 강의 중에,C# Part4 게임 서버도 써주셨더라고요.C++ 서버만 듣는 건 부족해서 C# 서버도 들어보라고 하신 걸까요~?아니면 강의 마지막에 유니티 연동 관련한 부분 때문에 그러신 걸까요~?C++ 서버 강의 너무 좋은데완강하는데 많은 시간이 걸려서 살짝씩 멘탈이 흔들리지만 다잡으면서 가고 있습니다.늘 좋은 강의 감사합니다.
-
미해결[Unity6] 유니티6로 배우는 실전 멀티플레이 디펜스
유니티6로 배우는 실전 멀티플레이 디펜스의 [로비생성] 편에 질문있습니다.
이전까진 문제없이 잘 이해하고 코드도 실행되었습니다. 그런데 [로비생성] 강의를 보고 따라했더니 오류가 발생했습니다. Unity.Services.Lobbies.LobbyServiceException: lobby code 'BARB6QOAUYDBBMLVUPZQBE' contains an invalid character 'O' (U+004F) at index 6 ---> Unity.Services.Lobbies.Http.HttpException`1[Unity.Services.Lobbies.Models.ErrorStatus]: (400) HTTP/1.1 400 Bad Request...생략...... 호스트는 잘 만들어지는데요, 다른 플레이어로 조인하려고 하면 저런 빨강 글씨의 오류가 발생합니다.인터넷에 찾아보니 외국 포럼만 나오는데요, 버그같기도 하고 그러네요. 제가 고치기 힘들어서요. 혹시 중간강의에서 코드를 통째로 올려주실 수 있나요? 저 오류때문에 코드를 실행하진 못하고, 코드 따라치면서 논리만 이해하는 식으로 공부하고 있습니다.코드를 실행하면서 게임을 돌려보는 실습까지 해보면 재밌긴 하겠지만요. 강의는 재밌게 잘 보고 있는데, 저 오류가 아쉽네요.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
PacketFormat 빌드 관련
PacketFormat.cs 파일을 빌드 하고 GenPacket.bat파일을 실행시키면 어떤때는 잘되고 어떤때는 안되네요 말씀하신대로 스크립트 내용 다 지우고 빌드해도 내용 안바뀐상태로 빌드됩니다.. 도대체 뭐가 문제일까요
-
해결됨[Unity6] 유니티6로 배우는 실전 멀티플레이 디펜스
섹션4-로비생성 작업 중(32:26)중 첫 실행시 [Vivox]: System.ArgumentException: 'server' is null or empty 오류 발생합니다.
섹션4-로비생성 작업 중(32:26)중 첫 실행시 다음과 같은 오류가 발생합니다.[Vivox]: System.ArgumentException: 'server' is null or emptyParameter name: serverUnityEngine.Logger:Log (UnityEngine.LogType,string,object)Unity.Services.Vivox.VivoxLogger:LogException (System.Exception) (at ./Library/PackageCache/com.unity.services.vivox/Runtime/SDK/Utils/VivoxLogger.cs:16)Unity.Services.Vivox.VivoxServiceInternal:.ctor (string,string,string,string,bool,bool,Unity.Services.Authentication.Internal.IAccessToken,Unity.Services.Authentication.Internal.IPlayerId,Unity.Services.Authentication.Internal.IEnvironmentId) (at ./Library/PackageCache/com.unity.services.vivox/Runtime/VivoxServiceInternal.cs:140)Unity.Services.Vivox.VivoxPackageInitializer:Initialize (Unity.Services.Core.Internal.CoreRegistry) (at ./Library/PackageCache/com.unity.services.vivox/Runtime/VivoxPackageInitializer.cs:41)Unity.Services.Core.Internal.CoreRegistryInitializer/<>c__DisplayClass3_0/<<InitializeRegistryAsync>g__InitializePackageAsync|2>d:MoveNext () (at ./Library/PackageCache/com.unity.services.core/Runtime/Core.Internal/Registry/CoreRegistryInitializer.cs:91)System.Runtime.CompilerServices.AsyncTaskMethodBuilder:Start<Unity.Services.Core.Internal.CoreRegistryInitializer/<>c__DisplayClass3_0/<<InitializeRegistryAsync>g__InitializePackageAsync|2>d> (Unity.Services.Core.Internal.CoreRegistryInitializer/<>c__DisplayClass3_0/<<InitializeRegistryAsync>g__InitializePackageAsync|2>d&)Unity.Services.Core.Internal.CoreRegistryInitializer/<>c__DisplayClass3_0:<InitializeRegistryAsync>g__InitializePackageAsync|2 (Unity.Services.Core.Internal.IInitializablePackage)Unity.Services.Core.Internal.CoreRegistryInitializer/<>c__DisplayClass3_0/<<InitializeRegistryAsync>g__TryInitializePackageAsync|0>d:MoveNext () (at ./Library/PackageCache/com.unity.services.core/Runtime/Core.Internal/Registry/CoreRegistryInitializer.cs:63)System.Runtime.CompilerServices.AsyncTaskMethodBuilder:Start<Unity.Services.Core.Internal.CoreRegistryInitializer/<>c__DisplayClass3_0/<<InitializeRegistryAsync>g__TryInitializePackageAsync|0>d> (Unity.Services.Core.Internal.CoreRegistryInitializer/<>c__DisplayClass3_0/<<InitializeRegistryAsync>g__TryInitializePackageAsync|0>d&)Unity.Services.Core.Internal.CoreRegistryInitializer/<>c__DisplayClass3_0:<InitializeRegistryAsync>g__TryInitializePackageAsync|0 (Unity.Services.Core.Internal.IInitializablePackage)Unity.Services.Core.Internal.CoreRegistryInitializer/<InitializeRegistryAsync>d__3:MoveNext () (at ./Library/PackageCache/com.unity.services.core/Runtime/Core.Internal/Registry/CoreRegistryInitializer.cs:48)System.Runtime.CompilerServices.AsyncTaskMethodBuilder`1<System.Collections.Generic.List`1<Unity.Services.Core.Internal.PackageInitializationInfo>>:Start<Unity.Services.Core.Internal.CoreRegistryInitializer/<InitializeRegistryAsync>d__3> (Unity.Services.Core.Internal.CoreRegistryInitializer/<InitializeRegistryAsync>d__3&)Unity.Services.Core.Internal.CoreRegistryInitializer:InitializeRegistryAsync ()Unity.Services.Core.Internal.UnityServicesInternal/<>c__DisplayClass32_0/<<InitializeServicesAsync>g__InitializePackagesAsync|1>d:MoveNext () (at ./Library/PackageCache/com.unity.services.core/Runtime/Core.Internal/UnityServicesInternal.cs:170)System.Runtime.CompilerServices.AsyncTaskMethodBuilder:Start<Unity.Services.Core.Internal.UnityServicesInternal/<>c__DisplayClass32_0/<<InitializeServicesAsync>g__InitializePackagesAsync|1>d> (Unity.Services.Core.Internal.UnityServicesInternal/<>c__DisplayClass32_0/<<InitializeServicesAsync>g__InitializePackagesAsync|1>d&)Unity.Services.Core.Internal.UnityServicesInternal/<>c__DisplayClass32_0:<InitializeServicesAsync>g__InitializePackagesAsync|1 ()Unity.Services.Core.Internal.UnityServicesInternal/<InitializeServicesAsync>d__32:MoveNext () (at ./Library/PackageCache/com.unity.services.core/Runtime/Core.Internal/UnityServicesInternal.cs:151)System.Runtime.CompilerServices.AsyncTaskMethodBuilder:Start<Unity.Services.Core.Internal.UnityServicesInternal/<InitializeServicesAsync>d__32> (Unity.Services.Core.Internal.UnityServicesInternal/<InitializeServicesAsync>d__32&)Unity.Services.Core.Internal.UnityServicesInternal:InitializeServicesAsync ()Unity.Services.Core.Internal.UnityServicesInternal/<InitializeAsync>d__27:MoveNext () (at ./Library/PackageCache/com.unity.services.core/Runtime/Core.Internal/UnityServicesInternal.cs:80)System.Runtime.CompilerServices.AsyncTaskMethodBuilder:Start<Unity.Services.Core.Internal.UnityServicesInternal/<InitializeAsync>d__27> (Unity.Services.Core.Internal.UnityServicesInternal/<InitializeAsync>d__27&)Unity.Services.Core.Internal.UnityServicesInternal:InitializeAsync (Unity.Services.Core.InitializationOptions)Unity.Services.Core.UnityServices/<InitializeAsync>d__21:MoveNext () (at ./Library/PackageCache/com.unity.services.core/Runtime/Core/UnityServices.cs:128)System.Runtime.CompilerServices.AsyncTaskMethodBuilder:Start<Unity.Services.Core.UnityServices/<InitializeAsync>d__21> (Unity.Services.Core.UnityServices/<InitializeAsync>d__21&)Unity.Services.Core.UnityServices:InitializeAsync (Unity.Services.Core.InitializationOptions)Unity.Services.Core.UnityServices:InitializeAsync () (at ./Library/PackageCache/com.unity.services.core/Runtime/Core/UnityServices.cs:79)NetManager/<Start>d__2:MoveNext () (at Assets/00_Scripts/Network/NetManager.cs:22)System.Runtime.CompilerServices.AsyncVoidMethodBuilder:Start<NetManager/<Start>d__2> (NetManager/<Start>d__2&)NetManager:Start () at Assets/00_Scripts/Network/NetManager.cs:22 여기 부분 코드가 await UnityServices.InitializeAsync(); 인데 어떻게 디버깅 해야 할 지를 모르겠습니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요 강의 잘듣고있습니다~ [해결했습니다]
PacketSession OnRecv 마지막부분에buffer에서 패킷의 사이즈 만큼 자르고buffer의 사용하지 않은부분은 buffer에 다가 새로 만들어서 넣어주고 있는데요여기서 저걸 왜 다시 넣어야 하는지 이해가 안갑니다.왜냐하면 읽은 데이터량만큼 processLen을 증가시켰고processLen을 반환하면 read커서가 그만큼 증가하게 되고이부분에서 readPos증가한만큼 new로 새로 만들어서 가져오는데 말이죠.. 굳이 필요가 없을거 같은데 맞나요..?
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
Dead 애니메이션 출력 오류입니다.
현재 이렇게 되어있는 상태인데 왜인지 Dead 애니메이션만 실행이 안돼요... 코드는 그대로 복붙한 상태라 애니메이터 쪽이 문제인 것 같은데 뭐가 문제인 걸까요??
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
커스텀 에디터에 관하여 질문이 있습니다.
Quest의 커스텀 에디터를 작성하였는데Quest가 가진 TaskGroups의 TaskGroup의 변수를 수정하였는데 수정이 안되는데 커스텀 에디터의 하위 요소에도 부가적인 작업을 해야 수정이 되는건가요?protected SerializedProperty taskGroupsProperty;protected SerializedProperty rewardsProperty;protected SerializedProperty useAutoCompleteProperty;protected SerializedProperty isCancelableProperty;protected SerializedProperty isSaveavleProperty;protected SerializedProperty acceptConditonsProperty;protected SerializedProperty cancelConditionProperty;protected override void OnEnable(){ base.OnEnable(); taskGroupsProperty = serializedObject.FindProperty("taskGroups"); rewardsProperty = serializedObject.FindProperty("rewards"); useAutoCompleteProperty = serializedObject.FindProperty("useAutoComplete"); isCancelableProperty = serializedObject.FindProperty("isCancelable"); isSaveavleProperty = serializedObject.FindProperty("isSaveable"); acceptConditonsProperty = serializedObject.FindProperty("acceptionConditions"); cancelConditionProperty = serializedObject.FindProperty("cancelConditions");}public override void OnInspectorGUI(){ base.OnInspectorGUI(); serializedObject.Update(); if (DrawFoldoutTitle("Task")) EditorGUILayout.PropertyField(taskGroupsProperty); if (DrawFoldoutTitle("Rewards")) EditorGUILayout.PropertyField(rewardsProperty); if (DrawFoldoutTitle("Option")) EditorGUILayout.PropertyField(useAutoCompleteProperty); EditorGUILayout.PropertyField(isCancelableProperty); EditorGUILayout.PropertyField (isSaveavleProperty); if (DrawFoldoutTitle("Condition")) EditorGUILayout.PropertyField(acceptConditonsProperty); EditorGUILayout.PropertyField(cancelConditionProperty); serializedObject.ApplyModifiedProperties();}이런식으로 작성을 하였는데다른 enum으로 수정을 하여도 기본값인 Null이 출력됩니다.
-
미해결[Unity6] 유니티6로 배우는 실전 멀티플레이 디펜스
씬의 기즈모 조절
섹션3. 캐릭터 공격 시작부분에서 씬 화면에 있는 이런 기즈모들은 어디서 조절 가능한가요?
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
스킬 구현 질문입니다
워크래프트3 영웅들 패시브 오라처럼 영웅이 살아있을때 영구적으로 지속되는 스킬은패시브로 짧은 주기마다 계속해서 효과를 주면 되는걸까요?간단한 스탯 영구적 증가 효과 스킬을패시브 타입으로 세팅에 apllycount 1, cooldown 1이펙트 세팅에서 duration 1.5 로이와 같이 하여 구현을 해보았습니다.혹여 더 좋은 방법이나 위의 방법이 문제가 있을지 궁금하여 질문드립니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
[수업 질문] [SpinLock]
class SpinLock { volatile int _locked = 0; private readonly object _lock = new object(); public void Acquire() { while (true) { //int original = Interlocked.Exchange(ref _locked, 1); //if (original == 0) // break; // CAS : Compare-And-Swap //int original = Interlocked.CompareExchange(ref _locked, 1, 0); //if (original == 0) // break; //int expected = 0; //int desired = 1; //if (Interlocked.CompareExchange(ref _locked, desired, expected) == expected) // break; lock (_lock) { if (_locked == 0) { _locked = 1; break; } } } }DeadLock 시간에 배웠던 lock 방식을 이용해서 작성해봤는데 출력 값은 0이 잘 나옵니다. Q. SpinLock 구현할 때 InterLock 계열의 메서드를 사용해 구현한 것과 lock을 이용해 구현한 것은 어떤 차이가 있는지 궁금합니다.강사님께서는 InterLock 을 통해 구현하셨는데 그 이유는 간단하게 사용할 수 있기 때문인가요??SpinLock / BackOff Lock / Assisted Lock 이런 것을 구현할 때 위와 같이 lock 을 써서 구현하는 것은 구조적으로 잘못된 것인가요?? 제가 이해한 것은 Lock 방식과 InterLock 방식은 하드웨어의 Instruction을 원자적으로 처리하기 위해 프로그래머가 C++/C# 같은 언어로 시키기 위한 방법인 것 같은데 이해를 똑바로 한 것인지 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
특성이 중복되었다고 나옵니다
안녕하세요, 선생님프로젝트 속성 변경후 PacketGenerator 빌드를 눌러야 하는데 모르고 디벙깅 후 시작을 눌러버려서 그런지 모르겠지만AssemblyInfo.cs 파일에서 특성이 중복되었다고 나옵니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템
파일 저장방식, 퀘스트 실패에 관하여 여쭤보고싶습니다.
세이브 저장방식을 Playerprefs 보단 프로젝트 Resource파일 내부에 json으로 저장하는쪽이 개발하는 과정에는 저장하는게 명확하게 보여서 더 좋다고 생각해서 바꾸긴 했는데Json과 playerprefs이 조금의 속도 차이는 있는거로 아는데 playerprefs에 json으로 저장하는것에는 무슨 차이가 있는지 여쭤보고싶습니다. 그리고 퀘스트의 실패를 만드는것은다키스트 던전처럼 일단 퀘스트를 무조건 성공하는 취급으로 한 후에 Give 함수에 enum에 따라서 이벤트를 발생 시키게 해서 구현하려는데 이때 Enum인 대성공,성공, 실패, 대실패를 정하는걸 TaskGroup에 넣는게 맞는지 잘 모르겠습니다.TaskGroup에 Enum변수를 만든 다음에 Quest에 isFailable 변수를 만들고 achievment 처럼 ReceiveReport를 가상함수로 만든 다음에 다른 종류의 퀘스트를 만들고 ReceiveReport를 원하는대로 수정한 다음 성공한 TaskGroup을 따라서 QuestResult가 결정되고 이걸 QuestReward에 QuestResult에 따라서 보상, 실패 처리를 하면 되는걸까요?public bool IsFailable => this.GetType() != typeof(Quest) && this.GetType() != typeof(Achievement); 이 bool값으로 어떤 유형의 퀘스트인지도 확인을 하고요.이런식으로 구상을 생각해 보았는데 이러한 설계가 맞는 방향인지 여쭤보고싶습니다.
-
해결됨[Unity] 함께 만들어가는 방치형 게임 개발
근접 공격 강좌에서 NRE이 발생하는데 시점 문제로 발생한 문제인지 이슈를 쳐내기가 곤란합니다.
이러한 이슈가 발생해 찾은 결과 Monster Script의 37번 째 줄인 FindClosetTarget 함수에서 타겟을 찾지 못해 NPR이 발생한 내용으로 확인되었는데Spawner에 Players를 넣어주어 플레이어인 Cleric과 Barbarian이 잡히나, 간헐적으로 Null을 return 해주는 현상이 발생하는데, 이게 Update 문 안에서 실행되어 FindClosetTarget 구문이 매우 빠른 속도로 실행되어 발생한 시점 문제인지 궁금합니다. 현재 강사분과 코드는 동일한 것으로 확인됩니다.
-
미해결[라이브 멘토링] 유니티 뱀파이어 서바이벌 장르 모작
안드로이드 빌드에서는 LoadAllAsync , LoadAsync 가 동작 하지 않고 있습니다.
안녕하세요.강의를 마지막까지 공부하고, 에디터에서 실행할시에 잘 동작 함을 확인 했습니다.그런데, 안드로이드 빌드를 해보면 빌드 실패도 하지 않습니다.생성된 APK 를 핸드폰에도 넣어보고, 녹스플레이어, 블루 스택에서 넣어서 실행해보면 파란 에디터에서 보이는 최초 파란 화면만 뜨고, 게임씬이 동작 하지 않고 있습니다.혹시나 해서, UI_TextMeshPro 에서Text 를 넣고, 테스트하던중 에디터 실행할때는 bbb 가 출력되고, 게임도 잘 돌아가는데, 안드로이드 플레이어나, 모바일 기기에서는 aaa 까지만 출력되고 다음줄이 실행 되지 않습니다. 비동기를 디버그 해보려고 노력했는데, 에디터에서는 오류가 나지 않고,F11 눌러서 한단계씩 들어가다보면 "모듈에 프레임 없음" 페이지가 나오고, 어드레서블에 있는 목록이 Resource 에 채워지는 것을 확인 하기가 어렵습니다. 비동기 이후에는 Resource 에 22개 딕셔너리가 채워진것을 확인 가능하긴 하더군요. 해결이 몇일째 안되고 있는데, 도움 부탁드립니다.public TextMeshProUGUI textComponent; // Start is called before the first frame update void Start() { textComponent.text = "aaa"; // "F:\p4v\TangTang\Assets\Scripts\Scenes\GameScene.cs" Managers.Resource.LoadAllAsync<Object>("PreLoad", (key, count, totalCount) => { Debug.Log($"로딩바 추가 {key}, {count}/{totalCount}"); if (count == totalCount) { textComponent.text = "bbb"; // Debug.Log("test"); // StartLoaded(); } }); }
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
동기방식과 비동기 방식 비교
루키스님 안녕하세요?소켓 함수쪽에서 동기방식과 비동기방식의 장단점을 고찰하고 있습니다. 이번 강의에서 Listen쪽을 동기 -> 비동기로 전환하면서 논블로킹 성질로 인해 어느 누군가의 입장 지연 등을 기다려도 않아도 되므로 그런 부분에서 이점이 있다.이렇게 이해를 하였는데요, 입장자 별로 스레드를 부여하여 동기적으로 입장시킴. 단, 너무 지연이 되면 해당 스레드는 종료 등으로 처리.이런 식으로 동기적 방법을 고수하면 콜백 함수 없어도 되니까 코드 복잡도도 줄고 컨텍스트 스위칭도 덜 일어나지 않을까? 라는 생각을 하게 되었습니다. 그러므로 동기적으로 소켓 함수를 계속 사용하는 것은 잘못된 생각인지, 아니면 비동기 동기가 각각 장단점이 있는 방식인지 루키스님 조언 얻으려고 질문 드립니다. 답변 미리 감사합니다. +수정 이 내용과 같은 맥락일까요?그렇다면 Listen과 Accept는 동기, Send와 Receive는 비동기로 처리 이런 방식은 어떤지 고민도 되고 하네요https://www.inflearn.com/community/questions/140160/%EA%B5%B3%EC%9D%B4-%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B0%A9%EC%8B%9D%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0
-
미해결유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
FindObjectOfType Deprecated오류가 발생하는데요.
LobbyUIController = FindObjectOfType<LobbyUIController>();강의대로 위의 코드로 진행하는 과정에서 오류가 있어서.. LobbyUIController = FindFirstObjectByType<LobbyUIController>();이렇게 수정하라고 나오는데, 이 때문인지 로비 쪽의 Scene을 로드하면 Log에서 아래와 같이 Error가 찍힙니다.NullReferenceException: Object reference not set to an instance of an objectLobbyManager.Start () (at Assets/Scripts/Lobby/LobbyManager.cs:23)
-
해결됨유니티 시스템 프로그래밍 Pt.1 - 상용 게임 구현을 위한 핵심 시스템 올인원 패키지
R키를 2초 누르면 재시작 하도록 구현하고 싶은데 이상합니다
R키 2초 누르면 SceneLoader의 ReLoadScene으로현재 씬을 재시작하도록 했습니다.재시작할 때 사진처럼 되면서 살짝 딜레이가 생깁니다.public bool RDown = false; // R 키를 눌렀는가? // true: 누르는 중 public float RDownTime = 0.0f; // R 키를 몇초 눌렀는가? private void Awake() { setting = transform.GetChild(0).gameObject; } protected override void HandleInput() { base.HandleInput(); RDown = Input.GetKey(KeyCode.R); if (RDown) { Debug.Log("R 키 누르는 중"); RDownTime += Time.deltaTime; if (RDownTime > 2.0f) // R버튼 2초 누르면 재시작 { SceneLoader.Instance.ReloadScene(); } } else // 누른 시간 초기화 { RDownTime = 0.0f; } //if (!RDown) // 누른 시간 초기화 //{ // RDownTime = 0.0f; //} } public void OnClickReStartBtn() // 재시작 버튼 구현 { SceneLoader.Instance.ReloadScene(); } HandleInput 함수는 부모 클래스 Update에서 호출 중입니다. 추가로 여기에 R키 사용에 있어 쿨타임을 줄 수 있을까요?씬이 재시작되면서 쿨타임 체크하는 부분도 씬 재시작으로 인해 초기화가 되지 않을까 걱정입니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
SetCanvas에는 Stack Push를 안해도 되나요?
SetCanvas 함수에서 true 일 때 _order++ 은해서_order값은 올라 가는데 Stack에는안올라 가는거 같은데 별로 상관 없는 걸까요?