2 minutes
[Unity]複数のuGUIを円運動させる
お世話になっております。
しゃまとんです。
UnityのuGUIを使って、画面上で円運動させたいなーと思いやってみました。
Mathfにあるsin/cos関数をx,yに当てはめることで回転させられます。
sin/cos関数にはラジアンを渡します。MathfのDeg2Radを使うと角度を簡単にラジアンに変換できます。
float rad = angle * Mathf.Deg2Rad;
float x = Mathf.Cos(rad) * r;
float y = Mathf.Sin(rad) * r;
今回は複数のUIオブジェクトを均等に配置したかったので、ベースオブジェクトを用意してスクリプト上から複製して、
座標計算して設定しています。
半径はスクリプトで定義してもいいですし、
ベースオブジェクトを0度などわかりやすい位置に置いて利用してもいいと思います。
スクリプトは上記画像のUIオブジェクトにつけて、Baseを参照させます。
コードはこんな感じです。
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
public class UICircle : MonoBehaviour {
// 回転速度
private const float speed = 2f;
// 生成数
private const int num = 5;
[SerializeField]
private Image imgBase; // ベース
private float r; // 半径
// 回転に利用する
private List<RectTransform> transes = new List<RectTransform>();
private List<float> startRads = new List<float>();
// cache
private Transform myTrans;
void Start() {
// キャッシュする
myTrans = transform;
// 半径を取得
r = imgBase.rectTransform.localPosition.y;
// ベースから生成
GameObject objBase = imgBase.gameObject;
for (int i = 0; i < num; i++) {
GameObject obj = Instantiate(objBase);
obj.transform.SetParent(myTrans, false);
RectTransform trans = obj.GetComponent<RectTransform>();
// 角度
float angle = i * (360 / num) + 90f;
// ラジアン
float rad = angle * Mathf.Deg2Rad;
// 座標変換
float x = Mathf.Cos(rad) * r;
float y = Mathf.Sin(rad) * r;
// 初期位置
trans.anchoredPosition = new Vector2(x, y);
// update用に取得
transes.Add(trans);
startRads.Add(rad);
}
// ベースを消す
objBase.SetActive(false);
}
void Update () {
// 回転処理
for (int i = 0; i < transes.Count; i++) {
float nowRad = Time.time * speed + startRads[i];
float x = Mathf.Cos(nowRad) * r;
float y = Mathf.Sin(nowRad) * r;
transes[i].anchoredPosition = new Vector2(x, y);
}
}
}
実行するとくるくると回ります。
以上です。
■ 参考