Code Monkey home page Code Monkey logo

Comments (12)

trafficshark8 avatar trafficshark8 commented on June 9, 2024

оказалось, что Ecs.Update() так работает уже месяца три минимум - не выкидывает в момент вызова сущности из группы сразу после entity.Remove<ComponentMoveBezierLine>(); просто ранее не замечал, т.к. не мешало ничему

from actors.unity.

PixeyeHQ avatar PixeyeHQ commented on June 9, 2024

Привет, спасибо за репорт. Не совсем понимаю необходимость в такой сложной конструкции на for и ecs.update -
пробовал цикл в обратном порядке прокручивать или foreach?

from actors.unity.

trafficshark8 avatar trafficshark8 commented on June 9, 2024

привет-привет)
для эксперимента сейчас тик такой

        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.

trafficshark8 avatar trafficshark8 commented on June 9, 2024

непонятно. теперь код такой:

	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.

trafficshark8 avatar trafficshark8 commented on June 9, 2024

выглядит как-будто в момент Ecs.Update(); происходит вторая проходка по группе foreach (var entity in source)... а т.к. оттуда сущность не ушла - то и выдает исключение.
на всякий случай - первая строчка лога на скриншоте
Debug.Log($" entity({entity}) callBack default source.length = {source.length} ");
встречается в логе один единственный раз. т.е. до этого группу никто не покидал ни разу

from actors.unity.

trafficshark8 avatar trafficshark8 commented on June 9, 2024
        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.

trafficshark8 avatar trafficshark8 commented on June 9, 2024

новая инфа. сущность в группе всегда одна с номером 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.

PixeyeHQ avatar PixeyeHQ commented on June 9, 2024

При использовании foreach Ecs.Update не нужен

from actors.unity.

trafficshark8 avatar trafficshark8 commented on June 9, 2024

ок. все убрал. новая инфа

	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.

trafficshark8 avatar trafficshark8 commented on June 9, 2024

в общем, спасибо. ничего не горит. тред не закрываем) если что - проверю любые изменения и предложения. в дебаг лог это пишется - не забуду. у меня все работает, т.к. как только обнуляю акшон для "реальной" сущности из этих двух, то ошибку не выкидывает - в игре странностей нет - и можно работать дальше. т.е. чтобы все работало просто раскомичиваю себе строчку cMove.callBack = default; и уже лишняя та же самая сущность не мешает

from actors.unity.

trafficshark8 avatar trafficshark8 commented on June 9, 2024

на всякий случай - актор с этой сущностью 44 изначально находится на подгружаемой дополнительной сцене. возможно он как-то дважды инитится....
https://gyazo.com/09e21d6b5fe65e35ce7da07f7f3e1d79

from actors.unity.

PixeyeHQ avatar PixeyeHQ commented on June 9, 2024

Закрыто, баг был поправлен в #79

from actors.unity.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.