雑学豚の巣穴

盛大なメモ帳

プレイヤーも敵もキャラクター

落下判定のタイルマップを作ってここに接触したら死亡にするぞー

f:id:rrroo:20200331044549p:plain

テストマップの落下判定

 

接触したら死亡だし死亡処理は前作ったからいいとして…

 

1.プレイヤーの接触イベントで落下判定とぶつかったら自分の死亡処理

2.落下判定の接触イベントでプレイヤーがぶつかってきたらプレイヤーの死亡処理を呼ぶ

 

どっちを選ぶべきか?

実際は針に当たったロックマンみたいなものなんだけどなー

 

例えば魔法攻撃があって鈍足になる効果の弾に当たったら

1.プレイヤーの接触イベントで魔法攻撃とぶつかったら魔法の種類ごとの処理をプレイヤーが判断して変える

2.魔法攻撃の接触イベントでプレイヤーがぶつかってきたらプレイヤーの状態異常や効果時間の設定を変える

 

こう考えると後者な気がする。

敵:くらえファイヤー!

火:

自:わーぶつかってきたこの火はファイヤーだから20%でやけどだー失敗したけどー

敵:くらえ火遁!

火:

自:わーぶつかってきたこの火は火遁だから50%でやけどだー成功したー

 

敵:くらえファイヤー!

火:プレイヤーに当たった!20%でやけどだ!

自:わー失敗したかーなんともないぜー

敵:くらえ火遁!

火:プレイヤーに当たった!50%でやけどだ!

自:わー成功したからやけど受けてるー

 

後者のがそれっぽい…それっぽくない?

バネ処理でも似たような事した気がする

(あーでも魔法反射だったらどうなるんだろう)

(ダメージだけ届けてレジスト判定はプレイヤー側が正解か?)

(やけど耐性装備してたらって判定はプレイヤーですべきだしな)

今回はどっちの処理で判定を取得するかという話で。

 

とりあえず今回は死亡判定側がぶつかったものが何かを見る

プレイヤーだったら死亡処理を呼ぶ。

CompareTagでプレイヤータグと一致したら

Collider2D.gameObjectの

.GetComponent<コンポネート名>()とってきて

自作.Dead();を実行

コンポネート名はプレイヤーにつけてるスクリプト

 

プレイヤーの落下死亡はできたけど

今のままだと敵キャラが落下してもずっと生き残っちゃう。

もうゴミオブジェクトなのに移動計算続けるのもなー…

敵も当たったら死亡処理だっ

 

タグ見てコンポネート名変えた処理に変えてもいいんだろうけど

 その時るーに電流走る

コンポネート名はクラス名だから…Dead関数を親クラスに持っておいて親クラスをプレイヤーや敵が継承すればいいのでは?

 

■クッソわからない継承の話

よく人間に例えられてる

人間は全員 名前と年齢を持っている

しかし、人によってはマラソン選手だったら他人には不要な最速タイムだったりを用意しなくてはいけなくなる。

そういう様々な人に対して1つ1つ専用の設定を作る必要があるとしても

100あれば管理の仕方は「人間が100人」のが楽だし

「君の名前は?」は人間に共通して聞ける内容だ。

それはマラソン選手に対しての質問ではなくて、人間に対しての質問だから。

そういう概念を大幅にとらえたものを用意してからそれを内包した詳細な概念を作る

これが継承である。

例にならえば人間を継承したマラソン選手という概念。

ラソン選手は名前と年齢を人間として最初から持ってるので最速タイムを追加すればいい。

 

話は戻って

 

落下判定に当たったプレイヤーと敵は死亡処理を行いたい。

楽な話さ

プレイヤーも敵もキャラクター.Dead();を継承してキャラクターとして問えばいい

死亡関数開始して下さい。

 

「unityの基礎クラスMonoBehaviour」を継承した「CharacterData」を継承した「Enemy」ってクラスを作る

 


public class CharacterData : MonoBehaviour
を作って
    public void Dead() { } //死亡関数を持ってることを宣言だけする

public class Enemy : CharacterData
継承したら

    new private void Dead()
    {
        c2D.enabled = false; //当たり判定消失とか
        isDead = true; //死亡フラグ立てたりとか
    }

中身を作って
落下判定のプログラム側で

    //当たり判定イベント
    private void OnTriggerEnter2D(Collider2D c2D)
    {
        if (c2D.CompareTag("enemyTag") ||
            c2D.CompareTag("playerTag"))
        {
            //即死に当たり死亡(落下)
            
            //CharacterDataとしてDead関数を呼ぶ
            c2D.gameObject.GetComponent<CharacterData>().Dead();
        }
    }

 

騎士である前に女だ!とか女である前に騎士だ!とか女騎士と姫の百合は大変良いものだとか。百合の間に割り込み隊長だとか。