Comments (12)
оказалось, что Ecs.Update() так работает уже месяца три минимум - не выкидывает в момент вызова сущности из группы сразу после entity.Remove<ComponentMoveBezierLine>();
просто ранее не замечал, т.к. не мешало ничему
from actors.unity.
Привет, спасибо за репорт. Не совсем понимаю необходимость в такой сложной конструкции на for и ecs.update -
пробовал цикл в обратном порядке прокручивать или foreach?
from actors.unity.
привет-привет)
для эксперимента сейчас тик такой
private bool check = false;
public void Tick(float delta)
{
if (source.length <= 0) return;
// проверка условия для окончания движения
foreach (var entity in source)
{
var cMove = entity.ComponentMoveBezierLine();
if (cMove.observedDistance < cMove.distanceFull) continue;
cMove.callBack?.ActionInvoke();
if (entity.Has<ComponentMoveBezierLine>()) entity.Remove<ComponentMoveBezierLine>();
//cMove.callBack = default;
check = true;
Debug.Log($" entity({entity}) callBack default source.length = {source.length} ");
}
Ecs.Update(); // чтобы сущность ушла из группы, если было удаление выше
if (check)
{
check = false;
Debug.Log($" callBack default source.length = {source.length} ");
}
в лог выдает так
https://gyazo.com/fa5ac51e9e5364a0b6638c3540b8e08b
т.е. после Ecs.Update(); дебаг в лог уже не выдает. значит падает в Ecs.Update(); при повторной проходке по foreach - там в группе явно остается сущность, которой компонент в акшоне удалили. cейчас еще попробую побольше до команды Ecs.Update(); инфу собрать в дебаге
from actors.unity.
непонятно. теперь код такой:
private bool check = false;
//private bool sourcechanged = true;
public void Tick(float delta)
{
if (source.length <= 0) return;
if (check)
{
check = false;
Debug.Log($" сюда можем попасть только если сущности удалили ComponentMoveBezierLine и запустили Ecs.Update() source.length({source.length}) ");
}
// проверка условия для окончания движения
foreach (var entity in source)
{
var cMove = entity.ComponentMoveBezierLine();
if (cMove.observedDistance < cMove.distanceFull) continue;
cMove.callBack?.ActionInvoke();
if (entity.Has<ComponentMoveBezierLine>()) entity.Remove<ComponentMoveBezierLine>();
//cMove.callBack = default;
check = true;
Debug.Log($" entity({entity}) callBack default source.length = {source.length} ");
}
Ecs.Update(); // чтобы сущность ушла из группы, если было удаление выше
if (check)
{
check = false;
Debug.Log($" сюда уже не попадаем после Ecs.Update() ");
}
лог не поменялся
https://gyazo.com/ec9f264c31ff001e4bbed82e3b4426a7
from actors.unity.
выглядит как-будто в момент Ecs.Update(); происходит вторая проходка по группе foreach (var entity in source)... а т.к. оттуда сущность не ушла - то и выдает исключение.
на всякий случай - первая строчка лога на скриншоте
Debug.Log($" entity({entity}) callBack default source.length = {source.length} ");
встречается в логе один единственный раз. т.е. до этого группу никто не покидал ни разу
from actors.unity.
private bool check = false;
public void Tick(float delta)
{
if (source.length <= 0) return;
if (check)
{
check = false;
Debug.Log($" сюда можем попасть только если сущности удалили ComponentMoveBezierLine и запустили Ecs.Update() source.length({source.length}) ");
}
// проверка условия для окончания движения
foreach (var entity in source)
{
var cMove = entity.ComponentMoveBezierLine();
if (cMove.observedDistance < cMove.distanceFull) continue;
Debug.Log($" проверка До удаления ComponentMoveBezierLine entity({entity}) callBack default source.length = {source.length} ");
cMove.callBack?.ActionInvoke();
if (entity.Has<ComponentMoveBezierLine>()) entity.Remove<ComponentMoveBezierLine>();
Debug.Log($" проверка после удаления ComponentMoveBezierLine entity({entity}) callBack default source.length = {source.length} ");
//cMove.callBack = default;
check = true;
}
Ecs.Update(); // чтобы сущность ушла из группы, если было удаление выше
if (check)
{
check = false;
Debug.Log($" сюда уже не попадаем после Ecs.Update() ");
}
https://gyazo.com/8bfe2748307066655261ce9bc0715595
from actors.unity.
новая инфа. сущность в группе всегда одна с номером 44, но длина группы равна 2
private bool check = false;
public void Tick(float delta)
{
if (source.length <= 0) return;
if (check)
{
Debug.Log($" сюда можем попасть только если сущности удалили ComponentMoveBezierLine и запустили Ecs.Update() source.length({source.length}) ");
}
// проверка условия для окончания движения
foreach (var entity in source)
{
var cMove = entity.ComponentMoveBezierLine();
Debug.Log($"сущности в группе {entity.id}) ");
if (cMove.observedDistance < cMove.distanceFull) continue;
Debug.Log($" проверка До удаления ComponentMoveBezierLine entity({entity}) callBack default source.length = {source.length} ");
cMove.callBack?.ActionInvoke();
if (entity.Has<ComponentMoveBezierLine>()) entity.Remove<ComponentMoveBezierLine>();
Debug.Log($" проверка после удаления ComponentMoveBezierLine entity({entity}) callBack default source.length = {source.length} ");
//cMove.callBack = default;
check = true;
}
Ecs.Update(); // чтобы сущность ушла из группы, если было удаление выше
if (check)
{
check = false;
Debug.Log($" сюда уже не попадаем после Ecs.Update() ");
}
https://gyazo.com/6931ba8273bc6215a3ce482b52b2a32f
from actors.unity.
При использовании foreach Ecs.Update не нужен
from actors.unity.
ок. все убрал. новая инфа
public void Tick(float delta)
{
if (source.length <= 0) return;
foreach (var entity in source)
{
Debug.Log($"сущности в группе {entity.id} age {entity.age} source.length = {source.length} ");
}
// проверка условия для окончания движения
foreach (var entity in source)
{
var cMove = entity.ComponentMoveBezierLine();
if (cMove.observedDistance < cMove.distanceFull) continue;
cMove.callBack?.ActionInvoke();
if (entity.Has<ComponentMoveBezierLine>()) entity.Remove<ComponentMoveBezierLine>();
check = true;
}
handleJobMove.Complete();
все время до исключения 338 кадров пишет, что в группе две сущности c одинаковым айди и age (age паблик сделал для теста)
https://gyazo.com/c6823225f6284ffa8aa3538e4205b440
from actors.unity.
в общем, спасибо. ничего не горит. тред не закрываем) если что - проверю любые изменения и предложения. в дебаг лог это пишется - не забуду. у меня все работает, т.к. как только обнуляю акшон для "реальной" сущности из этих двух, то ошибку не выкидывает - в игре странностей нет - и можно работать дальше. т.е. чтобы все работало просто раскомичиваю себе строчку cMove.callBack = default;
и уже лишняя та же самая сущность не мешает
from actors.unity.
на всякий случай - актор с этой сущностью 44 изначально находится на подгружаемой дополнительной сцене. возможно он как-то дважды инитится....
https://gyazo.com/09e21d6b5fe65e35ce7da07f7f3e1d79
from actors.unity.
Закрыто, баг был поправлен в #79
from actors.unity.
Related Issues (20)
- 🐞 Entities don't manage groups and components correctly HOT 1
- 🐞 Entities don't manage groups correctly
- 📘 Add Layer.Add<T>
- 🐞 ACTORS_EVENTS_MANUAL doesn't work correctly HOT 10
- 📘 Remove unused Require & RequireTags Attribute
- 📘 Add stop method for observers
- There is a typo at line 647 of README.md
- 🐞 HandleEnable does not work correctly
- 🐞 Method SliceFlip<T> does not work correctly.
- 📘 Layer.Add should take already defined objects
- 🐞 [ReadOnly] attribute breaks inspector positions
- 📘 API for removing transforms from entities
- 🐞 There is no API for getting a segment from the buffer by pointer.
- 🐞 Incorrect entity behavior with delayed component setup HOT 1
- 🐞 Entity can be added twice to the group HOT 1
- 🐞 Entity childs are not cleaned when a layer is reloaded HOT 1
- 🐞 Pooling didn't worked for Actor objects
- Change entity release routine
- groups with an exclude attribute are not removed from the cacheGroups during Dispose
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from actors.unity.