Sunday afternoon
(TODO: talk about trying to get matrix into the job, `GetComponentDataFromEntity()` didn't work, trying to access via `EntityManager` within the job, pass in the Translation, etc to construct. Nope.)
Perhaps I should use my current job as part of a chain? So it passes out a list of those that need sticking? Then create a new job that requires this one and creates the joints? (UPDATE: I come back to this idea later in the post.)
Aside: Oh, just realised I could probably get those data (rot&trans) from the physics world!
Aside: Just came across a thread suggesting a different way of doing physics event handling. Think maybe they've missed the way I found in that previous thread so may link it and see if I've missed something about their needs.
Need to know whether there's already a joint connecting A & B before creating a new one. Can't immediately see how to tell whether there's a Joint already connecting A & B. Joint is an `Entity` with `ComponentData` that indicates its connections so it's not on A or B. I won't be able to index into it. Could I record the Joint's `Entity` in the `StickCause`? Maybe. Maybe easier for now to say a `StickCause` is one-use, i.e. remove it after it's stuck once.
Did that but still getting complaints when there's already a joint. So need to query or get all joints in the scene? Worse than that -- I'll need to check both the physics world *and* previous work in this job (since we may have requested a joint be created). I should explain "requested" or maybe better "scheduled" since I'm using `EntityCommandBuffer.AddComponent()` which does the adding once you've finished. Maybe better doing this as a separate job.
When I tried compiling my existing code with `[BurstCompile]` it complained that I couldn't do a whole slew of stuff in Burst. Turns out joint creation is the problem. So that separate job idea is now a must.
Rearchitected slightly to create struct that holds all the parameters for joint creation and made my previous `ICollisionEventsJob` enqueue its requests into a `NativeQueue<JointCreationData>.Concurrent`. Now compiles with Burst!
[BurstCompile] private struct JointCreationData { [ReadOnly] public Entity a, b; [ReadOnly] public float3 posOnA, posOnB; }
Next I created a `JointCreationJob` that I'll run serially (not concurrent) so I can check existing joints. I don't anticipate this will be bazillions of hits so should be fine. It processes the earlier `NativeQueue<JointCreationData>` (no longer as a `Concurrent` so we can get the data out). To start with it simply does what used to be done in the `ICollisionEventsJob` (that Burst complained about). That's fine but retains the same problem of trying to create joints on things that already have joints.
private struct JointCreationJob : IJob { // no longer Concurrent. Not ReadOnly since Dequeue() used public NativeQueue<jointcreationdata> queueToAddJoints; public EntityCommandBuffer entityCommandBuffer; public void Execute() { var count = queueToAddJoints.Count; for (int i = 0; i < count; i++) { var jointCreationData = queueToAddJoints.Dequeue(); // TODO: Check whether already joint present and use SetComponent() // Will need to check both the physics world *and* previous work in this job (since we may have requested a joint be created) var jointBlobData = JointData.CreateBallAndSocket(jointCreationData.posOnA, jointCreationData.posOnB); entityCommandBuffer.AddComponent(jointCreationData.a, new PhysicsJoint { JointData = jointBlobData, EntityA = jointCreationData.a, EntityB = jointCreationData.b, EnableCollision = 1 // maybe? }); // For now remove the markers so they don't create any more entityCommandBuffer.RemoveComponent<stickcause>(jointCreationData.a); entityCommandBuffer.RemoveComponent<stickcause>(jointCreationData.b); } } }
I have a little time Monday night so I'll try to do a bit more then but this project is nowhere near a game entry so guess it'll continue as an exercise. I'll probably publish some code when it's a bit tidier for others ... entertainment :)
Connect the Unity (ECS) DOTS (for ExtraCredits Jam 2019)
An Extra Credits Jam 2019 entry focusing on learning Unity DOTS
Status | Prototype |
Author | Arakade |
Tags | 3D, connecttheunitydots, extragamejam, Unity |
More posts
- Final physics OnCollision flowJun 12, 2019
- ECS & Unity.Physics order diagramJun 08, 2019
- ECS Unity.Physics: Contacts, The Right Way (full OnCollisionEnter(Collision) ana...Jun 06, 2019
- Post-jam next stepsJun 05, 2019
- Post Jam: An empty EntityQuery in OnCreate() disables your systemJun 04, 2019
- Monday night: Joint add or setJun 04, 2019
- Saturday night: Implementing DOTS Unity.Physics OnCollisionEnter() only for cert...Jun 02, 2019
- Saturday afternoon Unity.Physics and DOTS samples strife (after late start)Jun 01, 2019
- Friday nightJun 01, 2019
Leave a comment
Log in with itch.io to leave a comment.