Skip to content

Instantly share code, notes, and snippets.

@baobao
Last active December 7, 2018 02:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save baobao/7e4464731e0e033b934ad7adef634af7 to your computer and use it in GitHub Desktop.
Save baobao/7e4464731e0e033b934ad7adef634af7 to your computer and use it in GitHub Desktop.
using Unity.Burst;
using Unity.Collections;
using UnityEngine;
using UnityEngine.Jobs;
public class ManyCubeRotateSample : MonoBehaviour
{
/// <summary>
/// キューブを回転させるJOB
/// </summary>
[BurstCompile]
struct TestParallelForTransformTestJob : IJobParallelForTransform
{
[ReadOnly]
public NativeArray<UpdateData> datList;
[ReadOnly]
public float deltaTime;
public void Execute(int index, TransformAccess transform)
{
var currentRotation = transform.localRotation;
var data = datList[index];
// 現在のQuaternionに回転値を加算
transform.localRotation = currentRotation * Quaternion.Euler(data.rotateSpeed * deltaTime);
}
}
struct UpdateData
{
/// <summary>
/// 回転スピード
/// </summary>
public Vector3 rotateSpeed;
}
[SerializeField]
private Transform _prefab;
/// <summary>
/// キューブの位置
/// </summary>
public float distance = 5f;
[SerializeField]
private int _count = 10000;
private TransformAccessArray _transformAccessArray;
public Vector3[] angleVelocity;
void Start()
{
var transforms = new Transform[_count];
angleVelocity = new Vector3[_count];
var angle = 100f;
for (int i = 0; i < _count; i++)
{
var tr = Instantiate(_prefab);
transforms[i] = tr;
angleVelocity[i] = new Vector3(Random.Range(-angle, angle), Random.Range(-angle, angle),
Random.Range(-angle, angle));
}
_transformAccessArray = new TransformAccessArray(transforms);
for (int i = 0; i < _transformAccessArray.length; i++)
{
_transformAccessArray[i].localPosition =
new Vector3(Random.Range(-distance, distance), Random.Range(-distance, distance),
Random.Range(-distance, distance));
}
}
private void OnDestroy()
{
_transformAccessArray.Dispose();
}
void Update()
{
var inputBuffer = new NativeArray<UpdateData>(_transformAccessArray.length, Allocator.Temp);
for (int i = 0; i < _transformAccessArray.length; i++)
{
inputBuffer[i] = new UpdateData()
{
rotateSpeed = angleVelocity[i]
};
}
var dt = Time.deltaTime;
var job = new TestParallelForTransformTestJob()
{
datList = inputBuffer,
deltaTime = dt
};
var handler = job.Schedule(_transformAccessArray);
handler.Complete();
inputBuffer.Dispose();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment