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

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

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

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

1865閲覧

[Unity]子オブジェクトのDateTime順にオブジェクトを並べる方法

minimize

総合スコア23

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/04/30 05:09

編集2020/04/30 13:27

Contentの下に複数の子オブジェクトがあり、
持っているContentのTextに日付を書いていて、その日付順にオブジェクトを並べたいと思っています。

⇩Contentの中にTweetという子オブジェクトが複数あります。
イメージ説明
⇩Tweetの中身はこんな感じです。
イメージ説明
⇩TweetのDayというところに日付が以下のように入っている状態です。
イメージ説明

このDayの順番にオブジェクトを並べたいです。
足りない情報などがありましたら、おしえてください!
よろしくお願いします!

C#

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6using System; 7 8public class TwitterHome : MonoBehaviour 9{ 10 private GameObject tweet; 11 public GameObject content; 12 public Sprite[] twitter_icon; 13 private int aaaa; 14 private List<GameObject> tweetlist = new List<GameObject>(); 15 16 // Start is called before the first frame update 17 void Start() 18 { 19 tweet = (GameObject)Resources.Load("Prefabs/Tweet"); 20 aaaa = 1; 21 List<int> tweetnum = new List<int>(); 22 23 if (aaaa == 1) 24 { 25 tweetnum.Add(1); 26 } 27 28 if (aaaa == 2) 29 { 30 tweetnum.Add(1); 31 tweetnum.Add(2); 32 } 33 34 for (int i = 0; i < tweetnum.Count; i++) { 35 aaaa = tweetnum[i]; 36 switch (aaaa) 37 { 38 case 1: 39 List<string> tweetText = new List<string>() 40 { 41 "sssssssssssss", 42 "ddddddddddd", 43 "test", 44 "test1", 45 "test3", 46 "test4", 47 "test4" 48 }; 49 List<DateTime> tweetDay = new List<DateTime>() 50 { 51 new DateTime(2030, 05, 10), 52 new DateTime(2030, 05, 09), 53 new DateTime(2030, 05, 09), 54 new DateTime(2030, 05, 09), 55 new DateTime(2030, 05, 08), 56 new DateTime(2029, 10, 15), 57 new DateTime(2029, 10, 10), 58 new DateTime(2029, 10, 10) 59 }; 60 61 Sprite icon = twitter_icon[0]; 62 63 TweetContent(tweetText, tweetDay, "test2", icon); 64 65 break; 66 67 case 2: 68 List<string> miyukiTweetText = new List<string>() 69 { 70 "aaaaa", 71 "ssssss", 72 "ddddddd", 73 "fffffff", 74 "ggggggg", 75 "sssssss", 76 "ffffffff", 77 "ffffffffffff" 78 }; 79 List<DateTime> miyukiTweetDay = new List<DateTime>() 80 { 81 new DateTime(2030, 05, 08), 82 new DateTime(2030, 05, 01), 83 new DateTime(2030, 04, 20), 84 new DateTime(2030, 04, 10), 85 new DateTime(2029, 11, 14), 86 new DateTime(2029, 10, 13), 87 new DateTime(2029, 10, 10), 88 new DateTime(2029, 10, 10) 89 }; 90 91 Sprite miyukiIcon = twitter_icon[1]; 92 93 TweetContent(miyukiTweetText, miyukiTweetDay, "test", miyukiIcon); 94 95 break; 96 97 98 default: 99 100 break; 101 } 102 } 103 104 } 105 106 void TweetContent(List<string> tweetText, List<DateTime> tweetDay, String name, Sprite icon) 107 { 108 for (int i = 0; i < tweetText.Count; i++) 109 { 110 GameObject tweetObj = (GameObject)Instantiate(tweet, 111 new Vector2(0.0f, 0.0f), 112 Quaternion.identity); 113 tweetObj.transform.GetChild(0).GetComponent<Image>().sprite = icon; 114 115 tweetObj.transform.GetChild(1).transform.GetComponent<Text>().text = name; 116 tweetObj.transform.GetChild(2).transform.GetComponent<Text>().text = tweetText[i]; 117 tweetObj.transform.GetChild(3).transform.GetComponent<Text>().text = tweetDay[i].ToString("yyyy/MM/dd"); 118 tweetObj.transform.SetParent(content.transform, false); 119 tweetlist.Add(tweetObj); 120 } 121 } 122 123 124 // Update is called once per frame 125 void Update() 126 { 127 128 } 129} 130

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

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

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

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

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

guest

回答2

0

ベストアンサー

今の作り方でやるなら、TweetContent()の中で、新しいtweetObjが何番目になるかを調べて、SetParent()した後にSetSibilingIndex()で順番を決めてあげる、としてあげると、tweetListの中のオブジェクトは常に順番通りに並んでいる状態にできそうです。

実際に試していないので動かなかったらゴメンナサイですが、

C#

1 2void TweetContent(List<string> tweetText, List<DateTime> tweetDay, String name, Sprite icon) 3{ 4 for (int i = 0; i < tweetText.Count; i++) 5 { 6 GameObject tweetObj = (GameObject)Instantiate(tweet, 7 new Vector2(0.0f, 0.0f), 8 Quaternion.identity); 9 tweetObj.transform.GetChild(0).GetComponent<Image>().sprite = icon; 10 11 tweetObj.transform.GetChild(1).transform.GetComponent<Text>().text = name; 12 tweetObj.transform.GetChild(2).transform.GetComponent<Text>().text = tweetText[i]; 13 tweetObj.transform.GetChild(3).transform.GetComponent<Text>().text = tweetDay[i].ToString("yyyy/MM/dd"); 14 tweetObj.transform.SetParent(content.transform, false); 15 16 // 何番目に入れるべきか調べる 17 int index = GetSibilingIndex(tweetDay[i]); 18 tweetObj.transform.SetSiblingIndex(index); 19 20 tweetlist.Add(tweetObj); 21 } 22} 23 24// ツイートの日付が何番目に来るべきかを調べる 25int GetSibilingIndex(DateTime targetDay) 26{ 27 // 現在のリストの日付と順番に比較する 28 for(int i=0; i<tweetlist.Count; i++) 29 { 30 // 比較するオブジェクト 31 GameObject tweetObj = tweetList[i]; 32 33 // 日付の文字列を取得 34 string dayText = tweetObj .transform.GetChild(3).transform.GetComponent<Text>().text; 35 36 // 文字列からDateTimeに変換 37 DateTime day = DateTime.ParseExact(dayText, "yyyy/MM/dd", null); 38 39 // 日付同士を比較して対象の日付のほうが早ければ順番が決まるので番号を返して終了 40 if(targetDay < day) 41 { 42 return i; 43 } 44 } 45 46 // 比較して決まらなかったらリストの全部より遅いので最後尾の順番を返す 47 return tweetList.Count; 48}

こんなかんじでどうでしょうか。

ただこの方法だと、ツイートが増えるたびに比較する回数が大幅に増えていくので、実運用に耐えられるかどうかは微妙かもしれません。
また、DateTimeをToString()した後に、もう一度ParseExactでDateTimeに戻していたり、GetComponentをたくさん使っていたり、効率が良くないところもあるので、そのあたりも改善の余地ありです。
ツイートのデータを表すクラスを用意したり、ツイートオブジェクト用のスクリプトを用意したりしてあげると、もっと見通しが良くなるかな、と思います。

【参考URL】
日付や時刻の文字列をDateTime/DateTimeOffsetオブジェクトに変換するには?
https://www.atmarkit.co.jp/ait/articles/0409/03/news087.html

日付を比較するには?[C#/VB]
https://www.atmarkit.co.jp/ait/articles/1803/28/news024.html

投稿2020/05/01 00:22

KzoNag

総合スコア7

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

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

minimize

2020/05/01 12:24

ありがとうございます!とても参考になります!
guest

0

全然詳しくないので間違っていたらすみません。

年→月→日の順番で比較して行って
https://kan-kikuchi.hatenablog.com/entry/SiblingIndex
このサイトのように
transform.SetSiblingIndex()
を使えば行けるんじゃないでしょうか。

投稿2020/04/30 14:51

amaebi

総合スコア4

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

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

minimize

2020/04/30 15:08

すみません、transform.SetSiblingIndex()を使えばchildの場所を変えることができることはわかるのですが、contentの中にある複数のchildオブジェクトの中の複数のオブジェクトの日付順にまず並べるというところがうまくかけなくて困っています!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問