У меня возникли проблемы с обновлением элементов в моем List
, кто-нибудь знает, почему этот код не работает? refScript1.selfCollide
— это ссылка на bool из моего скрипта PlayerProximityHitboxes
. Эти логические значения обновляются в событии OnTriggerEnter
и OnTriggerExit
в другом скрипте. Я новичок в списках, поэтому я чувствую, что пропустил что-то очевидное.
public class HitboxManager : MonoBehaviour
{
public bool frontCollide, rightCollide, backCollide, leftCollide;
public PlayerProximityHitboxes refScript1, refScript2, refScript3, refScript4;
public List<bool> hitboxDir = new List<bool>();
void Start()
{
hitboxDir.Add(refScript1.selfCollide);
hitboxDir.Add(refScript2.selfCollide);
hitboxDir.Add(refScript3.selfCollide);
hitboxDir.Add(refScript4.selfCollide);
}
void Update()
{
//referencing the index doesn't seem to work, here's my attempt at doing so
//frontCollide = hitboxDir[0];
//rightCollide = hitboxDir[1];
//backCollide = hitboxDir[2];
//leftCollide = hitboxDir[3];
//this works, but I want to be able to sort by indexes so I can reorder them.
frontCollide = refScript1.selfCollide;
rightCollide = refScript2.selfCollide;
backCollide = refScript3.selfCollide;
leftCollide = refScript4.selfCollide;
}
}
Объекты bool являются типами значений, что означает, что они будут скопированы в поле списка при запуске как «true, false..etc», либо вам нужно очистить список и добавить их снова при каждом обновлении кадра, либо использовать значение ссылочного типа.
Вы сохраняете значение в список, и если оно изменилось в refscript
, это не повлияет на ваше значение в списке. Вы должны сохранить ссылку на скрипт, а затем получить от него значение.
...
public List<PlayerProximityHitboxes> hitboxDir = new List<PlayerProximityHitboxes>();
...
void Start()
{
hitboxDir.Add(refScript1);
hitboxDir.Add(refScript2);
hitboxDir.Add(refScript3);
hitboxDir.Add(refScript4);
}
void Update()
{
frontCollide = hitboxDir[0].selfCollide;
rightCollide = hitboxDir[1].selfCollide;
backCollide = hitboxDir[2].selfCollide;
leftCollide = hitboxDir[3].selfCollide;
}
См. здесь дополнительную информацию о типах Ref и Value http://net-informations.com/faq/general/valuetype-referencetype.htm
Да, это сработало! Спасибо, я понятия не имел, что вы можете просто использовать ссылочный тип в качестве резервного типа для списка.
логическое значение ссылка не указана: Ссылка на документацию, объясняющую, что bool является структурой.
Вы фактически описали свою проблему именно словами «ссылка на bool». Вы копируете значение boolean
. В памяти это единственный "бит", который копируется и заменяет значение. Когда вы делаете:
//Simple types (all structs, ints, booleans, chars, bytes, ...)
bool a = true;
bool b = a; //Passed value to variable
a = false;
Console.WriteLine(b); //You will get `True` here
//Compared to some class/reference to classes
PlayerProximityHitboxes a = new PlayerProximityHitboxes();
PlayerProximityHitboxes b = a;
b.DoSomeUpdate(); //both `a` and `b` are same object
Console.WriteLine(b); //Same output as for `a`
Что вы можете сделать, так это сохранить ссылку на объекты в list
и проверить его логическое значение/обновить его:
public class HitboxManager : MonoBehaviour
{
public bool frontCollide, rightCollide, backCollide, leftCollide;
public PlayerProximityHitboxes refScript1, refScript2, refScript3, refScript4;
public List<bool> hitboxDir = new List<bool>();
void Start()
{
hitboxDir.Add(refScript1);
hitboxDir.Add(refScript2);
hitboxDir.Add(refScript3);
hitboxDir.Add(refScript4);
}
void Update()
{
frontCollide = hitboxDir[0].selfCollide;
rightCollide = hitboxDir[1].selfCollide;
backCollide = hitboxDir[2].selfCollide;
leftCollide = hitboxDir[3].selfCollide;
}
Какую ошибку вы получаете?