Unityでジャンクゲームを作っているっぽい

会社帰りにGPD PocketにUnity入れてゲーム作ってます

【CEtest3】03_CorgiEngineで倒しかたでスコア変化 & スコア表示

敵倒してスコア表示

MMFeedbackCorgiEngineFloatingTextという仕組みがある
これはダメージ発生時にダメージ数を表示してくれるのだけど
ここを改造してスコア表示すればいいんじゃね?と思ったの

スクリプトを用意

とりあえず、継承とかはしないでスクリプトをまるまるコピーしてテストしてみる
名前はFloatingText_my1とかにしてみる
これで、好きに改造できるので以下の内容を書いてみる

  • 表示のタイミングをenemyのHPがゼロになった場合
  • Valueに表示したいスコア値PointsWhenDestroyedを設定する

表示するには、MMFloatingTextSpawnerが必要

LevelManagerの下に空のオブジェクトを作り、MMFloatingTextSpawnerをアサイ
詳細はDamage floatiesを検索して参照

設定する

元々、ダメージ数を出す機能なのでEnemyにダメージ用のFeedbackを用意してMMFeedbacksをアサイ

Add new feedback...からFloatingText_my1を選択

これで、追加されました

Target HealthにEnemyを設定

最後に、EnemyのHealthのDamageFeedbacksに設定して出来上がり

まずは与えたダメージが表示された。
youtu.be

テストしてみる

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