より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

Javaグラフィックス完全制覇をUnityで実装してみる〜シェルピンスキーのギャスケット

書籍「Javaグラフィックス完全制覇」を参考にシェルピンスキーのギャスケットを描画してみます。

UnityなのでLineRendererを用います。

三角形一つについてLineRendererが必要になるので、LineRendererを追加したGameObjectをPrefabとして描画していきます。

f:id:rimever:20210924185235p:plain

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

public class SierpinskiGasketManager : MonoBehaviour
{
    void Start()
    {
        var startVertices = new List<Vector3>();
        float radius = 4f;
        for (int i = 0; i < 3; i++)
        {
            var x = -radius * Mathf.Sin(2 * Mathf.PI * i / 3);
            var y = radius * Mathf.Cos(2 * Mathf.PI * i / 3);
            startVertices.Add(new Vector3(x, y, 0));
        }

        DrawSierpinskiGasket(startVertices.ToArray(), 0, 10);
    }

    public GameObject Prefab;

    // Start is called before the first frame update

    private void DrawSierpinskiGasket(Vector3[] vertices, int currentIndex, int n)
    {
        if (currentIndex == 0)
        {
            DrawPolygon(vertices);
        }

        if (currentIndex < n)
        {
            var m = new Vector3[3];
            m[0] = (vertices[1] + vertices[2]) / 2;
            m[1] = (vertices[2] + vertices[0]) / 2;
            m[2] = (vertices[0] + vertices[1]) / 2;
            DrawPolygon(m);
            var pp = new Vector3[3];
            pp[0] = vertices[0];
            pp[1] = m[2];
            pp[2] = m[1];
            DrawSierpinskiGasket(pp, currentIndex + 1, n);
            pp[0] = m[2];
            pp[1] = vertices[1];
            pp[2] = m[0];
            DrawSierpinskiGasket(pp, currentIndex + 1, n);
            pp[0] = m[1];
            pp[1] = m[0];
            pp[2] = vertices[2];
            DrawSierpinskiGasket(pp, currentIndex + 1, n);
            
        }
    }

    private void DrawPolygon(Vector3[] vertices)
    {
        var o = Instantiate(Prefab);
        var lineRenderer = o.GetComponent<LineRenderer>();
        var v = new Vector3[vertices.Length + 1];
        vertices.CopyTo(v, 0);
        v[v.Length - 1] = vertices[0];
        lineRenderer.positionCount = v.Length;
        lineRenderer.SetPositions(v.ToArray());
    }
}

Reference

docs.unity3d.com

Javaグラフィックス完全制覇をUnityで実装してみる〜3Dの花を咲かせる

Unityの練習中なので、書籍「Javaグラフィックス」をUnityで実装してみることにしました。

Javaグラフィックスは2001年の書籍です。

Javaアプレットとか言っていた時代ですね。私の年齢層がバレますね。

結構面白いことができるので大事に保管していました。

今回は書籍の中で花を咲かせるというのをUnityでやってみることにします。

Unityの本に書いてあることをそのまま写経するのも練習になりますがJavaで書かれたコードをUnity+C#で実現しようとするとなかなか応用力が試されるのでいい練習になるのでやってみます。

花といっても円です。書籍では2Dなのですが3Dで実現してみることにしました。

f:id:rimever:20210923210649p:plain

Code

using System.Collections;
using System.Collections.Generic;
using UnityEditor.SceneManagement;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public GameObject Prefab;

    // Start is called before the first frame update
    void Start()
    {
        for (int i = 0; i < 60; i++)
        {
            var rangeMax = 4f;
            var o = Instantiate(Prefab,
                new Vector3(Random.Range(-rangeMax, rangeMax), Random.Range(-rangeMax, rangeMax),
                    Random.Range(-rangeMax, rangeMax)),
                Quaternion.identity);
            var size = Random.Range(0.5f, 1f);
            o.transform.localScale =
                new Vector3(size, size, size);
            o.GetComponent<Renderer>().material.color= Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f);
        }
    }

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

3DObjectのSphereを直接生成できないのでPrefabを設定して、Instatiateする方にしています。

PrefabはSphereそのものでMaterialなどもデフォルトのままです。

CameraをOrthographicに指定して調整し、Cylinderの底を使い、2Dらしくするとこちら。

f:id:rimever:20210924070919p:plain

これが原本に近い形になるかなと。

using System.Collections;
using System.Collections.Generic;
using UnityEditor.SceneManagement;
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public GameObject Prefab;

    // Start is called before the first frame update
    void Start()
    {
        for (int i = 0; i < 240; i++)
        {
            var rangeMax = 4f;
            var position = new Vector3(Random.Range(-rangeMax, rangeMax), Random.Range(-rangeMax, rangeMax),
                0);
            var o = Instantiate(Prefab);
            var size = Random.Range(0.5f, 1f);
            o.transform.localScale =
                new Vector3(size, size, size);
            o.transform.position = position;
            o.GetComponent<Renderer>().material.color = Random.ColorHSV(0f, 1f, 1f, 1f, 0.5f, 1f);
        }
    }

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

今日は、ここまで。まだまだこの本では色々できることがあるので実装しながら、Unityをやり込んでいきます。

Reference

Random Range ノード | Shader Graph | 10.0.0-preview.27

Random-ColorHSV - Unity スクリプトリファレンス

Unityラングフォート方程式でストレンジアトラクターを作成してみる

書籍「Unityで作るストレンジアトラクター」で学んだことを活かして、ラングフォート方程式でストレンジアトラクターを作成してみることにしました。

数式や実装は以下を参考にします。

www.isc.meiji.ac.jp

ローレンツ方程式より計算式を実装するだけでもミスが出るほどの複雑さです。

以下みたいな感じになりました。

f:id:rimever:20210923083125p:plain

f:id:rimever:20210923083230p:plain

リポジトリ

github.com

読書感想「Unityで作るトロコイド」

Unityで作るトロコイド

Reactのアイコンみたい。

最初の4.6で動かすときにUpdateは空メソッドにしておく必要があります。Changeというメソッドを呼び出すようになってますが、宣言されてないので。

f:id:rimever:20210922192546p:plain
Reactのアイコンみたい

拡張して、最後はすごいことになります。

f:id:rimever:20210922202450p:plain

f:id:rimever:20210922202456p:plain

f:id:rimever:20210922202515p:plain

読書感想「Unityで作るストレンジアトラクター」

Unityで作るストレンジアトラクター

f:id:rimever:20210922085304p:plain

ストレンジアトラクターの一つであるローレンツアトラクターを作る本です。

ローレンツアトラクターはローレンツ方程式から生成される曲線です。

ja.wikipedia.org

ただ、回転が書籍通りに実装したつもりなのですが、うまく動作しませんでした。ローレンツアトラクターが回転しません。

Strange AttractorのゲームオブジェクトのプロパティUse World Spaceのチェックを外して解消しました。

サクッとコード書いて動かすことができます。

ストレンジアトラクター

他には、ラングフォート方程式というのがあるそうです。

www.isc.meiji.ac.jp

読書感想「きっちり完成!Unity3Dゲーム制作 クリックスナイパー編」

きっちり完成!Unity3Dゲーム制作 クリックスナイパー編: 2020対応

フタバゼミというプログラミングを教えるところが出版している本です。

f:id:rimever:20210920143026p:plain
レイアウトは「高い(Tall)」で説明されます。

f:id:rimever:20210920145914p:plain
作ったターゲットを撃つだけでも割と面白い

私は、連射性能を上げた上、右クリックの時は、強く右に曲げるようにしました。ターゲットは左から右に流れていくので、これで補おうという手です。

github.com

f:id:rimever:20210921084322p:plain
トゥーンシェーダーを適用してみた

GitHub Actionを使ってみる

GitHubの新機能としてGitHub Actionがありましたが、まだ触ってなかったので軽く触ることにしました。

github.co.jp

docs.github.com

f:id:rimever:20210914190941p:plain
フォルダもパスも含めれば自動作成される

f:id:rimever:20210914191625p:plain
実行完了

要は、.github/workflowsにyamlファイルを含めれば実行されるという仕組みのようですね。

試したリポジトリは以下です。

github.com

C#のビルドを試してみる

適当に触っているC#リポジトリに対して、以下サンプルを参考にGitHubActionを組み込んでみます。

github.com

f:id:rimever:20210914204040p:plain
成功した様子

YAMLは以下です。サンプルは必要最低限の部分しか記載がないので、単純にそれだけでは動作しません。トリガーなどは自分で記載する必要があります。

github.com

Azure DevOpsと比べて

GitHub Actionでは私が確認した時点ではパブリックでは無料ですが、プライベートではお金が取られます。

AzureDevOpsはプライベートでも無料で実行できます。