【2Dシューティング】Unity公式チュートリアル9回目。HPの実装とアニメーション

こんにちは。【2Dシューティング】Unity公式チュートリアルをやってみるシリーズの9回目です。前回はタイトルを表示させました。
【2Dシューティング】Unity公式チュートリアルをやってみる8回目。タイトルをつける

今回はHPの実装をやっていきます。とダメージを受けたときの表現をアニメーションを使って実現するのですが、クソみたいにやることが多いので小分けにしていこうと思います。

HPを実装しよう

ここでやること

  • EnemyScriptにHPを実装
  • BulletScriptに攻撃力を実装
  • 敵HPの調整

スクリプトに機能を追加していこう

BulletScriptは攻撃力の変数を追加するだけ

public int power = 1;//攻撃力

EnemyScriptは当たり判定がおきたら弾の攻撃力分 hpを減らす実装をする。コードは全部のせると長いので、だいぶはしょってます。

//HP
public int hp = 1;
//略
void OnTriggerEnter2D (Collider2D c){
  //レイヤー名を取得
  string layerName = LayerMask.LayerToName(c.gameObject.layer);
  //レイヤー名がBullet(Player)以外のときは何も行わない
  if(layerName != "Bullet (Player)") return;
  //PlayerBulletのTransformを取得
  Transform playerBulletTransform = c.transform.parent;
  //Bulletコンポーネントを取得
  BulletScript bullet = playerBulletTransform.GetComponent<BulletScript>();

  if(c.gameObject.CompareTag("PlayerBullet")){
    Destroy(c.gameObject);//弾の削除
    hp = hp - bullet.power;
    if(hp <= 0){
      spaceship.Explosion();//爆発する
      Destroy(gameObject);//敵の削除
    }
  }
}
//略

公式チュートリアルではレイヤー名がBullet(Player)以外のときは何も行わないという。クソコードを追加しています。レイヤー名は半角スペースとかもちゃんと認識します。コピペしても動かないクソコードだったので、レイヤー名を確認する方法書いときます。

レイヤー名を確認するにはUnityメニューのEditProjectSettingsTag and Layersで確認することができます。
screenshot 20181213 2208

スクリプトに機能を追加したら自機弾の攻撃力と敵のHPを調整できますが、ここは好みなので省略。

敵がダメージを受けたときのアニメーションを作成

ここは公式をみたほうがいいです。マジクソだるい作業なので重要ポイントだけ箇条書きにしときますが個人的解釈なので役に立たない可能性が高いです。

  • AnimationControllerをダブルクリックするとアニメーターが開く
  • アニメーターではレイヤーを追加することができる
  • アニメーターではアニメーションを動作させる引きがねとなるトリガーを追加することができる
  • 新たなアニメーションを作成してアニメーターにドラッグ&ドロップすることができる
  • Animationの切替をMake Transitionで表現することができる
  • UnityメニューのWindowAnimationsからオブジェクトに紐づいたアニメーションの調整を行うことができる

アニメを切り替える仕組みを作る

アニメーターでDamageレイヤーを作成する

ここで重要なのはAnimationを切り替えるTriggerだ。Unity2Dシューティングチュートリアルをみていてクソわかりにくいのでキレそうになった。怒りを覚えたので動画にした。ここではAnimation切替の仕組みづくりを行っている。

DamageAnimationの調整を行う

DamageAnimationはオブジェクトを赤色にするAnimationにするため調整が必要だ。敵オブジェクトを選択した状態でUnityメニューのwindowAnimationを選択すると別窓でAnimationの設定画面が立ち上がる。これも動画にした。

Scriptを修正する

トリガーの発動させるためのScript修正も必要だ。もはや初心者の域をこえてきている。SpaceShipScriptにメンバーを追加する。

//SpaceShipScriptにメンバーの追加。上と下のコードは省略してます。

// アニメーターコンポーネント
private Animator animator;

void Start ()
{
  // アニメーターコンポーネントを取得
  animator = GetComponent<Animator> ();
}

//アニメーターコンポーネントの取得
public Animator GetAnimator(){
  return animator;
}

敵がまだ死んでなかったらDamageAnimationを発動させるためEnemyScriptを修正する。

//OnTriggerEneter2D内のif文にelseの処理を追加している
//上下のコードは省略

if(c.gameObject.CompareTag("PlayerBullet")){
      Destroy(c.gameObject);//弾の削除
      hp = hp - bullet.power;
      if(hp <= 0){
        spaceship.Explosion();//爆発する
        Destroy(gameObject);//敵の削除
      }else{
        spaceship.GetAnimator().SetTrigger("Damage");
      }

プレイヤーの無敵時間をつくる

ここもUnity2Dシューティングチュートリアルをみていてさらにわかりにくいのでめちゃくちゃキレそうになった。こちらもわかりにくいので動画にした。ここでのポイントはトリガーを使っていないことだそのためゲームがはじまりプレイヤーのインスタンスが生成されたらアニメーションがはじまるようになっている。

ここまでの状態

ファイルがでかいのでこれも動画にした。なんだか微妙だがこれでいいだろもう。

次の記事

次の記事は主にスコアの実装となります。公式と結構違うやり方でやってます。あと公式のWaveの話は省略してます。
【2Dシューティング】Unity公式チュートリアル10回目。スコアの実装


Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 49

Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 78