묻고 답해요
148만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
스킬트리 질문입니다
스킬트리의 xNode에서 노드 하나에 In 으로 들어오는 포트는 여러개가 설정가능한데out 도 여러개로 나가게 하고 싶은데 잘 되지 않아 이 부분의 해결방법에 대한 조언을 질문드립니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
카테고리의 응용에 대하여 여쭤보고싶습니다.
앞선 강의의 퀘스트 시스템을 현재강의의 identifiedObject를 합쳤고 stat, skill, effect 와 같은 윈도우에서 각각의 카테고리를 만들고 넣어준 다음에 만약 모종의 사유로 이름이 같은 카테고리가 없으면 X버튼 좌측에 추가적인 버튼을 생성시키고 그버튼을 누르면 해당 카테고리를 들어가게 개조를 가했는데 이게 괜찮을까요?내부 폴더를 대규모로 정리하다 보니까 파일의 경로가 틀어져서 Resources.Load들이 다 망가지게되어서 경로 의존성이 너무 높아져서 안정성이 낮아지는건지 여쭤보고 싶습니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
패링형 스킬에 대해 여쭤보고싶습니다
롤에 피오라 W, 이터널 리턴의 니키 W의 스킬들은 각각 가드 성공의 트리거가 하드CC기, 데미지가 트리거가 되는데 이 트리거가 되는 시간을 만들기 위해서는 이펙트를 이용한 버프를 활용하기에는 InActionState에 추가적인 수정이 필요한것같아 모듈식 개발의 취지에 맞질 않다고 생각합니다.추가적인 스킬 스테이트 머신을 만들고 InGuardingState와 같은 예시로 신규 스테이트를 만든 후에 해당 스테이트에서 공격한 대상, 받은 공격의 종류, CC기의 유무를 받게하고 이를 통해서 추가적인 애니메이션과 이펙트를 발동하게 하려고 하는데 이런식의 구조가 모듈식 개발의 적합할까요?
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
MMORPG라면 서버가 어떤 기능들을 가져가야 할까요?
클라가 모든 걸 다하고 서버는 판정만 해야할지 아니면 이동(구르기 같은), 데미지, 차징, State관리, Effect 등도 서버가 처리해야 할지 궁금합니다
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
공격할 때마다 일정 확률로 추가 투사체 발사
특정 아이템 효과로 기본 공격할 때마다 일정 확률로 추가 투사체를 발사하도록 하고 싶습니다.패시브 스킬을 만들어 아이템 장착/해제시 스킬을 등록/해제하도록 만들려고 하는데, 기능을 어떻게 만드는 것이 좋을지 고민이 됩니다. 제가 생각해 본 방법으로는, UseCondition에 IsRunningSkillCondition으로 특정 스킬을 사용하고 있는지 검사하고, IsPassRandomValueCondition으로 일정 확률을 통과했는지 검사한 후에 SpawnProjectileAction으로 투사체를 타겟에게 발사하도록 하면 될 것 같습니다.근데 이 방법으로 아마 동작은 될 것 같은데, 스킬의 UseCondition을 계속 체크해야해서 괜찮을지 의문이 생겼습니다. 마음같아선 OnDealDamage 이벤트에 일정 확률로 추가 투사체를 발사하는 메소드를 등록시키고 싶은데, 이를 스킬 시스템으로 어떻게 구현해야할지 잘 모르겠습니다. 어떤 방식으로 하는 것이 좋을 것 같은지 강사님의 생각이 궁금합니다. 추가로, 특정 아이템 장착시 기본 공격에 넉백이나 스턴 등 특정 이펙트를 추가하려면 어떻게 하는 것이 좋을지도 궁금합니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
공격력 주문력 스킬 계수 레벨 적용
롤의 스킬에는 각종 스탯계수가 붙어있는데요, 공격력계수, 주문력계수, 공격속도계수 등이 있습니다.저는 현재 각 스킬의 계수 관리를 위해서 DealDamage 이펙트의 레벨을 필요한 만큼 만들어서 이용중입니다.예를 들어, ad,ap 계수가 전부 1인 스킬을 구현한다고 하면, DealDamage 이펙트의 레벨을 2개 만들어서 ad계수가 1인 데미지 이펙트, ap계수가 1인 데미지 이펙트를 스킬에 다 추가하는 방식으로 하고 있습니다. 그런데, 레벨로 관리하니까 너무 직관적이지 않아 고민입니다. 예를 들어, ad계수가 1.5인 이펙트의 레벨이 3이라면, 스킬에 장착된 이펙트를 볼 때 이펙트를 또 한 번 더 들어가서 계수가 몇인지 확인하는 것이 너무 불편하게 느껴져서 질문드립니다. 강사님은 어떤 방식으로 관리하는 것이 좋다고 생각하시나요??
-
해결됨[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
아이템 및 시너지 효과 스킬 적용
롤토체스같은 게임에서 아이템과 증강체 및 시너지 효과 등을 어떻게 구현하면 좋을지 고민하는데 궁금한게 생겨 질문드립니다.예를 들어, 아이템을 장착하면 8초마다 주변 아군에게 보호막 부여와 같은 것을 구현할 때, 아이템을 장착하면 8초마다 주변 아군에게 보호막을 부여하는 패시브 스킬을 등록하고, 아이템을 해제하면 해당 패시브 스킬을 빼는 방식으로 만들면 될 것 같습니다.시너지 효과로 3타마다 추가 투사체를 발사하는 효과는 시너지가 발동되면 3타인지 체크하는 UseCondition을 가진 패시브 스킬을 통해 추가 투사체를 발사하게 하면 될 것 같습니다.그런데, 아이템을 장착하면 해당 캐릭터의 기본 공격 및 스킬이 체력 10% 이하인 적을 처형시키는 효과는 스킬로 구현이 어떻게 될지, 아니면 다른 좋은 방법이 있을지 떠오르지가 않아서 어떻게 구현할 수 있을지 질문드립니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
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이 출력됩니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
스킬 구현 질문입니다
워크래프트3 영웅들 패시브 오라처럼 영웅이 살아있을때 영구적으로 지속되는 스킬은패시브로 짧은 주기마다 계속해서 효과를 주면 되는걸까요?간단한 스탯 영구적 증가 효과 스킬을패시브 타입으로 세팅에 apllycount 1, cooldown 1이펙트 세팅에서 duration 1.5 로이와 같이 하여 구현을 해보았습니다.혹여 더 좋은 방법이나 위의 방법이 문제가 있을지 궁금하여 질문드립니다.
-
해결됨[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
Selct에 대해서 질문드립니다.
안녕하세요 강사님 궁금한게 있어서 질문 드립니다.제가 구현하고 싶은 부분은 리그오브 레전드의 스마트키 기능과 같은 부분입니다.제가 이해한 것이 맞다면 강의 안에서는Select로 비동기적 처리를 할 때 추가 입력을고정된 입력값(마우스 클릭)을 받아서 Select의 비동기적 처리를 구현한것으로 이해했습니다.만약 제가 롤의 SmartKey 기능과 같은 눌렀다가 키를 뗄때(스킬이 등록된 키마다 받아야할 입력이 달라짐)의 입력으로 비동기적 처리를 구현하고 싶다면 어떤식으로 구현해야 할까요?제가 고민해본 방법은 다음과 같습니다.Skill에 ReleaseInput()이라는 함수를 만든다.그리고 TargetSelectionAction에 똑같은 이름의 ReleaseInput() 함수를 만든다.ReleaseInput() 함수는 SkillSlot의 바인딩된 키 값을 기준으로 키를 뗄 때 호출된다.Skill의 RealeseInput()호출되면 Skill -> TargetSearch -> TargetSelectionAction 의 순서로 TargetSelection에 접근하여 TargetSelection의 추가로 만든releaseInput()함수를 호출한다.TargetSelectionAction에 releaseInputOccur이벤트를 만들고 ReleaseInput()함수로 이 이벤트를 Invoke해준다."키를 뗌" 액션을 Select의 비동기 방식에서 추가 입력값으로 이용하고 싶다면 releaseInputOccur이벤트에 추가적인 함수를 구독하여 기능을 구현한다.이런 식으로 생각해봤는데. 제가 아직 이 TargetSearcher 시스템에 이해도가 부족해서, 구현해주신 TargetSearcher 의 흐름을 망치지 않고 추가 기능을 만든 것 인지 아직 헷갈립니다.그래서 강사님께서 SmartKey방식을 구현하신다면 어떤 방식으로 구현하실지 궁금해서 여쭤봅니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
UseInAction에 대해서 질문드립니다.
제가 TargetSelectionTimingOption을 useInAction으로 했는데 SpawnSkillObjectAction클래스의 Apply부분에서 에러가 발생합니다.public override void Apply(Skill skill){foreach (var targetPosition in skill.TargetPositions) // 이 부분에서 에러 발생{var skillObject = GameObject.Instantiate(skillObjectPrefab).GetComponent<SkillObject>();skillObject.transform.position = targetPosition + (Vector3.up * 0.001f);skillObject.Setup(skill, targetSearcherForSkillObject, duration, applyCount, objectScale);}} 에러는 다음 오류가 발생합니다.NullReferenceException: Object reference not set to an instance of an objectSpawnSkillObjectAction.Apply (Skill skill) (at Assets/Scripts/Core/Skill/Action/SpawnSkillObjectAction.cs:25)Skill.Apply (System.Boolean isConsumeApplyCount) (at Assets/Scripts/Core/Skill/Skill.cs:643)InActionState.Apply () (at Assets/Scripts/Core/Skill/StateMachine/State/InActionState.cs:75)InActionState.Enter () (at Assets/Scripts/Core/Skill/StateMachine/State/InActionState.cs:23)StateMachine`1[EntityType].ChangeState (StateMachine`1+StateData[EntityType] newStateData) (at Assets/Scripts/Core/StateMachine/StateMachine.cs:88)StateMachine`1[EntityType].ChangeState (State`1[EntityType] newState, System.Int32 layer) (at Assets/Scripts/Core/StateMachine/StateMachine.cs:99)StateMachine`1[EntityType].TryTransition (System.Collections.Generic.IReadOnlyList`1[T] transtions, System.Int32 layer) (at Assets/Scripts/Core/StateMachine/StateMachine.cs:117)StateMachine`1[EntityType].Update () (at Assets/Scripts/Core/StateMachine/StateMachine.cs:135)Skill.Update () (at Assets/Scripts/Core/Skill/Skill.cs:396)SkillSystem.UpdateSkills () (at Assets/Scripts/Core/Skill/SkillSystem.cs:165)SkillSystem.Update () (at Assets/Scripts/Core/Skill/SkillSystem.cs:76)
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
Effect만 이용하고 싶습니다.
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를 사용하니 초기화 과정에서 문제가 있는 것 같습니다. 아니면 혹시 다르게 사용할 방법이 있을까 싶어서 질문드려봅니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
스킬의 Statemachine에서 변수를 가져오는 방법이 있을까요
너무 많은 질문을 드려서 죄송합니다.InActionState에서 액션을 추가해서 이벤트를 통해서 SkillSystem에서 이벤트가 호출될때를 이용하려고 하는데 SkillSystem에서 직접적으로 해당 스킬을 가져와서 스킬의 StateMachine을 가져오려고해도 가져올수가 없습니다. 애니메이션 이벤트를 활용하는 함수에서Owner.StateMachine.GetCurrentState() is InSkillActionState ownerState를 이용하면 가져올수있을까 했는데 안되네요스킬의 statemachine의 내부에 있는 InActionState에서 Entity가 가진 변수를 가져오는건 알겠는데 skillsystem에서 skill의 statemachine에 포함되는 inActionstate의 변수를 가져오는 방법을 잘 모르겠습니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
InActionState에 추가하는 변수에 관하여 질문이 있습니다.
InActionState 플레이어의 입력을 받게 하려고 했는데 private PlayerInputEnum[] playerinput; 이렇게 변수를 만들고playerinput = Entity.Owner.PlayerEntityInput.playerInputList; 이거를 통해서 가져오려고 했는데 이걸 Setup에 넣으면 스테이트 머신이 고장나면서 버그가 발생하고KeyNotFoundException: The given key '0' was not present in the dictionary.System.Collections.Generic.Dictionary`2[TKey,TValue].get_Item (TKey key) (at <834b2ded5dad441e8c7a4287897d63c7>:0)StateMachine`1[EntityType].GetCurrentState (System.Int32 layer) (at Assets/Scripts/Core/StateMachine/StateMachine.cs:360)StateMachine`1[EntityType].GetCurrentStateType (System.Int32 layer) (at Assets/Scripts/Core/StateMachine/StateMachine.cs:363)Skill.GetCurrentStateType (System.Int32 layer) (at Assets/Scripts/Core/Skill/Skill.cs:600)Test.SkillTest.OnGUI () (at Assets/Scripts/Test/Skill/SkillTest.cs:53)UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr, Boolean&)Enter에 넣어야 멀쩡히 작동을해서 질문을 드립니다.다른 변수로 테스트를 해보아도 배열 형태의 변수만 버그가 발생하는것 같아 질문을 드립니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
스킬 사용에 관한 질문이 있습니다.
스킬시스템의public bool Use(Skill skill){ skill = Find(skill); Debug.Assert(skill != null, $"SkillSystem::IncreaseStack({skill.CodeName}) - Skill이 System에 등록되지 않았습니다."); return skill.Use();}여기에서 스킬을 사용한다는것은 알겠는데 등록되어있는 스킬을 사용하는 방식이 어떤건지 잘 모르겠습니다.모든 참조를 이용해서 찾아도 스킬테스트에서 사용한 것 말고는 없고 이벤트를 이용한것인가 싶어서 다 찾아보아도 안보여서 질문을 드립니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
스킬 구현 질문입니다
현재 제가 인벤토리를 만들어 사용할 스킬을 등록하는 스킬창과 획득한 스킬을 보관하는 스킬보관창을 만들었습니다스킬창에 있는 스킬은 활성화되고 보관창에 있는것은 비활성화되게 할려는 의도입니다.액티브 스킬의 경우 키를 눌러 발동하기 때문에 문제가 없는데패시브 스킬의 경우 스킬보관창에 있어도 계속해서 발동됩니다.그래서 패시브 타입인 경우 스킬보관창에 있을 경우 비활성화되게 하기 위해skill 스크립트와 skillsystem 스크립트에 비활성화 변수를 추가하여 의도한 목적을 제작할려고 하였는데어디에서 제어해야 하는지 감이 안잡혀 이 부분에 대해 어딜 수정해야 되는지에 대한 조언을 부탁드립니다...
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
object 형의 박싱 언박싱에 관련해서 궁금합니다.
안녕하세요. 강습 잘 시청하고 있는데 궁금한 부분이 생겨서요.object 형을 많이 쓰던데, 실제 게임을 이 상태로 스킬을 구현해서 출시한다고 한다면 박싱 언박싱에 관련해서 성능 이슈는 없을까요? (ex : Stat.cs Dictionary<object, Dictionary<object, float>> bonusValuesByKey .. ) IdentifiedObject.cs 에서 object Clone() => Instantiate(this); 무시할 만한 수준일지 , 코드가 더 복잡하게 구현될 요지가 있어서 강의용으로 범용적으로 작업하셨는지 해서요.아님 object 형이 아닌 좀 더 나은 방향이 있다면 의견 듣고 싶습니다. 감사합니다.
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
Getcomponent 호출 빈도에 관하여 질문이 있습니다.
저번에 조언해주신것을 통해서 다른 에셋들과 오픈소스들을 뜯어가면서 저만의 프레임워크를 설계중입니다.그런데 다른 객체의 스텟을 가져와서 영향을 주려면 Getcomponent종류를 사용 할 수밖에 없는 것 같아 보이고 강의에서도 Getcomponent스킬의 대상을 지정할때 사용되는것을 보고 질문을 드립니다.Getcomponent가 프레임 단위로 실행되는 수준만 아니면 되는건가요?그러면 혹시 다른 게임에서의 예시로 버그, 해킹 툴의 요소로 공격속도를 비정상적으로 올라간상태로 공격시 프레임드랍이 걸리는 이유가 이때 Getcomponent같은게 실행이 많이 되어서 그런걸까요? ex)다크소울이었는지 엘든링이었는지 기억이 나질 않지만 버그로 인해 프레임단위로 공격하고 렉을 유발시켰던걸로 기억합니다.public void SearchTargets(){var result = TargetSearcher.SearchTargets(Owner, Owner.gameObject);Targets = result.targets.Select(x => x.GetComponent<Entity>()).ToArray();TargetPositions = result.positions;}
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 스킬 시스템
TargetSearcher없이 어떻게 해야하는지 질문이 있습니다.
콜라이더를 이용해서 하는 공격은무기 콜라이더 액션을 만든다음에public class WeaponColliderAction : SkillAction{ [SerializeField] private string weaponSocketName; public override void Apply(Skill skill) { var socket = skill.Owner.GetTransformSocket(weaponSocketName); socket.AddComponent<SkillCollider>(); } public override object Clone() { return new WeaponColliderAction() { weaponSocketName = weaponSocketName }; }}무기에 해당하는 오브젝트를 찾아서 스킬 콜라이더 스크립트를 추가하고public class SkillCollider : MonoBehaviour{ private Entity owner; private Skill skill; public void Setup(Entity owner, Skill skill) { this.owner = owner; // 현재 Skill의 Level 정보를 저장하기 위해 Clone을 보관 this.skill = skill.Clone() as Skill; } private void OnTriggerEnter(Collider other) { if (other.GetComponent<Entity>() == owner) return; var entity = other.GetComponent<Entity>(); if (entity) entity.SkillSystem.Apply(skill); Destroy(gameObject); }}해당 스킬이 적용되게 구현을 하였는데 이런식으로 구현하는지 맞는지와 TargetSearcher없이 자기 자신에게 사용하는 스킬을 Skill스크립트에 있는 public Entity Owner { get; private set; }와 public IReadOnlyList<Entity> Targets { get; private set; }을 활용하면 될것같은데 어떻게 구현하는지 모르겠어서 질문드립니다. 너무 많은 질문을 드리는것같아 죄송합니다.