#archived-dots

1 messages · Page 245 of 1

dense crypt
#

Depending on your needs you could also use RequireForUpdate / RequireSingletonForUpdate

hot basin
#

RequireForUpdate is helpful because it prevents whole OnUpdate() run not only single .ForEach()

verbal pewter
#

Hey all! What's the recommended way to store a list that's meant to be accessible and modified by a system? I tried creating a NativeList in OnCreate, but I'm getting the following error: Burst error BC1042: The managed class type Unity.Collections.NativeList1<Unity.Entities.Entity>* is not supported. Loading from a non-readonly static field RockMine.C4.Agents.NavigationDijkstraPathingSystem._navigationQualityGroupEntities is not supported. Do I need to create a dummy entity with a DynamicBuffer to store this data? Or is there a simpler way?

dense crypt
#
public class SomeSystem : SystemBase
{
    private NativeList<Entity> _entities;

    protected override void OnCreate()
    {
        _entities = new NativeList<Entity>(16, Allocator.Persistent);
    }

    protected override void OnDestroy()
    {
        _entities.Dispose();
    }
}
rustic rain
#

welp, now this weird bug persists even in build

haughty rampart
#

ok, small question: does anyone have experience in rust? if so, what is the c# equivalent to usize?

rotund token
#

not familiar with rust but is that just the size of int?

haughty rampart
#

no. at least i don't think so

rotund token
#

oh it's the size of the pointer

#

IntPtr.Size

coarse turtle
#

usize is platform dependent

rotund token
coarse turtle
#

So on 64 bit machines believe it should be a 64 bit uint

rotund token
#

The IntPtr type is designed to be an integer whose size is platform-specific. That is, an instance of this type is expected to be 32-bits on 32-bit hardware and operating systems, and 64-bits on 64-bit hardware and operating systems.

#

so is IntPtr

#

is it not equiv?

coarse turtle
#

Should be equivalent

haughty rampart
#

the thing is, i want to convert some rust code and in there it's let tmp = someNumber as usize which....doesn't make much sense when IntPtr.Size is an int value

coarse turtle
#

Could treat it as a 32 bit uint if you know the upper and lower bounds of the whatever the rust side is doing?

haughty rampart
#

yeah i've just cast it to long since i'm on a 64 bit machine, so i guess it should be fine. but i was just curious about usize

rotund token
#

what is somenumber anyway

haughty rampart
#

or should i use ulong?

haughty rampart
rotund token
#

is it being converted or just reinterpreted?

coarse turtle
#

Oh, maybe stick with ulong if you don't wanna lose bytes during the conversion from 64 to 32 bit?

haughty rampart
#

e.g. 1 line is index[3] = (iseed as f64 / F32 * SOLIDS.len() as f64) as usize;

coarse turtle
#

Yea I guess ulong would make sense

haughty rampart
#

but yeah, maybe i'll change these things to ulong. i literally have no experience in rust so, it's been a bit of guesswork and googling

coarse turtle
#

Yea id probably just stick with ulong.

verbal pewter
# dense crypt It's perfectly fine to use NativeList in Systems, not sure why you're getting an...

Yeah, it's strange. I wonder if it's because in my case _entities is static? From my understanding, methods called inside OnUpdate need to be static, right? At least I'm getting the following error if they're not static: error DC0002: Entities.ForEach Lambda expression invokes 'GoalBufferUpdate' on a NavigationDijkstraPathingSystem which is a reference type. This is only allowed with .WithoutBurst() and .Run(). In order for it to be accessible from within other methods, _entities needs to be either static or passed as an argument to the methods called in OnUpdate. When it's static I get the error in my original question. When I pass it as an argument I get the following error: error DC0001: Entities.ForEach Lambda expression uses field '_navigationQualityGroupEntities in a reference type'. Either assign the field to a local outside of the lambda expression and use that instead, or use .WithoutBurst() and .Run(). I have no idea what else to try, honestly.

rotund token
#

@verbal pewter i feel like you're doing something like this

#

protected override OnUpdate()
{
    Job.WithCode(() => {
        var entity = _entities[0]
    }```
#

you can't access the list in that scope

#

protected override OnUpdate()
{
    var entities = _entities;

    Job.WithCode(() => {
        var entity = entities[0]
    }
#

is what you need to do

verbal pewter
#

Oh really? Let me give that a try.

#

Yep, that seemed to have fixed it! What a completely unintuitive thing to have to do. Anyways, thank you!

rotund token
#

i always felt this is the problem with new people learning entities and their first experience being entities.foreach/job.withcode

#

it completely hides what's going on under the hood

#

for any new dev i need to teach it's the last thing i show them and by this time these quirks all make sense

verbal pewter
#

Yeah, fair enough

rotund token
#

but yeah, not really any fault of your own. it's just how it's presented these days in both the manual and most online tutorials

#

and there are a lot of quirks you have to hurdle across which makes starting with entities a huge pain for many people

verbal pewter
#

For sure

rotund token
#

like a quick question, i'm not sure of your experience so maybe this is obvious to you but do you know that Entities.ForEach/Job.WithCode isn't actually real code, it's just a stub and the whole thing is code generated under the hood?

lusty pewter
#

hi. is it possible to view the generated code?

rotund token
#

@lusty pewter

haughty rampart
#

when they change to source generators (hopefully) that'll be much more nicer too

lusty pewter
#

so it generates me an IJobChunk job which is superseded by IJobEntityBatch according to the docs?🧐

lusty pewter
#

good point

lusty pewter
rotund token
lusty pewter
#

the docs for EntityCommandBuffer.AddComponent(EntityQuery, ComponentType) state that "The query is performed at playback time, not when the method is called.". does anyone by chance now if this is guaranteed to be before or after any other changes are executed?

dense crypt
rotund token
#

currently it executes at the time the command buffer plays back, so the entities it could be used on are different to when it's called

lusty pewter
#

so the EntityQuery is handled the same way as any other recorded change? i usually use EntityCommandBuffer.AddComponent(Entity, ComponentType) to record changes and not the EntityQuery version

rotund token
#

from memory, in 0.50 it will on the spot query all entities it could match then store them in the buffer

#

this is much slower but much more predictable

lusty pewter
#

so if i have changes in the buffer that generate entities that match the query they will be changed as well?

rotund token
#

if they were passed to the buffer (or another buffer) before you call this method

#

then yes they will also be affected (currently)

#

in 0.50 they will not

lusty pewter
#

i see. thank you very much.

lusty pewter
rotund token
#

i'm pretty certain a dev posted this on the forums otherwise i've said something i shouldn't 😅

#

it was just a random post in one of the longer threads so i cbf finding the source

lusty pewter
#

if someone asks i tell them i didn't read anything 😉

rustic rain
#

didn't read what?

rotund token
#

here we go: https://forum.unity.com/threads/question-with-ecb-removecomponent-t-entityquery.1209505/#post-7725696

It turns out that the EntityCommandBuffer commands which evaluate their EntityQuery targets at playback time are problematic for many reasons; this is one of them. We've removed them internally for the next DOTS release; going forward, the EntityCommandBuffer.*ForEntityQuery() variants will be the only way to target queries with ECB commands. These variants evaluate the provided query at command-recording time, and serialize the list of matching entities. This can be slower than the alternative for queries matching a large number of entities, but provides a much more predictable (and less error-prone) experience.

rustic rain
#

I actually just wondered

#

what if

#

instead of changing archetypes of certain entity

#

you'll create new entity of your wanted archetype instead and just copy all values over to it from old entity. and then remove it.
Like do it all yourself.
Is it gonna be as slow as changing archetype or?

lusty pewter
#

it's a structural change just like adding or removing a component which is slow

rustic rain
#

but adding/removing entities is not structural

#

or is it?

lusty pewter
rustic rain
#

ah

tawdry iron
#

So I did this and I'm kinda stuck again cus I'm not sure WHY this is happening:

I had a path creator system in my assets that I used a while ago and decided to reuse for this, since it seemed to be along the same line of thought. It's really simple and normal gameObjects simply follow the path by just attaching a script that is already inported with the Asset

#

Using this I make a path, turned it into an entity, attached the entity to the main spawn system as a prefab and attached the follower code to the bees

#

but for some reason it's not working
I checked that the path is spawning and the code is correct as well as converted to an entity but I'm not sure what I'm doing wrong?

frosty siren
#

Is reading from NativeStream is fast as from NativeArray?

rotund token
#

no

#

nothing can really be as fast as reading a native array, it's pretty much direct memory access

#

but nativestream allows parallel writing and reading which is a huge benefit

hollow jolt
#

how to overcome the limit of arguments in the Entities ForEach method

candid epoch
hollow jolt
#

that's nice , thanks

pulsar jay
#

How would you handle a projectile that gets stuck in the enemy when hit? If you just parent the projectile to the entity the parent component will become invalid and trigger an error as soon as the enemy is being destroyed.

haughty rampart
pulsar jay
#

so you mean crawling through children of the enemy and check each one if it has a component of type projectile and destroy it?

pulsar jay
haughty rampart
#

i thought you parented it to the enemy? just get it from the children component and destroy the projectile. also, if you have parented the entities correctly, it should automatically destroy the projectile

pulsar jay
pliant pike
#

I don't suppose anyone can tell if I've got the thinking of the below code correctly

#
 if (!TempRecordEventBool.boolVal && currRobstate.currrobstat != RobotState.PackingShopping && currTillat.floatVal == 0)
            {                
                return;
                
            }```
#

if put inside a job that means it should exit the job straight away if any of the above statements are true correct

deft stump
#

is it possible to not schedule the job instead of doing checks inside it?

pliant pike
#

not really I've tried that way and can't get it to work

#

althought thinking about it I could just surround the whole job within the If(TempRecordEvent.Bool) code 🤔

hot basin
#

is thera a way to store NativeArray outside of a system?

#

in ECS*

pliant pike
hot basin
#

not using any unsafe code*

pliant pike
#

if you need arrays outside systems then you use DynamicBuffers

hot basin
#

as far as I know you shouldn't keep any data in systems so how should I keep i.e. native hash map?

pliant pike
#

there's no rule against it you can keep data in systems if you want

#

it can just be a bit more hassle to get it when you need it

hot basin
#

you should keep it lightweight

#

and data means violation of stateless systems

pliant pike
#

yeah but rules are made to be broken and sometimes you've just gotta do what works

hot basin
#

if there is such rule

#

then theree should be a way to keep it

pliant pike
#

I mean DOTS is still really new and people are still figuring out all the rules and supposed correct ways to use it

hot basin
#

maybe dots but DOD or ECS exists for a long time

#

but seems DOTS has only DB to contain arraylike data

#

seems reasonable to while thinking about entities like i.e. units

#

but it's strange to keep my map as a dynamic buffer

#

especially when restricted to single thread write

misty wedge
#

I know I already recently asked this, but I forgot my follow up, so here it is again:

Is StepPhysicsWorld incredibly slow for anyone else? Even with a single physics entity it takes up like 6 ms

#

This is with all safety features turned off

#

Burst on

#

Using normal unity physics

tulip robin
#

Hello guys,

After many test with AsyncGPU, i have last question.

Who is more efficient for no loose frame.
Step one with sync or
Step two with async ?

verbal pewter
#

What's the best practices recommendation for cases where you need to have settings accessible and changeable within jobs? As an example, I'd like to keep track of a simulationStep value that gets updated every step. This needs to be settable at the start of the program running since it's going to be saved between play sessions. I was hoping to create a static class with static values, but it seems that Burst can only access static values that are also marked as readonly. My only thought is to create an entity that will have a SettingsData component on it. Then it would be accessed/modified in the same way as any other component. Is there a better way to go about this?

rustic rain
#

I assume direct static property is faster than any singleton entity component, or?

#

not relevant to question above

verbal pewter
#

It's actually kind of relevant to my question hahah, I didn't know about singleton entities. That's probably what we're meant to use for settings shared across the project. But as far as I can tell this can't be used in cases where you'd want settings to be a list (or DynamicBuffer, I guess). Still seems like creating an entity to store all the data and DynamicBuffers representing your settings is the way to go.

candid epoch
verbal pewter
#

Ahhhhh thanks for mentioning GetSingletonEntity, learning all kinds of things tonight. That should let me get DynamicBuffers as well.

candid epoch
verbal pewter
#

Can you clarify what you mean by "update requirement"? Is that a way to ensure there are no updates unless the singleton exists?

candid epoch
verbal pewter
#

Yes

#

I'm pretty new to this though

whole inlet
#

What is the array equivalent for use inside an Entities.ForEach? I have an array with 3 items that does not need to be added to. I can't use array or any ienumerable as it's not burst compatible

left oak
#

You can also specify .WithReadOnly() in the Entities.ForEach

candid epoch
#

didn't find the docs section i wanted. i'll send a better link later

whole inlet
verbal pewter
# candid epoch you can use https://docs.unity3d.com/Packages/com.unity.entities@0.9/api/Unity.E...

Thanks for the link, I think I understand. Along with that I was looking at GetSingletonEntity a bit closer. It looks like that's part of ComponentSystemBase, so it can't be called from a MonoBehavior, for example. In the case of needing to be able to set a simulationStep value at the start of the program, it seems like you'd need to: 1) Create the entity in the MonoBehavior, 2) Add the component to the entity in the MonoBehavior, 3) In the OnCreate method of a system, get the entity, get the component data from the entity, and set that component data as a singleton. Does that sound right?

left oak
left oak
#

Also, the singleton exists on merit as being the only instance of that component. SetSingleton updates the VALUE of the component data that is the only one of its kind. You do not designate a componentdata AS a singleton

verbal pewter
#

Okay, makes sense, thank you

left oak
#

honestly, we have no idea what you're really doing with that except that it seems like you're trying to reuse a Monobehaviour script that was applied to each bee GO and wondering why it's not working in a entities environment. There are myriad possible reasons for this.

tawdry iron
left oak
#

I mean, do you have a system managing the bees locomotion? I understand that you're generating a path somehow, but what's moving the bees around it?

left oak
#

uhhh are your bees game objects?

#

ok so they're definitely prefab instantiations

tawdry iron
#

yes, they are

#

prefabs, I mean

left oak
#

So, the path follower monobehaviour has no affect on entities

tawdry iron
#

I'm just grabbing the prefab and slotting it in

left oak
#

a core tenet of ecs is that processing is not affixed to data

#

you need a SystemBase, or ISystemBase, that iterates through your bees if you want them to follow the path

tawdry iron
left oak
#

I mean, def start by reading the manual

tawdry iron
#

aight bet

#

thank you very much!

left oak
#

np, good luck

whole inlet
#

dumb question, but is there an easy way to find if a nativeArray contains a particular element? .contains() or .indexOf() doesn't seem burst compatible - if there's a resource I can refer to of the list of possible burst compatible methods I can run that'd be even better

rotund token
#

are you trying to use linq versions of contains/indexof?

#

NativeArrayExtensions contains burst safe versions of Contains, IndexOf etc

#

your type must implement IEquatable<T>

#
        /// Determines whether an element is in the native array.
        /// </summary>
        /// <typeparam name="T">The type of values in the array.</typeparam>
        /// <typeparam name="U">The value type.</typeparam>
        /// <param name="array">Array to perform search.</param>
        /// <param name="value">The value to locate.</param>
        /// <returns>True, if element is found.</returns>
        [BurstCompatible(GenericTypeArguments = new [] { typeof(int), typeof(int) })]
        public static bool Contains<T, U>(this NativeArray<T> array, U value) where T : struct, IEquatable<U>
        {
            return IndexOf<T, U>(array.GetUnsafeReadOnlyPtr(), array.Length, value) != -1;
        }

        /// <summary>
        /// Searches for the specified element in native array.
        /// </summary>
        /// <typeparam name="T">The type of values in the array.</typeparam>
        /// <typeparam name="U">The value type.</typeparam>
        /// <param name="array">Array to perform search.</param>
        /// <param name="value">The value to locate.</param>
        /// <returns>The zero-based index of the first occurrence element if found, otherwise returns -1.</returns>
        [BurstCompatible(GenericTypeArguments = new [] { typeof(int), typeof(int) })]
        public static int IndexOf<T, U>(this NativeArray<T> array, U value) where T : struct, IEquatable<U>
        {
            return IndexOf<T, U>(array.GetUnsafeReadOnlyPtr(), array.Length, value);
        }```
radiant berry
#

Hello, i was wondering where the best place is to see the current progress on DOTS to a fully stable release

radiant berry
#

ah thanks, i haven't come across this one yet

white island
#

ok so. im trying to learn how to use DOTS and one thing i'd like to do is within Entities.ForEach I would like to be able to reference other entities as the input. Like, I have a bunch of entities with a Block component that has a coordinates component and I would like to, within a foreach for one block, access the coordinates of other blocks

#

is that possible?

coarse turtle
#

you'll need to stash the other Block entities in a container and then read them in the job

#

There's ComponentDataFromEntity, which you can use for the look up once you have the entities

white island
#

ok, so with the Entities.Foreach I would interatively store the blocks in a big list and then work on that list

coarse turtle
#

That's the basic idea if you want to reference other blocks while iterating. Pretty sure there are better optimal ways if anything.

pearl laurel
#

Hey there, I'm trying to learn DOTS however I have this problem: whenever there is a PhysicsBody I get an IndexOutOfRangeException. It is the same whether it is a RigidBody being converted, or whether it is a PhysicsBody from the beginning.

#

This is the complete error I'm getting on apparently every frame

IndexOutOfRangeException: Index 0 is out of range of '0' Length.
Unity.Collections.NativeArray`1[T].FailOutOfRangeError (System.Int32 index) (at <d3b66f0ad4e34a55b6ef91ab84878193>:0)
Unity.Collections.NativeArray`1[T].CheckElementReadAccess (System.Int32 index) (at <d3b66f0ad4e34a55b6ef91ab84878193>:0)
Unity.Collections.NativeArray`1[T].get_Item (System.Int32 index) (at <d3b66f0ad4e34a55b6ef91ab84878193>:0)
Unity.Physics.Broadphase+DynamicVsDynamicFindOverlappingPairsJob.Execute (System.Int32 index) (at Library/PackageCache/com.unity.physics@0.6.0-preview.3/Unity.Physics/Collision/World/Broadphase.cs:1052)
Unity.Jobs.IJobParallelForDeferExtensions+JobParallelForDeferProducer`1[T].Execute (T& jobData, System.IntPtr additionalPtr, System.IntPtr bufferRangePatchData, Unity.Jobs.LowLevel.Unsafe.JobRanges& ranges, System.Int32 jobIndex) (at Library/PackageCache/com.unity.jobs@0.8.0-preview.23/Unity.Jobs/IJobParallelForDefer.cs:62)
#

Removing the RigidBody or PhysicsBody makes it disappear

karmic basin
#

I think the error is misleading. Do you have declared a NativeArray somewhere that you forgot to instantiate by any chance ?

pearl laurel
#

Nope, I haven’t done any code yet

karmic basin
#

100% blank project with a converted rigidbody ?

safe lintel
#

@rotund token btw why EventSystem : EventSystemBase and not say just EventSystem : SystemBase when eventsystem itself doesnt contain anything ? Ive noticed this paradigm in unity's own class usage

rotund token
#

FixedEventSystem : EventSystemBase

#

MyCustomEventSystem : EventSystemBase

safe lintel
#

ah right

rotund token
#

(and you can optionally implement them in different ways implementing a variety of virtual members)

pearl laurel
#

Unity 2020.3.26f1
Entities 0.17
Physics 0.6

safe lintel
#

tried restarting the editor?

#

wonder if its just a burst update thing

karmic basin
#

yeah probs an editor derp if zero code 🙂

pearl laurel
#

Well I restarted the editor and tried with Burst enabled and disabled and it’s the same @karmic basin @safe lintel

whole inlet
haughty rampart
#

first of all, get far far away from strings when working with dots

karmic basin
haughty rampart
karmic basin
#

can you screenshot the inspector of your object ?

pearl laurel
shrewd lion
#

Hey guys! I just figured out Unity with gameobjects/mono won't allow me to do what I was hoping to almost certainly. Which means either I move to Unreal, or DOTS. I'm going to give DOTS a serious try, but where do you start? Does anyone know any tutorials or resources/projects for:

  1. DOTS physics (rigidbody equivalent, raycasting, overlapsphere equivalent, checking collisions, translating objects)
  2. DOTS networking (basic rpc-like functionality, replication and synching)
  3. DOTS character controllers, camera controls, etc.

I have a huge grind ahead of me to learn these, but if you could point me to stuff it would be a lot easier. I already know there's a TPS project on github which I plan on studying, but the more of these the merrier

pearl laurel
#

Inititally I had a Collider and a Rigidbody but that also gave me the error, so I changed added the PhysisBody and PhysicsShape instead, same result

karmic basin
safe lintel
#

@shrewd lion so you want to learn the kitchen sink, pinned messages has links to all of that(samples repos has character collider example)

karmic basin
safe lintel
#

@pearl laurel if this is really an empty project, could toss it on github(without the library folder) for us to take a look at. have you tried opening the physics samples?

karmic basin
#

@shrewd lion you could also consider an intermediate solution between mono and DOTS, which is mono + Jobs

pearl laurel
shrewd lion
safe lintel
#

@pearl laurel honestly none of that should matter, and ive setup dozens of mini projects with physics to repro bugs etc.

#

@shrewd lion tbh unreal might be better suited to your needs at the end of the day given how experimental and unfinished dots is

shrewd lion
#

That should be doable since I have the source but man.... not something I would look forward to

pearl laurel
#

I'll still try to create a new project but that'll take a while, so this is the original project

pearl laurel
#

I have never filed a bug before, so how should I go about it

#

🤔

safe lintel
#

help>report a bug. just opening it after installing the latest editor

pearl laurel
#

Thanks, I'm doing that now

safe lintel
#

yeah getting that error. hmm

rotund token
#

oh

#

unity 2020.3.26 is broken (and unity 2021.2.8f1)

#

broke deferred job arrays

#

I already contacted Unity, the fix is to edit the collections package and change AsDeferredJobArray allocator to Invalid from None

pearl laurel
rotund token
#

(i'm literally telling you what's wrong)

#

either edit the collections package or downgrade to unity 2020.3.25

pearl laurel
#

how do I do that?

rotund token
#
  • go into YOURPROJECTLibrary/PackageCache/
  • copy com.unity.collections@0.15.0-preview.21 into YOURPROJECT/Packages/
#
  • open com.unity.collections@0.15.0-preview.21\Unity.Collections\NativeList.cs
#
  • change line 599 from Allocator.None to Allocator.Invalid
pearl laurel
#

OK then, I'll do that

#

Thanks

rotund token
#

Let me know if it fixes it, I haven't confirmed the fix on 2020.3.26 yet only 2021.2.8

safe lintel
#

@rotund token @pearl laurel dunno about that because im looking at my actual dots project and its working with collections 0.15.0.p21 with physics

#

admittedly im still on 2020.3.25 though for the editor

rotund token
#

yeah im not 100% certain physics is broken with this, i only know for certain netcode is broken

#

but yes the bug was only introduced in 2020.3.26

#

but TransformIncrementalConversionSystem uses AsDeferredJobArray so I believe the entire Entities package is broken

#

if you check changelog

#

it's this line that broke it in 2020.3.26

#

Kernel: Fixed an issue where low bit set in NativeArray buffer pointer assumes NativeArray is created by NativeList.AsDeferredJobArray which is not always the case. In some cases NativeArray can be created by NativeArray.GetSubArray, where pointer would have lowest bit set for odd byte aligned offset. (1294627)

safe lintel
#

sadly ive only gotten one response back from the qa team on some of the bugs ive submitted since dots went dark, and that was "is the bug still affecting you?" so cant say im really pleased about how qa and dots team work currently

rotund token
#

qa is useless for dots

safe lintel
#

as long as its reproducible, it should get to the dots team though right?

rotund token
#

sure

#

anyway unity is should be fixing this in the next collections package but well since entities don't support new collection packages I suspect this fix will be required to use entities for any new version of 2020.3 and 2021.2 until 0.50 comes up

safe lintel
#

cool, none to invalid does fix it

pearl laurel
#

can also confirm

#

@rotund token @safe lintel Thanks for helping

#

Though I wonder how long til I encounter the same thing just with another part on the same file

safe lintel
#

just pray for 0.50 to arrive soon

deft stump
coarse turtle
#

i imagine when there's a 1:1 conversion substitute of everything

#

I'm kind of hoping the tooling for converting and declaring that an entity is a part of a world is better since they look like they're sticking w/ the conversion workflow.

#

netcode gave some good insight in how multiworld setup works but wasn't really enough 🤔

safe lintel
#

seems like they consider pure dots is when theres no reference to anything unityengine

white island
#

What on earth does the error Entities.ForEach Lambda expression uses field 'blocks in a reference type'. Either assign the field to a local outside of the lambda expression and use that instead, or use .WithoutBurst() and .Run() mean

rotund token
#

protected override OnUpdate()
{
    Entities.ForEach(() => { var test = blocks;}).Schedule();
} ```
#

as the error states, you need to do this


protected override OnUpdate()
{
    var myBlocks = blocks;
    Entities.ForEach(() => { var test = myBlocks; }).Schedule();
} ```
white island
#

it's telling me that the error is in this chunk here

protected override void OnUpdate()
    {
        //initialize lists
        m_vertices = new NativeArray<Vector3>(24 * DataLUTs.chunkSize * DataLUTs.chunkSize * DataLUTs.chunkSize, Allocator.Temp);
rotund token
#

that's not possible because there's no Entities.ForEach there 😅

white island
#

thats why i was so confused

#
Entities.ForEach((ref Block block) =>
        {
            blocks.Add(new BlockData
            {
                type = block.type,
                coords = block.coordinates
            });
        }).Schedule();```
#

this is the foreach

white island
#
[Serializable]
public struct Block : IComponentData
{
    public FixedString32 type; //must be less than 32 characters
    [ReadOnly]
    public int3 coordinates;
}
private struct BlockData
    {
        public FixedString32 type;
        public int3 coords;
    }
rotund token
#

ok block is fine

#

where is blocks referenced from

white island
#

what do you mean

rotund token
#

i can see blocks in your job

#

where is it stored

#

(be easier if you just posted the full onupdate or system code)

white island
#
protected override void OnUpdate()
    {
        //initialize lists
        m_vertices = new NativeArray<Vector3>(24 * DataLUTs.chunkSize * DataLUTs.chunkSize * DataLUTs.chunkSize, Allocator.Temp);
        m_triangles = new NativeArray<int>(36 * DataLUTs.chunkSize * DataLUTs.chunkSize * DataLUTs.chunkSize, Allocator.Temp);
        m_uvs = new NativeArray<Vector2>(24 * DataLUTs.chunkSize * DataLUTs.chunkSize * DataLUTs.chunkSize, Allocator.Temp);
        blocks = new NativeList<BlockData>(Allocator.Temp);
        m_vertexIndex = 0;
        m_triangleIndex = 0;

        //build list of blocks
        Entities.ForEach((ref Block block) =>
        {
            blocks.Add(new BlockData
            {
                type = block.type,
                coords = block.coordinates
            });
        }).Schedule();

        //loop through blocks
        foreach (var b in blocks)
        {
            if (IsSolid(b.coords)) //if this is a solid block to render (not air)
            {
                for (int side = 0; side < 6; side++) //draw sides
                {
                    DrawSide(side, b.coords);
                }
            }

        }

        //create mesh
        m_mesh = new Mesh
        {
            vertices = m_vertices.ToArray(),
            uv = m_uvs.ToArray(),
            triangles = m_triangles.ToArray(),
        };

        // do calculations
        m_mesh.RecalculateNormals(); // normals
        m_mesh.RecalculateBounds();  // for occluding

        // set mesh as mesh
        //gameObject.GetComponent<MeshFilter>().mesh = m_mesh;
        //EntityManager entityManager = World.Active.EntityManager;
        //Entities.ForEach()

        // dispose of arrays
        m_vertices.Dispose();
        m_triangles.Dispose();
        m_uvs.Dispose();
        blocks.Dispose();
    }
rotund token
#

yes see

#

blocks

#

is stored on the system

rotund token
#

you need a local copy

#

otherwise the entire system gets brought into the job (which is not allowed for obvious reasons)

#

if you're code was simply
var blocks = new NativeList<BlockData>(Allocator.Temp);

#

it'd work

#

also this should be allocator TempJob not Temp as you're passing it into a job

white island
#

ok cool, that fixed the errors. Nothing like learning a new coding paradigm to make you feel like an idiot, hahah. I'd like to use m_mesh to set the mesh of one particular entity- how would I do that. Would I simply Foreach an entity with a component unique to that particular mesh, and then just, set the mesh?

white island
#

@rotund token can a render component’s mesh be assigned after creation of the entity?

rotund token
#

Yes

white island
#

Ok cool

white island
# rotund token Yes

last question:

//create mesh
        var m_mesh = new Mesh
        {
            vertices = m_vertices.ToArray(),
            uv = m_uvs.ToArray(),
            triangles = m_triangles.ToArray(),
        };

        // do calculations
        m_mesh.RecalculateNormals(); // normals
        m_mesh.RecalculateBounds();  // for occluding

        // set mesh as mesh on VoxelChunk types
        Entities.ForEach((ref RenderMesh r, in VoxelChunk v) =>
        {
            r.mesh = m_mesh;
        }).Schedule();

Entities.ForEach Lambda expression captures a non-value type 'm_mesh'. This is only allowed with .WithoutBurst() and .Run() what on earth does it want from me here.

rotund token
#

you can't do this in burst

#

you can't use managed types in burst

white island
#

so how do i do this. do i have to use blobs instead

white island
rotund token
#

you'll have to use Run() instead of Schedule() as well

#

also from memory you're going to get in trouble for doing a r.mesh = m_mesh here

white island
#

what do i do instead

rotund token
#

don't pass it in by ref
r.mesh = m_mesh;
EntityManager.SetSharedComponent(entity, r);

#

the more performant way would be to re-use the mesh and not create/set a new one though

white island
#

so i would do a EntityManager entityManager = World.Active.EntityManager; although last time i did that it yelled at me that World didnt have a .Active

white island
rotund token
#

add it to the foreach query

#

(also use .WithStructuralChanges() so you can use entitymanager)

rotund token
white island
rotund token
#

Entities.ForEach((Entity entity, RenderMesh r, in VoxelChunk v) =>

#

do that

white island
rotund token
#

technically you don't need withoutburst

#

withstructuralchanges also applies it

white island
rotund token
#

reverse the orderr

#

run/schedule/etc should be last

white island
# rotund token Yes

waity, you sure Cannot assign to a member of variable 'in RenderMesh' because it is a readonly variable Entities.ForEach((Entity entity, in RenderMesh r, in VoxelChunk v)

rotund token
#

var copy = r;
copy.mesh = m_mesh;

#

just do that

#

(though do note i have no 'in' on my rendermesh on the code i posted)

white island
#

im doing in because it tells me i cant use it with ref

rotund token
#

yes hence i had no ref or in

white island
#

oh is that what they meant by use value

#

okay

#

ok thank you the errors have left. Now i just have to spawn an archetype

misty wedge
#

Is there a way to figure out what commands are being run in an EntityCommandBufferSystem?

finite remnant
#

can i safely get a gameObject from a static list inside a job when i pass in the index of that static list via [readonly] nativearray<int>?

candid epoch
worn valley
#

@finite remnant All the information in a GameObject is bad for performance. Should figure out what you need from a GameObject and just grab that at some point

finite remnant
worn valley
#

What are you trying to get from the script?

#

Cause the idea behind ECS is that you have components which are just data

#

and then you have systems that operate on that data

finite remnant
#

just some locations to do some vector3.distance/float3 calculations

worn valley
#

So you want to step back and figure out what data you need

candid epoch
#

if you can you should move that data to ecs components

worn valley
#

You need to be specific in the data you a grabbing

#

so do you want a position of the game object?

#

Do you want a position that is set once?

finite remnant
worn valley
#

Do you want a position that is always updating

#

Oh I see

#

Well throwing ECS out, what you need is an array of whatever data you need

finite remnant
finite remnant
worn valley
#

Yup

#

NativeArray

finite remnant
#

thats my approach 😄

worn valley
#

And so you need some code that loads the data in the NativeArray

#

and then you load the data in the Job

#

So you need to figure out how you are going to find the relevant data

#

if you wanna do it stupidly simple, make two native arrays, one as a key and one as the value

#

and then just for loop through it. Once you find the one you want boom you have the data

#

Burst makes this so fast doing fancy look ups is usually not that important

#

Just don't load a gameobject into the native array, that will be horrible for performance and memory

finite remnant
worn valley
#

plus you can't really do that since NativeArrays need to be a struct

#

No that won't work

#

you can't pass things in and out like regular OOP

finite remnant
worn valley
#

You need read code, job code and write code if you want to go between the two

finite remnant
#

so i need to stop the mainthread anyway right?

worn valley
#

yes to write information to the gameobject monobehavior you will need to do it on the mainthread

finite remnant
vagrant lotus
#

not sure if this helps

finite remnant
# vagrant lotus https://docs.unity3d.com/Manual/JobSystemParallelForTransformJobs.html

i saw a video from codemonkey where he was using this for transforming a bunch of objects. this could at least be used for transforming my car ai. i guess i would need to store all the informations of the cars in arrays inside a single script, rather than having a script on each car for transforming. like: float[] speed; transform[]positions; etc and then pass that in via nativearrays.....

vagrant lotus
#

yes

#

a centralized array will be better for dots jobs

worn valley
#

Yes, aligned arrays are best. So index 55 of each Native Array is associated with the same gameobject. So you only pass the information you need into a job.

karmic basin
misty wedge
#

Yeah I found the same

devout prairie
#

Has anybody made an editor script or tool that will dump a selected Entity hierarchy ( selected in the Entities inspector ) as gameobjects into the scene, for debug purposes?

#

Seems it would be really useful, i find myself creating gameobjects and manually entering position to Entity positions for various reasons

coarse turtle
#

I think that's what the BatchRendererGroup API is supposed to do, since you can pass in a 'clickable object'

#

but still experimental

devout prairie
#

huh, what namespace is that under

coarse turtle
#

associatedSceneObject is the parameter

devout prairie
#

will have a look thanks

devout prairie
coarse turtle
#

ah nevermind

devout prairie
#

what i mean is - say you have an Entity selected in the jobs Entities inspector, i'd like to be able to convert that into a gameobject and inject it into the scene

#

just a basic gameobject with pos/rot/scale tbh, for debug purposes

coarse turtle
#

yea I think you'd have to roll your own. Have a system reads the translation/rotation/scale that you can manipulate and then apply it back to the entity. I think the difficult thing is when you have transformations being applied back to the game object (e.g. you have a system that animates the scale of an entity). It doesn't really give you much window room to apply your transformation I think.

devout prairie
#

yeah just looking into whether it's possible to reference the entities inspector and get the selected entity from it

#

i've written basic editor scripts but never tried to poll an inspector other than just, get selected object(s)

coarse turtle
#

Yea I'm not really sure. I haven't looked into the entitydebugger inspector yet to give better insight

devout prairie
#

use case would basically be - hit pause, click entity in inspector, hit a shortcut or menu item and it dumps a static gameobject with pos/rot

finite remnant
#

do they have changed the syntax for jobs (currently using 2021) ? i cant find ijobparalellfor with intelisense

tawdry iron
#

hi, I wanted to know how to use coroutines in ECS, is it done the same way?

finite remnant
haughty rampart
haughty rampart
finite remnant
#

@haughty rampart

#

seems to be unsuported

haughty rampart
#

?

#

it's there

tawdry iron
haughty rampart
haughty rampart
finite remnant
#

because i cant find it inside the manual/api

haughty rampart
#

it's literally marked

#

IJobParallelFor

tawdry iron
haughty rampart
#

@finite remnant or are you looking for IJobParallelForTransform?

finite remnant
haughty rampart
finite remnant
#

and yes i cant find it in the api

finite remnant
haughty rampart
#

not even in monobehaviours

finite remnant
haughty rampart
finite remnant
haughty rampart
#

exactly

#

also: don't ever do coroutines. but especially not in dots

#

coroutines have been superseded by async / await a long time ago

finite remnant
finite remnant
haughty rampart
finite remnant
#

can i use burst with all android devices, or do i need to use neon?

tawdry iron
worn valley
#

Your if statement resets the whole loop to above zero before it can be completed

#

Also that while loop doesn't do what you think it does. It won't move it incrementally.

tawdry iron
worn valley
#

Remove the while loop. You'll have greater success. A while loop is the same as a for loop. It stops everything to complete.

tawdry iron
worn valley
#

Except that loop doesn't break until the condition is met.

#

You have no break. While loops happen right at that instant. So you are just reducing the timer in one frame

#

Just remove the while loop and it should work

tawdry iron
#

oh aight

haughty rampart
tawdry iron
#

is it not?

#

man, i'm so bad at explaining myself bruh

#

sorry about that

haughty rampart
#

solution: change the while to an if

#

@tawdry iron

tawdry iron
#

yeye it works now

#

thanks everyone

#

🙏

misty wedge
#

Error: IL2CPP error (no further information about what managed code was being converted is available)

#

Great :[

#

How do I debug this?

#

The only additional info in the error message is: System.AggregateException: One or more errors occurred. (Value cannot be null. (Parameter 'definition')) ---> System.ArgumentNullException: Value cannot be null. (Parameter 'definition')

finite remnant
#

https://forum.unity.com/threads/unity-jobs-and-static-variables.534719/ so im wondering how i can prevent a job from changing a static variable that may was deleted. this thread says i should copy the values from the job to native array and change it in monobehaviour. but this wouldnt work with IJobParallelforTransform

remote crater
#

Is there a way to disable the ECS completely temporary and turn it back on later? If not, I'll have to disable all entities I want to render with a tag on being able to enable em later.

rustic rain
#

I assume you can just destroy world

#

and not create new one

#

but that's not disabl

#

that's literally destruction of everything that exists

remote crater
#

The problem I have is this: Scene loading doesn't work

#

Subscene works in editor, but not live compile

rustic rain
#

how so?

remote crater
#

So I have to do work around for my own personal set up.

#

Sec, no one on this forum could help me before, but I'll link u

#

I'm a boss at doing work arounds. I like the challenge of getting stuff done when I don't have techs others have.

#

I'll just add tags to everything that isn't disabled, + disabled tags. Then when I want to turn em on, I look for the one tag and take it and disabled off. Ez pz

#

If you can figure that scene thing, more power to you, most said it was a unity bug, but maybe I didn't subscene right.

#

Thank you for being interested to help. The willingness of random people to help is the one thing the Internet still has right in this weird age.

rustic rain
#

welp, editor vs build

#

classic

#

kek

#

do you have new input system?

remote crater
#

Fortunately I was smart enough to dodge that one

pearl laurel
#

Hey there. I want to know generally what is the recommended way of handling branching logic with DOTS. AFAIK if we are talking about something like a = condition ? x : y as long as x and y are simple variables then there is no branching. But what if I want to do something more complex, I can just put the branching logic inside my system's job and that would work, but the preferred way is supposedly adding a component of either type a or b and letting system a or b process that. However isn't deciding which component to add (or not to add) branching already, which means I'd still get a misprediction half the time (assuming a 50/50 split). What is the difference between just executing the logic on the spot? And isn't the overhead of modifying the archetype of the entities just cancelling any gains I might get.

#

I guess the answer is "if you only have a few components use an if, otherwise add a new component" but I'd like some elaboration

rustic rain
#

so you still want to use buffer

#

and it means your branching is irrelevant

remote crater
#

Input is by[ .foreach] or [entity Queries] before output via EntityCommandBuffer

pearl laurel
rustic rain
#

I'm saying, that if your logic is about adding components

#

you'll pass that job to buffer system

deft stump
# pearl laurel Hey there. I want to know generally what is the recommended way of handling bran...

the best way to do states like this, imo, is to have a component with a bool inside.
and 2 systems process the if and the else separately

///psuedo-code 
//System A
Entity.ForEach() => 
{
  if (ComponentA.Flag)
  {
    //process
  }
};
//System B
Entity.ForEach() => 
{
  if (!ComponentA.Flag)
  {
    //process
  }
};

for flipping them on and off, you can flip them inside those systems.
or have another system do the flipping for you under some conditions.

pearl laurel
midnight totem
#

Anyone here super-familiar with Burst FunctionPointers? I'm trying to refactor out a bunch of switch statements (like switch(biomeID) { case Mountain: return MountainBiome.Generate3D(...); ... }), and thought this pattern would be perfect:

[BurstCompile]
public static class MountainBiome {

    public static readonly BiomeGenDefinition GEN_DEFINITION = new BiomeGenDefinition() {
        Generate2D = BurstCompiler.CompileFunctionPointer<Biomes.Generate2DDelegate>(Generate2D),
        Generate3D = BurstCompiler.CompileFunctionPointer<Biomes.Generate3DDelegate>(Generate3D),
        GetTerrainBlock = BurstCompiler.CompileFunctionPointer<Biomes.GetTerrainBlockDelegate>(GetTerrainBlock),
        GetProspectiveFeatures = NullBiome.GEN_DEFINITION.GetProspectiveFeatures,
        LiquidType = BlockID.LiquidWater,
        UndergroundBiomeID = BiomeID.SurfaceLayerUnderground
    };
    
    [BurstCompile]
    [AOT.MonoPInvokeCallback(typeof(Biomes.Generate2DDelegate))]
    private static void Generate2D(double2 pos, long seed, /*...*/) {
        fullColumnBufferProxy.HeightMin = BASE_HEIGHT;
        fullColumnBufferProxy.HeightMax = BASE_HEIGHT + NOISE_AMPLITUDE_1 + NOISE_AMPLITUDE_2 + NOISE_AMPLITUDE_3;
    }

    [BurstCompile]
    [AOT.MonoPInvokeCallback(typeof(Biomes.Generate3DDelegate))]
    private static float Generate3D(double3 pos, long seed, /*...*/)) {
        // ...
#

Then I only need one switch statement method that returns a readonly ref to the BiomeGenDefinition instance.

I'm getting errors such as the following, though:

Burst error BC1064: Unsupported parameter Unity.Mathematics.double2 pos in function MountainBiome.Generate2D(Unity.Mathematics.double2 pos, long seed, float naturalHeight, ref Biomes.BiomeHeightRangeAndColumnBuffer1<Biomes.ColumnBufferProxy> fullColumnBufferProxy)`: structs cannot be passed to or returned from external functions in burst. To fix this issue, use a reference or pointer.

Is there any way to "mark" a FunctionPointer (I guess it would be on BurstCompileAttribute actually) as Burst-internal only, so I can avoid this type of issue? I would prefer not to have to move all my function parameters into a boilerplate reference-passed struct, if at all possible.

Thanks!

pearl laurel
#

*extra byte per component

rustic rain
deft stump
pearl laurel
#

I see

rustic rain
#

oh, so Burst doesn't like ifs?

deft stump
#

there's a talk about smell-checking what burst like and what doesn't.
https://www.youtube.com/watch?v=BpwvXkoFcp8

This session addresses how we are expanding the scope of the Burst Compiler to enable even the most demanding, hand-coded engine and gameplay problems to be expressed in HPC# via direct CPU intrinsics. Andreas shares the reasoning and use cases; as well as discussing implementation challenges, debugging, and performance along with comparisons to...

▶ Play video
#

My take away here is, when dealing with complex branching,
the CPU has to drop the instruction and load in the new one.
and Burst doesn't like those since it relies on patterns in the code to SIMD it.

midnight totem
#

Why I wish Unity.Mathematics had a hardware-matched vector type like System.Numerics does, heh

midnight totem
#

Ah they discuss it at 35:39

frosty siren
#

how can i get job index inside a job and how can i get maximum job index in current machine? What i've found is [NativeSetThreadIndex] and JobsUtility.MaxJobThreadCount, and the last returns 128

white island
#

okay so. I have this code here:

protected override void OnUpdate()
    {
        //initialize lists
        m_vertices = new NativeArray<Vector3>(24 * DataLUTs.chunkSize * DataLUTs.chunkSize * DataLUTs.chunkSize, Allocator.Temp);
        m_triangles = new NativeArray<int>(36 * DataLUTs.chunkSize * DataLUTs.chunkSize * DataLUTs.chunkSize, Allocator.Temp);
        m_uvs = new NativeArray<Vector2>(24 * DataLUTs.chunkSize * DataLUTs.chunkSize * DataLUTs.chunkSize, Allocator.Temp);
        var blocks = new NativeList<BlockData>(Allocator.TempJob);
        m_vertexIndex = 0;
        m_triangleIndex = 0;

        //build list of blocks
        Entities.ForEach((ref Block block) =>
        {
            blocks.Add(new BlockData
            {
                type = block.type,
                coords = block.coordinates
            });
        }).Schedule();

        //loop through blocks
        foreach (var b in blocks)
        {
            if (IsSolid(b.coords, blocks)) //if this is a solid block to render (not air)
            {
                for (int side = 0; side < 6; side++) //draw sides
                {
                    DrawSide(side, b.coords, blocks);
                }
            }

        }

        //create mesh
        var m_mesh = new Mesh
        {
            vertices = m_vertices.ToArray(),
            uv = m_uvs.ToArray(),
            triangles = m_triangles.ToArray(),
        };

        // do calculations
        m_mesh.RecalculateNormals(); // normals
        m_mesh.RecalculateBounds();  // for occluding

        // set mesh as mesh on VoxelChunk types
        Entities.ForEach((Entity entity, RenderMesh r, in VoxelChunk v) =>
        {
            r.mesh = m_mesh;
            EntityManager.SetSharedComponentData(entity, r);
        }).WithStructuralChanges().Run();

        // dispose of arrays
        m_vertices.Dispose();
        m_triangles.Dispose();
        m_uvs.Dispose();
        blocks.Dispose();
    }
#

and apparentyl the list blocks is causing a memory leak

#

where should I dispose the list blocks to stop the memory leak

coarse turtle
white island
coarse turtle
#

Yea

white island
#

im very new to DOTS so bear with me

coarse turtle
#

yea all good

white island
#

And can I dispose of the Blocks list at the end as normal if I do that

coarse turtle
#

yea

white island
#
JobHandle FindBlocks = Entities.ForEach((ref Block block) =>
        {
            blocks.Add(new BlockData
            {
                type = block.type,
                coords = block.coordinates
            });
        }).Schedule();

        FindBlocks.Complete();

it says that Entities.Foreach.Schedule is a void function and doesnt return a jobhandle?

coarse turtle
#

might be your IDE, does it compile in the editor?

white island
#

my IDE is having csharp issues i need to figure out, unity says this, and the error is right after FindBlocks =

coarse turtle
#

oh I can think 2 things since I don't typically use the lambda foreach (so I'll need to check the codegen later).

But try this first

JobHandle FirstBlocks = Entities.ForEach((...) => { }).Schedule(Dependency);

FirstBlocks.Complete();

The second option is (which I need to double check):

Entities.ForEach((...) => {}).Schedule();

Dependency.Complete() // Dependency is a SystemBase class variable you can access
white island
coarse turtle
#

Okay I think the second option should just work as intended

white island
#

ok question how do i make it so that a system only fires when i want. can I only do calculations in update or can i make my own function and call it from somehwere

#

or do i have to add a flag

rotund token
#

systems only ever update when you want them

#

systems react to data, if you've provided data it will update

#

if you don't want a system to update, don't provide it data!

white island
#

also the mesh never actually appears but thats a separate issue

rotund token
#

you can use RequireForUpdate/RequireSingletonForUpdate

#

to limit when systems will update

#

or just early out on a query etc

white island
white island
#

hey, how do I make materials for the hybrid renderer, because my mesh is green for.... some reason

#

using hybrid v2 btw

finite remnant
haughty rampart
haughty rampart
#

do you have any special material or smth?

rustic rain
#

Hmm, I'm trying to install URP

#

I basically followed guide on how to upgrade built in render into URP and then how to install Hybrid Renderer V2

#

and this results in instant 999+ errors

#

upon creating entities

#

In empty world - no errors

karmic basin
#

Entities dynamically created ?

rustic rain
#

yeah

karmic basin
#

ANyway disable Burst, you'll get more verbose stack

rustic rain
#

I have no idea what job is to blame

#

or there's way to disable it globally?

karmic basin
#

yup from main toolbar

rustic rain
#

is that it?

karmic basin
#

yup

rustic rain
#

and then?

#

how to make sure it's recompiled

#

ah

#

it's already

karmic basin
#

you want to play your project without burst, so you can track back the error

rustic rain
karmic basin
#

Hmm probs something wrong with editor/packages versions

rustic rain
#

well

#

all I did

#

install URP

#

enable hybrid v2

#

it worked before that

karmic basin
#

can you regenerate project files / delete Library folder ?

#

just to be sure nothing is cached

#

also do you use git ? to quickly check if nothing was bumped on your behalf during the update

#

SOrry just giving ideas

rustic rain
#

nah, this is just learning project

#

no git

#

is library folder cache only?

karmic basin
#

no

#

but safe to delete anything inside

#

your next opening of the editor will just be way slower as it regen everyhting

rustic rain
#

nope

#

stil same errors

karmic basin
#

Multiple worlds ?

rustic rain
#

no

#

only one

#

also, whenever I load new scene I remove old world

karmic basin
#

Im not sure then. My best guess is still versions conflict 🤷‍♂️

#

But HR should be good with URP 9+ and editor 2020+

rustic rain
#

so annoying unity hides all "experimental" packages tho

#

hard to debug version conflict

karmic basin
#

actually you can dig through them inside the packageCache

rustic rain
#

weird part is that all stack trace leads to physics

karmic basin
#

I think it just stumble upon the first NativeArray it found

rustic rain
#

well I double checked

#

all packages

#

are up to date

#

AND are automatically assigned as dependencies

#

in the first place

karmic basin
#

ok looks good then 🤷‍♂️

#

2020 ?

rustic rain
#

2021

karmic basin
#

oh I can't tell then, didn't switch yet

#

eventually i would try to downgrade collections package manually to a previous version (if I'm out of options)

#

Other than that, I'll let someone else bring his light on the topic 🙂

rustic rain
#

oh well

#

turns out my collections wasn't up to date

#

after update I see this

karmic basin
#

yeah same stuff, version mismatch

rustic rain
#

oh man

karmic basin
#

need to find the right combination I guess

rustic rain
#

this is disgusting xD

#

updated one thing

#

it broke other thing

vagrant lotus
#

it's hell to get back to previous version

#

ecs specifically say it requires collection 0.15

rustic rain
#

"com.unity.collections": "0.15.0",

#

like this?

#

or?

vagrant lotus
#

yes, but my situation was much worse

#

it was stuck on 0.17 a few month ago

#

and since then I forgot how I did it, let me check my old messages

#

read the messages around here

rustic rain
#

I know how to install old versions

#

I just don't know which one

vagrant lotus
#

choose the latest 0.15

#

screenshot if it's not showing

rustic rain
#

I edit manifest directly so

#

"com.unity.collections": "0.15.0-preview.21",

#

it's kind of like this to me

vagrant lotus
#

let me check

#

should be correct

rustic rain
#

nah, it's not

#

for some reason

#

it stays on this

vagrant lotus
vagrant lotus
#

it's shows how to see all version

#

let me fire up unity

#

I think I'm confusing both myself and you

rustic rain
#

bruh, I read whole thread and it's just complains about removed preview packages feature

#

😐

#

there's no way to see all packages in Unity 2021

rustic rain
#

unity keeps loading wrong version of collections for me

#

I probably made a mistake or smth

vagrant lotus
#

pretty sure back in september i tried to change the manifest and did nothing

#

this is how i finally solved my problem, by downgrading the package through the package manager

#

after showing the hidden option

rustic rain
#

whoah

#

actual hacks

#

xD

#

thanks, will try

vagrant lotus
#

yep, they started hidding that button after an update

#

it messed up a lot of things

rustic rain
#

Requested but overriden

vagrant lotus
#

click on it and try installing it

#

the 0.15

rustic rain
#

same thing

#

it becomes requested but overriden

vagrant lotus
#

hmmm, let me look this up

#

do you have the manifest file

rustic rain
#

finally

#

I resolved it

#

it was job package

#

that was forcing newer collections version

vagrant lotus
#

oh ye, you also need to downgrade it

#

👍 happy to help

rustic rain
#

welp, I'm just back to square 1 tho

#

since initial errors are still there xD

vagrant lotus
#

classic unity

#

part one solved

rustic rain
#

I really think

#

I should forget about dots for a while

#

xD

vagrant lotus
#

ye, let it mature a little, heard 1.0 is coming (p.s. i will hop back on to dots when 1.0 comes out)

vagrant lotus
#

oh nvm, i saw you message

rustic rain
#

rn I'll try to just install all versions same as yours

vagrant lotus
vagrant lotus
safe lintel
rustic rain
#

thank you

#

I got interesting point on my other bug tho:
If I don't run game with game scene, all materials in that scene are broken
Yet, if I load that game scene, change it to other scene and then go back to that same scene again - all materials work fine.

#

Any idea what can it be?

safe lintel
#

not sure, you switching materials at runtime or something?

rotund token
safe lintel
#

can you ask em for a 0.50 release estimation? 😉

rotund token
#

i couldn't tell you anyway

rustic rain
#

Irrelevant question:
Is it absolutely sure that all monos run BEFORE systems?

#

I checked several rn with logs

#

and it looks like mono run before systems, but I'm not sure if that will behave like this 100% times

haughty rampart
#

i wouldn't rely on it

coarse turtle
rustic rain
#

between systems

#

not monos

coarse turtle
#

monobehaviours depending on the message callback update in various places I know in PostLateUpdate they're called at the end

rotund token
rustic rain
#

oof

#

I guess if I use Script execution order that would secure it?

rotund token
#

SEO doesn't affect systems, only MB

rustic rain
#

Assuming system loop uses Default Time

coarse turtle
# rustic rain not monos

This is where monobehaviours update. You can inject your own delegate right before all monobehaviour's update loop.

rustic rain
#

ah

#

damn

#

I need a way to run mono update before all systems

rotund token
#

i would imply this means there is something wrong with our architecture

rustic rain
#

there is

#

it's hybrid

#

I want to keep everything related to gameplay in ECS

#

while everything about game managing (as app) in OOP

rotund token
#

that violates tertle's rule #3
3. Do not access entities from game object world. Inject references into game object world from entity world (Systems -> GameObjects)

rustic rain
#

but I'm not trying to

#

I just need to set certain static fields before systems can use them

#

in any way

rotund token
#

the rule basically says, game object world should never access anything ecs related which is what you're doing with game management

#

anyway they're just my rules, not forced ideas

#

but the whole point of them is to avoid issues like you're having

rustic rain
#

funny

#

new input system design just doesn't fit DOTS

#

xD

#

or maybe I'm just unable to find the balance

rotund token
#

i have no issue with it
the only thing that bothers me is there is no asset for mapping groups

#

so i have to string look it up

rustic rain
#

no asset for mapping groups?

rotund token
#

action maps

#

each action map has a collection of actions

#

actions have an InputActionReference

#

so you can put them on assets for conversion etc

#

but action maps do not

#

just a little annoyance i have with IS atm

rustic rain
#

still kinda don't get what you can't do kek

safe lintel
#

it bothers me its called InputSystem but its not an ecs system

rustic rain
#

it's event driven system

rotund token
#
    public class BuildInputConfig : IComponentData
    {
        public InputActionReference Select1;
        public InputActionReference Select2;
        public InputActionReference Destroy;

        public InputActionReference Place;
        public InputActionReference Rotate;
    }```

I want to store a referenced to InputActionMapReference
#

so i can disable/enable groups of actions when i change state

rustic rain
#

but you can

rotund token
#

see you're using the c# code

#

i do not generate the c# code

rustic rain
#

oh

rotund token
#

you are hard coding your input

#

my code is data driven

rustic rain
#

wdym data driven?

rotund token
#

if a designer comes in and decides to change the input action for menu

#

renames it, BackButton

#

does your code break

rustic rain
#

yeah

rotund token
#

and that's the problem

#

now it's not an issue if you're the only one working on the project etc

#

but if i'm writing a library for a large team i shouldn't be able to break the application changing data

#

my designers/artists should be free to change data how they please without having to find a free programmer to update the code and put up a pull request etc

#

the larger the team, the worse this becomes

rustic rain
#

yeah, I see what you mean here

rotund token
#

anyway that's why i want a reference to mapping

#

so i don't have to hardcode FindMapping(string)

rustic rain
#

but I feel like player input actions is not smth designers or artist should freely change at all

rotund token
#

why would a programmer setup action mappings?

#

i would argue only a designer should set this up

rustic rain
#

by mapping you mean creating new action and etc or?

rotund token
#

yeah

#

setting up keybindings, defining what action maps to what etc

haughty rampart
rotund token
#

i simply provide an empty field call InputActionReference - they can pass whatever they want into it

#

my code will work with whatever binding they choose

rustic rain
#

well keybinds are fine not to be hardcoded, but creating new actions, just by designers seems weird

#

how can you even make it work, he'll create new action, but what system will catch it up?

#

yeah, input registers, events trigger. But what is game feedback?

rotund token
#

i simply provide a set of fields for actions

#

its up to design to map to them how they want

#

they can re-use existing actions

#

a lot of them time the same action can be bound to multiple in game things

#

sometimes they want to split it off

#

so a new keybinding can be created

#

actions and action maps directly map to options screen for keybindings etc

#

so its important they can control, change, rename etc

rustic rain
#

but it's still same thing, but with extra steps

rotund token
#

it's not though

rustic rain
#

I mean, can't you just create such maps references yourself?

#

if you don't generate C# class

#

you can give to team certain maps like actions

#

and that would be your references

rotund token
#

oh i can just pass in a string

#

and it works

#

it's just an annoyance because strings are prone to errors

#

and if someone renames an action map group

#

it breaks all the data

#

whereas if you rename an asset (which actions are)

#

it will propagate for all settings

#

and actions / actionmap naming is important because it's used to auto generate options and keybindings

#

so its quite common to rename them

#

i just don't like anything prone to breaking. if i have 3 devs and 2 designers all changing input settings in different pull requests

#

i don't want anything to break when they all merge

#

it's just a minor annoyance of the inputsystem atm that's all, i'll live with it. way more discussion than required about it.

#

apart from that i've found a pattern for using IS with entities and am pretty happy with it

weak spire
#

Command Pattern

frosty siren
#

Is there a way in jobs to schedule IJobParallelForBatch with 1 batch per thread?

haughty rampart
frosty siren
#

or understanding of how to pick minIndicesPerJobCount properly

#

what i'm worry about is somewhere i saw that 64 is good number for small amounts of work, so knowing my minIndicesPerJobCount i can create NativeStream with Length/BatchSize, and then knowing startIndex in job i can calculate what index of NativeStream it belong. But with array length growing grows NativeStreams' forEachCount

coarse turtle
#

So I'm looking at the netcode package and I'm wondering where in the conversion pipeline the ghost entities are brought into their designated worlds (Server/Client). I see the GhostAuthoringConvesrion system which handles majority of the work, but it seems like everything is using DstEntityManager so I imagine that the entities are going to whatever the DefaultGameObjectInjectionWorld is.

#

Anyone have any clues that can point me in the right direction? 👀

rotund token
coarse turtle
#

Yea

rotund token
#

if so it's just GhostSpawnSystem

#

predicted ghosts spawn line 96

#

interpolated line 75 (but delayed)

coarse turtle
#

cool I'll take a look tomorrow morning - I'm trying to emulate something like that 👍

finite remnant
#

hey can i dispose a persistant nativearray after i used it a second time for another job?

#

also: why do i need to restart editor all the time when i edit a script with burst turned on?

verbal pewter
#

Does anyone know why my DynamicBuffer extension method isn't working when the DynamicBuffer value is a property? If I assign the property to a temporary variable in a method, I can then use the extension method on that temporary variable. But, when I try to use the extension method on a DynamicBuffer property it throws an error saying it does not contain a definition. Any thoughts?

EDIT: this can be ignored, I was being dumb.

mental tree
#

Hi, are UnityEvents comparable with ecs authoring. I'm aware it doesn't fully make sense with how ecs works but it's also a big part of my prefab workflow so it would be great if I can still use UnityEvents in the inspector

haughty rampart
#

well you can't use them on ecs, but you can still use them with ecs i guess

finite remnant
#

@haughty rampart if i change some values in inside a job (the struct is not perfect in that case), i always get internal error somehow. i think its because the jobs havent been completed because of faulty code-> nativearrays dont get disposed and this somehow causes internal compiler error and i need to restart unity

finite remnant
haughty rampart
finite remnant
#

damn

haughty rampart
finite remnant
#

ok

deep parcel
#

Hey, where can I find out which unity systems are/aren't currently compatible with ECS

left oak
#

There is a list of dots packages there

junior latch
#

So I'm going to work with a DynamicBuffer to store an array in a singleton entity. Is there a way for me to allocate a certain amount of memory to it in the heap at run-time? (I want to be able to initialize the 'array' to different sizes depending on other stuff in the code) I'm worried about the performance of appending a few thousand elements to a dynamicBuffer rather than something like initializing an array and then going through its indices.

junior latch
tranquil jay
#

Hi! Need a bit of help. I have a Camera that I want to follow the player race car but I have an issue:

  1. If I put it inside the subscene, is converted correctly but the Camera component does not work.
  2. If Ieave it in the root, the Camera component exists, as well as the ArenaCameraTransformComp but my systems cannot see that entity in the World.

How can I have a camera functionality while the World can see it and I can update the position?

    [UpdateBefore( typeof(TransformSystemGroup))]
    [UpdateAfter(typeof(AdvanceActorSpeedSystem))]
    public class CameraFollowPlayerSystem : SystemBase
    {
        /// <inheritdoc />
        protected override void OnCreate()
        {
            RequireSingletonForUpdate<ArenaCameraTransformComp>();
            RequireSingletonForUpdate<ArenaPlayerComp>();
        }

        /// <inheritdoc />
        protected override void OnUpdate()
        {
            Entity camera = GetSingletonEntity<ArenaCameraTransformComp>();
            Entity player = GetSingletonEntity<ArenaPlayerComp>();

            var playerPos = EntityManager.GetComponentData<Translation>( player ).Value;
            
            EntityManager.SetComponentData( camera, new Translation{Value = playerPos} );
        }
    }
rotund token
tranquil jay
#

@rotund token I also had to put ENABLE_HYBRID_RENDERER_V2 before, are there other defines I must-have in there? I plan to have physics stuff happening if that matters

rotund token
#
            // Camera conversion is disabled by default, because Unity Editor loses track of the main camera if it's put into a subscene
            Entities.ForEach((Camera camera) =>
            {
                AddHybridComponent(camera);
            });```
#

the reasoning why it's not enabled by default

tranquil jay
#

Also thanks a lot for your help all over the forums and discord @rotund token , you're a strong pillar of the community

#

@rotund token the ArenaCameraTransformComp is in the root of that GO, while the Camera itself is somewhere deeper in it's grandchildren

#

Strangely, if I activate that subscene, it works :/

rotund token
tranquil jay
rotund token
#

if you don't activate the subscene nothing in the subscene will be loaded, including the camera

tranquil jay
unborn totem
#

if I have two entites that each have a PhysicsCollider entity component, and those components have the same Serialized Hash value, does that mean the collider is the same on both Entities?

#

and is that a bad thing? i think I noticed when you EntityManager.Instantiate(entity) on an entity that has a PhysicsCollider component, it produces a new entity with the same Serialized Hash

#

someone I work with seemed very surprised to see two entities that each had PhysicsCollider components that had identical Serialized Hash values and I've been scratching my head over it all weekend

#

example

unborn totem
#

or perhaps that Serialized Hash is just a reference string to a BlobAsset?

graceful mason
#

should i render say 4 million spriterenderers using dots, or 256 tilemaps

#

Probably 256 dynamic meshes 😄

#

rendering as 256 tilemaps it works at 400fps, but loading as you pan is a bit slow

rugged dome
#

Hey people on Unity discord, how's dots doing these days? I thinking of starting my next project in it (i tried out ECS like two years back)

worn valley
#

It's a slow burn. Check the forum for the update on ECS .5 and ECS 1.0

#

As for just DOTS in general, Burst is the best as is the job system

worn valley
#

Lol what??

karmic basin
#

0.5 and 0.50 are not the same version

#

anyway, other than that, your answer is accurate

#

I was just nitpicking

worn valley
#

Oh duh of course

#

I've been doing too much float math lately

karmic basin
#

🤓

misty wedge
#

If I'm doing raycasting for a character controller, is there a better way to detect the closest hit besides iterating through all DistanceHit from CalculateDistance? There is a version that returns the closest hit, but I don't see a way to ignore the collider that is being cast from, meaning the closest collider would most likely be the entity itself...

karmic basin
#

If that happens you could still offset the origin of the cast (in the PointDistanceInput) or ignore the entity layer (in the Filter struct)

safe lintel
#

can also use a custom collector to ignore the casting entity @misty wedge

prisma anchor
#

Hey everyone. I am trying to learn and redo my idea in DOTS. I have an array of gameobjects that I want to define as the spawnable elements in my level. I am having trouble describing that in components. Does anyone have any helpful links and/or videos?

solemn lantern
karmic basin
#
  • the official ECS samples will teach you how to Instantiate from converted prefabs through monobehaviour authoring
#
  • in the netcode package you store all ghosts (network-aware spawnables) by registering your prefabs to a buffer, you could get inspiration from it
#

I explained it badly but 99% sure you'll find it useful

#

and for netcode I don't remember the component name, something like GhostPrefabCollection or close :p

karmic imp
#

can somebody tell me why this job wont run?

public struct JobLODTransforms : IJobParallelForTransform
{
    public Vector3 pointOfView;
    public float lodDist;
    public NativeList<int> occluded;

    public void Execute(int index, TransformAccess transform)
    {
        Vector3 diff = transform.position - pointOfView;
        if (diff.sqrMagnitude > lodDist)
        {
            occluded.Add(index);
        }
    }
}

i keep getting an error that say: InvalidOperationException: JobLODTransforms.occluded is not declared [ReadOnly] in a IJobParallelFor job. The container does not support parallel writing. Please use a more suitable container type.

rotund token
#

error tells you everything you need to know

#

you're writing to NativeList<int> in parallel

#

when the container does not support parallel writing

karmic imp
#

but it does when i'm using IJob

rotund token
#

IJob is not parallel

karmic imp
#

oh, that makes a lot of difference, what data structure can i use to fill a list in parallel or is impossible in the current version?

rotund token
#

nativelist has a parallelwriter version but it can't be resized so you need to know max capacity beforehand

#

also it's a bit slow

#

but if you aren't using it a lot it's fine

#

nativelist.asparallelwriter()

#

alternatively a nativequeue is probably your best bet

#

(again use asparallelwriter but it can be resized)

karmic imp
#

thanks, whereś more documentation about job compatibility between job types and usable structs?

rotund token
#

no container by default is supported in parallel

#

most have a parallel version

#

but they have various limitations etc

#

as for documentation, the best source is honestly the source code. Unity for the most part has done a really good job documenting everything.

prisma anchor
#

So I've had this problem before using ECS where my object wouldn't render. I remember adding the hybrid renderer. Even now, my object gets converted, but I dont see it in the scene/game view.

prisma anchor
#

I turned off hybrid V2, and it worked /shrug

whole inlet
#

Is it possible to have dynamic animations in dots/ecs?

rotund token
#

You're asking the wrong question.
The answer to any question starting with, Is it possible ...? is Yes

#

You're a developer, you can do anything with enough time.

#

The question you probably want to ask is, how much effort is X? or how painful implementing Y is?

whole inlet
#

Yeah alright, that's true. Let me revise my question - How painful is it to implement dynamic animations using the unity ecs packages we have at the moment?

white island
#

Is there an easy way I can find a specific Entity within a MonoBehaviour script

white island
#

This is my code but unity is not having it

EntityManager entityManager = World.DefaultGameObjectInjectionWorld.EntityManager;
        EntityQuery rawQuery = entityManager.CreateEntityQuery(typeof(ParsedRawsData));
        rawQuery.SetFilter(new ParsedRawsData { General.id = GetNameFromHash(id) });
        NativeList<Entity> rawDataArr = entityManager.GetAllEntities(Allocator.Temp);


        if (Array.Exists<Entity>(rawDataArr.AsArray(), r => entityManager.GetComponentData<ParsedRawsData>(r).General.id == GetNameFromHash(id))) //inefficient but the only way I could get this to work
        //searches the array of entities and find the one that has an ID matching the one corresponding to the hash and also is a ParsedRawData
        {
            return entityManager.GetComponentData<ParsedRawsData>(Array.Find<Entity>(rawDataArr.AsArray(), r => entityManager.GetComponentData<ParsedRawsData>(r).General.id == GetNameFromHash(id)));
        }
safe lintel
#

@whole inlet what do you mean by a dynamic animation?

whole inlet
# safe lintel <@!142933051750481921> what do you mean by a dynamic animation?

perhaps im using the wrong term, sorry about that. I'm looking to see if anyone has done animation where you can have a character model run in a certain direction, but then have the upper body face a programmatically defined direction (eg. face cursor). So part of a rigged model has it's animation dynamically defined.

safe lintel
#

Fairly certain the dots sample demo showcases that @whole inlet

whole inlet
# white island blended animations?

Thanks for the suggestion, I looked it up and although it's not quite what I'm after, it's good to know ECS has this, I was able to find an example of this in the sample projects.
I found a Brackeys tutorial that described the effect I'm after, it's called "Animation Rigging". @safe lintel do you know if there is an example of this in the sample projects? I took a look around and couldn't find any

pulsar jay
#

Is there any way to order systems like UpdateAfterIfExists? I have a system that should run after UpdateWorldTimeSystem. But the other system might not exist. E.g. while running in edit mode. Using UpdateAfter leads to Unity spamming warnings about invalid UpdateAfter.

pliant pike
pulsar jay
pliant pike
#

yeah but that's kind of one of the strengths of systems being able to create and order them yourself more easily than monobehaviours

rustic rain
#

Is there a way to instantiate entities with proper name?

#

so in debugger

#

you'd see those names

worn valley
#

You need to set the Entity name via the entity manager. IIRC it is a pain in the butt

rustic rain
#

only manager?

#

what about command buffer?

worn valley
#

Probably not. The entity naming is only for debugging. In a game you would never see that so they didn't put any work into making it fast or jobs safe

rustic rain
#

it's just for debugging yeah

#

when trying to inspect entities manually

safe lintel
#

@whole inlet animation samples repo has some ik manipulation examples, imo you could go pretty deep here but its not nearly as user friendly as the animation rigging package is

rustic rain
#

any idea what's wrong?

karmic basin
#

Should Add the first time

#

IIRC Set will not lazy Add

rustic rain
#

thing is, it only happens with this component in stack trace

#

ooooh

#

wait

#

I get what you mean

#

yea

karmic basin
#

Yes, because I guess your bullets don't have the Expire component

#

ah great 🙂

rustic rain
#

yup

#

that was it

#

hmm

#

Using deltaTime in fixedStep

#

I think I'm doing smth wrong here

#

any tip if I even should use deltaTime for fixed step?

karmic basin
#

Yeah, it's overriden for you with a fixed timestep

#

Do you capture it when you use it inside a Job ?

rustic rain
#

nah

#

I just noticed my character movement is clunky

karmic basin
#

Should capture first, then we'll see if that works 😛

rustic rain
#

I figured it's because it uses rigid body

#

and I multiply velocity by delta time

#

kek

karmic basin
#

erf ^^

last swan
#

I have struggles to copy data from one DynamicBuffer to another DynamicBuffer on another entity. In the vsdebugger, all the data is set correctly, but in the entity debugger, my entities buffers are length 0 with no entries. Is there a correct way of copying the data? (couldn't get CopyFrom() to work as well)

I tried entitymanager.getbuffer and dynamicbuffer.add, but these are structural changes, so I used ecb, now I am here after several different attempts having a foreach and ecb.AppendToBuffer. finally no compile errors/runtime errors, but yet no data in the buffers

probably I can't see the forest for the trees. (I am running the things in an async void, because I have to wait for an asyncoperation to finish, idk if that is causing troubles?)

rustic rain
#

I'm pretty sure I'm doing smth wrong, why render thread can be 12ms in this scene

coarse turtle
coarse turtle
# white island Hey, is this possible?

Get the world and create a query via World.EntityManager and search in your query?

var eq= World.DefaultGameObjectInjectionWorld.EntityManager.CreateQuery(...);
var entities = eq.ToEntityArray(...); // <- Is a NativeArray of entities
white island
coarse turtle
#

like it doesn't work?

safe lintel
#

what happens when you remove the filter?

white island
#

Like I get all sorts of errors

coarse turtle
#

what kind of errors?

white island
#

I’m away from my computer right now but stuff like EntityQuery doesn’t have method SetFilter, struct isn’t serializable, etc. is there anything fundamentally wrong with my code though

coarse turtle
#

not that I can really tell. If it doesn't find the entity what happens?

white island
#

Well if it doesn’t it creates the entity but that wasn’t code that was relevant to the issue

#

I can’t actually run the project because of the compiler errors. I’ll look into it more after work

white island
#

There is a matchesany though…

#

I must have been reading outdated docs

safe lintel
#

maybe youre looking for addsharedcomponentfilter?

rustic rain
#

almost 10 times more fps

rotund token
#

Unity itself actually doesn't have that much

#

If you turn off jobs debugger, safety but also switch from debug to release mode (and play maximised) you'll be within 10% of a build

#

Good to tell your qa, design this

#

Editor going from debug to release can doubled your fps

robust scaffold
#

Been a while since I checked the training samples but Entities has been moved to 0.50 in that repo

#

Gonna see if I can notice anything different

safe lintel
#

seems like the few scripts there are just monobehaviours

robust scaffold
#

Also 0.50 but with slightly more work

#

Only thing I dont recognize that well is in authoring, particularly IDeclareReferencedPrefabs. I dont use the conversion system so it could already be an existing feature or custom in this repo

#

Looks to be a way to prevent game objects from being culled when referenced as a property in a component of an entity rather than a direct hybrid component. Maybe

#

But otherwise, yea. Nothing that jumps out as particularly breaking change. Leads me more to believe that something has changed significantly on the job struct side. Burst is going to be updated as soon as DOTS is released. Last I heard from burst is that they got their next package update fixing a lot of the annoying Burst Inspector bugs from 1.7.0 pre-1 already packaged and bowtied largely tested and ready for release and just waiting for DOTS to ship... sometime in the next month or so.

#

The fact that Burst isnt iterating on major version number indicates that there should be no breaking changes on the job struct though. Nothing...

#

At least I think

safe lintel
#

IDeclareReferencedPrefabs has been there for some time, it converts the gameobject into an entity prefab

white island
#

are nativehashmaps blittable

coarse turtle
rustic rain
#

with log console and etc

rotund token
#

debug builds don't have it on by default

#

that's the primary thing that changes in the editor going from debug to release, it disables script debugging

rustic rain
#

ugh, not sure

#

but logs do say lines of code in files