pypy.com/

Python、Unity、FX自動化などを勉強しています。あと、コーラと車も好きです。そこらへんについて、たまに記事を書きます。

Unityで並列処理(cpu)をしてみた

こんにちは。

今回はUnityでCPUを使った並列処理をやっていきたいと思います。

わざわざCPUを使ったって書いているのは、前回の記事で、GPUを使った並列処理をやったからです。

興味のある方は、以下のリンクから、前回の記事を見ることができます。

UnityでGPUを使って並列処理をしてみた(GPGPU) - pypy.com/

前回はGPUを使ってやっていますが、むしろCPUを使うことのほうが多いと思いますし、CPUのほうが使いやすいので、今回の記事を書こうと思いました。

それではやっていきます。



書いていく

CPUを使った並列処理の場合は、GPUの時のように、前準備がいりません。

強いて言うなら、初っ端にusing System.Threading.Tasks; を入れるのを忘れないようにするくらいです。

コード自体はGPUを使うときと、ほぼ同じように書きます。

以下のような感じです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Threading.Tasks;

public class test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        int[] array = new int[100];
        Parallel.For(0, 100, i =>
        {
            array[i] = i;
        });
        
        for(int i = 0; i < 100; i++)
        {
            Debug.Log(array[i]);
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

見てもらえばわかりますが、普通のfor文とほぼ同じような感覚で使えます。

一応、適当なゲームオブジェクトにアタッチして、実行してみると以下のようになりました。

ちゃんと動いているのがわかります。

f:id:SaidaTaisei:20200414201421p:plain

ただ、Unity特有の機能(レイキャストなど)は並列処理の中では、使えません(コンパイルは通っても、実際に動かす時にエラーが出ます)。

そうはいっても、普通の計算処理なんかは、シングルスレッドでやる場合よりもそれなりに速くなるので、なんか遅いなって感じるときに使ってみるといいと思います。

ということで、今回はUnityでCPUを使って並列処理をする方法について書いてみました。

機会があったら、CPUのシングルスレッドとマルチスレッド、GPUの並列処理による計算時間の違いなんかも見ていきたいと思います。

UnityでGPUを使って並列処理をしてみた(GPGPU)

こんにちは。

今回はタイトルにもあるように、UnityでGPUを使って、並列処理をする方法について書いていきたいと思います。

UnityでGPU計算がしたいと検索すると、コンピュートシェダーを使った方法がヒットするので、それでもいいと思うのですが、今回はもっと簡単に使える、Aleaというライブラリを使った方法でやってみたいと思います。

AleaをUnityにいれる

まず、AleaをUnityで使えるようにしていきます。

Aleaはnugetにあるので、それをダウンロードします。

以下のページのDownload packageからダウンロードします。

NuGet Gallery | Alea 3.0.4

ダウンロードができたら、ダウンロードしたnupkgファイルをzip解凍します。

同じようにして、Mono.Cecilというライブラリもダウンロードして、zip解凍します。

Mono.Cecilもnugetにあるので、以下のページからダウンロードすることができます。

NuGet Gallery | Mono.Cecil 0.11.2

そこまでできたら、UnityでAssetsのなかにPluginsという名前のフォルダを作ります。

f:id:SaidaTaisei:20200412210833p:plain

その作ったフォルダの中に先ほどダウンロードして、解凍したものを入れます。

Windowsの64bitを使っている人(ほとんどの人が当てはまると思います)であれば僕と同じようにすれば大丈夫です。

alea/lib/net45のdllファイル全部と
alea/toolsのFsharp.Core.dllとAlea.CUDA.CT.Native.X86.B64.Windows.dllと
mono.ceil/lib/net40のMono.Cecil.dll
をPluginsの中にドラッグアンドドロップします。

すると、Pluginsは下記のようになるはずです。

f:id:SaidaTaisei:20200412213114p:plain

これで、エラーが出ていなかったら準備完了です。

GPUを使ってみる

せっかくgpuを使うので、凝ったことをやりたい気もするのですが、今回はとりあえず導入ということで、簡単なことだけやりたいと思います。

とりあえず、int型の配列に数字を入れてみました。

サンプルコードは以下に示します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Alea;
using Alea.Parallel;

public class test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Gpu gpu = Gpu.Default;
        int[] list = new int[100];
        gpu.For(0, 100, i =>
        {
            list[i] = i;
        });
        for (int i = 0; i < 100; i++)
        {
            Debug.Log(list[i]);
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}


実行すると、以下のようになります。

f:id:SaidaTaisei:20200412214039p:plain

ちゃんとintの配列に格納できていることがわかります。


ということで、今回はUnityでGPUを使った並列処理をやってみました。

今回は簡単なのしかやりませんでしたが、今度はGPUで処理する意味があるようなことをやりたいと思います。

Unity Student Plan に申し込んでみた

こんにちは。

今回は、Unity Student Plan について書いていこうと思います。

UnityといえばPersonalかProのライセンスを選ぶ人がほとんどだと思うのですが,学生であれば,Student Planという選択肢があります.

そこで,Student Planのライセンス認証までの方法を書いていきます.

GitHubのアカウントを作る

まず,GitHubのアカウントを作ります.

もうあるよっていう人は読み飛ばしてください.

アカウントは以下のページから作ることができます.
github.com

これは,ユーザー名とメールアドレスなどを打てばすぐに作ることができます.

GitHub Student Developer Packの申請をする

GitHubのアカウントができたら,次はGitHub Student Developer Packを申請します.

以下のページに行きます.
education.github.com


f:id:SaidaTaisei:20200321162626p:plain

こんな感じの画面になると思うので,学校のメールアドレスを打ちます.

認証されれば,チェックマークみたいなのが付きます.

How do you plan to use GitHub?
に対しては,なんか適当な理由を打っておきましょう.

Unity Student Plan の申請をする

ここに来るまでで,GitHubのStudent Packは申請ができていると思うので,つぎにUnity Student Planの申請を行います.

以下のページに行きます.
education.github.com

f:id:SaidaTaisei:20200321163508p:plain

こんな感じの画面になると思うので,unityのところをクリックします.

すると,以下の画面のようになります.

f:id:SaidaTaisei:20200321163734p:plain


sign up をクリックします.

これで,メールアドレスにシリアルナンバーが送られてくるはずです.

Unity Hub でアクティベートする

シリアルが送られてきたら,アクティベートしましょう.

Unity Hub を開きます.

右上のアカウントを押して,ライセンス認証のページに行きます.

あとは,そこにある新規ライセンスの認証をおして,メールで送られてきたシリアルを入れます.

f:id:SaidaTaisei:20200321164413p:plain


認証が通ったら,こんな感じにProになります.

アクティベーションはアカウントマークを押して,組織の管理から管理することができます.

f:id:SaidaTaisei:20200321164749p:plain

ここからも,シリアルキーの確認ができます.


今回はUnity Student Planに申し込んでみました.

学生の人はぜひ有効活用してみてください.

unityでpid制御(車編)_下準備

こんにちは。
今回は、久しぶりにunityでの記事を書きたいと思います。
テーマは、pid制御です。
pid制御といえば、フィードバック制御のひとつで有名ですね。
目標値と現在値の差分をProportional(比例)-Integral(積分)-Differential(微分)して制御する方法です。
今回は、下準備ということで、準備だけなのですが、近日中に制御までする記事を上げたいと思っています。
それでは書いていきます!

サーキットを作る

今回pid制御する対象が車ということで、それ用のサーキットを作りたいと思います。
本当は、テレインを置くだけでも良かったのですが、なんかサーキットがあったほうがよくない?って思ったので作りました。
fusion360というソフトで作ったものが以下のものになります。
f:id:SaidaTaisei:20191109101116p:plain
まあ、よくある感じのやつですね。
本当は、もっと凝ったものを作ろうかとも思ったのですが、面倒だったので止めました。
これを、unityで取り込むと、以下の写真のようになります。
そのままドラッグ&ドロップしただけです。
あ、ついでに、色を変えたような気もします。
f:id:SaidaTaisei:20191109102435p:plain

車を読み込む

車はunityのstandardassetsのものを使います。
このレベルのものが無料であるのはうれしいですね。
stanndardassets?ってなる方は、unityエディタでassetstoreを開いて、検索すると下の写真のものがあると思うので、それをimportすれば大丈夫です。
f:id:SaidaTaisei:20191109103244p:plain

いい感じに配置する

先ほどまでの作業で、サーキットと車は準備されたはずなので、それをいい感じの大きさにして、いい感じに配置します。
適当にやれば大丈夫です。
そしたら、サーキットのほうのオブジェクトにmeshcolliderをaddcompornentします。
これをしとかないと、車がすり抜けてしまうので、必ずつけましょう。
それで、あとは、スタートをおしたら、以下のようになりました。
f:id:SaidaTaisei:20191109111436p:plain
こうなれば、もうキーボード操作で車を走らせることができるはずです。
試しにやってみると動きました。

コースの線を引く

上の作業までで車をキーボードでは動かせるのですが、今回のテーマはpid制御ということで、目標となるコースに線を引きます。
まあ、線は書いても書かなくてもいいのですが、書いたほうが見やすいので、書いておきます。
適当に、コースとなりそうな場所に空のゲームオブジェクトを手動で配置し、それを一つのオブジェクトの子オブジェクトにしておきます。
あとは、以下のスクリプトをアタッチして、line_objectにその親となったオブジェクトを入れます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class create_line : MonoBehaviour
{
    public GameObject line_object;
    private List<Vector3> line_list;
    // Start is called before the first frame update
    void Start()
    {
        line_list = child_get_position(line_object);
        line(line_list);
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    //単純にリストの座標値にラインを引きます
    private void line(List<Vector3> target)
    {
        // オブジェクトの作成
        GameObject newObj = new GameObject();
        newObj.transform.parent = transform;
        // ラインの作成
        LineRenderer newLine = new LineRenderer();
        newLine = newObj.AddComponent<LineRenderer>();
        newLine.SetWidth(0.3f, 0.3f);
        newLine.SetVertexCount(target.Count+1);
        for (int i = 0; i < target.Count; i++)
        {
            newLine.SetPosition(i, target[i]);
            if (i == target.Count - 1)
            {
                Debug.Log(i);
                newLine.SetPosition(i+1, target[0]);
            }
        }
    }
    //ゲームオブジェクトを入れるとその子オブジェクトのポジションをリストにして返します。
    private List<Vector3> child_get_position(GameObject gobject)
    {
        List<Vector3> list = new List<Vector3> { };

        foreach (Transform n in gobject.transform)
        {
            list.Add(n.transform.position);
        }

        return list;
    }
}

これで、実行すると、下の画像のように線が描けるはずです。
f:id:SaidaTaisei:20191113175258p:plain
今日は、ここで終わります。
続編はできるだけ早く上げたいと思います。

unity2020.1.0a3をインストールしてみた

今回はunityに新しいバージョンが増えていたので、それについて書きたいと思います。

今回増えたのが2020.1.0a3です。

僕自身2020というバージョンを見るのが初めてで、気になってインストールしてみました。

まあ、普段は仕事の関係で2018を使うんですけど...

以下がインストール画面です。

f:id:SaidaTaisei:20190912230901p:plain

 

 次が起動画面なんですけど、2019のと同じ画像ですね。

f:id:SaidaTaisei:20190912232455p:plain

 

起動してみました。

ぱっと見は同じなのですが、よく見るとなんかいつもと違った感じの画面ですね。

a版はこれが普通なのかな

僕はa版をインストールするのが初めてなのでよくわかりません。

f:id:SaidaTaisei:20190912232852p:plain

続きはまた明日にでもあげます。

変更点や機能などについて書けたらなと思っています。

 

UnityのTerrainの高さをスクリプトで取得する

unityで(x,z)座標がわかっているときに、テレインの高さを取得する方法について書きます。

意外と使う機能だと思うのですが、あまり検索でもヒットしないため、書きます。

僕はgameobjectをtopビューで配置して、テレインの上に配置するのに使いました。

今から、例を書きます。

以下の画面のようにオブジェクトを配置します。

f:id:SaidaTaisei:20190912212311p:plain

このとき、cubeがterrainと離れた位置にあるのがわかります。

cubeに以下のスクリプトをアタッチします。

そして、unityの再生ボタンを押します。

すると、以下の画面のようにテレインの高さにcubeが配置されました。

f:id:SaidaTaisei:20190912213756p:plain

 このようにして、平面座標がわかっていれば、簡単にテレインの高さにオブジェクトを置くことができます。