#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. черт, я думал, что он просто сделал копию:/, спасибо за помощь!