プロフィール

はーさん

Author:はーさん
1人創作チームDeadMan'sSunのボスです。
Twitter→@Ha_Shok_ko

TERA HITO:Revolutionを作りました。よろしく頼むぜ、兄弟!
・ふりーむ!のTERAのページ(exe形式公開場所)へ
・UnityRoomのTERAのページ(WebGL版公開場所)へ

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム
QRコード
QR

私のアイランド


--/--/-- --:-- はーさん

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2015/07/15 02:24 はーさん

ライフバーを作ってみたので、作る過程を載せます。


俺っち頭いい!って思ったことを今から書きます。
ドヤ顔で、中学レベルの数学の話をしちゃいますよ。

さて、Unityでライフバーを作るついでにダメージ計算式を作りました。
その話をしようとおもいます。
コードの話じゃなくて、考え方を載せます。
掲載コードは参考程度に。コピペして使わないほうがいいです。うん!

・ライフバーについて

ゲームでよくあるライフバー。
HPが下がれば黄色くなっていき、赤くなっていって視覚的にプレイヤーにピンチですよ~とかコイツそろそろぶっ倒れるぜ!ざまあないぜ!さあとどめをさすんや!っていうのを伝えてくれる頼もしい味方。
その作り方について、ちょっと書きます。





その1:.HPとバーの1%分の数値を求める。

まずキャラに設定されている最大HPを求めます。
それを適当な変数に代入しておきます。
この変数の1%を求めて、その割合に応じてバーの長さを調節します。
小数点以下なんてプレイヤー側は気にもとめない+作ってる側としてもHPとかダメージを小数点なんて考慮したくないので全部おint型で処理します。

もちろん、ライフバーの長さもHP残量に応じて変化させるので割合を求めます。
と、いうかHPとバーの長さが必ずしも同じ数値になることはないですからね。
ライフバーの長さを100にしてHPを100にし、変化させる処理にしてしまうと、HPがとても多いキャラを作るとそれにあわせてライフバーの長さも変えないといけないので、見た目も悪いうえに作るのが大変です。
割合同士であれば、お互いの数値に依存することなく変化を反映させることができるわけです!
(すごい分かりにくい説明)

こんな感じ)

public int HP;←上のほうで宣言(フィールドって言うんでしたっけアソコ)
変化させるバーの情報//これは、使うものに応じて。UGUI、GUI、NGUIそれぞれの使う値を。
バーのもともとの長さ//もともとの長さから割合を求める。
※バーの例
※RectTransform Lifebar;
※Lifebar=GetComponent();
.....
void lifeBar(){
 double onePar_HP=(double)HP/100;
 バーの情報から変化させる軸の長さ(スケール)を100で割る/X,Y,Z,どれを変えるか
 ※バーの例
 ※doubel bar_x = (double)LifeBar.LocalScale.x/100;
 ※

}

これで1%のHPと長さが分かりました。ぶっちゃけもう勝ちゲーです。

その2:HP残量の割合を求める。

現在HPが最大HPに対してどれくらいの割合なのかを求めます。
先ほど1%分を求めたので、ひたすらfor文かwhile文で足していって、現在HP割合を求める方法と、最大HPから今のHPを引いて、受けた総ダメージを算出し、そこから受けたダメージの割合を求めて100から引いて現在HP割合を求める方法があります。
割合なんで最大値は100%なので100減らすわけです。(ドヤッ

僕は後者でやったんですけど、普通に前者でよくね?

後者のやり方がこうです。
まず、変数で現在HPと最大HPをそれぞれ分けて考えます。
現在HPは適当にnowHPみたいに書いておけばいいんじゃないでしょうか。
最大HP-現在HPで、ダメージを求めます。
そして繰り返し処理でHPの1%分を何回も足していきます。
1%を足しまくるので、何回足したかでダメージの割合を求める作戦です。

※バーの例
※RectTransform Lifebar;
※Lifebar=GetComponent();
.....
void lifeBar(){
 double onePar_HP=(double)HP/100;
 バーの情報から変化させる軸の長さ(スケール)を100で割る/X,Y,Z,どれを変えるか
 ※バーの例
 ※doubel bar_x = (double)LifeBar.LocalScale.x/100;
 ※
int damegeParcent=0//ダメージの割合を格納する変数
double a=0//足しまくるのを格納する変数
while(a  a+=onePar_HP;
damegeParcent++;
}
double hpParcent=100-damageParcent;

}

その3:割合に応じて長さを変えるんよ。

現在HPの割合を求めたので、同じような手段で長さを変えるための割合を求めます。
繰り返し処理で、何回も足す作戦です。
元の長さから、HP1%ごとに元の長さの1%を何回も何回も引いていく作戦です。

※バーの例
※RectTransform Lifebar;
※Lifebar=GetComponent();
.....
void lifeBar(){
 double onePar_HP=(double)HP/100;
 バーの情報から変化させる軸の長さ(スケール)を100で割る/X,Y,Z,どれを変えるか
 ※バーの例
 ※doubel bar_x = (double)LifeBar.LocalScale.x/100;
 ※
int damegeParcent=0//ダメージの割合を格納する変数
double a=0//足しまくるのを格納する変数
while(a  a+=onePar_HP;
damegeParcent++;
}
double hpParcent=100-damageParcent;
float fixScale=0;//バーの長さを調節します。
double x=(double)LifeBar.localScale.x;
for(int i=0;i x-=bar_x;
fixScale+=(float)bar_x;
}

}

その4:スケールを変えて、位置を調整する。

最後に、スケールを変えて位置を調整します。
スケールを変えると、左右で伸び縮みしちゃうので、普通に長さを変えるとそのまんま端っこからズレてしまいます。
なので、ズレた分を直してあげないといけません。
ライフバーのスケールを変更したあとに、変更分に応じて動かしてズレを修正します。

※バーの例
※RectTransform Lifebar;
※Lifebar=GetComponent();
.....
void lifeBar(){
 double onePar_HP=(double)HP/100;
 バーの情報から変化させる軸の長さ(スケール)を100で割る/X,Y,Z,どれを変えるか
 ※バーの例
 ※doubel bar_x = (double)LifeBar.LocalScale.x/100;
 ※
int damegeParcent=0//ダメージの割合を格納する変数
double a=0//足しまくるのを格納する変数
while(a  a+=onePar_HP;
damegeParcent++;
}
double hpParcent=100-damageParcent;
float fixScale=0;//バーの長さを調節します。
double x=(double)LifeBar.localScale.x;
for(int i=0;i x-=bar_x;
fixScale+=(float)bar_x;
}
Vector3 barPos=new Vector3(0,※適当なYの数値,0)
 LifeBar.localScale=new Vector3((float)x1,1);
LifeBar.LocalPosition=new Vector3(barPos.x-fixScale,barPos.y,barPos.z);
}

ノリはこんな感じです。





HPの割合とバーの長さの割合を求める。
割合を基にしてHPに応じたバーの長さを求める。
そしてスケール変化で生じるズレをポジション変更で修正する。

変動するライフバーはこんな具合です。
一連の処理は、UpDateあたりにぶちこんで何回も読み込むよりも変動があった場合のみ読み出してあげるといいかも。

whereのsomeoneのhelpにusefullになれたら嬉しいです。
数値よりもやっぱ視覚的に見えるほうがゲームっぽいし、なによりもぜんぜん微動だにしないライフバーを見て絶望したり、がっつり減るバーを見てキモティってなるんで、視覚的なUIにこだわっていきたいとろろですね。
それにしても、ざるそばの季節ですな。

またなんか作ったら更新します。

スポンサーサイト
UnityでHPメーターみたいなものを作った話続編 | ホーム | 作るゲームの話
Comment
UGUIのImageでType:Fillにするとゲージが作れますよ。
> UGUIのImageでType:Fillにするとゲージが作れますよ。

情報ありがとうございます。
さきほど見てみたところ、僕のやったやり方よりもずっと楽に作れそうですね。
試してみます。


Trackback
この記事のトラックバックURL
http://watasinoilands.blog.fc2.com/tb.php/50-a0fa9f35
この記事にトラックバックする(FC2ブログユーザー)
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。