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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

4回答

1051閲覧

倍数毎に体力回復したい

_Beginner

総合スコア103

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

1グッド

0クリップ

投稿2018/12/17 07:41

編集2018/12/18 06:24

ある整数が100の倍数になったとき、プレイヤーの体力を回復させるにはどうすれば良いのでしょうか?

以下のコードについて、そのような機能を追加したいのですが、どうすれば良いのかわかりません。

c#

1//プレイヤーの体力 0で死亡 最大値は100 2int health; 3 4//点数のようなもの。例えば敵を倒せば1増え、ボスを倒せば5増えるなど。 5int recovery; 6 7//recoveryの値が変更されたときに呼び出す 8void Recovery() 9{ 10 if(recovery ????? ) //recoveryが100の倍数になったら <-ここがわからない 11 { 12 health = 100; 13 } 14 15 if(health <= 0) 16 { 17 Destory(this.gameObject); 18 } 19}

このif文をどのように書けば「recoveryが100の倍数になったらhealthを全回復」にできますか?


recoveryは1ずつ増えていくのではなく、2や3増加することもあります。

なので、recoveryの値が 96 -> 97 -> 99 -> 101 -> 104 となる可能性があり、

100の倍数をスキップして増加してしまいます。

この場合はどのようにすれば良いのでしょうか?

Hawn👍を押しています

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

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

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

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

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

papinianus

2018/12/17 09:06

このRecovery()は、どう(タイミングとか)呼ばれるのですか?またrecoveryはどうやって増えていくのですか?そのあたり、コードは開示可能でしょうか?
_Beginner

2018/12/17 09:14

編集しました。コード内に説明を書きました。
guest

回答4

0

recoveryを100で割った商が前回の結果と異なった場合にhealthを回復すればいいのではないでしょうか?
これであれば、recoveryが100以上一度に増加しない限りは対応できるのではないかと思います。

recoveryが96 -> 97 -> 99 -> 101 -> 104と変化した場合、
recovery/100は0 -> 0 -> 0 -> 1 -> 1と変化するので、0から1に変化した時にhealthを加算するということです。

こういう手もありかも

C#

1//プレイヤーの体力 0で死亡 2int health; 3 4//点数のようなもの。例えば敵を倒せば1増え、ボスを倒せば5増えるなど。 5int recovery; 6 7//ポイント3の敵を倒したときに実行 8void Killed3pointEnemy() 9{ 10 Recovery(3); 11} 12 13//recoveryの値を変更するときに呼び出す 14void Recovery(int increase) 15{ 16 health += 50 * (((recovery + increase) / 100) - (recovery / 100)); 17 recovery += Increase; 18 19 if(health <= 0) 20 { 21 Destory(this.gameObject); 22 } 23}

これなら、100以上増加しても対応できるかと思います。

投稿2018/12/17 08:16

編集2018/12/17 13:59
YAmaGNZ

総合スコア10222

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

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

_Beginner

2018/12/17 09:21

整数位 / 100 で百の位の値を取得して比べれば良いのですね。 ありがとうございます。
guest

0

recoveryが100の倍数になったらhealthを50回復

倍数の判定には剰余算(割った余り)を使いましょう。
例えば3の倍数であれば

3,6,9,12,15,...

ですが、これらは全て3で割った余りが0になります。


recoveryは1ずつ増えていくのではなく、2や3増加することもあります。

安直ですが、更新前の数値を保存しておき、判定時に更新前と現在の間の数値を調べていけば良いかと。

投稿2018/12/17 07:47

dice142

総合スコア5158

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

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

_Beginner

2018/12/17 09:21

「一つ前の値を保存しておく」使わせていただきます。 ありがとうごじざいます。
guest

0

答えがでちゃいましたけど、他の人に参考になるかもしれないんで。

javascript

1//プレイヤーの体力 0で死亡 2int health; 3 4//点数のようなもの。例えば敵を倒せば1増え、ボスを倒せば5増えるなど。 5int recovery; 6int soulgem; 7 8//ポイント3の敵を倒したときに実行 9void Killed3pointEnemy() 10{ 11 soulgem += 3 12 recovery += 3; 13 14 Recovery(); 15} 16 17//recoveryの値が変更されたときに呼び出す 18void Recovery() 19{ 20 while(soulgem >= 100) 21 { 22 soulgem -= 100; 23 health += 50; 24 } 25 26 if(health <= 0) 27 { 28 Destory(this.gameObject); 29 } 30}

recoveryがハイスコア値みたいに保存しとかないといけない値なら、このようにsoulgemみたいな別の値を持てばいいですし、保存しなくていいなら、whileでrecoveryから100減らしてもいいでしょう。
この方式なら、一度に200点recoveryしても問題なく動作します。

投稿2018/12/17 13:39

papinianus

総合スコア12705

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

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

_Beginner

2018/12/18 06:16

なるほど! soulgemが100を超えたときに100減らすので一度に200以上増えても2度処理されるようになるのですね! 「100の倍数を超えた場合に体力を50回復する」場合は、papinianusさんのコードを、 「100の倍数を超えた場合に体力を全回復する」場合は僕が書いたコードでもOKということですね。 ありがとうございました!
guest

0

自己解決

dice142さん、YAmaGNZさんの回答を参考にコードを組んでみました。

一応うまくいったので書いておきます。

c#

1 2//プレイヤーの体力 0で死亡 最大値は100 3int health; 4 5//点数のようなもの。例えば敵を倒せば1増え、ボスを倒せば5増えるなど。 6int recovery; 7 8//recoveryの一つ前の状態を保存するための変数 9int reoveryBack; 10 11//ポイント3の敵を倒したときに実行 12void Killed3pointEnemy() 13{ 14 //recoveryの一回前の状態をrecoveryBackに保存 15 recoveryBack = recovery; 16 recovery += 3; 17 18 Recovery(); 19} 20 21//recoveryの値が変更されたときに呼び出す 22void Recovery() 23{ 24 //recoveryの百の位がrecoveryBackのそれと違うとき 25 if(recoveryBack / 100 != recovery / 100) 26 { 27 health = 100; 28 } 29 30 if(health <= 0) 31 { 32 Destory(this.gameObject); 33 } 34}

「100の倍数を超えたときに全回復」ならこのコードで大丈夫ですが、
「100の倍数を超えたときにx回復」ならpapinianusさんのコードを書いたほうがいいです。
僕のコードではrecoveryが200以上増えた場合、回復の処理は一度しか呼ばれません。

投稿2018/12/17 09:20

編集2018/12/18 06:20
_Beginner

総合スコア103

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問