Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 14 Next capture
2021 2022 2023
2 captures
13 Jun 22 - 14 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
1
Question by critterawesome · Jun 03, 2021 at 04:28 PM · variablestaticdotsreadonly

SystemBase ECS unity doesnt let me acess NativeMultiHashMap because it isnt readonly?

     using System.Collections;
     using System.Collections.Generic;
     using UnityEngine;
     using Unity.Entities;
     using Unity.Transforms;
     using Unity.Mathematics;
     using Unity.Collections;
     using Unity.Rendering;
     using Unity.Burst;
     using Unity.Jobs;
     
     
     
     public struct QuadrantData {
         public Entity entity;
         public Soldier soldier;
     }
     
     public class QuadrantSystem : SystemBase {
     
         EntityQuery entityQuery;
     
         public static NativeMultiHashMap<int, QuadrantData> quadrantMultiHashMap;
     
         public const int quadrantYMultiplier = 1000;
         private const int quadrantCellSize = 3;
     
         public static int GetPositionHashMapKey(int2 position) {
             return ((position.x / quadrantCellSize) + (quadrantYMultiplier * (position.y / quadrantCellSize)));
         }
     
         private static void DebugDrawQuadrant(float3 position) {
             Vector3 lowerLeft = new Vector3(math.floor(position.x / quadrantCellSize) * quadrantCellSize,0, math.floor(position.z / quadrantCellSize) * quadrantCellSize);
             Debug.DrawLine(lowerLeft, lowerLeft + new Vector3(+1,0, +0) * quadrantCellSize);
             Debug.DrawLine(lowerLeft, lowerLeft + new Vector3(+0,0, +1) * quadrantCellSize);
             Debug.DrawLine(lowerLeft + new Vector3(+1,0, +0) * quadrantCellSize, lowerLeft + new Vector3(+1,0, +1) * quadrantCellSize);
             Debug.DrawLine(lowerLeft + new Vector3(+0,0, +1) * quadrantCellSize, lowerLeft + new Vector3(+1,0, +1) * quadrantCellSize);
             //Debug.Log(GetPositionHashMapKey(position) + " " + position);
         }
     
         private static int GetEntityCountInHashMap(NativeMultiHashMap<int, QuadrantData> quadrantMultiHashMap, int hashMapKey) {
             QuadrantData quadrantData;
             NativeMultiHashMapIterator<int> nativeMultiHashMapIterator;
             int count = 0;
             if (quadrantMultiHashMap.TryGetFirstValue(hashMapKey, out quadrantData, out nativeMultiHashMapIterator)) {
                 do {
                     count++;
                 } while (quadrantMultiHashMap.TryGetNextValue(out quadrantData, ref nativeMultiHashMapIterator));
             }
             return count;
         }
         protected override void OnCreate()
         {
             quadrantMultiHashMap = new NativeMultiHashMap<int, QuadrantData>(0, Allocator.Persistent);
             base.OnCreate();
         }
     
         protected override void OnDestroy() {
             quadrantMultiHashMap.Dispose();
             base.OnDestroy();
         }
     
         protected override void OnUpdate() {
     
             entityQuery = GetEntityQuery(typeof(Translation), typeof(Soldier));
             quadrantMultiHashMap.Clear();
             if (entityQuery.CalculateEntityCount() > quadrantMultiHashMap.Capacity) {
                 quadrantMultiHashMap.Capacity = entityQuery.CalculateEntityCount();
             }
     
             Entities.ForEach((Entity entity,in Soldier soldier) =>
             {
                 int hashMapKey = GetPositionHashMapKey(soldier.Index);
                 quadrantMultiHashMap.Add(hashMapKey, new QuadrantData
                 {
                     entity = entity,
                     soldier = soldier,
                 });
             }).WithStoreEntityQueryInField(ref entityQuery)
              .ScheduleParallel();
     
             this.CompleteDependency();
         }
     
     }


I recieve this error?

C:\Dev\ECS Massive Battle\Assets\Scripts\QuadrantSystem.cs(74,13): Burst error BC1042: The managed class type Unity.Collections.NativeMultiHashMap2*` is not supported. Loading from a non-readonly static field QuadrantSystem.quadrantMultiHashMap is not supported

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

2 Replies

· Add your reply
  • Sort: 
avatar image
1

Answer by andrew-lukasik · Jun 03, 2021 at 06:06 PM

It won't let you access it because you are referencing a managed field from inside a job. This is not allowed. Thankfully, solution to this is very simple - make a local alias variable for jobs to copy by value.

 var quadrants = quadrantMultiHashMap.AsParallelWriter();
 Entities
     .ForEach( ( Entity entity ,in Soldier soldier ) =>
     {
         int hashMapKey = GetPositionHashMapKey(soldier.Index);
         quadrants.Add( hashMapKey , new QuadrantData{ entity = entity, soldier = soldier, });
     } )
     .ScheduleParallel();
Comment
Add comment · Show 15 · 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 critterawesome · Jun 03, 2021 at 06:53 PM 0
Share

Thanks for answering! I tried it but now it says that

InvalidOperationException: <>c__DisplayClass_OnUpdate_LambdaJob0.JobData.quadrants is not declared [ReadOnly] in a IJobParallelFor job. The container does not support parallel writing. Please use a more suitable container type.

avatar image andrew-lukasik critterawesome · Jun 03, 2021 at 07:19 PM 0
Share

Replace ScheduleParallel with Schedule (single thread)

OR use parallel writer:

 var quadrants = quadrantMultiHashMap.AsParallelWriter();
avatar image critterawesome andrew-lukasik · Jun 03, 2021 at 07:44 PM 0
Share

look at the answer below though am i supposed to access quadrants? I need a way for unity to read the static variable quadrantMultiHashMap without making it readonly as i can change the size without an error.

Show more comments
avatar image critterawesome · Jun 03, 2021 at 07:42 PM 0
Share

Yeah but i've heard that multithread is faster

avatar image andrew-lukasik critterawesome · Jun 03, 2021 at 08:21 PM 0
Share

It often is, but it introduces thread-safety considerations

avatar image critterawesome · Jun 03, 2021 at 08:40 PM 0
Share

One question on how to use this method do i acess the var quadrants that you recomended instead of the quadrantMultiHashMap like i did below?

avatar image andrew-lukasik critterawesome · Jun 03, 2021 at 08:43 PM 0
Share

Use aliases when inside a job (and Entities.ForEach is one). You can access QuadrantSystem.quadrantMultiHashMap normally otherwise (given there is no dependency issues)

avatar image critterawesome · Jun 03, 2021 at 08:45 PM 0
Share

It works if i use withoutburst but i know this can limit my performance thricefold so could you give me an example of what my changed quadrantsystem should be?

avatar image andrew-lukasik critterawesome · Jun 03, 2021 at 08:54 PM 0
Share

Do you mean this code you posted in second answer? I.e.:

  int hashMapKey = QuadrantSystem.GetPositionHashMapKey(soldierComponent.Index - 1);
  QuadrantData quadrantData;
  NativeMultiHashMapIterator<int> nativeMultiHashMapIterator;
  if (QuadrantSystem.quadrantMultiHashMap.TryGetFirstValue(hashMapKey, out quadrantData, out nativeMultiHashMapIterator))
  {
      do
      {
          if (soldierComponent.id != quadrantData.soldier.id)
          {
              if (soldierComponent.Index.x - 1 == quadrantData.soldier.Index.x && soldierComponent.Index.y == quadrantData.soldier.Index.y)
              {
                  TargetIsBlocked = true;
              }
          }
      } while (QuadrantSystem.quadrantMultiHashMap.TryGetNextValue(out quadrantData, ref nativeMultiHashMapIterator) && !TargetIsBlocked);
  }

If yes - is it part of a job too?

avatar image critterawesome andrew-lukasik · Jun 03, 2021 at 08:55 PM 0
Share

no i meant the quadrant system class in the first one and yes the second system also inherits from systembase.

Show more comments
avatar image
0

Answer by critterawesome · Jun 03, 2021 at 06:58 PM

If it helps you i access the hashmap by doing this

 int hashMapKey = QuadrantSystem.GetPositionHashMapKey(soldierComponent.Index - 1);
 QuadrantData quadrantData;
 NativeMultiHashMapIterator<int> nativeMultiHashMapIterator;
 if (QuadrantSystem.quadrantMultiHashMap.TryGetFirstValue(hashMapKey, out quadrantData, out nativeMultiHashMapIterator))
 {
     do
     {
         if (soldierComponent.id != quadrantData.soldier.id)
         {
             if (soldierComponent.Index.x - 1 == quadrantData.soldier.Index.x && soldierComponent.Index.y == quadrantData.soldier.Index.y)
             {
                 TargetIsBlocked = true;
             }
         }
     } while (QuadrantSystem.quadrantMultiHashMap.TryGetNextValue(out quadrantData, ref nativeMultiHashMapIterator) && !TargetIsBlocked);
 }
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

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

211 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

Related Questions

Need Help With My GAME! 3 Answers

Static variables 1 Answer

Change static variable in JS through Csharp 1 Answer

What's the better practice to use common variable? 0 Answers

Use Of Static Variables 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