🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Q&A

解決済

1回答

4651閲覧

Unityでタコメーターのような円盤に針で数値を示すメーターを作りたい。

Aka.H

総合スコア7

C#

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

0グッド

0クリップ

投稿2019/10/22 07:37

前提・実現したいこと

Unityで車のタコメーターやスピードメーターのような円盤と針で数値を表示するようなメーターを作りたいです。
具体的にはクエスト等で獲得したスコアをホーム画面でメーターに反映しMAXになるとレベルが上がるという仕組みにしたいです。

メーターの形としては円形の←(左真横)を0として↑を50%、→(右真横)を100%として針を上側に180度回転して数値が上がっていく形にしたいと考えています。
MAX値はレベルによって変化させたいです。

試したこと

円形のHPゲージのようなものやスピードメーターは検索して出てくるのですが、いまいち自分のやりたいことに落とし込めません。

思いつく範囲で下記のようにして針を動かしてみたりもしたのですがおおざっぱな値でしか動かせませんし、細かくしようとするとスクリプトをすごい数書くことになるのでどうにかして回転の値とスコア値を比例させて動かしたいです。
何かいい方法はないでしょうか?

C#

1int Score = (int)GManeger.MeinScore/1000; 2 3if (Score == 0) 4{ gameObject.transform.localEulerAngles = new Vector3(0, 0, 360); } 5 6if ((Score >= 5)&& (10 > Score)) 7{ gameObject.transform.localEulerAngles = new Vector3(0, 0, 342); }

補足情報(FW/ツールのバージョンなど)

Unity2019.2.8f1
C#
AndroidStudio 3.4.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

16:56より、大幅に書き換えました…

タコメーターというのが分からないので、文書を見て

C#

1 2int Score = (int)GManeger.MeinScore/1000; 3 4if (Score == 0) 5{ gameObject.transform.localEulerAngles = new Vector3(0, 0, 360); } 6 7if ((Score >= 5)&& (10 > Score)) 8{ gameObject.transform.localEulerAngles = new Vector3(0, 0, 342); } 9

上記を

C#

1 2int Score = (int)GManeger.MeinScore/1000; 3 4if( (Score >= 5)&& (10 > Score) ) 5 gameObject.transform.localEulerAngles = new Vector3(0, 0, 180 * ((float)Score) ); 6else 7 gameObject.transform.localEulerAngles = new Vector3(0, 0, 0 ); 8 9

に書き換えてみてもらっても大丈夫でしょうか…

質問主さんの発言から

1.1000に対する「GManeger.MeinScore」の割合で、ある物体の角度を0~180度に変えたい

そのように見受けられた次第です…。

詳しい状況は読めませんが…

スコア0の角度が気に入らなければ

gameObject.transform.localEulerAngles = new Vector3(0, 0, 180 * ((float)Score)+ 初期角度);

で実現できそうです…


あと

int Score = (int)GManeger.MeinScore/1000;

ここを

float Score = (float)GManeger.MeinScore/1000;

に書き換えると、0,1,2,3,4,5,6,7,8,9,10といった整数値ではなく
0~1.0の間の少数値が手に入るので、タコメーターがどういう挙動なのか分からないのですが
なめらかな針の動きをするなら、float型で受け取った方がいいかと思う次第です…

投稿2019/10/22 07:50

編集2019/10/22 08:03
hermit19901127

総合スコア368

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

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

sakura_hana

2019/10/22 08:37

ちょっとうろ覚えですが、intで割ると結果がintになり小数点以下が消えてしまうので float Score = GManeger.MeinScore/1000.0f; にしないとダメな気がします。 (割る数がfloatなら結果はfloatなのでGManeger.MeinScoreをintにキャストする必要は無い) あとif文要らないですね。 本来はScoreは0.0〜1.0の間に入るはずです(そうなるように「1000」の部分の値を調整する)。 もしもScoreが5以上10未満だったら、そこに180を掛けているのでメチャクチャ回転してしまいます。 GManeger.MeinScoreが0だったらScoreも0になりますし、他の要因で角度を0にする条件が提示されていないので条件分岐は要りません。 ちなみに「タコメーター」で検索すれば画像含めて情報が出て来るので回答前に調べた方がいいです。 普通のタコメーターであれば滑らかに回るものなのでfloat一択です(わざわざ小刻みにしたいならintでもいいですが)。
hermit19901127

2019/10/22 08:42

>ちなみに「タコメーター」で検索すれば画像含めて情報が出て来るので回答前に調べた方がいいです。 これは質問者さんのif文のから「ある一定までいってから、一気にメーターが上がる」みたいな感じのモノだと受け入れて、実際の動きを調べはしなかったので、ぐうの音もでません… intやfloatが混在してると、たしかに小数点切り捨てや丸目誤差等で、意図しない動きを誘発する事になりかねません…。 統一等はできないのでしょうか…
sakura_hana

2019/10/22 09:24

ベストアンサー済みで申し訳無いですが一応hermit19901127さん宛てにコメントを。 >「ある一定までいってから、一気にメーターが上がる」 最初はそう思ったという感じでしょうか?(実際は質問者さんは「この値ならこの角度」を全部手打ちしようとして、それは面倒だがどうすればいいかと質問したようですが) 現状の回答内での発言と矛盾するように見えるので書き方を注意した方がいいです。 >統一等はできないのでしょうか 誰に向けた発言なのかよく分かりませんが、意図しない動きが起こり得るからこそ、用途に応じて使い分ける必要があります。 まぁどちらでもいいなら「可能な限り元の型を維持」か「最初に最終的に使用する値に変換」ですかね。コード(設計)次第かなと思います。 なお、もしも回答前に追加で情報が必要な場合や解決出来るか怪しい場合、回答ではなく「追記・修正依頼」を利用することをオススメします。 回答が1件でも付くと質問削除が出来ない他、他の回答者が「もう回答付いてるならいいや」と質問をスルーしてしまう可能性がある為です。 (推測に自信があるとか他の回答が既に付いてるとかなら回答投稿でもいいと思いますが) 質問者を助けてあげることはとてもよいことですが、間違った情報を出すのは問題です(後からこのページを見る人にも影響を出しかねない)。 出しゃばりで申し訳ありませんがご一考頂けたら幸いです。
hermit19901127

2019/10/22 09:39

>if( (Score >= 5)&& (10 > Score) ) この条件式から「スコアが5を超えるまではメーターを動かさず、5から10の間でスコアを動かす」ことが目的のように見受けられた次第です… 1. 自分が最初に述べるべきは「参考としたいタコメーターの動作資料の動画」でしたね…。 「(実際は質問者さんは「この値ならこの角度」を全部手打ちしようとして、それは面倒だがどうすればいいかと質問したようですが)」 ここは全く読み取れませんでした…。 >>統一等はできないのでしょうか >誰に向けた発言なのかよく分かりませんが こちらは質問主さんへの発言となります。 設計に関して問題を言うべきタイミングではないとは反省致ししますが、 int型やfloat型が混在してるような状況は好ましくないと思う思想はあります…。 「回答ではなく「追記・修正依頼」を利用することをオススメします。」 たしかに、私が最初にやるべきことは、ここで 「タコメータの具体的な動きが分かる動画資料等はございますでしょうか…」と聞くべきでした。 申し訳ございません…。以後、気を付けます…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問