Unityのオブジェクトで関数グラフを描画してみた

本投稿は TECOTEC Advent Calendar 2022 の11日目の記事です。

次世代デジタル基盤開発事業部の原と申します。2022年4月に新卒で入社し、Unityを用いたゲームアプリの開発を行っております。 今回は業務の際に気になった"Mathf"を活用して、オブジェクトの移動軌跡で関数グラフの概形を描画してみました。

docs.unity3d.com

今回は下記のような正弦関数(sin関数)のグラフ概形を描画しています。

正弦関数のグラフ

作成手順

1. 移動させるオブジェクトの作成

今回は起動時に作成されていたシーンを使用します。 Hierarchyの左上の+ボタンからUI>Imageを選択して、オブジェクトを追加します。 上記画像のMainObjectのようにCanvas下に配置できていれば問題ありません。

2. スクリプトの作成

オブジェクトを移動させるためのスクリプトを作成します。

using System;
using UnityEngine;

public class MainObject : MonoBehaviour
{
    private float radius = 100f; 
    private float pos_x; // x座標
    private float pos_y; // y座標

    // 移動させる
    void Update()
    {
        SinGraph(); // 使用したいメソッドに書き換える
        // ゲームオブジェクトの位置を設定
        Vector3 pos = new Vector3(pos_x, pos_y, 0);
        gameObject.transform.localPosition = pos;
    }

 // 正弦関数のグラフ用
    void SinGraph()
    {
        // 位相の計算
        float phase = Time.time  * Mathf.PI;
        pos_x = 0.5f * radius * phase - 300;
        pos_y = radius * Mathf.Sin(0.01f * pos_x);
    }
}

上記のコード内でMathfのPISinを使用しましたが、これらはそれぞれ円周率の取得と正弦関数の計算のために使用しております。

スクリプトが完成したら、これを1で作成したオブジェクトにアタッチします。

3. 実行

アタッチまで完了し実行すると、このようにオブジェクトがグラフの概形に沿った軌道を描いて移動します。

実行結果

おわりに

最後まで読んでくださりありがとうございます。 ”中学校や高校で学ぶ数学は社会に出ても役に立たない”といわれることもありますが、数学を知っているとできることが広がって個人的にはとても面白いなと感じます。 今回は数学関数をオブジェクトの移動にのみ使用しましたが、今後はゲームを作る中でも活用できるように努めたいと思います。

おまけ

同様に他の関数でも作成し、使用するメソッドを書き換えることで他の関数グラフの概形も描くことができるので、興味のある方はぜひお試しください。

// 比例関数のグラフ
    void ProportionGraph()
    {
        pos_x = Time.time * 100 -300;
        pos_y = pos_x;
    }
    
    // 二次関数のグラフ
    void SquareGraph()
    {
        pos_x = Time.time * 10 -300;
        pos_y = 0.01f * MathF.Pow(pos_x, 2);
    }

// 余弦関数のグラフ
    void CosGraph()
    {
        // 位相の計算
        float phase = Time.time * 2 * Mathf.PI;
        pos_x = radius * phase - 300;
        pos_y = radius * Mathf.Cos(0.01f * pos_x);
    }

www.tecotec.co.jp