オブジェクトの無限回転
Sukemitsuです
オブジェクトを回し続けるだけのスクリプトを作りました
制作理由
オブジェクトを無限に回したかったのでついでに汎用性を高めてAssetにしました。
使い方
- 回したいオブジェクトにObjectRotate.csをアタッチする
- enum RotateAxis型変数Axisで回転軸を決定する
- bool型変数Clockwiseを決定する
- float型変数RotateSpeedで回転速度を決定する
- ゲームを開始すると回る
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でオブジェクトを回転させる方法まとめ/