tsg4gf
@tsg4gf (あやね ばば)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

円の周りに巻き付くようなテキスト

Q&A

Closed

解決したいこと

円の周りに巻き付くようなテキストを作りたいです。
音ゲーの選択画面のゲーム音楽のプレビューで、タイトルと作曲者を表示するのに使用したいと考えています。
テキストを1文字ずつ取得して、それをDotweenを使わず三角関数を使い配置させたいのですが、どう調べても出てきません。
テキストの文字数は選択した楽曲によって変わるので、そこも対応して頂きたいです。
分かる方居たら教えて頂きたいです。

###やりたい事のイメージ
question.png

0

1Answer

自己解決しました。
テキストの文字数を取得して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);
        }
    }
   
}

0Like

Your answer might help someone💌