Подскажите по многопотоку (IJob)

Программирование на Юнити.

Подскажите по многопотоку (IJob)

Сообщение ShockWave2048 18 дек 2020, 13:42

Всем привет!
Есть поле с фигурками, каждая фигура движется вправо пока расстояние больше Х, когда меньше просто останавливается.
Как мне организовать Job, в компоненте линии (1) или в компоненте фигурки(2)?
То есть для одной линии собирать данные в Native и загонять в джоб, или работать атомарно с джобами для каждой фигурки?
(вложить не смог)
https://prnt.sc/w5ajxc
May we live to see another day.
Аватара пользователя
ShockWave2048
UNIт
 
Сообщения: 53
Зарегистрирован: 07 авг 2014, 20:23

Re: Подскажите по многопотоку (IJob)

Сообщение alew 18 дек 2020, 21:09

Так вроде массивом и перебором можно обойтись.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

public class MovedMass : MonoBehaviour
{
    Texture2D back, t;
    public float speed = 5;
    List<Diamond>[] massDiamond;
    float dSize;
    struct Diamond
    {
        public Vector3 pos;
        public int num;
    }
    void Start()
    {
        Camera.main.orthographic = true;
        StartCoroutine(loadTexture());
        Vector2Int size = new Vector2Int(Screen.width, Screen.height);
        Vector2Int halfSize = size / 2;
        back = new Texture2D(size.x, size.y);
        for (int iy = 0; iy < size.y; iy++)
            for (int ix = 0; ix < size.x; ix++)
                back.SetPixel(ix, iy, Color.Lerp(Color.red, Color.yellow, Mathf.Sqrt((ix - halfSize.x) * (ix - halfSize.x) + (iy - halfSize.y) * (iy - halfSize.y)) / 1000));
        back.Apply();
        dSize = Screen.height / 10;
        int wCount = Screen.width / (int)(dSize * 0.7f);
        int hCount = Screen.height / (int)dSize;
        massDiamond = new List<Diamond>[hCount];
        for (int iy = 0; iy < hCount; iy++)
        {
            massDiamond[iy] = new List<Diamond>();
            for (int ix = 0; ix < wCount; ix++)
            {
                Diamond d = new Diamond();
                d.num = Random.Range(0, 9);
                d.pos = new Vector3(ix * -dSize * 2, iy * dSize);
                massDiamond[iy].Add(d);
            }
        }
    }
   
    void Update()
    {
        for (int iy = 0; iy < massDiamond.Length; iy++)
            for (int ix = 0; ix < massDiamond[0].Count; ix++)
            {
                Diamond d = massDiamond[iy][ix];
                if(d.pos.x<Screen.width - ix * dSize)
                {
                    Vector3 t = d.pos;
                    t.x += speed;
                    d.pos = t;
                    massDiamond[iy][ix] = d;
                }
            }
    }
    private void OnGUI()
    {
        GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), back);
        for (int iy = 0; iy < massDiamond.Length; iy++)
            for (int ix = 0; ix < massDiamond[0].Count; ix++)
            {
                Vector3 pos = massDiamond[iy][ix].pos;
                int n = massDiamond[iy][ix].num;
                GUI.DrawTextureWithTexCoords(new Rect(pos, new Vector2(dSize,dSize)), t, new Rect((n - (n / 4 * 4)) * 0.25f, (2 - n / 4) * 0.33f, .25f, .33f));
            }
    }
    IEnumerator loadTexture()
    {
        UnityWebRequest request = UnityWebRequestTexture.GetTexture("https://opengameart.org/sites/default/files/gem-7soul1_1.png");
        yield return request.SendWebRequest();
        if (!request.isHttpError || request.isNetworkError)
            t = DownloadHandlerTexture.GetContent(request);
        t.alphaIsTransparency = true;
        t.filterMode = FilterMode.Point;
    }
}

 
alew
UNIт
 
Сообщения: 76
Зарегистрирован: 23 ноя 2018, 19:59


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10