お世話になっております。
しゃまとんです。
UnityのuGUIを使って、画面上で円運動させたいなーと思いやってみました。
Mathfにあるsin/cos関数をx,yに当てはめることで回転させられます。
sin/cos関数にはラジアンを渡します。MathfのDeg2Radを使うと角度を簡単にラジアンに変換できます。
1 2 3 4 |
float rad = angle * Mathf.Deg2Rad; float x = Mathf.Cos(rad) * r; float y = Mathf.Sin(rad) * r; |
今回は複数のUIオブジェクトを均等に配置したかったので、ベースオブジェクトを用意してスクリプト上から複製して、座標計算して設定しています。
半径はスクリプトで定義してもいいですし、ベースオブジェクトを0度などわかりやすい位置に置いて利用してもいいと思います。
スクリプトは上記画像のUIオブジェクトにつけて、Baseを参照させます。
コードはこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
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); } } } |
実行するとくるくると回ります。
以上です。