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

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

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 スクリプトリファレンス