敵倒してスコア表示
MMFeedbackCorgiEngineFloatingTextという仕組みがある
これはダメージ発生時にダメージ数を表示してくれるのだけど
ここを改造してスコア表示すればいいんじゃね?と思ったの
スクリプトを用意
とりあえず、継承とかはしないでスクリプトをまるまるコピーしてテストしてみる
名前はFloatingText_my1とかにしてみる
これで、好きに改造できるので以下の内容を書いてみる
- 表示のタイミングをenemyのHPがゼロになった場合
- Valueに表示したいスコア値PointsWhenDestroyedを設定する
表示するには、MMFloatingTextSpawnerが必要
LevelManagerの下に空のオブジェクトを作り、MMFloatingTextSpawnerをアサイン
詳細はDamage floatiesを検索して参照
テストしてみる
Valueに表示したいスコア値PointsWhenDestroyedを設定する
PointsWhenDestroyedは、Enemyの得点ですね
元のMMFeedbackCorgiEngineFloatingTextで
Value = TargetHealth.LastDamage.ToString(Formatting);
って所を、こんな感じに変更
Value = TargetHealth.PointsWhenDestroyed.ToString(Formatting);
そうすると、Enemyに攻撃が当たる毎に表示される数値が変わるのがわかります
表示のタイミングをEnemyのHP=0にしてみる
コードを見てみると
if (Active)
って所で、表示のタイミングを判定しているっぽい?ので
こんな感じに変更
//enemyのHPがゼロになった場合 if (TargetHealth.CurrentHealth <= 0){
Enemyを破壊すると得点が出るようになった
youtu.be
倒しかたでスコアを変化させたい
要は敵のHPがゼロになった時にダメージ発生させたオブジェクトが判定できれば
トドメを刺した武器によってスコアを分岐できるんじゃないかと
ダメージを発生させたオブジェクトを取得したい
こんなの発見
corgi-engine-docs.moremountains.com
このinstigatorをstringsにキャストして判定できそう
とうとうCorgiEngineのスクリプトをoverrideする必要が出てきた
まずHealthを継承した改造用のクラスHealth_my1を用意する
using UnityEngine; using System.Collections; using MoreMountains.Tools; namespace MoreMountains.CorgiEngine{ public class Health_my1 : Health{ } }
これを敵にアサインすると、Healthと同じ内容が表示される
Damage()をHealthからコピペする
virtualをoverrideに書き換える
public string hitObjectName;にダメージを発生させたオブジェクトを入れたい
namespace MoreMountains.CorgiEngine{ public class Health_my1 : Health{ [Header("add")] public string hitObjectName; public override void Damage(int damage, GameObject instigator, float flickerDuration, float invincibilityDuration, Vector3 damageDirection) { } }
[Header("add")]
はインスペクターを見やすくするために設定
こんな感じに見える
Damage()内を改造する
instigatorを文字列にキャストして、hitObjectNameに入れる
これで、別のスクリプトからアクセスできるようになる
public override void Damage(int damage, GameObject instigator, float flickerDuration, float invincibilityDuration, Vector3 damageDirection) { //ダメージを与えたobjectをstringにキャスト hitObjectName = instigator.ToString(); ■省略■ }
MMFeedbackCorgiEngineFloatingText_Scoreで判定する
スコア表示の判定の所でDebug.Logで調べたオブジェクト名を使う
分岐先でスコアを変化させている
public Health_Enemy TargetHealth; private string hitobj; private int newPoint; protected override void CustomPlayFeedback(Vector3 position, float attenuation = 1.0f) { //ダメージ与えたobjectを入れる hitobj = TargetHealth.hitObjectName; //enemyのHPがゼロになった場合 if (TargetHealth.CurrentHealth <= 0){ ■省略■ //トドメ攻撃の判定 if(hitobj == "Weapon_player2_melee(Clone)DamageArea (UnityEngine.GameObject)"){ newPoint = TargetHealth.meleeScore; }else{ newPoint = TargetHealth.shotScore; } //enemyのscoreを指定 Value = newPoint.ToString(Formatting); ■省略■ } }
スコアに加算させる
実は、このままだと見た目だけのスコア分岐で、実際のスコアが反映されていない
改造用のクラスHealth_my1を更に編集
倒したときにスコア加算をしているのでKill()をHealthからコピペ
public override void Kill(){ ■省略■ }
スコア加算部分に泥臭い分岐処理を追加
// Adds points if needed. if (PointsWhenDestroyed != 0) { //トドメ攻撃の判定 if(hitObjectName == "Weapon_player2_melee(Clone)DamageArea (UnityEngine.GameObject)"){ CorgiEnginePointsEvent.Trigger(PointsMethods.Add, meleeScore); }else{ CorgiEnginePointsEvent.Trigger(PointsMethods.Add, shotScore); } }
これで、やりたいことができたかしら
youtu.be