Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
2
Question by FelixKahle · Jan 10, 2020 at 07:16 AM · c#errorfollow

ECS follow entity

I was playing around with the new entity component system and I came across a problem I was not able to solve. I try to make an entity follow another entity. I want to do it in a job and not on the main thread. I already wrote some code in order to accomplish that:

FollowEntityComponent.cs

 using Unity.Entities;
 using Unity.Mathematics;
 
 public struct FollowEntityComponent : IComponentData
 {
     public Entity entityToFollow;
     public float3 offset;
 }

FollowEntitySystem.cs

 using Unity.Entities;
 using Unity.Mathematics;
 using Unity.Transforms;
 using Unity.Jobs;
 using Unity.Burst;
 using Unity.Collections;
 
 public class FollowEntitySystem : JobComponentSystem
 {
     struct FollowEntityJob : IJobForEach<Translation, FollowEntityComponent>
     {
         [ReadOnly] public ComponentDataFromEntity<Translation> translationComponentFromEntityToFollow;
 
         public void Execute(ref Translation translationComponent, ref FollowEntityComponent followEntityComponent)
         {
             if (!translationComponentFromEntityToFollow.Exists(followEntityComponent.entityToFollow))
             {
                 return;
             }
             float3 entityToFollowPosition = translationComponentFromEntityToFollow[followEntityComponent.entityToFollow].Value;
             translationComponent.Value = entityToFollowPosition + followEntityComponent.offset;
         }
     }
 
     protected override JobHandle OnUpdate(JobHandle inputDeps)
     {
         FollowEntityJob followEntityJob = new FollowEntityJob()
         {
             translationComponentFromEntityToFollow = GetComponentDataFromEntity<Translation>(true)
         };
         return followEntityJob.Schedule(this, inputDeps);
     }
 }

The code does actually compile, however, I get the following error when I hit play:

InvalidOperationException: The writable NativeArray FollowEntityJob.Iterator is the same NativeArray as FollowEntityJob.Data.translationComponentFromEntityToFollow, two NativeArrays may not be the same (aliasing).

I already figured out why I am getting this error message. It is because I am having a Translation component in IJobForEach<Translation, FollowEntityComponent> and in [ReadOnly] public ComponentDataFromEntity<Translation> translationComponentFromEntityToFollow; this seems to cause the error. (See: https://www.youtube.com/watch?v=KuGRkC6wzMY , minute: 21:53). However, even when I know the reason I can not figure out a better way of accomplishing what I want to do. I would be very thankful if somebody could provide me a solution to my problem.

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

3 Replies

· Add your reply
  • Sort: 
avatar image
2

Answer by Metalar · Feb 05, 2020 at 04:44 PM

Hello @FelixKahle ,

not sure if you already figured it out, but I found a solution: The problem is, as @Igarczyn already stated, the aliasation. However, you can avoid that by not depending on the Translation component, but the LocalToWorld component instead.

So you can adjust your code like this:

 public class FollowEntitySystem : JobComponentSystem
  {
      struct FollowEntityJob : IJobForEach<Translation, FollowEntityComponent>
      {
          [ReadOnly] public ComponentDataFromEntity<LocalToWorld> localToWorldFromEntityToFollow;
  
          public void Execute(ref Translation translationComponent, ref FollowEntityComponent followEntityComponent)
          {
              if (!localToWorldFromEntityToFollow.Exists(followEntityComponent.entityToFollow))
              {
                  return;
              }
              float3 entityToFollowPosition = localToWorldFromEntityToFollow[followEntityComponent.entityToFollow].Position;
              translationComponent.Value = entityToFollowPosition + followEntityComponent.offset;
          }
      }
  
      protected override JobHandle OnUpdate(JobHandle inputDeps)
      {
          FollowEntityJob followEntityJob = new FollowEntityJob()
          {
              localToWorldFromEntityToFollow = GetComponentDataFromEntity<LocalToWorld>(true)
          };
          return followEntityJob.Schedule(this, inputDeps);
      }
  }
Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
0

Answer by lgarczyn · Jan 11, 2020 at 11:45 AM

The problem is not in this code, you are passing overlapping pointers (in that case likely the same array) to both arguments of the function to run your entities.

Passing the same array (aliazation error) is likely an error, but also extremely dangerous for a number of reasons regarding optimization and memory safety.

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
0

Answer by FelixKahle · Jan 11, 2020 at 04:17 PM

But how would you overcome the problem that you have to read the position (translation) of the entity to follow as well as write to the position (translation as well) from the entity, which should follow the other one. I cant figure out how I should design a solution for that problem.

Comment
Add comment · Show 8 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image RendrWyre · Jan 11, 2020 at 06:45 PM 0
Share

Taking a shot in the dark but have you considered using Archetypes to distinguish entities in memory? for example, using a Follower Component for followers and a $$anonymous$$er Component for leaders? This could be done at runtime (Spawn Ghost... add leader component, spawn goat, add follower component) as Unity will update archetypes dynamically based on their components.

avatar image FelixKahle RendrWyre · Jan 11, 2020 at 07:11 PM 0
Share

But then I would still have the problem that I need to write and read from translation components (gain translation from leader by using ComponentDataFromEntity and write to the translation from the follower in the job). This would cause the same error I think.

avatar image RendrWyre FelixKahle · Jan 11, 2020 at 07:18 PM 0
Share

@Felix$$anonymous$$ahle I'm not sure it would? If they are different archetypes then you should be able to read/write to both of them without worrying as Unity stores then in separate memory chunks. I'm still getting my head around ECS so I could be totally wrong. $$anonymous$$aybe two iterations? Iterate through all entities with the leader component (and get the position of a single or multiple entities) and then iterate through all entities with a follower component, and update their position.

Show more comments

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

698 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

Multiple Cars not working 1 Answer

Distribute terrain in zones 3 Answers

I am having a problem with the following script 1 Answer

rigidbody AddForce(transform.left) error 1 Answer

[Answered] Error CS0019: Operator `==' cannot be applied 1 Answer


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges