Элементы списка исчезают в воздухе

#c# #unity3d

Вопрос:

У меня есть несколько списков элементов, один из которых называется «currentInputs», который пользователь должен иметь возможность добавлять, нажимая клавиши, и «keyInputs», который представляет собой список авторизованных ключей, которые пользователь может ввести. Проблема в том, что всякий раз, когда я ввожу клавишу в «currentInputs», одна и та же клавиша исчезает из «keyInputs», что означает, что каждую клавишу можно нажать только один раз. Я не уверен, в чем причина этого, пожалуйста, помогите.

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class inputManager : MonoBehaviour
{

    public keyboardManager toCall;
    public List<KeyInput> _keyInputs;
    public List<KeyInput> _currentInputs;


    void Start()
    {
        _currentInputs = new List<KeyInput>();
    }

    void Update()
    {
        GetKeyInputs();
        toCall.GetInputs(_currentInputs);
    }

    private void GetKeyInputs()                         //finds all keyboard inputs on this frame
    {
        foreach (KeyInput input in _keyInputs)
        {
            if (Input.GetKeyDown(input.key))
            {
                _currentInputs.Add(input);
            }

            if (Input.GetKeyUp(input.key))
            {
                _currentInputs.Remove(input);
            }
        }
    }

}
 

Весь остальной код находится здесь

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class keyboardManager : MonoBehaviour
{
    public List<KeyInput> useableInputs;
    public List<GameObject> physicalKeys;


    public List<KeyInput> activeKeys;
    public List<KeyInput> lastActiveKeys;              //active means this key is down, inactive means this key is up, and dead means this key was recently released and is now recharging
    public List<KeyInput> inactiveKeys;
    public List<KeyInput> deadKeys;
    private List<KeyInput> releasedKeys;
    public List<KeyInput> temp;

    public inputManager inp;

    void Start()
    {
        useableInputs = new List<KeyInput>();
        lastActiveKeys = new List<KeyInput>();
        inactiveKeys = inp._keyInputs;
    }


    public void GetInputs(List<KeyInput> newInputs)     //selects the correct inputs to use, first to execute
    {
        lastActiveKeys = activeKeys;
        releasedKeys = new List<KeyInput>();
        activeKeys = new List<KeyInput>();
        while (newInputs.Count > 0 amp;amp; activeKeys.Count < 3)
        {
            temp = newInputs;

            if (deadKeys.Contains(newInputs[0]))
            {
                newInputs.RemoveAt(0);
            }
            else
            {
                inactiveKeys.Remove(newInputs[0]);
                activeKeys.Add(newInputs[0]);
                newInputs.RemoveAt(0);
            }
        }
        activeInactiveDead();
    }

    private void activeInactiveDead()                   //checks what is active or inactive or dead, second to execute
    {
        foreach (KeyInput k in lastActiveKeys)
        {
            if (!activeKeys.Contains(k))                //kills keys
            {
                releasedKeys.Add(k);
                deadKeys.Add(k);
                SpriteRenderer sprite = getGObject(k).GetComponent(typeof(SpriteRenderer)) as SpriteRenderer;
                sprite.color = Color.grey;
            }
        }
        foreach(KeyInput k in deadKeys)
        {
            SpriteRenderer sprite = getGObject(k).GetComponent(typeof(SpriteRenderer)) as SpriteRenderer;
            if(sprite.color == Color.white)
            {
                deadKeys.Remove(k);
                inactiveKeys.Add(k);                    //after .5 seconds, the key has returned to white and can be re used
            }
            else
            {
                sprite.color = Color.Lerp(Color.grey, Color.white, Mathf.PingPong(Time.time, 1));
            }
        }
    }


    private GameObject getGObject(KeyInput k)
    {
        foreach(GameObject p in physicalKeys)
        {
            if(p.name == k.name)
            {
                print("found");
                return p;
            }
        }
        Debug.LogError("error object not found");
        return new GameObject();
    }
}
 
 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class KeyInput
{
        public string name;
        public KeyCode key;
}
 

Комментарии:

1. Что toCall.GetInputs(_currentInputs); происходит? Пожалуйста, напишите, пожалуйста, похоже, что проблема находится в этом месте.

2. Я отредактировал сообщение, чтобы добавить остальную часть моего кода, я не смог найти в нем проблем, которые могли бы вызвать эту ошибку, но, может быть, кто-то другой сможет

3. Это вызывает функцию в части кода KeyboardManager, которая затем фактически что-то делает с данными, которые ей были даны

Ответ №1:

Ну, вы назначаете

 inactiveKeys = inp._keyInputs;
 

поэтому с этого момента в обоих полях будет содержаться одна и та же ссылка на один и тот же объект списка. Таким образом, каждое изменение в inactiveKeys нем также применяется к одному и тому же объекту списка ссылок _keyInputs .

Позже вы это сделаете

 inactiveKeys.Remove(newInputs[0]);
 

где вы удаляете этот элемент из своего списка.


Похоже, что на самом деле вам просто нужна КОПИЯ списка, чтобы вы могли использовать, например

 inactiveKeys = new List<KeyInput>(inp._keyInputs);
 

Комментарии:

1. черт, я думал, что он просто сделал копию:/, спасибо за помощь!