質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Q&A

解決済

1回答

2163閲覧

unity 中心座標をもとにそれぞれのオブジェクトを周回させたい

BRAK

総合スコア98

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

0グッド

0クリップ

投稿2020/10/31 13:22

中心座標をもとにそれぞれのオブジェクトを周回させたい

現在2Dのアニメーションをコードで作ろうとしています。
あるオブジェクトを中心としてその周りに例えば、リンゴを6個配置して周回させるというコードを書きました。
周回するのはいいのですが、すべて同じ位置から配置され、周回するというバグに直面しました。

C#

1コード 2 public float aroundX = 1; 3 public float aroundY = 1; 4 5 const float aroundDistanceX = 105; 6 const float aroundDistanceY = 105; 7 8 rect.anchoredPosition = new Vector2( 9 Mathf.Cos(aroundX * Time.timeSinceLevelLoad) * aroundDistanceX, 10 Mathf.Sin(aroundY * Time.timeSinceLevelLoad) * aroundDistanceY 11 );

UIの画像を周回させています。
ここから、個人の位置を特定して、その位置から周回させるというのを書いたのですが、そもそも中心座標がそれぞれで異なってしまうで、すべてが連動して周回する全く理想型でない形になります。

C#

1コード 2 private Vector2 initialPos; 3 public GameObject pivot; 4 private void Start() 5 { 6 rect = GetComponent<RectTransform>(); 7 Vector2 p = new Vector2(pivot.transform.position.x, pivot.transform.position.y); 8 initialPos = p - rect.anchoredPosition; 9 } 10 11 void Test() 12 { 13 rect.anchoredPosition = initialPos + new Vector2( 14 Mathf.Cos(aroundX * Time.timeSinceLevelLoad) * aroundDistanceX, 15 Mathf.Sin(aroundY * Time.timeSinceLevelLoad) * aroundDistanceY 16 ); 17 }

どうすればいいかわからないので教えてください。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

現状だと、三角関数の引数として与えられる角度がどのサクランボも同じになってしまっているように見えますね。
それぞれのサクランボを円上の適切な位置にばらけさせてやる必要があるかと思います。下記のようなコードだとどうでしょうか?

C#

1using System.Collections.Generic; 2using UnityEngine; 3 4public class Cherry : MonoBehaviour 5{ 6 private static readonly List<Cherry> instances = new List<Cherry>(); 7 private static bool sorted; 8 9 private const float aroundDistanceX = 105; 10 private const float aroundDistanceY = 105; 11 12 public float aroundX = 1; 13 public float aroundY = 1; 14 15 public RectTransform pivot; 16 17 private RectTransform rect; 18 private float phaseOffset; 19 20 private void Awake() 21 { 22 sorted = false; 23 24 // instancesにすでに破壊済みのサクランボの残骸がある可能性を考慮し掃除する 25 instances.RemoveAll(instance => instance == null); 26 27 // まずAwakeのタイミングでinstancesに自分自身を登録する 28 instances.Add(this); 29 30 // 位相オフセットは、いったん初期位置に基づいた仮の値をセットする 31 rect = GetComponent<RectTransform>(); 32 Vector2 relativePosition = rect.anchoredPosition - pivot.anchoredPosition; 33 phaseOffset = Mathf.Atan2(relativePosition.y, relativePosition.x); 34 } 35 36 private void Start() 37 { 38 if (!sorted) 39 { 40 // Startの時点でシーン上のサクランボがinstancesに登録されたはずなので、 41 // それらサクランボを仮の位相オフセット順に並び替える 42 instances.Sort((a, b) => (int)Mathf.Sign(a.phaseOffset - b.phaseOffset)); 43 sorted = true; 44 } 45 46 // 手作業で配置した位置を基にした仮の位相オフセットでは 47 // 円上に均等に並んでいない恐れがあるため、きっちり均等にする 48 float firstPhaseOffset = instances[0].phaseOffset; 49 int instanceCount = instances.Count; 50 int instanceIndex = instances.IndexOf(this); 51 float newPhaseOffset = firstPhaseOffset + ((2.0f * Mathf.PI * instanceIndex) / instanceCount); 52 Debug.Log($"Phase offset of instance {instanceIndex}/{instanceCount}: {phaseOffset} -> {newPhaseOffset}"); 53 phaseOffset = newPhaseOffset; 54 } 55 56 private void Update() 57 { 58 Test(); 59 } 60 61 private void Test() 62 { 63 // 三角関数に与える位相をphaseOffsetの分だけずらすことで 64 // それぞれのサクランボの円上の位置がばらけるはず 65 float phase = Time.timeSinceLevelLoad + phaseOffset; 66 Vector2 relativePosition = new Vector2( 67 Mathf.Cos(aroundX * phase) * aroundDistanceX, 68 Mathf.Sin(aroundY * phase) * aroundDistanceY 69 ); 70 rect.anchoredPosition = pivot.anchoredPosition + relativePosition; 71 } 72}

投稿2020/11/02 20:58

Bongo

総合スコア10811

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BRAK

2020/11/03 02:21

ありがとうございます。試してみます。
BRAK

2020/11/03 02:35

すごい、出来ました。 昨日、別の人にアドバイスをもらったところ親の空のゲームオブジェクトを回転させて、子のサクランボ全体を回転させた分それぞれを逆回転させるや、テラシュールのリングメニューのコードを自分なりに改変して適用するなど教えてもらいました。 特にテラシュールの方の記事はかなり気になって実装してみたいのでこちらも試してみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問