オブジェクトの無限回転

Sukemitsuです

オブジェクトを回し続けるだけのスクリプトを作りました

制作理由

オブジェクトを無限に回したかったのでついでに汎用性を高めてAssetにしました。

使い方

  1. 回したいオブジェクトにObjectRotate.csをアタッチする
  2. enum RotateAxis型変数Axisで回転軸を決定する
  3. bool型変数Clockwiseを決定する
  4. float型変数RotateSpeedで回転速度を決定する
  5. ゲームを開始すると回る
Inspector上の表示

Inspector上ですべて操作できます

変数Tはfloat型でデバック用に表示しているだけでいじらなくてよい(いじっても無駄)

複数の軸を同時に回転させることは不可、途中で回転軸を変えたりは苦手(Update()で回転度合を取得していると一定時間でおかしな挙動をしたので断念)

各変数はpublicで外部からアクセス可能

応用

  • float型変数RotateSpeedを0にすることで回転を止めれる
  • 親オブジェクト(EmptyObject)、子オブジェクト(回したいオブジェクト)の両方にObjectRotate.csをアタッチすることで複数軸で回転させたり、惑星、衛星のような軌道を再現したりできる

スクリプト

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

public class ObjectRotate : MonoBehaviour
{
    public enum RotateAxis
    {
        x,
        y,
        z,
    }

    public RotateAxis axis;
    public bool clockwise;
    public float RotateSpeed = 1;
    public float t;

    private float angle, ex, ey, ez;
    private Vector3 _Rotate;

    // Start is called before the first frame update
    void Start()
    {
        GetObjectEulerAngles();

        t = 0.0f;
    }

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

    public void GetObjectEulerAngles()
    {
        _Rotate = transform.eulerAngles;

        ex = _Rotate.x;
        ey = _Rotate.y;
        ez = _Rotate.z;
    }

    public void RotateObject()
    {

        if (clockwise)
        {
            angle = Mathf.LerpAngle(0, 180, t * RotateSpeed);
        }
        else
        {
            angle = Mathf.LerpAngle(0, -180, t * RotateSpeed);
        }

        t += Time.deltaTime;
        if (t >= 1 / RotateSpeed)
        {
            t = 0;
        }

        switch (axis)
        {
            case RotateAxis.x:
                transform.localEulerAngles = new Vector3(angle, ey, ez);
                break;
            case RotateAxis.y:
                transform.localEulerAngles = new Vector3(ex, angle, ez);
                break;
            case RotateAxis.z:
                transform.localEulerAngles = new Vector3(ex, ey, angle);
                break;
        }
    }
}

参考サイト

【Unity入門】1番簡単なenumの覚え方!綺麗なプログラムは定数から!
https://www.sejuku.net/blog/55897

Unityでオブジェクトを回転させる方法まとめ
https://tama-lab.net/2017/06/unityでオブジェクトを回転させる方法まとめ/

Sukemitsu

2021年度会計

2019年度加入生
投稿記事一覧

コメントを残す

CAPTCHA


成果物紹介

前の記事

ObjectPool
未分類

次の記事

Unityマウス操作いろいろ