今回は敵にダメージを与えた時に一気にダメージ分のHPを減らすのではなく1ずつHPを減らす演出を加えたいと思います。
HPがどういう風に減っていくかをわかりやすくする為に敵のHPを頭上に数値として表示しておきます。
上の記事ではメーターで作成していますが、こちらのメーターでも同じように作成する事が出来ます。
また今回のように徐々にHPを減らす機能をメーターで表示しつつダメージ量も分かりやすくする機能も作ってみました。
メーターで作りたい人は上の記事を参考にしてください。
今回の機能を作成すると、
↑のような感じの機能が出来上がります。
与えるダメージは1回で1000にしています(記事を見ないとどんなもんかわからないかも?)。
この記事を最初に作った時より良い感じになりました(謎)
その分、サンプルは雑になっていますけどね・・・・(^_^;)
HP表示用UIの作成
まずは人型キャラクターの子要素にHP表示用UIを作成していきます。
敵キャラクターの子要素で右クリック→UI→Canvasを作成し、名前をDamageUIとします。
HPの子要素にUI→Textを作成します。
上がDanmageUIのインスペクタです。
CanvasのRenderModeをWorld Spaceにして、通常のゲームオブジェクトと同じように扱えるようにします。
RotateDamageUIスクリプトはHPのUIが常にカメラの方向を向くようにする為のスクリプトです。
1 2 3 4 5 6 7 8 9 10 11 | using UnityEngine; using System.Collections; public class RotateDamageUI : MonoBehaviour { void Update () { transform.rotation = Camera.main.transform.rotation; } } |
これで敵キャラクターのHP用のUIが完成しました。
上が敵キャラクターのインスペクタです。
実際にはCubeを作成して名前をEnemyにし、TagにEnemyを設定しただけですが・・・(修正前は人型キャラクターにしてました)
EnemyStatus(敵のステータス管理スクリプト)とEnemyController(敵の行動処理スクリプト)を新しく作り設定しておきます。
スクリプトは後で作成します。
上のようにHPのUIが表示されるように配置します。
ここまで出来たら敵キャラクターをAssetsフォルダにドラッグ&ドロップしてプレハブ化しておきます。
これでHPを表示するUIを持った敵キャラクターが量産出来ます。
敵のステータス保持スクリプトEnemyStatusの作成
EnemyStatusを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | using UnityEngine; using System.Collections; using UnityEngine.UI; namespace CountDownHP { public class EnemyStatus : MonoBehaviour { // HP [SerializeField] private int hp = 10000; // HPを一度減らしてからの経過時間 private float countTime = 0f; // 次にHPを減らすまでの時間 [SerializeField] private float nextCountTime = 0f; // HP表示テキスト private Text hpText; // 現在のダメージ量 private int damage = 0; void Start() { hpText = GetComponentInChildren<Text>(); hpText.text = hp.ToString (); } void Update () { // ダメージなければ何もしない if (damage == 0) { return; } // 次に減らす時間がきたら if(countTime >= nextCountTime) { // ダメージ量を10で割った商をHPから減らす var tempDamage = damage / 10; // 商が0になったら余りを減らす if (tempDamage == 0) { tempDamage = damage % 10; } hp -= tempDamage; hpText.text = hp.ToString(); damage -= tempDamage; countTime = 0f; // HPが0以下になったら敵を削除 if(hp <= 0) { Destroy(gameObject); } } countTime += Time.deltaTime; } // ダメージ値を追加するメソッド public void SetDamage(int damage) { this.damage += damage; countTime = 0f; } } } |
EnemyStatusはHPを保持したり、ダメージを受けた時に徐々にHPを減らす処理を担当します。
ダメージを受けたらSetDamageメソッドを呼び出し、ダメージ値を保持します。
Updateメソッドではダメージがある時に前にダメージを受けてから指定した時間経過していたらダメージを減らす処理をします。
トータルのダメージ量を一気に減らすとカウントダウンが出来ないので、トータルのダメージ量を10で割った商を1回で減らすようにします。
例えば1200のトータルダメージがあったとしたら10で割った商は120なので1回の処理で120減らします。
最終的には10で割ると商が0になるので、その時は余りを減らすダメージ量にします。
HPが0以下になったら自身(敵)を削除するようにします。
敵キャラクター操作スクリプトEnemyControllerの作成
次は敵キャラクター操作スクリプトEnemyControllerです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | using UnityEngine; using System.Collections; using UnityEngine.UI; public class EnemyController : MonoBehaviour { private CountDownHP.EnemyStatus status; void Start () { status = GetComponent<CountDownHP.EnemyStatus>(); } public void TakeDamage(int damage) { status.SetDamage (damage); } } |
敵キャラクター操作スクリプトと言っていますが、今回は動かす事はしないので、ダメージを受けた時の処理だけを記述しています。
TakeDamageメソッドは主人公の攻撃が当たった時に呼ぶメソッドでダメージ値を受け取ります。
実際に減らす処理はEnemyStatusスクリプトで行っていますので、ダメージ量をEnemyStatusのSetDamageメソッドを呼び出して渡しています。
次にEnemyControllerのTakeDamageメソッドを呼び出す処理を追加していきます。
今回は
で弾が敵に当たった時にTakeDamageメソッドを呼び出すようにします。
(近接攻撃等で敵を攻撃した時にTakeDamageメソッドを呼び出す処理でも同じように作成してください。)
弾が敵に当たった時の処理BulletAttackにTakeDamageメソッドを呼び出す処理を追加
それでは弾が敵に当たった時の処理BulletAttackにTakeDamageメソッドを呼び出す処理を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | using UnityEngine; using System.Collections; public class BulletAttack : MonoBehaviour { // コライダのIsTriggerのチェックを外し物理的な衝突をさせる場合 void OnCollisionEnter(Collision col) { if(col.gameObject.tag == "Enemy") { col.gameObject.GetComponent<EnemyController>().TakeDamage(100); Destroy(gameObject); } } } |
弾のゲームオブジェクトを消す前にEnemyControllerのTakeDamageメソッドに引数100(ダメージ値)を渡して呼び出します。
(今回の場合はダメージ値は常に100になります)
その後、弾のゲームオブジェクトを消します。
HPが少しづつ減るかどうかの確認
これで機能が完成したので敵を攻撃して試してみましょう。
HPが少しづつ減っていくのが確認出来ます。
また、連続で攻撃が当たれば前の攻撃で受けたダメージ分は一気に計算されそこからまた少しづつ減るようになっています。
↑のサンプルは最初に作成した仕様でのサンプルでダメージを減らしている時に攻撃をするとダメージを完全に減らした値から再度ダメージを与える事になります。
機能に修正を加えて攻撃を与えた時はダメージ量だけ増やし、減らす処理はEnemyStatusスクリプトで行うように変更しました。
これでUnityで敵にダメージを与えた時に少しづつHPを減らす機能を作成が完了しました。
HPを減らしていく間隔時間を設定しましたが、あんまり使わないかも・・・・(^_^;)
間隔時間を0にしても早すぎるってことはなさそうですしね。