private void Start()
    {
        // Initialize velocities with a persistent allocator of size amountOfFish, which is a pre-declared variable.
        velocities = new NativeArray <Vector3>(amountOfFish, Allocator.Persistent);

        // Initialize transformAccessArray with size amountOfFish.
        transformAccessArray = new TransformAccessArray(amountOfFish);

        for (int i = 0; i < amountOfFish; i++)
        {
            float distanceX =
                Random.Range(-spawnBounds.x / 2, spawnBounds.x / 2);

            float distanceZ =
                Random.Range(-spawnBounds.z / 2, spawnBounds.z / 2);

            // Create a random spawn point within spawnBounds.
            Vector3 spawnPoint = (transform.position + Vector3.up * spawnHeight) + new Vector3(distanceX, 0, distanceZ);

            // Instantiate objectPrefab, which is a fish, at spawnPoint with no rotation.
            Transform t = (Transform)Instantiate(objectPrefab, spawnPoint, Quaternion.identity);

            // Add the instantiated transform to transformAccessArray.
            transformAccessArray.Add(t);
        }
    }
    internal void AddMobsToSystem(int mobCnt)
    {
        movementJH.Complete();

        if (!taa_mobs.isCreated)
        {
            taa_mobs = new TransformAccessArray(0);
        }

        if (na_mobStates == null || !na_mobStates.IsCreated)
        {
            na_mobStates = new NativeArray <MobState>(0, Allocator.Persistent);
        }

        if (!nl_startPos.IsCreated)
        {
            nl_startPos = new NativeList <Vector3>(Allocator.Persistent);
        }

        if (!nl_targetPos.IsCreated)
        {
            nl_targetPos = new NativeList <Vector3>(Allocator.Persistent);
        }

        int oldMobCnt = PoolManager.instance.MobPool.m_cnt - mobCnt;

        for (int i = 0; i < mobCnt; ++i)
        {
            var startPos   = GameManager.instance.GetSpawnPosFromStart(GameManager.instance.m_defaultSpawnPos, oldMobCnt + i, 2.0f);
            var SpawnedMob = PoolManager.instance.MobPool.SpawnObject(startPos, Quaternion.identity) as MobFightComponent;
            taa_mobs.Add(SpawnedMob.transform);

            nl_startPos.Add(startPos);
            nl_targetPos.Add(new Vector3(startPos.x, startPos.y, GameManager.instance.Target.transform.position.z));
        }

        if (na_mobStates.Length > 0)
        {
            var tempMobState = new NativeArray <MobState>(na_mobStates, Allocator.Temp);
            na_mobStates.Dispose();
            na_mobStates = new NativeArray <MobState>(tempMobState.Length + mobCnt, Allocator.Persistent);
            NativeArray <MobState> .Copy(tempMobState, 0, na_mobStates, 0, tempMobState.Length);
        }
        else
        {
            na_mobStates.Dispose();
            na_mobStates = new NativeArray <MobState>(mobCnt, Allocator.Persistent);
        }

        for (int i = oldMobCnt; i < na_mobStates.Length; ++i)
        {
            na_mobStates[i] = MobState.ToTarget;
        }

        if (PoolManager.instance.SpearPool.m_cnt < PoolManager.instance.MobPool.m_cnt)
        {
            int diff = PoolManager.instance.MobPool.m_cnt - PoolManager.instance.SpearPool.m_cnt;
            AddSpearsToSystem(diff);
        }
    }
Пример #3
0
    private void Spawn()
    {
        agentsTransforms = new Transform[quantity];

        for (int i = 0; i < quantity; i++)
        {
            // having no parent is actually very important. Sharing the parent will prevent the job
            // system to split calculations across threads
            agentsTransforms[i] = Instantiate(agentPrefab, null).transform;

            float t = (float)i / (float)quantity;

            float x = t * 90.0f;
            x -= 45.0f;

            float z = UnityEngine.Random.Range(-4.0f, 4.0f);

            // scatter the spawn along the x/z axis to avoid excessive overlapping
            agentsTransforms[i].position = transform.position + new Vector3(x, 0.0f, z);

            // uncomment for color variation but sacrify instancing
            //agentsTransforms[i].GetComponentInChildren<MeshRenderer>().material.color = new Color(t, t * (z * 0.25f), z * 0.25f, 1.0f);

            float sy  = UnityEngine.Random.Range(0.4f, 1.0f);
            float sxz = UnityEngine.Random.Range(0.4f, 0.8f);

            agentsTransforms[i].localScale = new Vector3(sxz, sy, sxz);
        }

        agentsTransAcc = new TransformAccessArray(agentsTransforms);
    }
Пример #4
0
        public ColliderGroupJobData(IReadOnlyList <VRMSpringBoneColliderGroup> groups)
        {
            var length = groups.Count;

            this.TransformAccessArray = new TransformAccessArray(length);
            foreach (var group in groups)
            {
                this.TransformAccessArray.Add(group.transform);
            }

            this.GroupParams = new NativeArray <GroupParam>(length, Allocator.Persistent,
                                                            NativeArrayOptions.UninitializedMemory);
            for (var i = 0; i < length; i++)
            {
                var group = groups[i];
                Assert.IsTrue(group.BlittableFieldsArray.IsCreated);
                this.GroupParams[i] = new GroupParam
                {
                    InstanceID         = group.GetInstanceID(),
                    BlittableFieldsPtr =
                        (VRMSpringBoneColliderGroup.BlittableFields *)@group.BlittableFieldsArray.GetUnsafePtr(),
                    SphereCollidersLength = group.BlittableFieldsArray.Length,
                };
            }
        }
Пример #5
0
 /// <summary>
 /// 释放,如果为true,则重新加载数据
 /// 注意,该操作会释放大量GC
 /// </summary>
 /// <param name="isReset"></param>
 public void Dispose(bool isReset)
 {
     Hjob.Complete();
     pointReadList.Dispose();
     pointReadWriteList.Dispose();
     pointTransformsList.Dispose();
     constraintReadList1.Dispose();
     for (int i = 0; i < constraintReadList.Length; i++)
     {
         constraintReadList[i].Dispose();
     }
     if (isReset)
     {
         pointTransformsList  = new TransformAccessArray(0);
         m_constraintList     = new List <ConstraintRead[]>();
         m_pointReadList      = new List <PointRead>();
         m_pointReadWriteList = new List <PointReadWrite>();
     }
     else
     {
         collidersReadList.Dispose();
         collidersReadWriteList.Dispose();
         colliderTransformsList.Dispose();
     }
 }
Пример #6
0
    // Update is called once per frame
    void Update()
    {
        Transform[] transforms = new Transform[people.Count];
        float[]     influence  = new float[people.Count];
        for (int i = 0; i < people.Count; i++)
        {
            transforms[i] = people[i].transform;
            influence[i]  = people[i].influenceLevel;
        }
        TransformAccessArray transformAccessArray = new TransformAccessArray(transforms, 100);
        NativeArray <float>  influenceNA          = new NativeArray <float>(influence, Allocator.TempJob);
        ApplyInfluenceJob    applyInfluenceJob    = new ApplyInfluenceJob
        {
            baseMovement = 1,
            deltaTime    = Time.deltaTime,
            sin          = math.sin(Time.time),
            Influence    = influenceNA,
            random       = new Unity.Mathematics.Random((uint)UnityEngine.Random.Range(1, 100000))
        };
        JobHandle handle = applyInfluenceJob.Schedule(transformAccessArray);

        handle.Complete();
        transformAccessArray.Dispose();
        influenceNA.Dispose();
    }
Пример #7
0
    private void Update()
    {
        float startTime = Time.realtimeSinceStartup;

        //Objenin sürekli hareket halinde olmasını sağlamak için gerekli tanımları yaptık
        NativeArray <float>  moveYArray           = new NativeArray <float> (BodyList.Count, Allocator.TempJob);
        TransformAccessArray transformAccessArray = new TransformAccessArray(BodyList.Count);

        for (int i = 0; i < BodyList.Count; i++)
        {
            moveYArray[i] = BodyList[i].moveY;
            transformAccessArray.Add(BodyList[i].transform);
        }

        ReallyToughParallelJobTransforms reallyToughParallelJobTransforms = new ReallyToughParallelJobTransforms {
            deltaTime  = Time.deltaTime,
            moveYArray = moveYArray,
        };

        JobHandle jobHandle = reallyToughParallelJobTransforms.Schedule(transformAccessArray);

        jobHandle.Complete();

        for (int i = 0; i < BodyList.Count; i++)
        {
            BodyList[i].moveY = moveYArray[i];
        }

        moveYArray.Dispose();
        transformAccessArray.Dispose();

        txtTotal.text = "TOTAL\n" + GameObject.FindGameObjectWithTag("bodies").transform.childCount.ToString();   //Obje sayısını güncel tuttuk
    }
Пример #8
0
    private void OnEnable()
    {
        _startPos      = curveStart is null ? Vector3.zero : curveStart.transform.position;
        _endPos        = curveEnd is null ? Vector3.zero : curveEnd.transform.position;
        _midPos        = curveMiddle is null ? Vector3.zero : curveMiddle.transform.position;
        _firstDistance = Vector3.Distance(_startPos, _midPos) + Vector3.Distance(_midPos, _endPos);

        var chainTransforms = dickChains.Select(o => o.transform).ToArray();

        _transformAccessArray      = new TransformAccessArray(chainTransforms, chainTransforms.Length);
        _dickTransformTargetNative = new NativeArray <ApproachTarget>(dickChains.Length, Allocator.Persistent);
        _factor = new NativeArray <float>(1, Allocator.Persistent)
        {
            [0] = 0f
        };

        Observable.IntervalFrame(10)
        .TakeUntilDisable(this)
        .Subscribe(_ =>
        {
            AssignNearestDickNavigator();
            AssignNearestPullProxy();
        });

        _disposed = false;
    }
Пример #9
0
    private void Start()
    {
        for (int i = 0; i < _numberOfOrbits; i++)
        {
            for (int j = 0; j < _numberOfStars / _numberOfOrbits; j++)
            {
                var newStar = Instantiate(_starPrefab);
                newStar.GetComponent <MeshRenderer>().material = _materials[UnityEngine.Random.Range(0, _materials.Count)];

                var randomX = Mathf.Cos(UnityEngine.Random.Range(0f, 360f));
                var randomY = Mathf.Sin(UnityEngine.Random.Range(0f, 360f));

                // TODO: Might want to make use of the axis here somehow
                var offsetDirection = new Vector3(randomX, 0, randomY);

                newStar.transform.position =
                    transform.position +
                    (offsetDirection.normalized * (i + 1) * _orbitOffset) *
                    (_noiseOffset ? UnityEngine.Random.Range(0f, _noiseOffsetAmount) : 1);

                _starSpeeds.Add(_scaleRotationToDistance ? (_speed / (newStar.transform.position - transform.position).magnitude) : _speed);
                _stars.Add(newStar.transform);
                _distancesFromCenter.Add(math.sqrt(math.pow(newStar.transform.position.x - transform.position.x, 2) + math.pow(newStar.transform.position.z - transform.position.z, 2)));
            }
        }

        _nativeStarSpeeds          = new NativeArray <float>(_starSpeeds.ToArray(), Allocator.Persistent);
        _transformAccessArray      = new TransformAccessArray(_stars.ToArray());
        _nativeDistancesFromCenter = new NativeArray <float>(_distancesFromCenter.ToArray(), Allocator.Persistent);
    }
Пример #10
0
        void Start()
        {
            _ui         = GetComponent <UI>();
            _transforms = new TransformAccessArray(0, -1);

            AddShips(enemyShipCount);
        }
Пример #11
0
        void Prepare()
        {
            if (_taa.isCreated)
            {
                return;
            }

            var xforms = new Transform[_instanceCount];

            for (var i = 0u; i < _instanceCount; i++)
            {
                // We have to insert an empty game object to avoid an issue where
                // prevents game objects with HideFlags from getting ray-traced.
                var go1 = new GameObject("LightBar");
                var go2 = new GameObject("Renderer", typeof(MeshFilter), typeof(MeshRenderer));

                go1.hideFlags        = HideFlags.HideAndDontSave;
                go1.transform.parent = transform;
                go2.transform.parent = go1.transform;

                go2.GetComponent <MeshFilter>().sharedMesh       = _mesh;
                go2.GetComponent <MeshRenderer>().sharedMaterial = _material;

                xforms[i] = go1.transform;
            }

            _taa = new TransformAccessArray(xforms);
        }
Пример #12
0
    void Start()
    {
        cubes = GetComponent <GridGenerator> ().GetTransforms();

        transformsAccess = new TransformAccessArray(cubes);
        velocity         = new NativeArray <float3> (cubes.Length, Allocator.Persistent);
    }
Пример #13
0
        void Start()
        {
            // 修改为符合Jobs要求的数据结构
            m_FishVels       = new NativeArray <Vector3>(amountOfFish, Allocator.Persistent);
            m_TrsAccessArray = new TransformAccessArray(amountOfFish);
            m_FishRotTimes   = new NativeArray <float>(amountOfFish, Allocator.Persistent);

            for (int i = 0; i < amountOfFish; i++)
            {
                // 在规定边界范围内随机生成鱼
                var trsFish = (Transform)Instantiate(objectPrefab,
                                                     transform.position + new Vector3(
                                                         UnityEngine.Random.Range(-spawnBounds.x / 2, spawnBounds.x / 2),
                                                         0,
                                                         UnityEngine.Random.Range(-spawnBounds.z / 2, spawnBounds.z / 2)),
                                                     Quaternion.identity);


                // 在用JobsParallelForTransform的情况下,transform不能有parent,否则都会被视为一个transform来处理,无法分别运行在多个核上
                // 详情见:https://forum.unity.com/threads/jobs-performance-questions.520406/
                //trsFish.parent = this.transform;
                m_TrsAccessArray.Add(trsFish);
                m_FishRotTimes[i] = Random.Range(1f, 5f);
                m_FishVels[i]     = new Vector3(Random.Range(-1f, 1f), 0, Random.Range(-1f, 1f));
            }
        }
Пример #14
0
    /// <summary>
    /// Start関数
    /// </summary>
    void Start()
    {
        // Debugger登録
        DebugUI.SetCounter(animationInfo, characterNum);
        // animation の情報初期化
        animationInfo.Initialize();
        // それぞれのバッファーを初期化/作成
        boardRenderers      = new BoardRenderer[characterNum];
        characterTransforms = new Transform[characterNum];

        var material = new Material(drawMaterial);

        material.mainTexture = animationInfo.texture;
        for (int i = 0; i < characterNum; ++i)
        {
            var gmo = GameObject.Instantiate(prefab, new Vector3(Random.RandomRange(-InitPosXParam, InitPosXParam), 0.5f, Random.RandomRange(-InitPosZParam, InitPosZParam)), Quaternion.identity);
            // 今回のサンプルではColliderは不要なので削除
            GameObject.Destroy(gmo.GetComponent <Collider>());
            characterTransforms[i] = gmo.transform;
            boardRenderers[i]      = gmo.GetComponent <BoardRenderer>();
            boardRenderers[i].SetMaterial(material);
            int idx = i % animationInfo.sprites.Length;
            boardRenderers[i].SetRect(animationInfo.GetUvRect(0));
        }
        //
        transformAccessArray = new TransformAccessArray(characterTransforms);
    }
Пример #15
0
    protected override void OnCreate()
    {
        m_TransformAccessArray = new TransformAccessArray(0);

        m_NewQuery = GetEntityQuery(
            new EntityQueryDesc
        {
            All  = new[] { ComponentType.ReadOnly <CompanionLink>() },
            None = new[] { ComponentType.ReadOnly <CompanionGameObjectUpdateTransformSystemState>() }
        }
            );

        m_ExistingQuery = GetEntityQuery(
            new EntityQueryDesc
        {
            All = new[]
            {
                ComponentType.ReadOnly <CompanionLink>(),
                ComponentType.ReadOnly <CompanionGameObjectUpdateTransformSystemState>(),
                ComponentType.ReadOnly <LocalToWorld>(),
            }
        }
            );

        m_DestroyedQuery = GetEntityQuery(
            new EntityQueryDesc
        {
            All  = new[] { ComponentType.ReadOnly <CompanionGameObjectUpdateTransformSystemState>() },
            None = new[] { ComponentType.ReadOnly <CompanionLink>() }
        }
            );
    }
Пример #16
0
    protected override void OnStartRunning()
    {
        var comps = GetEntities <Components>();

        if (comps.Length == 0)
        {
            return;
        }

        var speeds = new float[comps.Length];
        var trs    = new Transform[comps.Length];

        for (int i = 0; i < trs.Length; i++)
        {
            speeds[i] = comps[i].mover.speed;
            trs[i]    = comps[i].tr;
        }

        transAccessArray = new TransformAccessArray(trs);
        nativeSpeeds     = new NativeArray <float>(speeds, Allocator.TempJob);

        job = new MyJob
        {
            speeds = nativeSpeeds
        };
    }
Пример #17
0
 void Start()
 {
     rotationAxis         = new NativeArray <Vector3>(1, Allocator.Persistent);
     this.rotationAxis[0] = Vector3.up;
     Transform[] transforms = { transform };
     transformArray = new TransformAccessArray(transforms);
 }
Пример #18
0
 void Update()
 {
     //按下鼠标左键后
     if (Input.GetMouseButtonDown(0))
     {
         //随机设置坐标
         NativeArray <Vector3> position = new NativeArray <Vector3>(cubes.Length, Allocator.Persistent);
         for (int i = 0; i < position.Length; i++)
         {
             position[i] = Vector3.one * i;
         }
         //设置Transform
         TransformAccessArray transformArray = new TransformAccessArray(cubes);
         //启动工作线程
         MyJob job = new MyJob()
         {
             position = position
         };
         JobHandle jobHandle = job.Schedule(transformArray);
         //等待工作线程结束
         jobHandle.Complete();
         Debug.Log("工作线程结束");
         //结束
         transformArray.Dispose();
         position.Dispose();
     }
 }
Пример #19
0
        protected override void OnUpdate()
        {
            int queryLength = m_query.CalculateEntityCount();

            if (queryLength > m_transforms.capacity)
            {
                m_transforms.Dispose();
                m_transforms = new TransformAccessArray(queryLength);
            }

            int transformsLength = m_transforms.length;

            for (int i = 0; i < transformsLength; i++)
            {
                m_transforms.RemoveAtSwapBack(i);
            }

            var jh = Dependency;

            Dependency = default;
            Entities.ForEach((CameraManager manager) =>
            {
                m_transforms.Add(manager.camera.transform);
            }).WithoutBurst().Run();

            var ltws = m_query.ToComponentDataArrayAsync <LocalToWorld>(Allocator.TempJob, out var jh2);

            Dependency = new CopyTransformsJob
            {
                ltws = ltws
            }.Schedule(m_transforms, JobHandle.CombineDependencies(jh, jh2));

            Dependency = ltws.Dispose(Dependency);
        }
Пример #20
0
        public void AddNewColumn(OreColumn oreColumn)
        {
            audioSourceEffects.PlayOneShot(addColumnSound);

            var columnHolder = InstantiateColumn(oreColumn);

            columnHolder.transform.SetAsFirstSibling();
            columnHolder.transform.localPosition = new Vector3(-1 * _prefabSize.x, 0, 0);

            var transformAccessArray = new TransformAccessArray(_game.GetOreColumns().Count);

            for (int i = 0; i < spawnPoint.transform.childCount; i++)
            {
                transformAccessArray.Add(spawnPoint.transform.GetChild(i));
            }

            new MoveColumnsLeftJob
            {
                PrefabWidth = _prefabSize.x
            }
            .Schedule(transformAccessArray)
            .Complete();

            transformAccessArray.Dispose();
        }
Пример #21
0
        public SpringBoneJobData(IReadOnlyList <VRMSpringBone.Node> nodes)
        {
            var length = nodes.Count;

            this.Length = length;
            this.TransformAccessArray       = new TransformAccessArray(length);
            this.ParentTransformAccessArray = new TransformAccessArray(length);
            foreach (var node in nodes)
            {
                this.TransformAccessArray.Add(node.Transform);
                this.ParentTransformAccessArray.Add(node.Transform.parent);
            }

            this.ImmutableNodeParams = new NativeArray <ImmutableNodeParam>(length, Allocator.Persistent,
                                                                            NativeArrayOptions.UninitializedMemory);
            this.VariableNodeParams = new NativeArray <VariableNodeParam>(length, Allocator.Persistent,
                                                                          NativeArrayOptions.UninitializedMemory);
            for (var i = 0; i < length; i++)
            {
                var node = nodes[i];
                this.ImmutableNodeParams[i] = new ImmutableNodeParam
                {
                    Length             = node.Length,
                    LocalRotation      = node.LocalRotation,
                    BoneAxis           = node.BoneAxis,
                    BlittableFieldsPtr = node.BlittableFieldsPtr,
                    CenterMatrixPtr    = node.CenterMatrixPtr,
                };
                this.VariableNodeParams[i] = new VariableNodeParam
                {
                    CurrentTail = node.InitTail,
                    PrevTail    = node.InitTail,
                };
            }
        }
Пример #22
0
    private void Spawn()
    {
        if (prefab == null || spawnArea == null || spawnObjects.Count > 0)
        {
            return;
        }

        Vector3 area   = spawnArea.transform.position;
        Vector3 scale  = spawnArea.transform.localScale;
        float   radius = Mathf.Max(scale.x, scale.y, scale.z);

        transformAccessArray = new TransformAccessArray(spawnNum);
        moveDirections       = new NativeArray <Vector3>(spawnNum, Allocator.Persistent);
        rotateAngles         = new NativeArray <Vector3>(spawnNum, Allocator.Persistent);

        spawnObjects.Clear();
        for (int i = 0; i < spawnNum; i++)
        {
            Vector3    pos = Random.insideUnitSphere * radius + area;
            GameObject go  = Instantiate(prefab, pos, prefab.transform.rotation);
            spawnObjects.Add(go);

            transformAccessArray.Add(go.transform);
            moveDirections[i] = moveDirection * Random.Range(minMoveSpeed, maxMoveSpeed);
            rotateAngles[i]   = rotateAngle * Random.Range(minRotateSpeed, maxRotateSpeed);
        }

        DisplayCount();
    }
Пример #23
0
    protected override void OnCreate()
    {
        m_Entities             = new NativeArray <Entity>(0, Allocator.Persistent);
        m_TransformAccessArray = new TransformAccessArray(0);

        m_NewQuery = GetEntityQuery(
            new EntityQueryDesc
        {
            All  = new[] { ComponentType.ReadOnly <CompanionLink>() },
            None = new[] { ComponentType.ReadOnly <CompanionGameObjectUpdateTransformSystemState>() }
        }
            );

        m_ExistingQuery = GetEntityQuery(
            new EntityQueryDesc
        {
            All = new[] { ComponentType.ReadOnly <CompanionLink>(), ComponentType.ReadOnly <CompanionGameObjectUpdateTransformSystemState>() }
        }
            );

        m_DestroyedQuery = GetEntityQuery(
            new EntityQueryDesc
        {
            All  = new[] { ComponentType.ReadOnly <CompanionGameObjectUpdateTransformSystemState>() },
            None = new[] { ComponentType.ReadOnly <CompanionLink>() }
        }
            );
    }
Пример #24
0
    void Start()
    {
        objs = new Transform[num];
        for (int i = 0; i < num; i++)
        {
            var obj = Instantiate(prefab).transform;
            obj.position = Vector3.zero;
            objs[i]      = obj;
        }

        pos = new NativeArray <Vector3>(num, Allocator.Persistent);
        vel = new NativeArray <Vector3>(num, Allocator.Persistent);
        acc = new NativeArray <Vector3>(num, Allocator.Persistent);
        trs = new TransformAccessArray(objs);
        rst = new NativeArray <int>(8, Allocator.Persistent);
        rnd = new NativeArray <Random>(num, Allocator.Persistent);

        for (int i = 0; i < num; i++)
        {
            pos[i] = Vector3.zero;
            vel[i] = UnityEngine.Random.insideUnitSphere;
            acc[i] = Vector3.zero;
        }
        seed = new Random(1);
    }
Пример #25
0
    /// <summary>
    /// create a job for transform position all enimies with speed
    /// </summary>
    private void JobWorkToTransform()
    {
        NativeArray <float>  speedArr             = new NativeArray <float>(enemies.Count, Allocator.TempJob);
        TransformAccessArray transformAccessArray = new TransformAccessArray(enemies.Count);

        for (int i = 0; i < enemies.Count; i++)
        {
            speedArr[i] = enemies[i].speed;
            transformAccessArray.Add(enemies[i].transform);
        }

        UpdateTransform job = new UpdateTransform
        {
            deltaTime  = Time.deltaTime,
            speedArray = speedArr,
            targetX    = _targetX,
        };

        JobHandle jobHandle = job.Schedule(transformAccessArray);

        jobHandle.Complete();

        speedArr.Dispose();
        transformAccessArray.Dispose();
    }
Пример #26
0
 /// <summary>
 /// 释放,如果为true,则重新加载数据
 /// 注意,该操作会释放大量GC
 /// </summary>
 /// <param name="isReset"></param>
 public void Dispose(bool isReset)
 {
     JobHandle.CompleteAll(handleList.AsArray());
     pointReadList.Dispose();
     pointReadWriteList.Dispose();
     pointTransformsList.Dispose();
     constraintReadList1.Dispose();
     ConstraintReadByPointIndex.Dispose();
     for (int i = 0; i < constraintReadList.Length; i++)
     {
         constraintReadList[i].Dispose();
     }
     if (isReset)
     {
         pointTransformsList  = new TransformAccessArray(0);
         m_constraintList     = new List <ConstraintRead[]>();
         m_pointReadList      = new List <PointRead>();
         m_pointReadWriteList = new List <PointReadWrite>();
     }
     else
     {
         handleList.Dispose();
         collidersReadList.Dispose();
         collidersReadWriteList.Dispose();
         colliderTransformsList.Dispose();
     }
 }
Пример #27
0
        void Start()
        {
            fps        = GetComponent <FPS>();
            transforms = new TransformAccessArray(0, -1);

            AddShips(enemyShipCount);
        }
Пример #28
0
    void RemoveShipsFromList()
    {
        foreach (Boid ship in shipsToDestroy)
        {
            // Get ship no
            int shipNo = ships.IndexOf(ship);

            // Remove ship from list
            ships.RemoveAt(shipNo);
            shipComp.RemoveAt(shipNo);

            // Recreate the velocities array
            List <Vector3> tempVelocities = new List <Vector3>(velocities.ToArray());
            tempVelocities.RemoveAt(shipNo);
            velocities.Dispose();
            velocities = new NativeArray <Vector3>(ships.Count, Allocator.Persistent);
            velocities.CopyFrom(tempVelocities.ToArray());

            // Remove from transfrom access array
            transformAccessArray.Dispose();
            Transform[] tempTransforms = new Transform[ships.Count];
            for (int i = 0; i < ships.Count; i++)
            {
                tempTransforms[i] = ships[i].transform;
            }
            transformAccessArray = new TransformAccessArray(tempTransforms);
        }
        shipsToDestroy.Clear();
    }
Пример #29
0
        void UpdateTransformIndex()
        {
            if (!m_Dirty)
            {
                return;
            }
            m_Dirty = false;
            Profiler.BeginSample("UpdateTransformIndex");
            NativeArrayHelpers.ResizeIfNeeded(ref m_TransformMatrix, m_Transform.Length);
            if (!m_TransformAccessArray.isCreated)
            {
                TransformAccessArray.Allocate(m_Transform.Length, -1, out m_TransformAccessArray);
            }
            else if (m_TransformAccessArray.capacity != m_Transform.Length)
            {
                m_TransformAccessArray.capacity = m_Transform.Length;
            }
            m_TransformAccessArray.SetTransforms(m_Transform);

            for (int i = 0; i < m_Transform.Length; ++i)
            {
                if (m_Transform[i] != null)
                {
                    var instanceId    = m_Transform[i].GetInstanceID();
                    var transformData = m_TransformData[instanceId];
                    transformData.transformIndex = i;
                    m_TransformData[instanceId]  = transformData;
                }
            }
            Profiler.EndSample();
        }
Пример #30
0
        public static void OnDroneCountChange()
        {
            movementJobHandle.Complete();
            energyJobHandle.Complete();
            _Transforms.Dispose();
            _Transforms = new TransformAccessArray(0);
            foreach (Drone drone in Drones.Values)
            {
                _Transforms.Add(drone.transform);
            }
            _JobInfoArray.Dispose();
            _JobInfoArray = new NativeArray <MovementInfo>(_Transforms.length, Allocator.Persistent);
            _EnergyInfoArray.Dispose();
            _EnergyInfoArray = new NativeArray <EnergyInfo>(_Transforms.length, Allocator.Persistent);
            _PreviousPositions.Dispose();
            _PreviousPositions = new NativeArray <Vector3>(_Transforms.length, Allocator.Persistent);
            int j = 0;

            foreach (Drone drone in Drones.Values)
            {
                _PreviousPositions[j] = drone.PreviousPosition;

                _JobInfoArray[j]    = new MovementInfo();
                _JobInfoArray[j]    = drone.GetMovementInfo(_JobInfoArray[j]);
                _EnergyInfoArray[j] = new EnergyInfo();
                _EnergyInfoArray[j] = drone.GetEnergyInfo(_EnergyInfoArray[j]);
                j++;
            }
        }