円の周りに巻き付くようなテキスト
解決したいこと
円の周りに巻き付くようなテキストを作りたいです。
音ゲーの選択画面のゲーム音楽のプレビューで、タイトルと作曲者を表示するのに使用したいと考えています。
テキストを1文字ずつ取得して、それをDotweenを使わず三角関数を使い配置させたいのですが、どう調べても出てきません。
テキストの文字数は選択した楽曲によって変わるので、そこも対応して頂きたいです。
分かる方居たら教えて頂きたいです。
0
円の周りに巻き付くようなテキストを作りたいです。
音ゲーの選択画面のゲーム音楽のプレビューで、タイトルと作曲者を表示するのに使用したいと考えています。
テキストを1文字ずつ取得して、それをDotweenを使わず三角関数を使い配置させたいのですが、どう調べても出てきません。
テキストの文字数は選択した楽曲によって変わるので、そこも対応して頂きたいです。
分かる方居たら教えて頂きたいです。
自己解決しました。
テキストの文字数を取得して1文字ずつ回転させるのではなく、テキストを1文字ずつ生成して円周上に配置するようにしました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.UI;
public class CircleText : MonoBehaviour
{
public string viewText;//配置したいテキスト
public float speed;//円周状に回らせるスピード
[SerializeField] private float distance;//中心からの距離
[SerializeField] private float viewAngle;//円の接線から何度か
[SerializeField] private GameObject textPrefab;//テキストをプレハブ化したもの
private float angle;//回す用
private float betweenAngle;//何度の範囲内に描画するか
int size { get { return viewText.Length; } }//文字数
private GameObject[] texts;//表示するテキストの配列
void Start()
{
Generate(viewText);
}
private void Update()
{
angle += Time.deltaTime * speed;
Layout(angle);
}
/// <summary>
/// 文字表示
/// </summary>
/// <param name="text">表示させたいテキスト</param>
public void Generate(string text)
{
viewText = text;
for(int n = 0; n < transform.childCount; n++)
{
Destroy(transform.GetChild(n).gameObject);
}
angle = 0;
texts = new GameObject[size];
for (int index = 0; index < size; index++)
{
GameObject ins = Instantiate(textPrefab);
ins.transform.SetParent(this.transform);
texts[index] = ins;
texts[index].GetComponent<Text>().text = viewText[index].ToString();
texts[index].transform.localScale = Vector3.one;
}
}
/// <summary>
/// 配置
/// </summary>
/// <param name="angle"></param>
void Layout(float angle)
{
betweenAngle = 10 * size;
float pading = betweenAngle / size;
for(int index = 0; index < size; index++)
{
float pAngle = pading * index * -1 + angle;
Vector2 axis = Vector2.zero;
axis.x = Mathf.Cos(pAngle * Mathf.Deg2Rad);
axis.y = Mathf.Sin(pAngle * Mathf.Deg2Rad);
texts[index].transform.position = axis * distance;
texts[index].transform.rotation = Quaternion.Euler(0, 0, pAngle + viewAngle * -1);
}
}
}