Программа: Unity 6
Редактор кода: Visual Studio Code
Отказ от ответственности: английский не является моим родным языком, поэтому я использую инструменты перевода. Я прошу прощения, если контекст или формулировка кажется странным.
Я в настоящее время пытаюсь справиться с системой ввода Unity в архитектуре ECS Component System). Я изо всех сил пытаюсь понять, почему определенная часть моей реализации не работает, как и ожидалось. Я экспериментировал с кодом отладки для проверки приема пользовательского ввода. Тем не менее, методы, которые обнаруживают изменения состояния в рамке, в частности, Action. Следующие проверки: < /p>
Проверено настройки актива актива ввода. Подтверждено, что взаимодействие не добавляется в привязки. Настройки пакета системы ввода в настройках проекта - по умолчанию (режим обновления - это события процесса в динамическом обновлении). < /P>
Измененный порядок выполнения системы: попытка перенести inputgatheringsystem для более поздних групп обновления (например, с симуляционной системой, даже презентациями, для управления вопросами времени, связанными с тем, чтобы работать слишком рано. (Это не решило проблему). < /P>
Проверено не специфичное для действия: подтверждено, что проблема не ограничена только действием «прыжков». Когда я изменил код, чтобы прочитать действие «атаки», используя Waspresediteframe, он также не смог обнаружить пресс, тогда как использование Ispresed для «атаки» работала нормально. Они также не смогли вернуть True, когда ожидалось. Тем не менее, тщательная проверка и поиск журналов подтвердил, что такой журнал не был сгенерирован, что указывает на то, что условие, вероятно, никогда не оцениваемое на True. < /P>
текущий контекст программы: < /strong> < /p>
my setup следуют за этим основным потоком: < /p>
Если мой фундаментальный подход к реализации для чтения ввода в ECS является ошибочным, я был бы очень благодарен за правильное способ достижения этого, особенно для обнаружения дискретных событий кнопки, таких как WaspresedThisFrame. < /P>
< /press> < /p> < /p> < /pr /> < /hr />
< /pressframe. /> inputcomponent.cs
Код: Выделить всё
using Unity.Entities;
using Unity.Mathematics;
public struct PlayerInputSingletonTag : IComponentData { }
public struct InputData : IComponentData
{
public float2 MoveDirection;
public bool JumpButtonDown;
public bool FireButtonHeld;
}
Код: Выделить всё
using Unity.Entities;
using UnityEngine;
public class InputSingletonAuthoring : MonoBehaviour
{
class InputSingletonBaker : Baker
{
public override void Bake(InputSingletonAuthoring authoring)
{
var entity = GetEntity(TransformUsageFlags.None);
AddComponent(entity, new InputData());
AddComponent(entity, new PlayerInputSingletonTag());
}
}
}
Код: Выделить всё
using Unity.Entities;
using Unity.Mathematics;
using UnityEngine.InputSystem;
using UnityEngine;
using InputSystem;
[UpdateInGroup(typeof(InitializationSystemGroup))]
public partial class InputGatheringSystem : SystemBase
{
private InputSystem.InputSystem playerControls;
protected override void OnCreate()
{
RequireForUpdate
();
playerControls = new InputSystem.InputSystem();
playerControls.Player.Enable();
}
protected override void OnUpdate()
{
ref InputData inputData = ref SystemAPI.GetSingletonRW().ValueRW;
InputAction moveAction = playerControls.Player.Move;
InputAction jumpAction = playerControls.Player.Jump;
InputAction fireAction = playerControls.Player.Attack;
inputData.MoveDirection = moveAction.ReadValue();
inputData.JumpButtonDown = jumpAction.WasPressedThisFrame();
inputData.FireButtonHeld = fireAction.IsPressed();
}
protected override void OnDestroy()
{
playerControls?.Player.Disable();
playerControls?.Dispose();
}
}
Код: Выделить всё
using Unity.Entities;
using Unity.Mathematics;
using UnityEngine;
[UpdateInGroup(typeof(SimulationSystemGroup))]
public partial class DebugInputSystem : SystemBase
{
protected override void OnUpdate()
{
if (!SystemAPI.HasSingleton())
{
return;
}
InputData currentInput = SystemAPI.GetSingleton();
Debug.Log($"[Input Debug] Move: {currentInput.MoveDirection}, Jump Pressed: {currentInput.JumpButtonDown}, Fire Held: {currentInput.FireButtonHeld}");
}
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... -ispressed
Мобильная версия