コード例 #1
0
        public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            dstManager.AddComponent <UINumbers>(entity);
            dstManager.AddBuffer <UINumberMaterial>(entity);

            if (!conversionSystem.TryGetBuildConfigurationComponent <DotsRuntimeBuildProfile>(out var _))
            {
                return;
            }

            //Add additional entity for the Empty material
            var    primaryEntity    = conversionSystem.GetPrimaryEntity(Empty);
            var    mat              = dstManager.GetComponentData <SimpleMaterial>(primaryEntity);
            Entity additionalEntity = conversionSystem.CreateAdditionalEntity(Empty);

            dstManager.AddComponentData <SimpleMaterial>(additionalEntity, mat);

            //Add additional entities for each numbers material
            for (int i = 0; i < Numbers.Length; i++)
            {
                primaryEntity    = conversionSystem.GetPrimaryEntity(Numbers[i]);
                mat              = dstManager.GetComponentData <SimpleMaterial>(primaryEntity);
                additionalEntity = conversionSystem.CreateAdditionalEntity(Numbers[i]);
                dstManager.AddComponentData <SimpleMaterial>(additionalEntity, mat);
            }
        }
コード例 #2
0
        private Entity GetCurveEntityFromAnimationCurve(AnimationCurve curve, float multiplier, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            var curveEntity = conversionSystem.CreateAdditionalEntity(this);
            var keysEntity  = conversionSystem.CreateAdditionalEntity(this);

            var curveFloat = new BezierCurveFloat {
                keys = keysEntity
            };

            dstManager.AddComponentData <BezierCurveFloat>(curveEntity, curveFloat);

            var buffer    = dstManager.AddBuffer <BezierKeyFloat>(keysEntity);
            var keyFrames = curve.keys;

            for (int i = 0; i < keyFrames.Length; i++)
            {
                var keyFrame = keyFrames[i];
                var time     = keyFrame.time;
                var value    = keyFrame.value;
                value *= multiplier;

                var inValue  = value - keyFrame.inTangent * 0.15f;
                var outValue = value + keyFrame.outTangent * 0.15f;
                buffer.Add(new BezierKeyFloat(time, value, inValue, outValue));
            }

            return(curveEntity);
        }
コード例 #3
0
    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        conversionSystem.DeclareLinkedEntityGroup(this.gameObject);
        Entity additional1 = conversionSystem.CreateAdditionalEntity(this.gameObject);

        dstManager.SetName(additional1, $"{this.name}_Add1");
        Entity additional2 = conversionSystem.CreateAdditionalEntity(this.gameObject);

        dstManager.SetName(additional2, $"{this.name}_Add2");

        conversionSystem.GetPrimaryEntity(referPrefab);
    }
コード例 #4
0
        public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            var player = entity;

            dstManager.AddComponentData <Position>(player, new float2(10, 8));
            dstManager.AddComponentData <Renderable>(player, new Renderable
            {
                FGColor = Color.yellow,
                BGColor = Color.black,
                Glyph   = RLTK.CodePage437.ToCP437('@')
            });
            dstManager.AddComponentData <InputData>(player, new InputData());

            for (int i = 0; i < 10; ++i)
            {
                var e          = conversionSystem.CreateAdditionalEntity(gameObject);
                var renderable = new Renderable
                {
                    FGColor = Color.red,
                    BGColor = Color.black,
                    Glyph   = RLTK.CodePage437.ToCP437('☺')
                };
                dstManager.AddComponentData <Position>(e, new float2(i * 3, 13));
                dstManager.AddComponentData(e, renderable);
                dstManager.AddComponentData(e, new MoveLeft {
                    Speed = 15
                });
            }
        }
コード例 #5
0
        public static Entity ConvertSubmesh(GameObjectConversionSystem gsys, UnityEngine.MeshRenderer uMeshRenderer,
                                            UnityEngine.Mesh uMesh, Entity meshEntity, int subMeshIndex, Entity materialEntity)
        {
            Entity primaryMeshRenderer = gsys.GetPrimaryEntity(uMeshRenderer);
            Entity meshRendererEntity  = primaryMeshRenderer;

            if (subMeshIndex > 0)
            {
                meshRendererEntity = gsys.CreateAdditionalEntity(uMeshRenderer);
                AddTransformComponent(gsys, primaryMeshRenderer, meshRendererEntity);
            }

            gsys.DstEntityManager.AddComponentData(meshRendererEntity, new Unity.Tiny.Rendering.MeshRenderer()
            {
                mesh       = meshEntity,
                material   = materialEntity,
                startIndex = Convert.ToInt32(uMesh.GetIndexStart(subMeshIndex)),
                indexCount = Convert.ToInt32(uMesh.GetIndexCount(subMeshIndex))
            });

            gsys.DstEntityManager.AddComponentData(meshRendererEntity, new Unity.Tiny.Rendering.CameraMask()
            {
                mask = (ulong)(1 << uMeshRenderer.gameObject.layer)
            });

            gsys.DstEntityManager.AddComponentData(meshRendererEntity, new WorldBounds());

            return(meshRendererEntity);
        }
コード例 #6
0
        private static Entity GenerateMeshRendererEntity(GameObjectConversionSystem gsys,
                                                         UnityEngine.SkinnedMeshRenderer uSkinnedMeshRenderer, Entity meshEntity, Entity materialEntity, int startIndex,
                                                         int indexCount, bool createAdditionlEntity, bool canUseGPUSkinning, bool canUseCPUSkinning)
        {
            Entity primarySkinnedMeshRenderer = gsys.GetPrimaryEntity(uSkinnedMeshRenderer);
            Entity meshRendererEntity         = primarySkinnedMeshRenderer;

            if (createAdditionlEntity)
            {
                meshRendererEntity = gsys.CreateAdditionalEntity(uSkinnedMeshRenderer);
                MeshRendererConversion.AddTransformComponent(gsys, primarySkinnedMeshRenderer, meshRendererEntity);
            }

            Unity.Tiny.Rendering.SkinnedMeshRenderer smr = new Unity.Tiny.Rendering.SkinnedMeshRenderer();
            smr.sharedMesh        = meshEntity;
            smr.material          = materialEntity;
            smr.startIndex        = startIndex;
            smr.indexCount        = indexCount;
            smr.canUseGPUSkinning = canUseGPUSkinning;
            smr.canUseCPUSkinning = canUseCPUSkinning;
            smr.shadowCastingMode = (Unity.Tiny.Rendering.ShadowCastingMode)uSkinnedMeshRenderer.shadowCastingMode;
            smr.skinQuality       = ConvertSkinQuality(uSkinnedMeshRenderer);
            gsys.DstEntityManager.AddComponentData(meshRendererEntity, smr);

            gsys.DstEntityManager.AddComponentData(meshRendererEntity, new WorldBounds());
            return(meshRendererEntity);
        }
コード例 #7
0
        public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            var rt = this.GetComponent <RectTransform>();

            textTransform.rect = rt.rect;
            dstManager.AddComponentData <TextTransform>(entity, textTransform);

            //Account for pivot, so pivot could be anywhere and not influencing starting position of glyphs.
            var shiftBack = rt.pivot;

            shiftBack.y = 1 - shiftBack.y;
            shiftBack  *= rt.sizeDelta;
            var translation = dstManager.GetComponentData <Translation>(entity);

            translation.Value.x -= shiftBack.x;
            translation.Value.y += shiftBack.y;
            dstManager.SetComponentData <Translation>(entity, translation);

            dstManager.AddComponent <FontMetrics>(entity);

            var ea = new NativeArray <GlyphEntityGroup>(persistentCharacterEntities, Allocator.Temp);

            for (int i = 0; i < persistentCharacterEntities; i++)
            {
                Entity persistentCharacter = conversionSystem.CreateAdditionalEntity(this.gameObject);
#if UNITY_EDITOR
                dstManager.SetName(persistentCharacter, $"{this.name}_Char{i}");
#endif
                foreach (var type in ArchetypeCollection.CharacterTypes)
                {
                    dstManager.AddComponent(persistentCharacter, type);
                }

                ea[i] = new GlyphEntityGroup {
                    character = persistentCharacter
                };

                //buffer.Add(new CharacterEntityGroup {character = persistentCharacter});
                dstManager.SetComponentData(persistentCharacter, new Parent {
                    Value = entity
                });
            }

            var buffer = dstManager.AddBuffer <GlyphEntityGroup>(entity);
            buffer.AddRange(ea);

            dstManager.AddComponentData(entity, new TextContent
            {
                text = text,
            });

            textStructure.persistentCharacterEntityMode = persistentCharacterEntities > 0;
            dstManager.AddComponentData <TextStructure>(entity, textStructure);


            dstManager.AddSharedComponentData <FontAssetHolder>(entity, new FontAssetHolder
            {
                htmFontAsset = htmFontAsset
            });
        }
コード例 #8
0
        public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            //var rootPath = EditorApplication.applicationContentsPath;
            //var path = Path.Combine(rootPath, DataPath);

            dstManager.AddComponent <GameDataManager>(entity);

            var folders = AssetDatabase.GetSubFolders(DataPath);

            if (folders != null)
            {
                for (int i = 0; i < folders.Length; i++)
                {
                    var folderPath = folders[i];

                    var typeName = GetGameDataTypeNameFromPath(folderPath);
                    if (authoringDict.TryGetValue(typeName, out var authoring))
                    {
                        //Debug.LogFormat("Convert: {0}: {1}, {2}", i, folderPath, authoring.GetType().Name);

                        var listEntity = conversionSystem.CreateAdditionalEntity(this);
                        authoring.Convert(gameObject, listEntity, dstManager, conversionSystem);
                    }
                }
            }
        }
コード例 #9
0
        public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            var blob = new NodeBlobRef(_source.GetBlobAsset());
            var bb   = new EntityBlackboard {
                Entity = entity, EntityManager = dstManager
            };

            VirtualMachine.Reset(ref blob, ref bb);

            dstManager.AddBuffer <BehaviorTreeBufferElement>(entity);
            dstManager.AddComponent <CurrentBehaviorTreeComponent>(entity);

            var behaviorTreeEntity = conversionSystem.CreateAdditionalEntity(gameObject);

#if UNITY_EDITOR
            dstManager.SetName(behaviorTreeEntity, $"[BT]{dstManager.GetName(entity)}:{_order}.{_debugName}");
#endif
            var query     = blob.GetAccessTypes();
            var dataQuery = new BlackboardDataQuery(query, components =>
                                                    // HACK: workaround for different world/dstManager in subscenes.
                                                    // dstManager.CreateEntityQuery(components.ToArray()));
                                                    World.DefaultGameObjectInjectionWorld.EntityManager.CreateEntityQuery(components.ToArray()));
            dstManager.AddSharedComponentData(behaviorTreeEntity, dataQuery);

            dstManager.AddComponentData(behaviorTreeEntity, new BehaviorTreeComponent
            {
                Blob = blob, Thread = _thread, AutoCreation = _autoCreateTypes
            });
            dstManager.AddComponentData(behaviorTreeEntity, new BehaviorTreeTargetComponent {
                Value = entity
            });
            dstManager.AddComponentData(behaviorTreeEntity, new BehaviorTreeOrderComponent {
                Value = _order
            });
        }
        /// <summary>
        /// Convert the given <see cref="Renderer"/> into a multiple Hybrid Rendered entities such that every
        /// <see cref="Material"/> in the <see cref="Renderer"/> is converted into one entity that uses that <see cref="Material"/>
        /// with the corresponding sub-mesh from <see cref="RenderMesh.mesh"/>. All created entities will be parented
        /// to the entity created from <see cref="root"/>.
        /// </summary>
        public void ConvertToMultipleEntities(
            EntityManager dstEntityManager,
            GameObjectConversionSystem conversionSystem,
            RenderMeshDescription renderMeshDescription,
            Renderer renderer,
            List <Material> sharedMaterials,
            Transform root)
        {
            int materialCount = sharedMaterials.Count;

            float4x4 localToWorld = root.localToWorldMatrix;
            var      rootEntity   = conversionSystem.GetPrimaryEntity(root);

            for (var m = 0; m != materialCount; m++)
            {
                var meshEntity = conversionSystem.CreateAdditionalEntity(renderer);

                // required for incremental conversion to work without a dependency on the transform itself.
                dstEntityManager.AddComponent <CopyTransformFromPrimaryEntityTag>(meshEntity);
                dstEntityManager.AddComponentData(meshEntity, new LocalToWorld {
                    Value = localToWorld
                });
                if (!dstEntityManager.HasComponent <Static>(meshEntity))
                {
                    dstEntityManager.AddComponentData(meshEntity, new Parent {
                        Value = rootEntity
                    });
                    dstEntityManager.AddComponentData(meshEntity,
                                                      new LocalToParent {
                        Value = float4x4.identity
                    });
                }

                var material = sharedMaterials[m];

                var lightmappedMaterial = ConfigureHybridLightMapping(
                    meshEntity,
                    dstEntityManager,
                    renderer,
                    material);

                if (lightmappedMaterial != null)
                {
                    material = lightmappedMaterial;
                }

                renderMeshDescription.RenderMesh.subMesh  = m;
                renderMeshDescription.RenderMesh.material = material;

                RenderMeshUtility.AddComponents(
                    meshEntity,
                    dstEntityManager,
                    renderMeshDescription);

                RemoveLightProbeComponentsFromLightMappedEntities(meshEntity, dstEntityManager);

                conversionSystem.ConfigureEditorRenderData(meshEntity, renderer.gameObject, true);
            }
        }
コード例 #11
0
    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        var e = conversionSystem.CreateAdditionalEntity(this);

        dstManager.AddComponentData(e, new SetFixedTimestep {
            Timestep = 1f / StepsPerSecond
        });
    }
コード例 #12
0
        public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            dstManager.AddComponent <UINumbers>(entity);
            dstManager.AddBuffer <UINumberMaterial>(entity);

            //Add additional entity for the Empty material
            var    primaryEntity    = conversionSystem.GetPrimaryEntity(Empty);
            var    mat              = dstManager.GetComponentData <SimpleMaterial>(primaryEntity);
            Entity additionalEntity = conversionSystem.CreateAdditionalEntity(Empty);

            dstManager.AddComponentData <SimpleMaterial>(additionalEntity, mat);

            //Add additional entities for each numbers material
            for (int i = 0; i < Numbers.Length; i++)
            {
                primaryEntity    = conversionSystem.GetPrimaryEntity(Numbers[i]);
                mat              = dstManager.GetComponentData <SimpleMaterial>(primaryEntity);
                additionalEntity = conversionSystem.CreateAdditionalEntity(Numbers[i]);
                dstManager.AddComponentData <SimpleMaterial>(additionalEntity, mat);
            }
        }
コード例 #13
0
        // モーションエンティティ生成
        // メインオブジェクトの関連エンティティとして生成し、リンクもここでつける。
        static Entity createMotionEntity
            (GameObjectConversionSystem gcs, GameObject motionMain, ComponentType[] motionTypes)
        {
            var em = gcs.DstEntityManager;

            var motionArchetype = em.CreateArchetype(motionTypes);
            var motionEntity    = gcs.CreateAdditionalEntity(motionMain, motionArchetype);

            em.SetName_(motionEntity, $"{motionMain.name} motion");

            return(motionEntity);
        }
コード例 #14
0
    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        dstManager.AddComponentData(entity, GetLightSource());
        dstManager.AddComponentData(entity, GetLightPosition());

        dstManager.AddComponentData(entity,
                                    new Velocity {
            vel    = 0,
            angVel = angularVelocity * Mathf.Deg2Rad,
        }
                                    );
        dstManager.AddComponentData(entity,
                                    new Mass {
            mass    = math.INFINITY,
            inertia = inertia
        }
                                    );

        dstManager.AddComponentData(entity,
                                    new GravityScale {
            gravityScale = 0
        }
                                    );

        dstManager.AddComponentData(entity, new IgnoreHierarchyTag());

        if (toTrack != null)
        {
            dstManager.AddComponentData(entity,
                                        new LightTrackingJoint {
                toTrack       = conversionSystem.GetPrimaryEntity(toTrack),
                trackSpeed    = math.radians(trackSpeed),
                trackSoftness = trackSoftness
            }
                                        );
        }

        foreach (var snapInfo in snapInfos)
        {
            var joint = conversionSystem.CreateAdditionalEntity(gameObject);
            dstManager.SetName(joint, "Light mount joint");
            dstManager.AddComponentData(joint,
                                        new LightMountJoint {
                lightEntity = entity,
                mount       = conversionSystem.GetPrimaryEntity(snapInfo.mount),
                rangeStart  = Ang.SignedAngleOf(snapInfo.ccw),
                rangeEnd    = Ang.SignedAngleOf(snapInfo.cw),
                id          = Random.Range(0, int.MaxValue)
            }
                                        );
        }
    }
コード例 #15
0
        // ストリームエンティティ生成
        // ボーンオブジェクトの関連エンティティとして生成する。
        //
        static Entity[] createStreamEntitiesOfSection
        (
            GameObjectConversionSystem gcs, GameObject[] enabledBoneObjects,
            ComponentType[] streamTypes
        )
        {
            var em = gcs.DstEntityManager;

            var streamArchetype = em.CreateArchetype(streamTypes);
            var streamEntities  = enabledBoneObjects
                                  .Select(boneObject => gcs.CreateAdditionalEntity(boneObject, streamArchetype))
                                  .Do(ent => em.SetName_(ent, $"{em.GetName_(ent)} stream"))
                                  .ToArray();

            return(streamEntities);
        }
コード例 #16
0
    public static void CreatePanel(EntityManager dstManager, GameObjectConversionSystem conversionSystem, GameObject gameObject, GameObject prefab, LocalToWorld localToWorld)
    {
        var meshRenderer = prefab.GetComponent <MeshRenderer>();
        var meshFilter   = prefab.GetComponent <MeshFilter>();
        var materials    = new List <Material>(10);
        var mesh         = meshFilter.sharedMesh;

        meshRenderer.GetSharedMaterials(materials);

        var segmentEntity = conversionSystem.CreateAdditionalEntity(gameObject);
        var pos           = localToWorld.Position;

        var renderBounds = new RenderBounds
        {
            Value = new AABB
            {
                Center  = new float3(0.0f, 0.0f, 0.0f),
                Extents = new float3(0.5f, 0.5f, 0.5f)
            }
        };
        var worldRenderBounds = new WorldRenderBounds
        {
            Value = new AABB
            {
                Center  = pos,
                Extents = new float3(0.5f, 0.5f, 0.5f)
            }
        };
        var frozenRenderSceneTag = new FrozenRenderSceneTag
        {
            HasStreamedLOD = 0,
            SceneGUID      = Hash128.Compute("Grid Panel"),
            SectionIndex   = 0
        };

#if UNITY_EDITOR
        dstManager.SetName(segmentEntity, "Grid Panel");
#endif
        dstManager.AddComponentData(segmentEntity, localToWorld);
        dstManager.AddComponentData(segmentEntity, renderBounds);

        dstManager.AddComponentData(segmentEntity, worldRenderBounds);
        dstManager.AddSharedComponentData(segmentEntity, frozenRenderSceneTag);
        dstManager.AddComponent(segmentEntity, typeof(Static));

        CreateRenderMesh(segmentEntity, dstManager, conversionSystem, meshRenderer, mesh, materials);
    }
コード例 #17
0
    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        Entity swappableDetector = conversionSystem.CreateAdditionalEntity(this);

        dstManager.AddBuffer <DirectContactStore>(swappableDetector);
        dstManager.AddComponent <Box>(swappableDetector);
        dstManager.AddComponent <Position>(swappableDetector);
        dstManager.AddComponent <IsTrigger>(swappableDetector);

        dstManager.AddComponentData(entity,
                                    new PlayerRoot {
            swappableDetector = swappableDetector
        }
                                    );

        dstManager.AddComponent <ActivePlayer>(entity);
        dstManager.AddBuffer <DirectContactStore>(entity);
        dstManager.AddBuffer <ShadowContactStore>(entity);
    }
コード例 #18
0
        public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            foreach (var giveItem in GiveItems)
            {
                var item = conversionSystem.GetPrimaryEntity(giveItem.prefab);
                var give = conversionSystem.CreateAdditionalEntity(gameObject);
                dstManager.AddComponentData(give, new GiveItem
                {
                    item     = item,
                    amount   = giveItem.amount,
                    receiver = entity
                });

#if UNITY_EDITOR
                var name = dstManager.GetName(item);
                dstManager.SetName(give, $"Give {name}");
#endif
            }
        }
コード例 #19
0
        public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            dstManager.AddComponentData(entity, new EntityRefTestData {
                Value = conversionSystem.GetPrimaryEntity(Value)
            });

            for (int i = 0; i != AdditionalEntityCount; i++)
            {
                var additional = conversionSystem.CreateAdditionalEntity(this);
                dstManager.AddComponentData(additional, new EntityRefTestData {
                    Value = conversionSystem.GetPrimaryEntity(Value)
                });
            }

            if (DeclareLinkedEntityGroup)
            {
                conversionSystem.DeclareLinkedEntityGroup(gameObject);
            }
        }
コード例 #20
0
        // ----------------------------------------------------------------------------------


        static Entity createDrawInstanceEntity
            (GameObjectConversionSystem gcs, GameObject top, GameObject main)
        {
            var em = gcs.DstEntityManager;


            var archetype = em.CreateArchetype
                            (
                typeof(DrawInstance.MeshTag),
                typeof(DrawInstance.ModeLinkData),
                typeof(DrawInstance.PostureLinkData),
                typeof(DrawInstance.TargetWorkData)
                            );
            var ent = gcs.CreateAdditionalEntity(top, archetype);

            em.SetComponentData(ent,
                                new DrawInstance.ModeLinkData
            {
                DrawModelEntityCurrent = gcs.GetFromModelEntityDictionary(top),
            }
                                );
            em.SetComponentData(ent,
                                new DrawInstance.PostureLinkData
            {
                PostureEntity = gcs.GetPrimaryEntity(main),
            }
                                );
            em.SetComponentData(ent,
                                new DrawInstance.TargetWorkData
            {
                DrawInstanceId = -1,
            }
                                );


            em.SetName_(ent, $"{top.name} draw");
            return(ent);
        }
コード例 #21
0
        public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            for (int j = 0; j < vehiclePrefabs.Count; j++)
            {
                // A primary entity needs to be called before additional entities can be used
                Entity vehiclePrefab = conversionSystem.CreateAdditionalEntity(this);
                var    prefabData    = new VehiclePrefabData
                {
                    VehiclePrefab = conversionSystem.GetPrimaryEntity(vehiclePrefabs[j]),
                    VehicleSpeed  = j < speedMultipliers.Length ? speedMultipliers[j] : 3.0f
                };
                dstManager.AddComponentData(vehiclePrefab, prefabData);
            }

            var trafficSettings = new TrafficSettingsData
            {
                GlobalSpeedFactor = globalSpeedFactor,
                PathSegments      = pathSegments,
                MaxCars           = maxCars
            };

            dstManager.AddComponentData(entity, trafficSettings);
        }
コード例 #22
0
        public override FontData ConvertGameData(GameObject gameObject, Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem, FontDataSO dataSO)
        {
            bool isRuntime = conversionSystem.TryGetBuildConfigurationComponent <DotsRuntimeBuildProfile>(out var _);

            var data = new FontData();

            data.Id   = dataSO.Id;
            data.Name = dataSO.Name;

            var font = dataSO.Font;

            data.Ascent  = font.ascent;
            data.Dynamic = font.dynamic;

            if (isRuntime)
            {
                data.MaterialEntity = conversionSystem.GetPrimaryEntity(font.material);
                Debug.LogFormat("[R]FontDataSOListConverter.ConvertGameData: {0}", font.material);
            }
            else
            {
                var materialEntity = conversionSystem.CreateAdditionalEntity(gameObject);
                dstManager.AddSharedComponentData(materialEntity, new FontMaterial {
                    Material = font.material
                });
                data.MaterialEntity = materialEntity;
                Debug.LogFormat("FontDataSOListConverter.ConvertGameData: {0}", font.material);
            }

            data.LineHeight = font.lineHeight;
            data.FontSize   = font.fontSize;

            data.CharacterInfoArrayAssetRef = CreateArrayAssetRef(font.characterInfo);

            return(data);
        }
コード例 #23
0
ファイル: Map.cs プロジェクト: NeroWeNeed/reactics
        //TODO: Editor Rendering not working for some reason.
        public async void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            if (map != null)
            {
                var mapSystem = dstManager.World.GetOrCreateSystem <MapSystemGroup>();
                dstManager.AppendArchetype(entity, mapSystem.Archetypes.Map);
                var mesh = map.CreateMesh();
                mesh.RecalculateBounds();
                dstManager.AddComponentData(entity, new MapData(map.CreateBlob()));
                dstManager.AddComponentData(entity, new MapHighlightState {
                    dirty = 0, states = new Unity.Collections.LowLevel.Unsafe.UnsafeMultiHashMap <ushort, Point>(16, Allocator.Persistent)
                });
                dstManager.AddComponentData(entity, new MapCollisionState {
                    value = new Unity.Collections.LowLevel.Unsafe.UnsafeHashMap <Point, Entity>(16, Allocator.Persistent)
                });
                dstManager.AddComponentData(entity, new MapRenderInfo {
                    baseIndexCount = mesh.GetIndexCount(0), tileSize = 1f, elevationStep = 0.25f
                });
                var layerEntities = new NativeArray <Entity>(MapLayers.Count, Allocator.TempJob);

                for (int i = 0; i < MapLayers.Count; i++)
                {
                    layerEntities[i] = conversionSystem.CreateAdditionalEntity(this);
                    dstManager.AppendArchetype(layerEntities[i], mapSystem.Archetypes.MapRenderLayer);
                }

                var      layers   = (MapLayer[])Enum.GetValues(typeof(MapLayer));
                Material material = mapMaterial;

                for (int i = 0; i < layers.Length; i++)
                {
#if UNITY_EDITOR
                    dstManager.SetName(layerEntities[i], $"{this.name} ({layers[i]} Layer)");
#endif
                    dstManager.SetSharedComponentData(layerEntities[i], new RenderMesh
                    {
                        mesh           = mesh,
                        material       = material,
                        subMesh        = i,
                        castShadows    = ShadowCastingMode.Off,
                        receiveShadows = false,
                        layer          = transform.gameObject.layer
                    });
                    dstManager.SetComponentData(layerEntities[i], new MapElement {
                        value = entity
                    });
                    dstManager.SetComponentData(layerEntities[i], new MaterialColor
                    {
                        Value = layerColors[layers[i]].ToFloat4()
                    });

                    dstManager.SetComponentData(layerEntities[i], new RenderBounds {
                        Value = mesh.bounds.ToAABB()
                    });

                    /*                 dstManager.AddComponentData(layerEntities[i], new Translation { Value = new float3(0, 0, 0) });
                     *              dstManager.AddComponentData(layerEntities[i], new Rotation { Value = quaternion.identity });
                     *              dstManager.AddComponentData(layerEntities[i], new CompositeScale { Value = float4x4.Scale(1) });
                     *              dstManager.AddComponentData(layerEntities[i], new PerInstanceCullingTag());
                     *              dstManager.AddComponentData(layerEntities[i], new BuiltinMaterialPropertyUnity_RenderingLayer { Value = 1 }); */
                    //Overlapping submeshes can't overlap anymore so offset position slightly upward for each layer.
                    dstManager.SetComponentData(layerEntities[i], new LocalToWorld {
                        Value = float4x4.Translate(new float3(0, transform.position.y + (LAYER_OFFSET * i), 0))
                    });
                    dstManager.GetBuffer <MapLayerRenderer>(entity).Add(new MapLayerRenderer {
                        entity = layerEntities[i], layer = layers[i]
                    });
                    //dstManager.AddBuffer<MapTileEffect>(entity);
                    dstManager.AddComponentData(layerEntities[i], new Parent {
                        Value = entity
                    });
                    conversionSystem.ConfigureEditorRenderData(layerEntities[i], this.gameObject, true);
                }
                var children = dstManager.AddBuffer <Child>(entity);
                children.AddRange(layerEntities.Reinterpret <Child>());
                conversionSystem.DeclareLinkedEntityGroup(this.gameObject);
                conversionSystem.ConfigureEditorRenderData(entity, this.gameObject, true);
                layerEntities.Dispose();
            }
        }
コード例 #24
0
        public static void Convert(
            EntityManager dstEntityManager,
            GameObjectConversionSystem conversionSystem,
            bool attachToPrimaryEntityForSingleMaterial,
            Renderer meshRenderer,
            Mesh mesh,
            List <Material> materials,
            Dictionary <MaterialLookupKey, Material> createdMaterials,
            LightMaps lightMaps,
            int lightmapIndex,
            Transform root,
            AABB localBounds)
        {
            var materialCount = materials.Count;

            // Don't add RenderMesh (and other required components) unless both mesh and material are assigned.
            if (mesh == null || materialCount == 0)
            {
                Debug.LogWarning(
                    "MeshRenderer is not converted because either the assigned mesh is null or no materials are assigned.",
                    meshRenderer);
                return;
            }

            //@TODO: Transform system should handle RenderMeshFlippedWindingTag automatically. This should not be the responsibility of the conversion system.
            float4x4 localToWorld = root.localToWorldMatrix;
            var      flipWinding  = math.determinant(localToWorld) < 0.0;

            if (materialCount == 1 && attachToPrimaryEntityForSingleMaterial)
            {
                var meshEntity = conversionSystem.GetPrimaryEntity(meshRenderer);

                AddComponentsToEntity(
                    meshEntity,
                    dstEntityManager,
                    conversionSystem,
                    meshRenderer,
                    mesh,
                    materials,
                    createdMaterials,
                    flipWinding,
                    0,
                    lightMaps,
                    lightmapIndex,
                    localBounds);
            }
            else
            {
                var rootEntity = conversionSystem.GetPrimaryEntity(root);

                for (var m = 0; m != materialCount; m++)
                {
                    var meshEntity = conversionSystem.CreateAdditionalEntity(meshRenderer);

                    dstEntityManager.AddComponentData(meshEntity, new LocalToWorld {
                        Value = localToWorld
                    });
                    if (!dstEntityManager.HasComponent <Static>(meshEntity))
                    {
                        dstEntityManager.AddComponentData(meshEntity, new Parent {
                            Value = rootEntity
                        });
                        dstEntityManager.AddComponentData(meshEntity,
                                                          new LocalToParent {
                            Value = float4x4.identity
                        });
                    }

                    AddComponentsToEntity(
                        meshEntity,
                        dstEntityManager,
                        conversionSystem,
                        meshRenderer,
                        mesh,
                        materials,
                        createdMaterials,
                        flipWinding,
                        m,
                        lightMaps,
                        lightmapIndex,
                        localBounds);
                }
            }
        }
コード例 #25
0
        public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            Debug.Log("Converting");

            unsafeMemoryReferences = new List <CustomMemoryManagerBase>();

            List <VehicleObject> vehiclePrefabs;

            InitializeTotalVehicles(out vehiclePrefabs);

            for (int i = 0; i < vehiclePrefabs.Count; i++)
            {
                Entity bodyEntity = conversionSystem.CreateAdditionalEntity(this);
                //convert vehicle body part to ECS
                var vehicleBody = new VehicleBody
                {
                    prefab = conversionSystem.GetPrimaryEntity(vehiclePrefabs[i].body),
                    length = vehiclePrefabs[i].bodyLength,
                    id     = VEHICLE_ID_POOL
                };
                dstManager.AddComponentData(bodyEntity, vehicleBody);

                //convert vehicle wheel(s) part to ECS
                var wheels = vehiclePrefabs[i].wheels;
                for (int j = 0; j < wheels.Length; j++)
                {
                    Entity wheelEntity  = conversionSystem.CreateAdditionalEntity(this);
                    var    vehicleWheel = new VehicleWheel
                    {
                        prefab         = conversionSystem.GetPrimaryEntity(wheels[j]),
                        positionOffset = wheels[j].gameObject.transform.position,
                        rotationOffset = wheels[j].gameObject.transform.eulerAngles,
                        id             = VEHICLE_ID_POOL
                    };
                    dstManager.AddComponentData(wheelEntity, vehicleWheel);
                }
                VEHICLE_ID_POOL++;
            }
            //

            /*********** WORKING ON PATHS ********/

            //assign path's ID
            for (int i = 0; i < pathsCollector.bakedTrafficPaths.Length; i++)
            {
                pathsCollector.bakedTrafficPaths[i].id = (byte)PATH_ID_POOL;
                PATH_ID_POOL++;
            }

            //conver path asset to ecs data
            unsafe
            {
                for (int i = 0; i < pathsCollector.bakedTrafficPaths.Length; i++)
                {
                    //get current path
                    var currentPath = pathsCollector.bakedTrafficPaths[i];
                    //Debug.Log(currentPath.PathName);

                    //create entity
                    var pathEntity = conversionSystem.CreateAdditionalEntity(this);

                    //allocate native memory
                    CustomMemoryManager <float3> pathMem = new CustomMemoryManager <float3>();
                    pathMem.AllocateMemory(currentPath.PathNodes.Count, 32, Allocator.Persistent);

                    CustomMemoryManager <byte> occupiedSlotMem = new CustomMemoryManager <byte>();
                    occupiedSlotMem.AllocateMemory(currentPath.PathNodes.Count, 8, Allocator.Persistent);

                    //add to list
                    unsafeMemoryReferences.Add(pathMem);
                    unsafeMemoryReferences.Add(occupiedSlotMem);


                    //populate allocated memory
                    var nodesPtr    = pathMem.GetPointer();
                    var occupiedPtr = occupiedSlotMem.GetPointer();
                    for (int j = 0; j < currentPath.PathNodes.Count; j++)
                    {
                        nodesPtr[j]    = currentPath.PathNodes[j];
                        occupiedPtr[j] = 0;
                    }


                    //populate linked count
                    byte linkedCount = 0;
                    CustomMemoryManager <PathLinkedData> linkedData = new CustomMemoryManager <PathLinkedData>();
                    unsafeMemoryReferences.Add(linkedData);

                    if (currentPath.splittingPaths != null && currentPath.splittingPaths.Count > 0)
                    {
                        linkedData.AllocateMemory(currentPath.splittingPaths.Count, 32, Allocator.Persistent);
                        var linkedDataPtr = linkedData.GetPointer();

                        for (int j = 0; j < currentPath.splittingPaths.Count; j++)
                        {
                            linkedDataPtr[j].chance         = (byte)currentPath.splittingPaths[j].turnedChance;
                            linkedDataPtr[j].connectingNode = currentPath.splittingPaths[j].startNode;
                            linkedDataPtr[j].transitionNode = currentPath.splittingPaths[j].transitionNode;
                            linkedDataPtr[j].linkedID       = currentPath.splittingPaths[j].turnedPath.id;
                        }
                    }


                    //create ecs data
                    var pathData = new Path
                    {
                        id          = currentPath.id,
                        maxSpeed    = (byte)currentPath.actualSpeedLimit,
                        nodesCount  = currentPath.PathNodes.Count,
                        pathNodes   = nodesPtr,
                        occupied    = occupiedPtr,
                        linkedCount = linkedCount,
                        linked      = linkedData.GetPointer()
                    };

                    //add ecs data
                    dstManager.AddComponentData(pathEntity, pathData);
                }
            }

            //add total vehicles to ECS
            var traffSettings = new TrafficSettingsData
            {
                vehicleCount = totalVehicles,
            };

            dstManager.AddComponentData(entity, traffSettings);

            Debug.Log("Finished");

            //Done with paths
            //upload them

            Resources.UnloadAsset(pathsCollector);
            pathsCollector = null;


            //explicitly call garbage collector
            System.GC.Collect();
        }
    public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
    {
        // set up initial counts and values for everything
        MaxFarmers  = maxFarmers;
        MaxDrones   = maxDrones;
        droneCount  = 0;
        farmerCount = 0;
        BoardWidth  = boardWidth;
        PerformTaskSystem.InitializeTillSystem(maxFarmers);

        // set up mesh rendering from prefab
        MeshRenderer meshRenderer = TilePrefab.GetComponent <MeshRenderer>();
        var          meshFilter   = TilePrefab.GetComponent <MeshFilter>();
        var          materials    = new List <Material>(MATERIAL_NUMBER);
        var          mesh         = meshFilter.sharedMesh;

        meshRenderer.GetSharedMaterials(materials);

        // set up entity and manager
        entityManager = dstManager;
        boardEntity   = conversionSystem.GetPrimaryEntity(TilePrefab);

        // a board archetype
        boardArchetype = entityManager.CreateArchetype(
            typeof(Translation), typeof(GridBoard));

        // Generate rock prefab entity
        rockEntity = conversionSystem.GetPrimaryEntity(RockPrefab);
        entityManager.AddComponentData(rockEntity, new RockTag {
        });

        // Generate drone prefab entity
        droneEntity = conversionSystem.GetPrimaryEntity(DronePrefab);
        entityManager.AddComponentData(droneEntity, new MovementComponent {
        });
        entityManager.AddComponentData(droneEntity, new EntityInfo {
            specificEntity = droneEntity, type = -1
        });
        entityManager.AddComponent(droneEntity, typeof(DroneTag));

        // generate 3 plants to use for everything else
        plantEntity = new Entity[DIFF_PLANT_COUNT];
        Unity.Mathematics.Random rand  = new Unity.Mathematics.Random(42);
        int          nextRandom        = rand.NextInt();
        MeshRenderer meshPlantRenderer = PlantMeshPrefab.GetComponent <MeshRenderer>();
        var          meshPlantFilter   = PlantMeshPrefab.GetComponent <MeshFilter>();
        var          materials2        = new List <Material>(MATERIAL_NUMBER);

        meshPlantRenderer.GetSharedMaterials(materials2);

        for (int i = 0; i < DIFF_PLANT_COUNT; i++)
        {
            plantMesh = GeneratePlantMesh(nextRandom);
            var meshPlantTmp = Instantiate(plantMesh);
            meshPlantFilter.sharedMesh = meshPlantTmp;
            plantEntity[i]             = conversionSystem.GetPrimaryEntity(PlantMeshPrefab);
            Convert(plantEntity[i], dstManager, conversionSystem, meshPlantRenderer, meshPlantTmp, materials2);
            entityManager.AddComponent(plantEntity[i], typeof(PlantTag));
            entityManager.SetComponentData(plantEntity[i], new Translation {
                Value = new float3(-1, -5, -1)
            });
            entityManager.AddComponentData(plantEntity[i], new NonUniformScale {
                Value = new float3(1.0f, 2.0f, 1.0f)
            });
            entityManager.AddComponentData(plantEntity[i], new PlantComponent
            {
                timeGrown    = 0,
                state        = (int)PlantState.None,
                reserveIndex = -1
            });
            nextRandom = rand.NextInt();
        }
        // create atlas and texture info
        CalculatePredeterminedTextures();
        // if textures changed we'd have to re-create them with the following:
        //CreateAtlasData();
        //CreateTextures();

        // the texture indices in the world
        // clearing memory gives everything the first image in the uv's,
        // which is conveniently non-tilled ground
        blockIndices = new NativeArray <int>(BoardWidth * BoardWidth, Allocator.Persistent, NativeArrayOptions.ClearMemory);

        // initialize hash table that stores all the tile state info
        GridData gdata = GridData.GetInstance();

        gdata.Initialize(BoardWidth);

        // generate the terrain mesh and add it to the world
        Mesh mesh2;
        int  maxX = BoardWidth / MAX_MESH_WIDTH;
        int  maxZ = BoardWidth / MAX_MESH_WIDTH;

        // only one mesh
        allMeshes = new Mesh[(maxX + 1) * (maxZ + 1)];
        allUVs    = new NativeArray <float2> [(maxX + 1) * (maxZ + 1)];
        allVerts  = new NativeArray <float3> [(maxX + 1) * (maxZ + 1)];
        allTris   = new NativeArray <int> [(maxX + 1) * (maxZ + 1)];

        // for small enough meshes it's just a single mesh in the world
        int height = 0;

        if (maxX == 0 && maxZ == 0)
        {
            int cornerX = 0;
            int cornerZ = 0;
            allUVs[0] = new NativeArray <float2>(BoardWidth * BoardWidth * 4, Allocator.Persistent);
            mesh2     = GenerateTerrainMesh(BoardWidth, BoardWidth, 0, 0, height, allUVs[0]);

            mesh                  = Instantiate(mesh2);
            allMeshes[0]          = mesh;
            meshFilter.sharedMesh = mesh;

            var segmentEntity = conversionSystem.CreateAdditionalEntity(gameObject);
            var pos           = new float3(cornerX, 0, cornerZ);

            var localToWorld = new LocalToWorld
            {
                Value = float4x4.Translate(pos)
            };
            var aabb = new AABB
            {
                Center  = pos,
                Extents = new float3(BoardWidth, 0.5f, BoardWidth)
            };
            var worldRenderBounds = new WorldRenderBounds
            {
                Value = aabb
            };

            dstManager.AddComponentData(segmentEntity, localToWorld);
            dstManager.AddComponentData(segmentEntity, worldRenderBounds);
            dstManager.AddComponent(segmentEntity, ComponentType.ChunkComponent <ChunkWorldRenderBounds>());
            //dstManager.AddComponent(segmentEntity, typeof(Frozen));

            Convert(segmentEntity, dstManager, conversionSystem, meshRenderer, mesh, materials);
        }
        else
        {
            // FIX: this could be parallelized as all meshes are
            // independent from each other
            // for larger meshes it's broken up into
            // 64k vertex pieces

            for (int index = 0; index < (maxX + 1) * (maxZ + 1); index++)
            {
                //Parallel.For(0, (maxX + 1) * (maxZ + 1), (index) =>
                //{
                int x = (int)(index / (maxX + 1));
                int z = index - (maxX + 1) * x;
                //UnityEngine.Debug.Log("x: " + x + " " + z);
                int cornerX = x * MAX_MESH_WIDTH;
                int cornerZ = z * MAX_MESH_WIDTH;
                int width   = 0;
                int depth   = 0;
                int startX  = 0;
                int startZ  = 0;

                float3 pos = new float3(cornerX, 0, cornerZ);

                if (x < maxX && z < maxZ)
                {
                    startX = cornerX;
                    startZ = cornerZ;
                    width  = MAX_MESH_WIDTH;
                    depth  = MAX_MESH_WIDTH;
                }
                else if (x < maxX)
                {
                    startX = cornerX;
                    startZ = cornerZ;
                    width  = MAX_MESH_WIDTH;
                    depth  = BoardWidth - cornerZ;
                }
                else if (z < maxZ)
                {
                    startX = cornerX;
                    startZ = cornerZ;
                    width  = BoardWidth - cornerX;
                    depth  = MAX_MESH_WIDTH;
                }
                else
                {
                    startX = cornerX;
                    startZ = cornerZ;
                    width  = BoardWidth - cornerX;
                    depth  = BoardWidth - cornerZ;
                }
                //UnityEngine.Debug.Log("index " + index + " " + width + " " + depth +
                //    " " + cornerX + " " + cornerZ);

                allUVs[index]   = new NativeArray <float2>(width * depth * 4, Allocator.Persistent);
                allVerts[index] = new NativeArray <float3>(width * depth * 4, Allocator.Persistent);
                allTris[index]  = new NativeArray <int>(width * depth * 6, Allocator.Persistent);
                NativeArray <float2> uvs  = allUVs[index];
                NativeArray <float3> vert = allVerts[index];
                NativeArray <int>    tri  = allTris[index];

                int triangleIndex    = 0;
                int vertexIndex      = 0;
                int vertexMultiplier = 4; // create quads to fit uv's to so we can use more than one uv

                int uvIndex = 0;

                for (x = 0; x < width; x++)
                {
                    for (z = 0; z < depth; z++)
                    {
                        int y            = height;
                        int textureIndex = 0;
                        int index2D      = (z + startZ) + width * (x + startX);
                        textureIndex = blockIndices[index2D];

                        // add vertices for the quad first
                        // front
                        vert[vertexIndex]     = new float3(x + 0.5f, 0.5f, z + -0.5f);
                        vert[vertexIndex + 1] = new float3(x + 0.5f, 0.5f, z + 0.5f);
                        vert[vertexIndex + 2] = new float3(x + -0.5f, 0.5f, z + 0.5f);
                        vert[vertexIndex + 3] = new float3(x + -0.5f, 0.5f, z + -0.5f);

                        // set the UV's
                        uvs[uvIndex] = new float2(textures[textureIndex].pixelStartX,
                                                  textures[textureIndex].pixelStartY);
                        uvs[uvIndex + 1] = new float2(textures[textureIndex].pixelStartX,
                                                      textures[textureIndex].pixelEndY);
                        uvs[uvIndex + 2] = new float2(textures[textureIndex].pixelEndX,
                                                      textures[textureIndex].pixelEndY);
                        uvs[uvIndex + 3] = new float2(textures[textureIndex].pixelEndX,
                                                      textures[textureIndex].pixelStartY);
                        uvIndex += 4;

                        // front or top face
                        tri[triangleIndex]     = vertexIndex;
                        tri[triangleIndex + 1] = vertexIndex + 2;
                        tri[triangleIndex + 2] = vertexIndex + 1;
                        tri[triangleIndex + 3] = vertexIndex;
                        tri[triangleIndex + 4] = vertexIndex + 3;
                        tri[triangleIndex + 5] = vertexIndex + 2;
                        triangleIndex         += 6;

                        // increment the vertices
                        vertexIndex += vertexMultiplier;
                    }
                }
                AABB aabb;
                aabb = new AABB
                {
                    Center  = pos,
                    Extents = new float3(width, 0.5f, depth)
                };
                mesh2 = new Mesh();
                mesh2.SetVertices(allVerts[index]);
                mesh2.SetUVs(0, allUVs[index]);
                mesh2.SetTriangles(allTris[index].ToArray(), 0);
                mesh2.RecalculateNormals();
                mesh2.RecalculateBounds();
                mesh = Instantiate(mesh2);
                meshFilter.sharedMesh = mesh;
                //Debug.Log("creating mesh for : " + x + " " + z + "  " + (z + (maxX + 1) * x));
                allMeshes[index] = mesh;
                var segmentEntity = conversionSystem.CreateAdditionalEntity(gameObject);

                var localToWorld = new LocalToWorld
                {
                    Value = float4x4.Translate(pos)
                };
                var worldRenderBounds = new WorldRenderBounds
                {
                    Value = aabb
                };

                dstManager.AddComponentData(segmentEntity, localToWorld);
                dstManager.AddComponentData(segmentEntity, worldRenderBounds);
                dstManager.AddComponent(segmentEntity, ComponentType.ChunkComponent <ChunkWorldRenderBounds>());
                //dstManager.AddComponent(segmentEntity, typeof(Frozen));

                Convert(segmentEntity, dstManager, conversionSystem, meshRenderer, mesh, materials);
            }
            //);
        }

        // generate rocks and such on the grid
        GenerateGrid();

        // generate the farmers
        // Create farmer entity prefab from the game object hierarchy once
        farmerEntity = conversionSystem.GetPrimaryEntity(FarmerPrefab);
        entityManager.AddComponent <FarmerTag>(farmerEntity);

        // FIX: this could be parallelized
        // NOTE: NOT WORTH DOING UNTIL ALL THE add/set component is
        // part of burst as that's all this is
        // Also note: usually not that many farmers to justify
        // parallelization.
        for (int i = 0; i < farmerNumber; i++)
        {
            farmerCount++;
            var instance = entityManager.Instantiate(farmerEntity);
            if (i == 0)
            {
                firstFarmer = instance;
            }
            int startX = Math.Abs(rand.NextInt()) % gdata.width;
            int startZ = Math.Abs(rand.NextInt()) % gdata.width;

            // Place the instantiated entity in a grid with some noise
            var position = new float3(startX, 2, startZ);
            entityManager.SetComponentData(instance, new Translation()
            {
                Value = position
            });
            var data = new MovementComponent
            {
                startPos  = new float2(startX, startZ),
                speed     = 2,
                targetPos = new float2(startX, startZ),
            };
            var entityData = new EntityInfo {
                specificEntity = instance, type = -1
            };
            entityManager.AddComponentData(instance, data);
            entityManager.AddComponentData(instance, entityData);

            // give his first command based on the 1's in the hash
            entityManager.AddComponent <NeedsTaskTag>(instance);
        }

        if (blockIndices.IsCreated)
        {
            blockIndices.Dispose();
        }
    }
コード例 #27
0
        public static void Convert(
            Entity entity,
            EntityManager dstEntityManager,
            GameObjectConversionSystem conversionSystem,
            Renderer meshRenderer,
            Mesh mesh,
            List <Material> materials)
        {
            var materialCount = materials.Count;

            // Don't add RenderMesh (and other required components) unless both mesh and material assigned.
            if ((mesh != null) && (materialCount > 0))
            {
                var renderMesh = new RenderMesh
                {
                    mesh           = mesh,
                    castShadows    = meshRenderer.shadowCastingMode,
                    receiveShadows = meshRenderer.receiveShadows,
                    layer          = meshRenderer.gameObject.layer
                };

                //@TODO: Transform system should handle RenderMeshFlippedWindingTag automatically. This should not be the responsibility of the conversion system.
                float4x4 localToWorld = meshRenderer.transform.localToWorldMatrix;
                var      flipWinding  = math.determinant(localToWorld) < 0.0;

                if (materialCount == 1 && AttachToPrimaryEntityForSingleMaterial)
                {
                    renderMesh.material = materials[0];
                    renderMesh.subMesh  = 0;

                    dstEntityManager.AddSharedComponentData(entity, renderMesh);

                    dstEntityManager.AddComponentData(entity, new PerInstanceCullingTag());
                    dstEntityManager.AddComponentData(entity, new RenderBounds {
                        Value = mesh.bounds.ToAABB()
                    });

                    if (flipWinding)
                    {
                        dstEntityManager.AddComponent(entity, ComponentType.ReadWrite <RenderMeshFlippedWindingTag>());
                    }

                    conversionSystem.ConfigureEditorRenderData(entity, meshRenderer.gameObject, true);
                }
                else
                {
                    for (var m = 0; m != materialCount; m++)
                    {
                        var meshEntity = conversionSystem.CreateAdditionalEntity(meshRenderer);

                        renderMesh.material = materials[m];
                        renderMesh.subMesh  = m;

                        dstEntityManager.AddSharedComponentData(meshEntity, renderMesh);

                        dstEntityManager.AddComponentData(meshEntity, new PerInstanceCullingTag());
                        dstEntityManager.AddComponentData(meshEntity, new RenderBounds {
                            Value = mesh.bounds.ToAABB()
                        });
                        dstEntityManager.AddComponentData(meshEntity, new LocalToWorld {
                            Value = localToWorld
                        });

                        if (!dstEntityManager.HasComponent <Static>(meshEntity))
                        {
                            dstEntityManager.AddComponentData(meshEntity, new Parent {
                                Value = entity
                            });
                            dstEntityManager.AddComponentData(meshEntity, new LocalToParent {
                                Value = float4x4.identity
                            });
                        }

                        if (flipWinding)
                        {
                            dstEntityManager.AddComponent(meshEntity, ComponentType.ReadWrite <RenderMeshFlippedWindingTag>());
                        }

                        conversionSystem.ConfigureEditorRenderData(meshEntity, meshRenderer.gameObject, true);
                    }
                }
            }
        }
コード例 #28
0
        public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            //var top = this.GetComponentInParent<CharacterModelAuthoring>();// プレハブだとできない( children はできるのに)
            var top  = this.gameObject.Ancestors().First(go => go.GetComponent <CharacterModelAuthoring>());
            var main = top.transform.GetChild(0).gameObject;



            var waponSelectorEntity = conversionSystem.CreateAdditionalEntity(this.gameObject);

            dstManager.SetName_(waponSelectorEntity, $"{main.name} wapon selector");

            var types = new ComponentTypes
                        (
                typeof(WaponSelector.LinkData),
                typeof(WaponSelector.ToggleModeData),
                typeof(WaponSelector.WaponLink0)
                //typeof(Disabled)// 何も持っていない状態用
                        );

            dstManager.AddComponents(waponSelectorEntity, types);

            dstManager.SetComponentData(waponSelectorEntity,
                                        new WaponSelector.LinkData
            {
                OwnerMainEntity  = conversionSystem.GetPrimaryEntity(main),
                muzzleBodyEntity = entity,
            }
                                        );
            dstManager.SetComponentData(waponSelectorEntity,
                                        new WaponSelector.ToggleModeData
            {
                CurrentWaponCarryId = 0,
                WaponCarryLength    = 0,
            }
                                        );

            if (this.Wapons.Length >= 2)
            {
                dstManager.AddComponentData(waponSelectorEntity, new WaponSelector.WaponLink1 {
                });
            }
            if (this.Wapons.Length >= 3)
            {
                dstManager.AddComponentData(waponSelectorEntity, new WaponSelector.WaponLink2 {
                });
            }
            if (this.Wapons.Length >= 4)
            {
                dstManager.AddComponentData(waponSelectorEntity, new WaponSelector.WaponLink3 {
                });
            }



            if (this.Wapons.Length > 0)
            {
                var msg = new WaponMessage.ReplaceWapon4MsgData
                {
                    NumPeplace   = math.min(this.Wapons.Where(x => x != null).Count(), 4),
                    WaponPrefab0 = this.Wapons.Length >= 1 ? conversionSystem.GetPrimaryEntity(this.Wapons[0]) : Entity.Null,
                    WaponPrefab1 = this.Wapons.Length >= 2 ? conversionSystem.GetPrimaryEntity(this.Wapons[1]) : Entity.Null,
                    WaponPrefab2 = this.Wapons.Length >= 3 ? conversionSystem.GetPrimaryEntity(this.Wapons[2]) : Entity.Null,
                    WaponPrefab3 = this.Wapons.Length >= 4 ? conversionSystem.GetPrimaryEntity(this.Wapons[3]) : Entity.Null,
                };
                dstManager.AddComponentData(waponSelectorEntity, msg);
            }



            //var waponEnities = this.Wapons
            //    .Where(x => x != null)
            //    .Take(4)
            //    .Select(w => conversionSystem.GetPrimaryEntity(w))
            //    .ToArray();

            //if (waponEnities.Length >= 1)
            //    dstManager.AddComponentData(waponSelectorEntity, new WaponSelector.WaponPrefab0 { WaponPrefab = waponEnities[0] });
            //if (waponEnities.Length >= 2)
            //    dstManager.AddComponentData(waponSelectorEntity, new WaponSelector.WaponPrefab1 { WaponPrefab = waponEnities[1] });
            //if (waponEnities.Length >= 3)
            //    dstManager.AddComponentData(waponSelectorEntity, new WaponSelector.WaponPrefab2 { WaponPrefab = waponEnities[2] });
            //if (waponEnities.Length >= 4)
            //    dstManager.AddComponentData(waponSelectorEntity, new WaponSelector.WaponPrefab3 { WaponPrefab = waponEnities[3] });
        }
コード例 #29
0
        public void Convert(Entity entity, EntityManager dstManager, GameObjectConversionSystem conversionSystem)
        {
            var conversionTarget = GhostAuthoringConversion.GetConversionTarget(conversionSystem);

            if (conversionTarget == NetcodeConversionTarget.Undefined)
            {
                throw new InvalidOperationException(
                          $"A ghost prefab can only be created in the client or server world, not {dstManager.World.Name}");
            }

            var  collection   = default(GhostPrefabCollectionComponent);
            Type enableSystem = null;

            if (conversionTarget == NetcodeConversionTarget.Server)
            {
                enableSystem = FindComponentWithName($"Enable{NamePrefix}GhostSendSystemComponent");
                if (enableSystem == null)
                {
                    throw new InvalidOperationException($"Could not find Enable{NamePrefix}GhostSendSystemComponent, make sure the ghost collection is generated");
                }
                var prefabList = new NativeList <GhostPrefabBuffer>(Allocator.Temp);
                foreach (var ghost in Ghosts)
                {
                    if (ghost.prefab == null || !ghost.enabled)
                    {
                        continue;
                    }
                    var prefabEntity =
                        GameObjectConversionUtility.ConvertGameObjectHierarchy(ghost.prefab.gameObject,
                                                                               conversionSystem.ForkSettings(1));
                    EnsurePrefab(prefabEntity, dstManager);
                    prefabList.Add(new GhostPrefabBuffer {
                        Value = prefabEntity
                    });
                }

                collection.serverPrefabs = conversionSystem.CreateAdditionalEntity(this);
                var prefabs = dstManager.AddBuffer <GhostPrefabBuffer>(collection.serverPrefabs);
                for (int i = 0; i < prefabList.Length; ++i)
                {
                    prefabs.Add(prefabList[i]);
                }
            }
            else if (conversionTarget == NetcodeConversionTarget.Client)
            {
                enableSystem = FindComponentWithName($"Enable{NamePrefix}GhostReceiveSystemComponent");
                if (enableSystem == null)
                {
                    throw new InvalidOperationException($"Could not find Enable{NamePrefix}GhostReceiveSystemComponent, make sure the ghost collection is generated");
                }
                var predictedList    = new NativeList <GhostPrefabBuffer>(Allocator.Temp);
                var interpolatedList = new NativeList <GhostPrefabBuffer>(Allocator.Temp);
                foreach (var ghost in Ghosts)
                {
                    if (ghost.prefab == null || !ghost.enabled)
                    {
                        continue;
                    }
                    var origInstantiate = ghost.prefab.DefaultClientInstantiationType;
                    ghost.prefab.DefaultClientInstantiationType =
                        GhostAuthoringComponent.ClientInstantionType.Interpolated;
                    var prefabEntity =
                        GameObjectConversionUtility.ConvertGameObjectHierarchy(ghost.prefab.gameObject,
                                                                               conversionSystem.ForkSettings(1));
                    ghost.prefab.DefaultClientInstantiationType =
                        GhostAuthoringComponent.ClientInstantionType.Predicted;
                    var predictedPrefabEntity =
                        GameObjectConversionUtility.ConvertGameObjectHierarchy(ghost.prefab.gameObject,
                                                                               conversionSystem.ForkSettings(2));
                    ghost.prefab.DefaultClientInstantiationType = origInstantiate;
                    EnsurePrefab(predictedPrefabEntity, dstManager);
                    EnsurePrefab(prefabEntity, dstManager);
                    predictedList.Add(new GhostPrefabBuffer {
                        Value = predictedPrefabEntity
                    });
                    interpolatedList.Add(new GhostPrefabBuffer {
                        Value = prefabEntity
                    });
                }

                collection.clientInterpolatedPrefabs = conversionSystem.CreateAdditionalEntity(this);
                var interpolatedPrefabs = dstManager.AddBuffer <GhostPrefabBuffer>(collection.clientInterpolatedPrefabs);
                for (int i = 0; i < interpolatedList.Length; ++i)
                {
                    interpolatedPrefabs.Add(interpolatedList[i]);
                }
                collection.clientPredictedPrefabs = conversionSystem.CreateAdditionalEntity(this);
                var predictedPrefabs = dstManager.AddBuffer <GhostPrefabBuffer>(collection.clientPredictedPrefabs);
                for (int i = 0; i < predictedList.Length; ++i)
                {
                    predictedPrefabs.Add(predictedList[i]);
                }
            }

            dstManager.AddComponentData(entity, collection);
            if (enableSystem != null)
            {
                dstManager.AddComponent(entity, enableSystem);
            }
        }
コード例 #30
0
        public static void Convert(
            Entity entity,
            EntityManager dstEntityManager,
            GameObjectConversionSystem conversionSystem,
            Renderer meshRenderer,
            Mesh mesh,
            List <Material> materials)
        {
            var materialCount = materials.Count;

            // Don't add RenderMesh (and other required components) unless both mesh and material assigned.
            if ((mesh != null) && (materialCount > 0))
            {
                var renderMesh = new RenderMesh
                {
                    mesh           = mesh,
                    castShadows    = meshRenderer.shadowCastingMode,
                    receiveShadows = meshRenderer.receiveShadows,
                    layer          = meshRenderer.gameObject.layer
                };

                renderMesh.needMotionVectorPass = (meshRenderer.motionVectorGenerationMode == MotionVectorGenerationMode.Object) ||
                                                  (meshRenderer.motionVectorGenerationMode == MotionVectorGenerationMode.ForceNoMotion);

                //@TODO: Transform system should handle RenderMeshFlippedWindingTag automatically. This should not be the responsibility of the conversion system.
                float4x4 localToWorld = meshRenderer.transform.localToWorldMatrix;
                var      flipWinding  = math.determinant(localToWorld) < 0.0;

                if (materialCount == 1 && AttachToPrimaryEntityForSingleMaterial)
                {
                    AddComponentsToEntity(
                        renderMesh,
                        entity,
                        dstEntityManager,
                        conversionSystem,
                        meshRenderer,
                        mesh,
                        materials,
                        flipWinding,
                        0);
                }
                else
                {
                    for (var m = 0; m != materialCount; m++)
                    {
                        var meshEntity = conversionSystem.CreateAdditionalEntity(meshRenderer);

                        dstEntityManager.AddComponentData(meshEntity, new LocalToWorld {
                            Value = localToWorld
                        });
                        if (!dstEntityManager.HasComponent <Static>(meshEntity))
                        {
                            dstEntityManager.AddComponentData(meshEntity, new Parent {
                                Value = entity
                            });
                            dstEntityManager.AddComponentData(meshEntity, new LocalToParent {
                                Value = float4x4.identity
                            });
                        }

                        AddComponentsToEntity(
                            renderMesh,
                            meshEntity,
                            dstEntityManager,
                            conversionSystem,
                            meshRenderer,
                            mesh,
                            materials,
                            flipWinding,
                            m);
                    }
                }
            }
        }