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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

Q&A

解決済

1回答

2363閲覧

unityで座標がゲームオブジェクトと共に動くHPバーを作りたいが、座標がずれてしまいます

abuk

総合スコア20

C#

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

0グッド

0クリップ

投稿2018/09/18 16:48

編集2018/09/18 17:57

unityで、動くゲームオブジェクトに追随するようなHPバーを作ったのですが、HPバーが減るたびに座標が少しずつずれてしまいます。
具体的にどのような仕様になっているかというと、縦長の長方形のHPバーがゲームオブジェクトの子オブジェクトで、HPバーが減っても底辺とゲームオブジェクトの相対位置が変わらないようなHPバーを作りました。
HPバーのスプライトは色のついた長方形の画像で、余白はなく画像全体が長方形を描画しています。
HPバーを減らす処理はlocalScaleの値を変更することで行います。
下がそのコードです。

C#

1public class Enemy_1 : MonoBehaviour 2{ 3 4 public int hp = 2; 5 public int max_hp = 2; 6 //HPゲージ 7 public GameObject enemy_hp_gauge; 8 //HPゲージの相対位置 9 public Vector3 enemy_hp_gauge_pos; 10 11 IEnumerator Start() 12 { 13 14 enemy_hp_gauge = transform.Find("enemy_hp_gauge").gameObject; 15 enemy_hp_gauge_pos = enemy_hp_gauge.transform.localPosition; 16 17 //処理。。。 18 } 19 20 void Update() 21 { 22 //縮める前のhpバーの高さ取得 23 float height_prev = enemy_hp_gauge.GetComponent<SpriteRenderer>().bounds.size.y; 24 //hpバーを縮める 25 enemy_hp_gauge.transform.localScale = new Vector3(1, (float)hp / max_hp, 1); 26 //hpバーを縮めた後のバーの高さ取得 27 float height_next = enemy_hp_gauge.GetComponent<SpriteRenderer>().bounds.size.y; 28 //バーの下部と親オブジェクトの相対位置が変わらないようにする 29 enemy_hp_gauge.transform.localPosition = new Vector3(0,(height_next-height_prev)/2.0f,0) + enemy_hp_gauge_pos; 30 //バーの相対位置を更新 31 enemy_hp_gauge_pos = enemy_hp_gauge.transform.localPosition; 32 } 33 34 //ダメージを食らったらhpを減らす処理 35

このような実装をしたのですが、HPバーが削れるたびに少しずつHPバーの底辺が下にずれていってしまいます。
これは何が原因なのでしょうか?教えてくださると助かります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

設定されているSpriteのPivotがBottomになっていませんでしょうか?
コードを見た所、ゲージを縮めた後に位置を調節している箇所がありますが、PivotがBottomだとその処理が不要になるかと思います。

投稿2018/09/19 01:39

miyaby

総合スコア51

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

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

abuk

2018/09/19 05:43

pivotをcenterからbottomにしたら解決できました。ありがとうございます。 しかしこのコードの処理だと位置がずれていくのは何故なのでしょうか?丸め誤差のせいなのでしょうか
miyaby

2018/09/19 05:53

ScaleがPivotを中心に行われるためです。 abukさんのコードでは、ゲージがscaleで縮んだあと、(centerを中心に縮むので)上がった底辺分を下げる処理が入っています。 ですがPivotがBottomの場合、scaleで縮んでも底辺部分の位置は変わりません。なので、底辺部分を下げる処理分だけゲージ自体の位置がずれていくようになっています。
abuk

2018/09/19 08:31

pivotがbottomの場合にHPバーの位置を下げる処理を行わないでうまくいくことは納得しました。 しかしpivotがcenterで、centerを中心に縮むので上がった底辺分を下げる処理が入っている場合ではずれてしまうのは何故なのでしょうか?ずらす距離の計算が間違っているのでしょうか
miyaby

2018/09/19 09:36

親のGameObjectのScaleのYの値は1になっていますでしょうか? 自分の環境で試したところ、上記の値が1より大きい時は下に下がる、1未満の時は上に上がるような計算になっているようです。
abuk

2018/09/20 11:48

こちらの環境では親のスケールが1になっていると上にズレてしまいます。 親のscaleを1.5にしたところ正しく動いているようにみえました。親のスケールはゲームプレイ中には変更していないのですが。。。 原因がよくわかりません。
miyaby

2018/09/21 01:18

親の親までのScaleが異なっているとかでしょうか・・・ HierarchyビューやInspectorの情報があればもう少しわかることがあるかもしれません。可能でしたら追記お願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問