C#スクリプトを使って、3Dのゲーム制作をしています。この数字画像を使って15:00という文字を表示しつつ15:00~00:00となっていくようにして、00:00となったら「タイムアップ!」という文字を出力できるようにしたいのですが、Unity使ってまだ間もないのでまったくもって分からないです・・・。ですので、それができるようなプログラムを押し教えていただけると嬉しいです。
![イメージ説明]WIDTH:600
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/05/14 08:43
回答5件
0
まず、CanvasにTimeCounterというPanelを用意してます。(名前は別になんでもかまいません)
Penelを出せば、CanvasとPanel、EventSystemが勝手にできます。
で、
そのPanelの子オブジェクトにImageを4枚入れます。
ここまでは大丈夫ですよね?
で、上記スクリプトをTimeCounterにいれます。
そうすると、TimeCounterの中に
ImagesとNumberSpritesという配列ができます。
左についている矢印をおせばサイズを変更する画面が開きます。
そのNumberSpritesの中に数字の画像を入れていけばよいです。
画像が入れれない、という事ですので多分Textureを入れようとしているのだと思います。
画像はSpriteにしてください。
画像ファイルを選ぶと、
Texture Typeという項目があります。
まずこれをSprite(2D and UI)に変更します。
この状態でApplyすると、Textureの子にSpriteができます。
それを入れればよいです。
画像がぼやけていたりすると思いますが、
FilterModeをPointにしてやればぼやけはなくなります。
多分これが原因っぽいですね。
投稿2015/06/15 01:30
退会済みユーザー
総合スコア0
0
ベストアンサー
using System;
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class TimeCounter : MonoBehaviour {
[SerializeField] Image[] images = new Image[4]; [SerializeField] Sprite[] numberSprites = new Sprite[10]; public float timeCount { get; private set; } void Start() { SetTime(900); } public void SetTime(float time) { timeCount = time; StartCoroutine(TimerStart()); } void SetNumbers(int sec, int val1, int val2) { string str = String.Format("{0:00}", sec); images[val1].sprite = numberSprites[Convert.ToInt32(str.Substring(0,1))]; images[val2].sprite = numberSprites[Convert.ToInt32(str.Substring(1,1))]; } IEnumerator TimerStart() { while (timeCount >= 0) { int sec = Mathf.FloorToInt(timeCount % 60); SetNumbers(sec, 2, 3); int minu = Mathf.FloorToInt((timeCount - sec)/ 60); SetNumbers(minu, 0, 1); yield return new WaitForSeconds(1.0f); timeCount -= 1.0f; } TimeOver(); } void TimeOver() { TextMesh text = new GameObject().AddComponent<TextMesh>(); text.text = "Time Over!"; }
}
今回はUnityらしい?方法で。
まず、Canvasを使用しています。
CanvasにPanelを1枚、ここに上記のスクリプトを追加。
その子要素としてImageを4枚、Panelに並べて下さい。
インスペクターにImagesとNumberSpritesの配列ができますので、
Imagesを4に子要素として置いたものを左から0,1,2,3に入れて下さい。
NumberSpritesは10、そのまま0~9にそのまま数字を当てはめて下さい。
なんとなく分かるかと思いますが、画像も添付いたします。
投稿2015/06/10 11:53
退会済みユーザー
総合スコア0
0
そうですね。15分にしたいのであれば900にすれば900秒、すなわち15分にはなります。時間は...
ただ、このソースのままで、そのようにするには当然、
秒を分に変換する
表示は秒単位なので、表示も変換する作業が当然必要になります。
また、適当なので3ケタの表示にも対応していませんで、その改造も必要になります。
どのように画像を表示させるか、とタイマーの方法の一つとしての説明させていただいたものです。
そもそも、Unityは関係なく完全にc#のお話なのです。
c#についてある程度理解があれば、好みの問題でかなりのパターンが存在するかと思います。全く違う方法で実装する事も普通に可能です。
15秒についてはテストするのに楽だったので、あえてその方法をとりました。
このままでは何ができないか、どうすれば思ったとおりにできるか?を考える事も重要なんです。
という事は言っておきたいです。
説教っぽくなってるのが嫌なので、近いうちにここで上記画像を使用して15分のタイマーを表示する方法を回答しますね。
ただ、どんな事をしているのか?というのはソースを見て考えてほしいと思います。
そして、他にもいくらでも方法がある、という事も分かって下さい。すぐには理解できなくても、いつの間にか分かるようになってますから、続けていれば。
投稿2015/06/10 08:32
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
for文に4というマジックナンバーがある事から分かるように、
かなり適当に組みましたので実用性はないですが、
using UnityEngine;
using System.Collections;
// 小数点第三位の四捨五入と文字列のint型変換に使っています。(MathとConvert)
using System;
public class TimeConut : MonoBehaviour {
Sprite[] sprites; GameObject[] number = new GameObject[4]; float timer = 15; // 15秒 bool timeOver = false; void Start() { // 分割したスプライトを読み込んでいます。 sprites = Resources.LoadAll<Sprite>("Sprites/Number"); CreateSprites(); } void Update() { timer = timer - Time.deltaTime > 0 ? timer - Time.deltaTime : 0; if (timer == 0) { TimeOver(); return; } // timerの値を四捨五入して、文字列に変換しています。 string t = Math.Round(timer, 2).ToString(); if (timer < 10) t = "0" + t; // 小数点が邪魔なので消します。 string timeStr = t.Replace(".",""); for (int i= 0 ; i < timeStr.Length; i++) { // 1文字とりだしてint型に変換しています。 int num = Convert.ToInt32(timeStr.Substring(i, 1)); // 取り出した数字に画像を変更しています。 number[i].GetComponent<SpriteRenderer>().sprite = sprites[num]; } } void CreateSprites() { for (int i=0 ; i < 4 ; i++) { number[i] = new GameObject(); number[i].AddComponent<SpriteRenderer>(); number[i].transform.position = new Vector3(i, 0, 0); } } void TimeOver() { for (int i =0 ; i < 4 ; i++) number[i].GetComponent<SpriteRenderer>().sprite = null; if (timeOver) return; GameObject obj = new GameObject(); obj.AddComponent<TextMesh>().text = "Time Over!!"; timeOver = true; }
}
条件と違う事は、数字を1枚にまとめた画像ファイル、それをunityの機能のmaltipleで分割して、
配列の数字と同じになるようにした事ぐらいです。
配列の番号通りに数字の画像を代入しても当然同じ意味になります。画像以外はスクリプトから生成していますので、カメラにでものっければそれだけで画面中央にタイマーっぽいものが動作するはずです。
最初に申し上げた通りかなり適当です。方法論の一つとして提示いたします。どのように画像を変更しているか?はわかるかと思います。
投稿2015/06/05 07:43
退会済みユーザー
総合スコア0
0
Time.deltaTimeを使うパターンと、
コルーチンを使うパターンが考えられますが、今回の場合はTime.deltaTimeがいいかもしれません。
簡単で初心者向けです。
Time.deltaTimeは前フレームから何秒かかったかを取得できるものです。(単位は秒)
lang
1public float timer = 0; 2 3void Update () { 4 timer += Time.deltaTime; 5}
こうする事で、timerがストップウオッチのように数字が大きくなっていきます。
質問者さんのやりたい事は、
画像を1秒毎に変更させなければいけないので、
Time.deltaTimeを使って変数[timer]が1.0以上になったら画像を変更させるのがいいでしょう。
この時注意しなければいけないのは、timerは約0.016秒づつ増えていくので(FPSにもよりますが)、ピッタリ1秒になることはありません。
なので
if(timer == 1f)
ではなく、
if(timer >= 1f)
としてください。
投稿2015/05/14 12:15
総合スコア305
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/06/01 08:33
2015/06/01 08:56
2015/06/01 09:00
2015/06/02 00:38
2015/06/03 05:49
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。